diff --git a/.eslintrc.json b/.eslintrc.json index f614f1ad91..a94ea87704 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -43,6 +43,7 @@ }, "rules": { "no-unused-vars": "off", + "local-rules/no-barrel-imports": "error", "local-rules/no-budibase-imports": "error", "local-rules/no-console-error": "error", "@typescript-eslint/no-unused-vars": [ diff --git a/charts/budibase/README.md b/charts/budibase/README.md index c944ed1397..c10b42d75b 100644 --- a/charts/budibase/README.md +++ b/charts/budibase/README.md @@ -139,7 +139,7 @@ $ helm install --create-namespace --namespace budibase budibase . -f values.yaml | globals.smtp.user | string | `""` | The username to use when authenticating with your SMTP server. | | globals.sqs.enabled | bool | `false` | Whether to use the CouchDB "structured query service" or not. This is disabled by default for now, but will become the default in a future release. | | globals.tempBucketName | string | `""` | | -| globals.tenantFeatureFlags | string | `"*:LICENSING,*:USER_GROUPS,*:ONBOARDING_TOUR"` | Sets what feature flags are enabled and for which tenants. Should not ordinarily need to be changed. | +| globals.tenantFeatureFlags | string | `` | Sets what feature flags are enabled and for which tenants. Should not ordinarily need to be changed. | | imagePullSecrets | list | `[]` | Passed to all pods created by this chart. Should not ordinarily need to be changed. | | ingress.className | string | `""` | What ingress class to use. | | ingress.enabled | bool | `true` | Whether to create an Ingress resource pointing to the Budibase proxy. | diff --git a/charts/budibase/templates/app-service-deployment.yaml b/charts/budibase/templates/app-service-deployment.yaml index 6b4fbe5dda..a60b2797ea 100644 --- a/charts/budibase/templates/app-service-deployment.yaml +++ b/charts/budibase/templates/app-service-deployment.yaml @@ -65,7 +65,10 @@ spec: - name: ENABLE_ANALYTICS value: {{ .Values.globals.enableAnalytics | quote }} - name: API_ENCRYPTION_KEY - value: {{ .Values.globals.apiEncryptionKey | quote }} + valueFrom: + secretKeyRef: + name: {{ template "budibase.fullname" . }} + key: apiEncryptionKey - name: HTTP_LOGGING value: {{ .Values.services.apps.httpLogging | quote }} - name: INTERNAL_API_KEY @@ -161,7 +164,10 @@ spec: - name: TENANT_FEATURE_FLAGS value: {{ .Values.globals.tenantFeatureFlags | quote }} - name: ENCRYPTION_KEY - value: {{ .Values.globals.bbEncryptionKey | quote }} + valueFrom: + secretKeyRef: + name: {{ template "budibase.fullname" . }} + key: bbEncryptionKey {{ if .Values.globals.bbAdminUserEmail }} - name: BB_ADMIN_USER_EMAIL value: {{ .Values.globals.bbAdminUserEmail | quote }} @@ -221,7 +227,7 @@ spec: name: {{ .secretName }} key: {{ .secretKey | quote }} {{- end}} - image: budibase/apps:{{ .Values.globals.appVersion | default .Chart.AppVersion }} + image: {{ .Values.globals.dockerRegistry }}budibase/apps:{{ .Values.globals.appVersion | default .Chart.AppVersion }} imagePullPolicy: Always {{- if .Values.services.apps.startupProbe }} {{- with .Values.services.apps.startupProbe }} diff --git a/charts/budibase/templates/automation-worker-service-deployment.yaml b/charts/budibase/templates/automation-worker-service-deployment.yaml index 38a384626e..71089bd7ee 100644 --- a/charts/budibase/templates/automation-worker-service-deployment.yaml +++ b/charts/budibase/templates/automation-worker-service-deployment.yaml @@ -58,7 +58,10 @@ spec: - name: ENABLE_ANALYTICS value: {{ .Values.globals.enableAnalytics | quote }} - name: API_ENCRYPTION_KEY - value: {{ .Values.globals.apiEncryptionKey | quote }} + valueFrom: + secretKeyRef: + name: {{ template "budibase.fullname" . }} + key: apiEncryptionKey - name: HTTP_LOGGING value: {{ .Values.services.automationWorkers.httpLogging | quote }} - name: INTERNAL_API_KEY @@ -154,7 +157,10 @@ spec: - name: TENANT_FEATURE_FLAGS value: {{ .Values.globals.tenantFeatureFlags | quote }} - name: ENCRYPTION_KEY - value: {{ .Values.globals.bbEncryptionKey | quote }} + valueFrom: + secretKeyRef: + name: {{ template "budibase.fullname" . }} + key: bbEncryptionKey {{ if .Values.globals.bbAdminUserEmail }} - name: BB_ADMIN_USER_EMAIL value: {{ .Values.globals.bbAdminUserEmail | quote }} @@ -209,7 +215,7 @@ spec: key: {{ .secretKey | quote }} {{- end}} - image: budibase/apps:{{ .Values.globals.appVersion | default .Chart.AppVersion }} + image: {{ .Values.globals.dockerRegistry }}budibase/apps:{{ .Values.globals.appVersion | default .Chart.AppVersion }} imagePullPolicy: Always {{- if .Values.services.automationWorkers.startupProbe }} {{- with .Values.services.automationWorkers.startupProbe }} diff --git a/charts/budibase/templates/minio-service-deployment.yaml b/charts/budibase/templates/minio-service-deployment.yaml index 901ead2b46..9ad2642e8d 100644 --- a/charts/budibase/templates/minio-service-deployment.yaml +++ b/charts/budibase/templates/minio-service-deployment.yaml @@ -35,7 +35,7 @@ spec: name: {{ template "budibase.fullname" . }} key: objectStoreSecret - image: minio/minio + image: {{ .Values.globals.dockerRegistry }}minio/minio imagePullPolicy: "" livenessProbe: httpGet: diff --git a/charts/budibase/templates/proxy-service-deployment.yaml b/charts/budibase/templates/proxy-service-deployment.yaml index d5ea696431..8ef7056fa4 100644 --- a/charts/budibase/templates/proxy-service-deployment.yaml +++ b/charts/budibase/templates/proxy-service-deployment.yaml @@ -32,7 +32,7 @@ spec: {{ end }} spec: containers: - - image: budibase/proxy:{{ .Values.globals.appVersion | default .Chart.AppVersion }} + - image: {{ .Values.globals.dockerRegistry }}budibase/proxy:{{ .Values.globals.appVersion | default .Chart.AppVersion }} imagePullPolicy: Always name: proxy-service {{- if .Values.services.proxy.startupProbe }} diff --git a/charts/budibase/templates/redis-service-deployment.yaml b/charts/budibase/templates/redis-service-deployment.yaml index 9ad12e0167..22950df41a 100644 --- a/charts/budibase/templates/redis-service-deployment.yaml +++ b/charts/budibase/templates/redis-service-deployment.yaml @@ -22,7 +22,7 @@ spec: - redis-server - --requirepass - {{ .Values.services.redis.password }} - image: {{ .Values.services.redis.image }} + image: {{ .Values.globals.dockerRegistry }}{{ .Values.services.redis.image }} imagePullPolicy: "" name: redis-service ports: diff --git a/charts/budibase/templates/secrets.yaml b/charts/budibase/templates/secrets.yaml index 263934187e..a44d2c0d9b 100644 --- a/charts/budibase/templates/secrets.yaml +++ b/charts/budibase/templates/secrets.yaml @@ -16,10 +16,14 @@ data: jwtSecret: {{ index $existingSecret.data "jwtSecret" }} objectStoreAccess: {{ index $existingSecret.data "objectStoreAccess" }} objectStoreSecret: {{ index $existingSecret.data "objectStoreSecret" }} + bbEncryptionKey: {{ index $existingSecret.data "bbEncryptionKey" }} + apiEncryptionKey: {{ index $existingSecret.data "apiEncryptionKey" }} {{- else }} internalApiKey: {{ template "budibase.defaultsecret" .Values.globals.internalApiKey }} jwtSecret: {{ template "budibase.defaultsecret" .Values.globals.jwtSecret }} objectStoreAccess: {{ template "budibase.defaultsecret" .Values.services.objectStore.accessKey }} objectStoreSecret: {{ template "budibase.defaultsecret" .Values.services.objectStore.secretKey }} + bbEncryptionKey: {{ template "budibase.defaultsecret" .Values.globals.bbEncryptionKey }} + apiEncryptionKey: {{ template "budibase.defaultsecret" .Values.globals.apiEncryptionKey }} {{- end }} {{- end }} diff --git a/charts/budibase/templates/worker-service-deployment.yaml b/charts/budibase/templates/worker-service-deployment.yaml index ecab8dc645..fbd88e862f 100644 --- a/charts/budibase/templates/worker-service-deployment.yaml +++ b/charts/budibase/templates/worker-service-deployment.yaml @@ -65,7 +65,10 @@ spec: {{ end }} {{ end }} - name: API_ENCRYPTION_KEY - value: {{ .Values.globals.apiEncryptionKey | quote }} + valueFrom: + secretKeyRef: + name: {{ template "budibase.fullname" . }} + key: apiEncryptionKey - name: HTTP_LOGGING value: {{ .Values.services.worker.httpLogging | quote }} - name: INTERNAL_API_KEY @@ -167,7 +170,10 @@ spec: - name: TENANT_FEATURE_FLAGS value: {{ .Values.globals.tenantFeatureFlags | quote }} - name: ENCRYPTION_KEY - value: {{ .Values.globals.bbEncryptionKey | quote }} + valueFrom: + secretKeyRef: + name: {{ template "budibase.fullname" . }} + key: bbEncryptionKey {{ if .Values.globals.datadogApmEnabled }} - name: DD_LOGS_INJECTION value: {{ .Values.globals.datadogApmEnabled | quote }} @@ -207,7 +213,7 @@ spec: name: {{ .secretName }} key: {{ .secretKey | quote }} {{- end}} - image: budibase/worker:{{ .Values.globals.appVersion | default .Chart.AppVersion }} + image: {{ .Values.globals.dockerRegistry }}budibase/worker:{{ .Values.globals.appVersion | default .Chart.AppVersion }} imagePullPolicy: Always {{- if .Values.services.worker.startupProbe }} {{- with .Values.services.worker.startupProbe }} diff --git a/charts/budibase/values.yaml b/charts/budibase/values.yaml index 4e80be7322..dde912410c 100644 --- a/charts/budibase/values.yaml +++ b/charts/budibase/values.yaml @@ -62,7 +62,7 @@ globals: budibaseEnv: PRODUCTION # -- Sets what feature flags are enabled and for which tenants. Should not ordinarily need to be # changed. - tenantFeatureFlags: "*:LICENSING,*:USER_GROUPS,*:ONBOARDING_TOUR" + tenantFeatureFlags: "" # -- Whether to enable analytics or not. You can read more about our analytics here: # . enableAnalytics: "1" diff --git a/eslint-local-rules/index.js b/eslint-local-rules/index.js index e88642c905..d9d894c33e 100644 --- a/eslint-local-rules/index.js +++ b/eslint-local-rules/index.js @@ -1,6 +1,17 @@ +const path = require("path") + +const makeBarrelPath = finalPath => { + return path.resolve(__dirname, "..", finalPath) +} +const backendCoreBarrelPaths = [ + makeBarrelPath(path.join("packages", "backend-core", "src", "index.ts")), + makeBarrelPath(path.join("packages", "backend-core", "src")), + makeBarrelPath(path.join("packages", "backend-core")), +] + module.exports = { "no-console-error": { - create: function(context) { + create: function (context) { return { CallExpression(node) { if ( @@ -13,11 +24,12 @@ module.exports = { ) { context.report({ node, - message: 'Using console.error(err) on its own is not allowed. Either provide context to the error (console.error(msg, err)) or throw it.', + message: + "Using console.error(err) on its own is not allowed. Either provide context to the error (console.error(msg, err)) or throw it.", }) } }, - }; + } }, }, "no-budibase-imports": { @@ -106,4 +118,42 @@ module.exports = { } }, }, + "no-barrel-imports": { + meta: { + type: "problem", + docs: { + description: + "Disallow imports from the top-level backend-core barrel file", + category: "Best Practices", + recommended: false, + }, + schema: [], // no options + messages: { + noBarrelImport: + "Avoid importing from the top-level barrel file 'backend-core/src/index.ts'. Import directly from the specific module instead.", + }, + }, + create(context) { + return { + ImportDeclaration(node) { + const importPath = node.source.value + const importFullPath = path.resolve( + context.getFilename(), + "..", + importPath + ) + + if (backendCoreBarrelPaths.includes(importFullPath)) { + context.report({ + node, + messageId: "noBarrelImport", + data: { + importFullPath, + }, + }) + } + }, + } + }, + }, } diff --git a/hosting/single/runner.sh b/hosting/single/runner.sh index b89bf8ffd4..95464dd031 100644 --- a/hosting/single/runner.sh +++ b/hosting/single/runner.sh @@ -10,7 +10,6 @@ declare -a DOCKER_VARS=("APP_PORT" "APPS_URL" "ARCHITECTURE" "BUDIBASE_ENVIRONME [[ -z "${MINIO_URL}" ]] && [[ -z "${USE_S3}" ]] && export MINIO_URL=http://127.0.0.1:9000 [[ -z "${NODE_ENV}" ]] && export NODE_ENV=production [[ -z "${POSTHOG_TOKEN}" ]] && export POSTHOG_TOKEN=phc_bIjZL7oh2GEUd2vqvTBH8WvrX0fWTFQMs6H5KQxiUxU -[[ -z "${TENANT_FEATURE_FLAGS}" ]] && export TENANT_FEATURE_FLAGS="*:LICENSING,*:USER_GROUPS,*:ONBOARDING_TOUR" [[ -z "${ACCOUNT_PORTAL_URL}" ]] && export ACCOUNT_PORTAL_URL=https://account.budibase.app [[ -z "${REDIS_URL}" ]] && export REDIS_URL=127.0.0.1:6379 [[ -z "${SELF_HOSTED}" ]] && export SELF_HOSTED=1 @@ -45,8 +44,7 @@ fi # randomise any unset environment variables for ENV_VAR in "${ENV_VARS[@]}" do - temp=$(eval "echo \$$ENV_VAR") - if [[ -z "${temp}" ]]; then + if [[ -z "${!ENV_VAR}" ]]; then eval "export $ENV_VAR=$(uuidgen | sed -e 's/-//g')" fi done diff --git a/lerna.json b/lerna.json index 070d726a42..d4ea1cc162 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", - "version": "2.30.3", + "version": "2.30.7", "npmClient": "yarn", "packages": [ "packages/*", diff --git a/packages/backend-core/src/context/tests/index.spec.ts b/packages/backend-core/src/context/tests/index.spec.ts index 2d89131549..95eb635ce7 100644 --- a/packages/backend-core/src/context/tests/index.spec.ts +++ b/packages/backend-core/src/context/tests/index.spec.ts @@ -2,7 +2,7 @@ import { testEnv } from "../../../tests/extra" import * as context from "../" import { DEFAULT_TENANT_ID } from "../../constants" import { structures } from "../../../tests" -import { db } from "../.." +import * as db from "../../db" import Context from "../Context" import { ContextMap } from "../types" import { IdentityType } from "@budibase/types" diff --git a/packages/backend-core/src/features/index.ts b/packages/backend-core/src/features/index.ts index 67084c8486..e0bd29b1bc 100644 --- a/packages/backend-core/src/features/index.ts +++ b/packages/backend-core/src/features/index.ts @@ -159,8 +159,9 @@ export class FlagSet, T extends { [key: string]: V }> { specificallySetFalse.add(feature) } + // ignore unknown flags if (!this.isFlagName(feature)) { - throw new Error(`Feature: ${feature} is not an allowed option`) + continue } if (typeof flagValues[feature] !== "boolean") { @@ -169,7 +170,7 @@ export class FlagSet, T extends { [key: string]: V }> { // @ts-expect-error - TS does not like you writing into a generic type, // but we know that it's okay in this case because it's just an object. - flagValues[feature] = value + flagValues[feature as keyof FlagValues] = value tags[`flags.${feature}.source`] = "environment" } } @@ -265,9 +266,5 @@ export class FlagSet, T extends { [key: string]: V }> { // All of the machinery in this file is to make sure that flags have their // default values set correctly and their types flow through the system. export const flags = new FlagSet({ - LICENSING: Flag.boolean(false), - GOOGLE_SHEETS: Flag.boolean(false), - USER_GROUPS: Flag.boolean(false), - ONBOARDING_TOUR: Flag.boolean(false), DEFAULT_VALUES: Flag.boolean(false), }) diff --git a/packages/backend-core/src/features/tests/features.spec.ts b/packages/backend-core/src/features/tests/features.spec.ts index 1e8e25654a..5cd012f7a5 100644 --- a/packages/backend-core/src/features/tests/features.spec.ts +++ b/packages/backend-core/src/features/tests/features.spec.ts @@ -1,6 +1,6 @@ import { IdentityContext, IdentityType, UserCtx } from "@budibase/types" import { Flag, FlagSet, FlagValues, init, shutdown } from "../" -import { context } from "../.." +import * as context from "../../context" import environment, { withEnv } from "../../environment" import nodeFetch from "node-fetch" import nock from "nock" @@ -67,9 +67,9 @@ describe("feature flags", () => { expected: flags.defaults(), }, { - it: "should fail when an environment flag is not recognised", + it: "should ignore unknown feature flags", environmentFlags: "default:TEST_BOOLEAN,default:FOO", - errorMessage: "Feature: FOO is not an allowed option", + expected: { TEST_BOOLEAN: true }, }, { it: "should be able to read boolean flags from PostHog", diff --git a/packages/backend-core/src/redis/tests/redis.spec.ts b/packages/backend-core/src/redis/tests/redis.spec.ts index 376afbfab7..4ea41fdb7f 100644 --- a/packages/backend-core/src/redis/tests/redis.spec.ts +++ b/packages/backend-core/src/redis/tests/redis.spec.ts @@ -1,7 +1,7 @@ import { GenericContainer, StartedTestContainer } from "testcontainers" import { generator, structures } from "../../../tests" import RedisWrapper, { closeAll } from "../redis" -import { env } from "../.." +import env from "../../environment" import { randomUUID } from "crypto" jest.setTimeout(30000) diff --git a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte index 98243c6e2f..1d66a0ba00 100644 --- a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte +++ b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte @@ -46,7 +46,7 @@ import { RowUtils } from "@budibase/frontend-core" import ServerBindingPanel from "components/common/bindings/ServerBindingPanel.svelte" import OptionsEditor from "./OptionsEditor.svelte" - import { isEnabled, TENANT_FEATURE_FLAGS } from "helpers/featureFlags" + import { isEnabled } from "helpers/featureFlags" const AUTO_TYPE = FieldType.AUTO const FORMULA_TYPE = FieldType.FORMULA @@ -168,8 +168,7 @@ $: canBeDisplay = canBeDisplayColumn(editableColumn.type) && !editableColumn.autocolumn $: canHaveDefault = - isEnabled(TENANT_FEATURE_FLAGS.DEFAULT_VALUES) && - canHaveDefaultColumn(editableColumn.type) + isEnabled("DEFAULT_VALUES") && canHaveDefaultColumn(editableColumn.type) $: canBeRequired = editableColumn?.type !== LINK_TYPE && !uneditable && diff --git a/packages/builder/src/components/common/HelpMenu.svelte b/packages/builder/src/components/common/HelpMenu.svelte index 0ce5ab9c8e..bba55e88dc 100644 --- a/packages/builder/src/components/common/HelpMenu.svelte +++ b/packages/builder/src/components/common/HelpMenu.svelte @@ -1,7 +1,6 @@ @@ -58,13 +58,13 @@ onConfirm={confirmScreenDetails} {onCancel} cancelText={"Back"} - disabled={!screenUrl || error || !touched} + disabled={!route || error || !touched} >
modal.confirm()}>
diff --git a/packages/builder/src/components/design/settings/controls/DataSourceSelect/DataSourceSelect.svelte b/packages/builder/src/components/design/settings/controls/DataSourceSelect/DataSourceSelect.svelte index 99b5ace847..410af53648 100644 --- a/packages/builder/src/components/design/settings/controls/DataSourceSelect/DataSourceSelect.svelte +++ b/packages/builder/src/components/design/settings/controls/DataSourceSelect/DataSourceSelect.svelte @@ -34,6 +34,7 @@ import ClientBindingPanel from "components/common/bindings/ClientBindingPanel.svelte" import DataSourceCategory from "components/design/settings/controls/DataSourceSelect/DataSourceCategory.svelte" import { API } from "api" + import { datasourceSelect as format } from "helpers/data/format" export let value = {} export let otherSources @@ -51,24 +52,15 @@ let modal $: text = value?.label ?? "Choose an option" - $: tables = $tablesStore.list.map(m => ({ - label: m.name, - tableId: m._id, - type: "table", - datasource: $datasources.list.find( - ds => ds._id === m.sourceId || m.datasourceId - ), - })) + $: tables = $tablesStore.list.map(table => + format.table(table, $datasources.list) + ) $: viewsV1 = $viewsStore.list.map(view => ({ ...view, label: view.name, type: "view", })) - $: viewsV2 = $viewsV2Store.list.map(view => ({ - ...view, - label: view.name, - type: "viewV2", - })) + $: viewsV2 = $viewsV2Store.list.map(format.viewV2) $: views = [...(viewsV1 || []), ...(viewsV2 || [])] $: queries = $queriesStore.list .filter(q => showAllQueries || q.queryVerb === "read" || q.readable) diff --git a/packages/builder/src/components/design/settings/controls/TableSelect.svelte b/packages/builder/src/components/design/settings/controls/TableSelect.svelte index 7b73d0a7cf..545110a8cc 100644 --- a/packages/builder/src/components/design/settings/controls/TableSelect.svelte +++ b/packages/builder/src/components/design/settings/controls/TableSelect.svelte @@ -2,24 +2,14 @@ import { Select } from "@budibase/bbui" import { createEventDispatcher, onMount } from "svelte" import { tables as tablesStore, viewsV2 } from "stores/builder" + import { tableSelect as format } from "helpers/data/format" export let value const dispatch = createEventDispatcher() - $: tables = $tablesStore.list.map(table => ({ - type: "table", - label: table.name, - tableId: table._id, - resourceId: table._id, - })) - $: views = $viewsV2.list.map(view => ({ - type: "viewV2", - id: view.id, - label: view.name, - tableId: view.tableId, - resourceId: view.id, - })) + $: tables = $tablesStore.list.map(format.table) + $: views = $viewsV2.list.map(format.viewV2) $: options = [...(tables || []), ...(views || [])] const onChange = e => { diff --git a/packages/builder/src/components/portal/licensing/LicensingOverlays.svelte b/packages/builder/src/components/portal/licensing/LicensingOverlays.svelte index cde7865638..ab80418b6e 100644 --- a/packages/builder/src/components/portal/licensing/LicensingOverlays.svelte +++ b/packages/builder/src/components/portal/licensing/LicensingOverlays.svelte @@ -7,7 +7,6 @@ import { ExpiringKeys } from "./constants" import { getBanners } from "./licensingBanners" import { banner } from "@budibase/bbui" - import { TENANT_FEATURE_FLAGS, isEnabled } from "helpers/featureFlags" const oneDayInSeconds = 86400 @@ -89,8 +88,7 @@ userLoaded && $licensing.usageMetrics && domLoaded && - !licensingLoaded && - isEnabled(TENANT_FEATURE_FLAGS.LICENSING) + !licensingLoaded ) { licensingLoaded = true queuedModals = processModals() diff --git a/packages/builder/src/helpers/data/format.js b/packages/builder/src/helpers/data/format.js new file mode 100644 index 0000000000..51b0f12566 --- /dev/null +++ b/packages/builder/src/helpers/data/format.js @@ -0,0 +1,31 @@ +export const datasourceSelect = { + table: (table, datasources) => ({ + label: table.name, + tableId: table._id, + type: "table", + datasource: datasources.find( + datasource => datasource._id === table.sourceId || table.datasourceId + ), + }), + viewV2: view => ({ + ...view, + label: view.name, + type: "viewV2", + }), +} + +export const tableSelect = { + table: table => ({ + type: "table", + label: table.name, + tableId: table._id, + resourceId: table._id, + }), + viewV2: view => ({ + type: "viewV2", + id: view.id, + label: view.name, + tableId: view.tableId, + resourceId: view.id, + }), +} diff --git a/packages/builder/src/helpers/featureFlags.js b/packages/builder/src/helpers/featureFlags.js index 824e3c3f3e..e9054e8a9c 100644 --- a/packages/builder/src/helpers/featureFlags.js +++ b/packages/builder/src/helpers/featureFlags.js @@ -1,14 +1,6 @@ import { auth } from "../stores/portal" import { get } from "svelte/store" -export const TENANT_FEATURE_FLAGS = { - LICENSING: "LICENSING", - USER_GROUPS: "USER_GROUPS", - ONBOARDING_TOUR: "ONBOARDING_TOUR", - GOOGLE_SHEETS: "GOOGLE_SHEETS", - DEFAULT_VALUES: "DEFAULT_VALUES", -} - export const isEnabled = featureFlag => { const user = get(auth).user return !!user?.flags?.[featureFlag] diff --git a/packages/builder/src/pages/builder/app/[application]/_layout.svelte b/packages/builder/src/pages/builder/app/[application]/_layout.svelte index cd62a97340..be8337b376 100644 --- a/packages/builder/src/pages/builder/app/[application]/_layout.svelte +++ b/packages/builder/src/pages/builder/app/[application]/_layout.svelte @@ -9,7 +9,6 @@ deploymentStore, } from "stores/builder" import { auth, appsStore } from "stores/portal" - import { TENANT_FEATURE_FLAGS, isEnabled } from "helpers/featureFlags" import { Icon, Tabs, @@ -90,16 +89,14 @@ const initTour = async () => { // Check if onboarding is enabled. - if (isEnabled(TENANT_FEATURE_FLAGS.ONBOARDING_TOUR)) { - if (!$auth.user?.onboardedAt) { - builderStore.startBuilderOnboarding() - } else { - // Feature tour date - const release_date = new Date("2023-03-01T00:00:00.000Z") - const onboarded = new Date($auth.user?.onboardedAt) - if (onboarded < release_date) { - builderStore.setTour(TOUR_KEYS.FEATURE_ONBOARDING) - } + if (!$auth.user?.onboardedAt) { + builderStore.startBuilderOnboarding() + } else { + // Feature tour date + const release_date = new Date("2023-03-01T00:00:00.000Z") + const onboarded = new Date($auth.user?.onboardedAt) + if (onboarded < release_date) { + builderStore.setTour(TOUR_KEYS.FEATURE_ONBOARDING) } } } diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/ScreenList/ScreenNavItem.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/ScreenList/ScreenNavItem.svelte index 2a0da6bac3..e533145fa1 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/ScreenList/ScreenNavItem.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/ScreenList/ScreenNavItem.svelte @@ -20,7 +20,7 @@ let confirmDeleteDialog let screenDetailsModal - const createDuplicateScreen = async ({ screenName, screenUrl }) => { + const createDuplicateScreen = async ({ route }) => { // Create a dupe and ensure it is unique let duplicateScreen = Helpers.cloneDeep(screen) delete duplicateScreen._id @@ -28,9 +28,8 @@ duplicateScreen.props = makeComponentUnique(duplicateScreen.props) // Attach the new name and URL - duplicateScreen.routing.route = sanitizeUrl(screenUrl) + duplicateScreen.routing.route = sanitizeUrl(route) duplicateScreen.routing.homeScreen = false - duplicateScreen.props._instanceName = screenName try { // Create the screen @@ -136,8 +135,8 @@ diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/CreateScreenModal.svelte b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/CreateScreenModal.svelte index 7c2775e054..554a2c80f5 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/CreateScreenModal.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/CreateScreenModal.svelte @@ -1,8 +1,9 @@ - - - - Select which datasources you would like to use to create your screens - - - {#each datasources as datasource} -
-
- -
{datasource.name}
-
- - {#each datasource.tablesAndViews as tableOrView} - {@const selected = selectedTablesAndViews.some( - selected => selected.id === tableOrView.id - )} - toggleSelection(tableOrView)} - {selected} - {tableOrView} - /> - {/each} + + + Select which datasources you would like to use to create your screens + + + {#each datasources as datasource} +
+
+ +

{datasource.name}

- {/each} - - - + + {#each datasource.tablesAndViews as tableOrView} + {@const selected = selectedTablesAndViews.some( + selected => selected.id === tableOrView.id + )} + toggleSelection(tableOrView)} + {selected} + {tableOrView} + /> + {/each} +
+ {/each} +
+
diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/FormTypeModal.svelte b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/FormTypeModal.svelte deleted file mode 100644 index b7108fd9aa..0000000000 --- a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/FormTypeModal.svelte +++ /dev/null @@ -1,115 +0,0 @@ - - - - onConfirm(type)} - {onCancel} - disabled={!type} - size="L" - > - - - -
(type = "Create")} - > -
-
- Create a new row - - For capturing and storing new data from your users - -
- {#if type === "Create"} - - - - {/if} -
-
-
(type = "Update")} - > -
-
- Update an existing row - For viewing and updating existing data -
- {#if type === "Update"} - - - - {/if} -
-
-
(type = "View")} - > -
-
- View an existing row - For a read only view of your data -
- {#if type === "View"} - - - - {/if} -
-
-
-
-
- - diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/TableOrViewOption.svelte b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/TableOrViewOption.svelte index b0b9f3dfc1..47a4a834ff 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/TableOrViewOption.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/TableOrViewOption.svelte @@ -1,49 +1,14 @@
-
- - {tableOrView.name} -
- -
- -
- read - -
-
- -
- write - -
-
-
+ + {tableOrView.name}
diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/TypeModal.svelte b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/TypeModal.svelte new file mode 100644 index 0000000000..045e3000e7 --- /dev/null +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/TypeModal.svelte @@ -0,0 +1,82 @@ + + + onConfirm(selectedType)} + {onCancel} + disabled={!selectedType} + size="L" +> + + + + {#each types as type} +
(selectedType = type.id)} + > +
+ {type.img.alt} +
+
+ {type.title} + {type.description} +
+
+ {/each} +
+
+ + diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/formTypes.js b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/formTypes.js new file mode 100644 index 0000000000..c1e0d93f5a --- /dev/null +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/formTypes.js @@ -0,0 +1,35 @@ +import formView from "./images/formView.svg" +import formUpdate from "./images/formUpdate.svg" +import formCreate from "./images/formCreate.svg" + +const tableTypes = [ + { + id: "create", + img: { + alt: "A form containing new data", + src: formCreate, + }, + title: "Create a new row", + description: "For capturing and storing new data from your users", + }, + { + id: "update", + img: { + alt: "A form containing edited data", + src: formUpdate, + }, + title: "Update an existing row", + description: "For viewing and updating existing data", + }, + { + id: "view", + img: { + alt: "A form containing read-only data", + src: formView, + }, + title: "View an existing row", + description: "For a read only view of your data", + }, +] + +export default tableTypes diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/blank.png b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/blank.png deleted file mode 100644 index 4867cc8dc3..0000000000 Binary files a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/blank.png and /dev/null differ diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/blank.svg b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/blank.svg new file mode 100644 index 0000000000..6a225a3271 --- /dev/null +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/blank.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/form.png b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/form.png deleted file mode 100644 index cb9b57d23b..0000000000 Binary files a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/form.png and /dev/null differ diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/formCreate.svg b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/formCreate.svg new file mode 100644 index 0000000000..d8d0220142 --- /dev/null +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/formCreate.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/formUpdate.svg b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/formUpdate.svg new file mode 100644 index 0000000000..674dbb12cc --- /dev/null +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/formUpdate.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/formView.svg b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/formView.svg new file mode 100644 index 0000000000..0b65846b16 --- /dev/null +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/formView.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/grid.png b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/grid.png deleted file mode 100644 index c3efa30a67..0000000000 Binary files a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/grid.png and /dev/null differ diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/table.png b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/table.png deleted file mode 100644 index 0bfda10bbe..0000000000 Binary files a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/table.png and /dev/null differ diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableDetails.png b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableDetails.png deleted file mode 100644 index f67495f3aa..0000000000 Binary files a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableDetails.png and /dev/null differ diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableInline.png b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableInline.png deleted file mode 100644 index 905294a9ae..0000000000 Binary files a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableInline.png and /dev/null differ diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableInline.svg b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableInline.svg new file mode 100644 index 0000000000..d2d2fb8134 --- /dev/null +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableInline.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableModal.svg b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableModal.svg new file mode 100644 index 0000000000..a638c0eec8 --- /dev/null +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableModal.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableNewScreen.svg b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableNewScreen.svg new file mode 100644 index 0000000000..462ddfc4a2 --- /dev/null +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableNewScreen.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableSidePanel.svg b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableSidePanel.svg new file mode 100644 index 0000000000..c590f1ab70 --- /dev/null +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableSidePanel.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/index.svelte b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/index.svelte index ef07b277ef..3101ce41ea 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/index.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/index.svelte @@ -1,10 +1,9 @@ -{#if isEnabled(TENANT_FEATURE_FLAGS.LICENSING) && !$licensing.isEnterprisePlan && !$licensing.isEnterpriseTrial} +{#if !$licensing.isEnterprisePlan && !$licensing.isEnterpriseTrial} {#if $admin.cloud && $auth?.user?.accountPortalAccess}