diff --git a/.github/workflows/cypress-platform.yml b/.github/workflows/cypress-platform.yml index 6c91a3f420..2577580715 100644 --- a/.github/workflows/cypress-platform.yml +++ b/.github/workflows/cypress-platform.yml @@ -59,7 +59,7 @@ jobs: echo "TOOLJET_DB_HOST=localhost" >> .env echo "TOOLJET_DB_PASS=postgres" >> .env echo "PGRST_JWT_SECRET=r9iMKoe5CRMgvJBBtp4HrqN7QiPpUToj" >> .env - echo "ENABLE_ONBOARDING_QUESTIONS_FOR_ALL_SIGN_UPS=true" >> .env + echo "ENABLE_ONBOARDING_QUESTIONS_FOR_ALL_SIGN_UPS=false" >> .env echo "PGRST_HOST=localhost:3001" >> .env echo "SSO_GIT_OAUTH2_CLIENT_ID=dummy" >> .env echo "SSO_GIT_OAUTH2_CLIENT_SECRET=dummy" >> .env @@ -153,8 +153,26 @@ jobs: - name: use mybuilder buildx run: docker buildx use mybuilder - - name: Build docker image - run: docker buildx build --platform=linux/amd64 -f docker/production.Dockerfile . -t tooljet/tj-osv:cypressplaform + - name: Docker Login + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Set SAFE_BRANCH_NAME + run: echo "SAFE_BRANCH_NAME=$(echo ${{ env.BRANCH_NAME }} | tr '/' '-')" >> $GITHUB_ENV + + - name: Build and Push Docker image + uses: docker/build-push-action@v4 + with: + context: . + file: docker/production.Dockerfile + push: true + tags: tooljet/tj-osv:${{ env.SAFE_BRANCH_NAME }} + platforms: linux/amd64 + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - name: Set up environment variables run: | @@ -174,7 +192,7 @@ jobs: echo "PGRST_JWT_SECRET=r9iMKoe5CRMgvJBBtp4HrqN7QiPpUToj" >> .env echo "PGRST_HOST=postgrest" >> .env echo "PGRST_DB_URI=postgres://postgres:postgres@postgres/tooljet_db" >> .env - echo "ENABLE_ONBOARDING_QUESTIONS_FOR_ALL_SIGN_UPS=true" >> .env + echo "ENABLE_ONBOARDING_QUESTIONS_FOR_ALL_SIGN_UPS=false" >> .env echo "SSO_GIT_OAUTH2_CLIENT_ID=dummy" >> .env echo "SSO_GIT_OAUTH2_CLIENT_SECRET=dummy" >> .env echo "SSO_GIT_OAUTH2_HOST=dummy" >> .env @@ -188,6 +206,16 @@ jobs: - name: Pulling the docker-compose file run: curl -LO https://tooljet-test.s3.us-west-1.amazonaws.com/docker-compose.yaml && mkdir postgres_data + - name: Update docker-compose file + run: | + # Update docker-compose.yaml with the new image + sed -i '/^[[:space:]]*tooljet:/,/^$/ s|^\([[:space:]]*image:[[:space:]]*\).*|\1tooljet/tj-osv:${{ env.SAFE_BRANCH_NAME }}|' docker-compose.yaml + + - name: Install Docker Compose + run: | + curl -L "https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + chmod +x /usr/local/bin/docker-compose + - name: Run docker-compose file run: docker-compose up -d @@ -200,7 +228,7 @@ jobs: - name: Wait for the server to be ready run: | timeout 1500 bash -c ' - until curl --silent --fail http://localhost:80/apps/tooljet/; do + until curl --silent --fail http://localhost:3000/apps/tooljet/; do sleep 5 done' @@ -212,14 +240,14 @@ jobs: uses: jsdaniell/create-json@1.1.2 with: name: "cypress.env.json" - json: ${{ secrets.CYPRESS_SECRETS }} + json: ${{ secrets.CYPRESS_SECRETS_SUBPATH }} dir: "./cypress-tests" - name: Platform-subpath uses: cypress-io/github-action@v5 with: working-directory: ./cypress-tests - config: "baseUrl=http://localhost:80/apps/tooljet/" + config: "baseUrl=http://localhost:3000/apps/tooljet/" config-file: cypress-workspace.config.js - name: Capture Screenshots diff --git a/.version b/.version index a35c54823f..49b32b2c1c 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -3.0.5-ce +3.1.1-ce diff --git a/cypress-tests/cypress.config.js b/cypress-tests/cypress.config.js index 3ec3595644..3cb0aeac23 100644 --- a/cypress-tests/cypress.config.js +++ b/cypress-tests/cypress.config.js @@ -82,7 +82,7 @@ module.exports = defineConfig({ experimentalModfyObstructiveThirdPartyCode: true, experimentalRunAllSpecs: true, baseUrl: "http://localhost:8082", - specPattern: "cypress/e2e/happyPath/platform/commonTestcases/**/*.cy.js", + specPattern: "cypress/e2e/happyPath/**/*.cy.js", downloadsFolder: "cypress/downloads", numTestsKeptInMemory: 0, redirectionLimit: 10, diff --git a/cypress-tests/cypress/commands/apiCommands.js b/cypress-tests/cypress/commands/apiCommands.js index 5c712323d2..b574ddb4aa 100644 --- a/cypress-tests/cypress/commands/apiCommands.js +++ b/cypress-tests/cypress/commands/apiCommands.js @@ -7,7 +7,7 @@ Cypress.Commands.add( redirection = "/" ) => { cy.request({ - url: `http://localhost:3000/api/authenticate/${workspaceId}`, + url: `${Cypress.env("server_host")}/api/authenticate/${workspaceId}`, method: "POST", body: { email: userEmail, @@ -69,7 +69,7 @@ Cypress.Commands.add("apiCreateApp", (appName = "testApp") => { Cypress.env("authToken", `tj_auth_token=${cookie.value}`); cy.request({ method: "POST", - url: "http://localhost:3000/api/apps", + url: `${Cypress.env("server_host")}/api/apps`, headers: { "Tj-Workspace-Id": Cypress.env("workspaceId"), Cookie: `tj_auth_token = ${cookie.value}`, @@ -103,7 +103,7 @@ Cypress.Commands.add("apiDeleteApp", (appId = Cypress.env("appId")) => { cy.request( { method: "DELETE", - url: `http://localhost:3000/api/apps/${Cypress.env("appId")}`, + url: `${Cypress.env("server_host")}/api/apps/${Cypress.env("appId")}`, headers: { "Tj-Workspace-Id": Cypress.env("workspaceId"), Cookie: Cypress.env("authToken"), @@ -122,15 +122,26 @@ Cypress.Commands.add("apiDeleteApp", (appId = Cypress.env("appId")) => { Cypress.Commands.add( "openApp", - ( + (slug = '', workspaceId = Cypress.env("workspaceId"), appId = Cypress.env("appId"), componentSelector = "[data-cy='empty-editor-text']" ) => { + cy.intercept('GET', '/api/v2/apps/*').as('getAppData'); cy.window({ log: false }).then((win) => { win.localStorage.setItem("walkthroughCompleted", "true"); }); - cy.visit(`/${workspaceId}/apps/${appId}`); + cy.visit(`/${workspaceId}/apps/${appId}${slug}`); + cy.wait('@getAppData').then((interception) => { + // Assuming the response body is a JSON object + const responseData = interception.response.body; + + // Set the response data as an environment variable + Cypress.env('apiResponseData', responseData); + + // You can log it to check if the env var is set correctly + cy.log(Cypress.env('apiResponseData')); + }); cy.get(componentSelector, { timeout: 10000 }); } ); @@ -140,7 +151,7 @@ Cypress.Commands.add("apiCreateWorkspace", (workspaceName, workspaceSlug) => { cy.request( { method: "POST", - url: "http://localhost:3000/api/organizations", + url: `${Cypress.env("server_host")}/api/organizations`, headers: { "Tj-Workspace-Id": Cypress.env("workspaceId"), Cookie: `tj_auth_token=${cookie.value}`, @@ -162,7 +173,7 @@ Cypress.Commands.add("logoutApi", () => { cy.request( { method: "GET", - url: "http://localhost:3000/api/logout", + url: `${Cypress.env("server_host")}/api/logout`, headers: { "Tj-Workspace-Id": Cypress.env("workspaceId"), Cookie: `tj_auth_token=${cookie.value}`, @@ -180,7 +191,7 @@ Cypress.Commands.add("userInviteApi", (userName, userEmail) => { cy.request( { method: "POST", - url: "http://localhost:3000/api/organization_users", + url: `${Cypress.env("server_host")}/api/organization_users`, headers: { "Tj-Workspace-Id": Cypress.env("workspaceId"), Cookie: `tj_auth_token=${cookie.value}`, @@ -207,7 +218,7 @@ Cypress.Commands.add("addQueryApi", (queryName, query, dataQueryId) => { }; cy.request({ method: "PATCH", - url: `http://localhost:3000/api/data_queries/${dataQueryId}`, + url: `${Cypress.env("server_host")}/api/data_queries/${dataQueryId}`, headers: headers, body: { name: queryName, @@ -234,7 +245,7 @@ Cypress.Commands.add( cy.request({ method: "GET", - url: `http://localhost:3000/api/apps/${appId}`, + url: `${Cypress.env("server_host")}/api/apps/${appId}`, headers: { "Tj-Workspace-Id": workspaceId, Cookie: `${authToken}; app_id=${appId}`, @@ -246,7 +257,7 @@ Cypress.Commands.add( cy.request({ method: "POST", - url: "http://localhost:3000/api/data_queries", + url: `${Cypress.env("server_host")}/api/data_queries`, headers: { "Content-Type": "application/json", Cookie: authToken, @@ -273,3 +284,73 @@ Cypress.Commands.add( }); } ); + + +Cypress.Commands.add("addComponentToApp", (appName, componentName, layoutConfig = {}) => { + cy.task("updateId", { + dbconfig: Cypress.env("app_db"), + sql: `select id from apps where name='${appName}';`, + }).then((resp) => { + const appId = resp.rows[0]?.id; // Safely access the id field + + if (!appId) { + throw new Error(`App ID not found for appName: ${appName}`); + } + + // Default layout values + const defaultLayout = { + desktop: { top: 90, left: 9, width: 6, height: 40 }, + mobile: { top: 90, left: 9, width: 6, height: 40 }, + }; + + // Merge default layout with the provided configuration + const layouts = { + desktop: { ...defaultLayout.desktop, ...layoutConfig.desktop }, + mobile: { ...defaultLayout.mobile, ...layoutConfig.mobile }, + }; + + cy.getCookie("tj_auth_token", { log: false }).then((cookie) => { + Cypress.env("authToken", `tj_auth_token=${cookie.value}`); + + cy.request({ + method: "GET", + url: `${Cypress.env("server_host")}/api/v2/apps/${appId}`, + headers: { + "Tj-Workspace-Id": Cypress.env("workspaceId"), + Cookie: `tj_auth_token=${cookie.value}`, + }, + }).then((response) => { + expect(response.status).to.eq(200); + + const { id: editingVersionId, home_page_id: homePageId } = response.body.editing_version; + const componentId = crypto.randomUUID ? crypto.randomUUID() : require("uuid").v4(); + + const requestBody = { + is_user_switched_version: false, + pageId: homePageId, + diff: { + [componentId]: { + name: componentName, + layouts: layouts, + type: "Text", + }, + }, + }; + + cy.request({ + method: "POST", + url: `${Cypress.env("server_host")}/api/v2/apps/${appId}/versions/${editingVersionId}/components`, + headers: { + "Content-Type": "application/json", + "Tj-Workspace-Id": Cypress.env("workspaceId"), + Cookie: `tj_auth_token=${cookie.value}`, + }, + body: requestBody, + }).then((postResponse) => { + expect(postResponse.status).to.eq(201); + cy.log(`Component ${componentId} added successfully`); + }); + }); + }); + }); +}); diff --git a/cypress-tests/cypress/commands/commands.js b/cypress-tests/cypress/commands/commands.js index 72914c8fa6..31c0df012d 100644 --- a/cypress-tests/cypress/commands/commands.js +++ b/cypress-tests/cypress/commands/commands.js @@ -5,16 +5,21 @@ import { commonText, createBackspaceText } from "Texts/common"; import { passwordInputText } from "Texts/passwordInput"; import { importSelectors } from "Selectors/exportImport"; import { importText } from "Texts/exportImport"; +import { onboardingSelectors } from "Selectors/onboarding"; Cypress.Commands.add( - "login", + "appUILogin", (email = "dev@tooljet.io", password = "password") => { cy.visit("/"); - cy.clearAndType(commonSelectors.workEmailInputField, email); - cy.clearAndType(commonSelectors.passwordInputField, password); - cy.get(commonSelectors.signInButton).click(); - cy.wait(2000); - cy.get(commonSelectors.homePageLogo).should("be.visible"); + cy.wait(3000); + cy.clearAndType(onboardingSelectors.loginEmailInput, email); + cy.clearAndType(onboardingSelectors.loginPasswordInput, password); + cy.get(onboardingSelectors.signInButton).click(); + + cy.intercept("GET", "/api/library_apps/").as("library_apps"); + cy.get(commonSelectors.homePageLogo, { timeout: 10000 }); + cy.wait("@library_apps"); + } ); @@ -69,7 +74,7 @@ Cypress.Commands.add( "dragAndDropWidget", ( widgetName, - positionX = 190, + positionX = 80, positionY = 80, widgetName2 = widgetName, canvas = commonSelectors.canvas @@ -90,51 +95,48 @@ Cypress.Commands.add( } ); -Cypress.Commands.add("appUILogin", () => { - cy.visit("/"); - cy.clearAndType(commonSelectors.workEmailInputField, "dev@tooljet.io"); - cy.clearAndType(commonSelectors.passwordInputField, "password"); - cy.get(commonSelectors.signInButton).click(); - cy.wait(2000); - cy.get(commonSelectors.homePageLogo).should("be.visible"); -}); -Cypress.Commands.add( - "clearAndTypeOnCodeMirror", - { - prevSubject: "optional", - }, - (subject, value) => { - cy.wrap(subject) - .realClick() - .find("pre.CodeMirror-line") - .invoke("text") - .then((text) => { - cy - .wrap(subject) - .last() - .click() - .type(createBackspaceText(text), { delay: 0 }), - { - delay: 0, - }; - }); - if (!Array.isArray(value)) { - cy.wrap(subject).last().type(value, { - parseSpecialCharSequences: false, - delay: 0, - }); - } else { +Cypress.Commands.add("clearAndTypeOnCodeMirror", { prevSubject: "optional" }, (subject, value) => { + cy.wrap(subject) + .realClick() + .find(".cm-line") + .invoke("text") + .then((text) => { cy.wrap(subject) .last() - .type(value[1], { - parseSpecialCharSequences: false, - delay: 0, - }) - .type(`{home}${value[0]}`, { delay: 0 }); - } + .click() + .type(createBackspaceText(text), { delay: 0 }); + }); + + const splitIntoFlatArray = (value) => { + const regex = /(\{\{)|([^{}]+)|(\}\})/g; + let prefix = ""; + return value.match(regex)?.reduce((acc, part) => { + if (part === "{{") { + prefix = "{leftarrow}{leftarrow}"; + acc.push(part); // Keep '{{' as is + } else if (part === "}}") { + // Skip '}}' + } else { + acc.push(prefix + part); // Add prefix to any other part, including spaces + prefix = ""; // Reset prefix + } + return acc; + }, []) || []; + }; + + if (Array.isArray(value)) { + cy.wrap(subject).last().realType(value, { parseSpecialCharSequences: false, delay: 0, force: true }); + } else { + splitIntoFlatArray(value).forEach((i) => { + cy.wrap(subject) + .last() + .click() + .realType(`{end}{end}{end}{end}{end}{end}{end}{end}{end}{end}{end}{end}{end}{end}{end}{end}{end}{end}{end}{end}${i}`, { parseSpecialCharSequences: false, delay: 0, force: true }); + }); } -); +}); + Cypress.Commands.add("deleteApp", (appName) => { cy.intercept("DELETE", "/api/apps/*").as("appDeleted"); @@ -189,7 +191,7 @@ Cypress.Commands.add( (subject, value) => { cy.wrap(subject) .realClick() - .find("pre.CodeMirror-line") + .find(".cm-line") .invoke("text") .then((text) => { cy.wrap(subject).realType(createBackspaceText(text)), @@ -365,7 +367,7 @@ Cypress.Commands.add("getPosition", (componentName) => { Cypress.Commands.add("defaultWorkspaceLogin", () => { cy.apiLogin(); - cy.intercept("GET", "http://localhost:3000/api/library_apps").as( + cy.intercept("GET", "/api/library_apps").as( "library_apps" ); cy.visit("/my-workspace"); @@ -468,3 +470,12 @@ Cypress.Commands.add("appPrivacy", (appName, isPublic) => { sql: `UPDATE apps SET is_public = ${isPublicValue} WHERE name = '${appName}';`, }); }); + +Cypress.Commands.overwrite('intercept', (originalFn, method, endpoint, mockData) => { + const isSubpath = Cypress.config('baseUrl')?.includes('/apps/tooljet'); + const cleanEndpoint = endpoint.replace('/apps/tooljet', ''); + const fullUrl = isSubpath ? `/apps/tooljet${cleanEndpoint}` : cleanEndpoint; + + return originalFn(method, fullUrl, mockData); +}); + diff --git a/cypress-tests/cypress/constants/selectors/common.js b/cypress-tests/cypress/constants/selectors/common.js index e9b118fa11..198fc3db9b 100644 --- a/cypress-tests/cypress/constants/selectors/common.js +++ b/cypress-tests/cypress/constants/selectors/common.js @@ -5,10 +5,10 @@ export const cyParamName = (paramName = "") => { export const commonSelectors = { toastMessage: ".go3958317564", oldToastMessage: ".go318386747", - newToastMessage: - '.drawer-container > [style="position: fixed; z-index: 9999; inset: 16px; pointer-events: none;"] > .go4109123758 > .go2072408551', + newToastMessage: '.drawer-container > [style="position: fixed; z-index: 9999; inset: 16px; pointer-events: none;"] > .go4109123758 > .go2072408551 > .go3958317564', toastCloseButton: '[data-cy="toast-close-button"]', editButton: "[data-cy=edit-button]", + fileSelector: "[data-cy=uploaded-file-data]", searchField: "[data-cy='widget-search-box-search-bar']", firstWidget: "[data-cy=widget-list]:eq(0)", canvas: "[data-cy=real-canvas]", @@ -21,9 +21,9 @@ export const commonSelectors = { workEmailLabel: '[data-cy="work-email-label"]', workEmailInputField: "[data-cy=work-email-input]", emailInputError: '[data-cy="email-error-message"]', - passwordLabel: '[data-cy="password-label"]', + passwordLabel: '[data-cy="password-input-label"]', forgotPasswordLink: '[data-cy="forgot-password-link"]', - passwordInputField: '[data-cy="password-input-field"]', + passwordInputField: '[data-cy="password-input-input"]', signInButton: "[data-cy=login-button]", loginButton: '[data-cy="login-button"]', dropdown: "[data-cy=workspace-dropdown]", @@ -63,20 +63,21 @@ export const commonSelectors = { workspaceLoginUrl: "[data-cy=workspace-login-url]", workspaceName: '[data-cy="workspace-name"]:eq(0)', signInHeader: '[data-cy="sign-in-header"]', - signInSubHeader: '[data-cy="sign-in-sub-header"]', + signInSubHeader: '[data-cy="signup-info"]', createAnAccountLink: '[data-cy="create-an-account-link"]', - SignUpSectionHeader: '[data-cy="signup-section-header"]', + signUpSectionHeader: '[data-cy="sign-up-header"]', signInRedirectText: '[data-cy="signin-redirect-text"]', - signInRedirectLink: '[data-cy="signin-redirect-link"]', + signInRedirectLink: '[data-cy="signin-link"]', signUpTermsHelperText: '[data-cy="signup-terms-helper"]', termsOfServiceLink: '[data-cy="terms-of-service-link"]', privacyPolicyLink: '[data-cy="privacy-policy-link"]', redirectURL: '[data-cy="redirect-url"]', - invitePageHeader: '[data-cy="invite-page-header"]', - invitePageSubHeader: '[data-cy="invite-page-sub-header"]', + invitePageHeader: '[data-cy="join-my-workspace-header"]', + invitePageSubHeader: '[data-cy="onboarding-page-description"]', userNameInputLabel: '[data-cy="name-input-label"]', - invitedUserName: '[data-cy="invited-user-name"]', - invitedUserEmail: '[data-cy="invited-user-email"]', + invitedUserName: '[data-cy="name-input-input-value"]', + invitedUserEmail: '[data-cy="email-input-value"]', + invitedUseremail: '[data-cy="email-input-input-value"]', acceptInviteButton: '[data-cy="accept-invite-button"]', databaseIcon: '[data-cy="icon-database"]', profileSettings: '[data-cy="profile-settings"]', @@ -108,6 +109,9 @@ export const commonSelectors = { exportAllButton: '[data-cy="export-all-button"]', avatarImage: '[data-cy="avatar-image"]', selfHostSetUpBanner: '[data-cy="setup-banner-inner"]', + HostBanner: '[data-cy="onboarding-image"]', + adminSetup: '[data-cy="set-up-your-admin-account-header"]', + signupTerms: '[data-cy="signup-terms-helper"]', selfHostSetUpSubBanner: '[data-cy="setup-sub-banner"]', selfHostSetUpCard: '[data-cy="setup-card"]', selfHostSetUpCardImage: '[data-cy="setup-card-image"]', @@ -115,52 +119,59 @@ export const commonSelectors = { selfHostSetUpCardSubHeader: '[data-cy="setup-card-sub-header"]', setUpToolJetButton: '[data-cy="setup-tooljet-button"]', setUpadminCheckPoint: '[data-cy="set-up-admin-check-point"]', - setUpworkspaceCheckPoint: '[data-cy="set-up-workspace-check-point"]', + setUpworkspaceCheckPoint: '[data-cy="set-up-your-workspace!-header"]', companyProfileCheckPoint: '[data-cy="company-profile-check-point"]', onboardingPageHeader: '[data-cy="onboarding-page-header"]', onboardingPageSubHeader: '[data-cy="onboarding-page-sub-header"]', onboardingPageDescription: '[data-cy="onboarding-page-description"]', - passwordHelperText: '[data-cy="password-helper-text"]', + passwordHelperText: '[data-cy="new-password-input-hint"]', continueButton: '[data-cy="continue-button"]', + passwordHelperTextSignup: '[data-cy="password-input-hint"]', + continueButton: '[data-cy="sign-up-button"]', + OnbordingContinue: '[data-cy="onboarding-submit-button"]', userAccountNameAvatar: '[data-cy="user-account-name-avatar"]', - workspaceNameInputLabel: '[data-cy="workspace-name-input-label"]', - workspaceNameInputField: '[data-cy="workspace-name-input-field"]', + workspaceNameInputLabel: '[data-cy="onboarding-workspace-name-label"]', + workspaceNameInputField: '[data-cy="onboarding-workspace-name-input"]', backArrow: '[data-cy="back-arrow"]', backArrowText: '[data-cy="back-arrow-text"]', onboardingPorgressBubble: '[data-cy="onboarding-progress-bubbles"]', skipArrow: '[data-cy="skip-button"]', skipArrowText: '[data-cy="skip-arrow-text"]', companyNameInputField: '[data-cy="company-name-input-field"]', - nameInputField: '[data-cy="name-input-field"]', - emailInputField: '[data-cy="email-input-field"]', + nameInputField: '[data-cy="name-input-input"]', + emailInputField: '[data-cy="email-input-input"]', + skipbutton: '[class="driver-close-btn"]', + backLogo: '[data-cy="editor-page-logo"]', + backtoapps: '[data-cy="back-to-app-option"]', signUpButton: '[data-cy="sign-up-button"]', emailImage: '[data-cy="email-image"]', - spamMessage: '[data-cy="email-page-spam-msg"]', - resendEmailButton: '[data-cy="resend-email-button"]', + spamMessage: '[data-cy="info-message"]', + resendEmailButton: '[data-cy="resend-verification-email-button"]', editEmailButton: '[data-cy="edit-email-button"]', createAccountCheckMark: '[data-cy="create-account-check-mark"]', createAccountCheckPoint: '[data-cy="create-account-check-point"]', verifyEmailCheckMark: '[data-cy="verify-email-check-mark"]', verifyEmailCheckPoint: '[data-cy="verify-email-check-point"]', backtoSignUpButton: '[data-cy="back-to-signup-button"]', - forgotPasswordPageHeader: '[data-cy="forgot-password-page-header"]', - forgotPasswordPageSubHeader: '[data-cy="forgot-password-sub-header"]', - resetPasswordLinkButton: '[data-cy="reset-password-link"]', + forgotPasswordPageHeader: '[data-cy="forgot-password-header"]', + forgotPasswordPageSubHeader: '[data-cy="signup-redirect-text"]', + resetPasswordLinkButton: '[data-cy="send-a-reset-link-button"]', enterIcon: '[data-cy="enter-icon"]', - passwordResetPageHeader: '[data-cy="reset-password-page-header"]', + passwordResetPageHeader: '[data-cy="reset-password-header"]', newPasswordInputLabel: '[data-cy="new-password-input-label"]', - newPasswordInputField: '[data-cy="new-password-input-field"]', + newPasswordInputField: '[data-cy="new-password-input-input"]', confirmPasswordInputFieldLabel: '[data-cy="confirm-password-input-label"]', - confirmPasswordInputField: '[data-cy="confirm-password-input-field"]', + confirmPasswordInputField: '[data-cy="confirm-password-input-input"]', resetPasswordButton: '[data-cy="reset-password-button"]', resetPasswordPageDescription: '[data-cy="reset-password-page-description"]', - backToLoginButton: '[data-cy="back-to-login-button"]', + backToLoginButton: '[data-cy="back-to-login"]', breadcrumbTitle: '[data-cy="app-header-label"]>>', + // breadcrumbPageTitle: '[data-cy="app-header-label"]', breadcrumbPageTitle: '[data-cy="breadcrumb-page-title"]', - labelFullNameInput: '[data-cy="label-full-name-input-field"]', - inputFieldFullName: '[data-cy="input-field-full-name"]', - labelEmailInput: '[data-cy="label-email-input-field"]', - inputFieldEmailAddress: '[data-cy="input-field-email"]', + labelFullNameInput: '[data-cy="name-label"]', + inputFieldFullName: '[data-cy="name-input"]', + labelEmailInput: '[data-cy="email-label"]', + inputFieldEmailAddress: '[data-cy="email-input"]', closeButton: '[data-cy="close-button"]', emptyAppCreateButton: "[data-cy='button-new-app-from-scratch']", globalDataSourceIcon: '[data-cy="icon-global-datasources"]', @@ -212,7 +223,7 @@ export const commonSelectors = { return `[data-cy="${cyParamName(folderName)}-edit-folder-option"]`; }, inspectorPinIcon: '.d-flex > [data-cy="left-sidebar-inspector"]', - groupInputFieldLabel: '[data-cy="label-group-input-field"]', + groupInputFieldLabel: '[data-cy="user-group-label"]', pageSectionHeader: '[data-cy="dashboard-section-header"]', yesButton: '[data-cy="yes-button"]', @@ -262,7 +273,7 @@ export const commonSelectors = { export const commonWidgetSelector = { widgetBox: (widgetName) => { - return `[data-cy=widget-list-box-${cyParamName(widgetName)}]`; + return `[data-cy=widget-list-box-${cyParamName(widgetName)}]:eq(0)`; }, draggableWidget: (widgetName) => { diff --git a/cypress-tests/cypress/constants/selectors/dashboard.js b/cypress-tests/cypress/constants/selectors/dashboard.js index e9b2876008..d643ad8e51 100644 --- a/cypress-tests/cypress/constants/selectors/dashboard.js +++ b/cypress-tests/cypress/constants/selectors/dashboard.js @@ -16,7 +16,7 @@ export const dashboardSelector = { ManageSSO: "[data-cy=manage-sso]", userMenu: "[data-cy=user-menu]", profileLink: "[data-cy=profile-link]", - logoutLink: "[data-cy=logout-link]", + logoutLink: '[data-cy="logout-link"]', changeIconTitle: "[data-cy=change-icon-title]", appCardDefaultIcon: "[data-cy=app-card-apps-icon]", changeButton: "[data-cy=change-button]", diff --git a/cypress-tests/cypress/constants/selectors/manageSSO.js b/cypress-tests/cypress/constants/selectors/manageSSO.js index 1d2f48189a..a18883be69 100644 --- a/cypress-tests/cypress/constants/selectors/manageSSO.js +++ b/cypress-tests/cypress/constants/selectors/manageSSO.js @@ -32,8 +32,8 @@ export const ssoSelector = { redirectUrlLabel: "[data-cy=redirect-url-label]", redirectUrl: "[data-cy=redirect-url]", googleTile: '[data-cy="google-sign-in-text"]', - googleIcon: "[data-cy=google-sso-icon]", - googleSSOText: "[data-cy=google-sso-text]", + googleIcon: "[data-cy=google-sso-button]", + googleSSOText: "[data-cy=google-sso-button-text]", git: '[data-cy="github-sso-card"]', gitEnableToggle: '[data-cy="github-toggle-input"]', githubLabel: '[data-cy="github-label"]', @@ -41,9 +41,9 @@ export const ssoSelector = { encriptedLabel: "[data-cy=encripted-label]", clientSecretInput: "[data-cy=client-secret-input]", gitTile: "[data-cy=git-tile]", - gitIcon: "[data-cy=git-sso-icon]", - gitSignInText: "[data-cy=git-sso-text]", - gitSSOText: "[data-cy=git-sso-text]", + gitIcon: "[data-cy='git-sso-button-text']", + gitSignInText: "[data-cy='git-sso-button-text']", + gitSSOText: "[data-cy=git-sso-button-text]", password: "[data-cy=left-menu-items] :eq(3)", passwordEnableToggle: '[data-cy="password-enable-toggle"]', loginHelpText: "[data-cy=login-help-text]", diff --git a/cypress-tests/cypress/constants/selectors/manageUsers.js b/cypress-tests/cypress/constants/selectors/manageUsers.js index 4982e2d37d..f42254f4c4 100644 --- a/cypress-tests/cypress/constants/selectors/manageUsers.js +++ b/cypress-tests/cypress/constants/selectors/manageUsers.js @@ -62,10 +62,8 @@ export const usersSelector = { inputFieldBulkUpload: '[data-cy="input-field-bulk-upload"]', copyInvitationLink: '[data-cy="copy-invitation-link"]', uploadedFileData: '[data-cy="uploaded-file-data"]', - toastCloseButton: - '.drawer-container > [style="position: fixed; z-index: 9999; inset: 16px; pointer-events: none;"] > .go4109123758 > .go2072408551 > [data-cy="toast-close-button"]', - - + modalClose: '.tj-base-btn.tj-large-btn.tj-primary-btn.close-btn', + toastCloseButton:'.drawer-container > [style="position: fixed; z-index: 9999; inset: 16px; pointer-events: none;"] > .go4109123758 > .go2072408551 > [data-cy="toast-close-button"]', userName: (userName) => { return `[data-cy="${cyParamName(userName)}-user-name"]`; }, diff --git a/cypress-tests/cypress/constants/selectors/onboarding.js b/cypress-tests/cypress/constants/selectors/onboarding.js new file mode 100644 index 0000000000..1f43250c3f --- /dev/null +++ b/cypress-tests/cypress/constants/selectors/onboarding.js @@ -0,0 +1,20 @@ +export const cyParamName = (paramName = "") => { + return paramName.toLowerCase().replace(/\s+/g, "-"); +}; + +export const onboardingSelectors = { + emailLabel: "[data-cy='email-label']", + emailInput: "[data-cy='email-input-input']", + signupEmailInput: "[data-cy='email-input']", + loginEmailInput: "[data-cy='email-input']", + passwordLabel: "[data-cy='password-label']", + passwordInput: "[data-cy='password-input-input']", + loginPasswordInput: "[data-cy='password-input']", + signInButton: "[data-cy='sign-in-button']", + passwordError: "[data-cy='password-error']", + nameInput: "[data-cy='name-input']", + nameLabel: '[data-cy="name-input-label"]', + signupNameLabel: '[data-cy="name-label"]', + forgotEmailInput: '[data-cy="email-input-field-input"]', + createAnAccountLink: '[data-cy="create-an-account-link"]', +} \ No newline at end of file diff --git a/cypress-tests/cypress/constants/selectors/workspaceConstants.js b/cypress-tests/cypress/constants/selectors/workspaceConstants.js index de38a10273..1aec73c936 100644 --- a/cypress-tests/cypress/constants/selectors/workspaceConstants.js +++ b/cypress-tests/cypress/constants/selectors/workspaceConstants.js @@ -1,19 +1,19 @@ -export const cyParamName = (paramName = "") => { - return paramName.toLowerCase().replace(/\s+/g, "-"); -}; +import { cyParamName } from "./common"; + export const workspaceConstantsSelectors = { workspaceConstantsHelperText: '[data-cy="workspace-constant-helper-text"]', emptyStateImage: '[data-cy="empty-state-image"]', emptyStateHeader: '[data-cy="empty-state-header"]', emptyStateText: '[data-cy="empty-state-text"]', - addNewConstantButton: '[data-cy="add-new-constant-button"]', + addNewConstantButton: '[data-cy="form-add-new-constant-button"]', contantFormTitle: '[data-cy="constant-form-title"]', addConstantButton: '[data-cy="add-constant-button"]', envName: '[data-cy="env-name"]', constantsTableNameHeader: '[data-cy="workspace-variable-table-name-header"]', constantsTableValueHeader: '[data-cy="workspace-variable-table-value-header"]', + nameInputFiled: '[data-cy="name-input-field"]', constantName: (constName) => { return `[data-cy="${cyParamName(constName)}-workspace-constant-name"]`; @@ -30,4 +30,7 @@ export const workspaceConstantsSelectors = { constHideButton: (constName) => { return `[data-cy="${cyParamName(constName)}-constant-visibility"]`; }, + constantsType: (type) => { + return `[data-cy="${cyParamName(type)}-constants-input"]`; + }, }; diff --git a/cypress-tests/cypress/constants/texts/common.js b/cypress-tests/cypress/constants/texts/common.js index fc9d1b989a..a4d9549fd9 100644 --- a/cypress-tests/cypress/constants/texts/common.js +++ b/cypress-tests/cypress/constants/texts/common.js @@ -52,13 +52,14 @@ export const commonText = { }, closeButton: "modal close", workEmailLabel: "Email", - emailInputError: "Invalid Email", - passwordLabel: "Password", + emailInputError: "Email is invalid", + passwordLabel: "Password *", + LoginPasswordLabel: "Password", forgotPasswordLink: "Forgot?", loginButton: " Login", signInHeader: "Sign in", signInSubHeader: "New to ToolJet?Create an account", - SignUpSectionHeader: "Join ToolJet", + signUpSectionHeader: "Join ToolJet", signInRedirectText: "Already have an account?", signInRedirectLink: "Sign in", signUpTermsHelperText: "By signing up you are agreeing to the", @@ -67,11 +68,11 @@ export const commonText = { invitePageHeader: "Join My workspace", invitePageSubHeader: "You are invited to a workspace My workspace. Accept the invite to join the workspace.", - userNameInputLabel: "Name", - acceptInviteButton: "Accept invite", + userNameInputLabel: "Name *", + acceptInviteButton: "Accept Invite", createButton: "Create", saveChangesButton: "Save changes", - emailInputLabel: "Email", + emailInputLabel: "Email *", allApplicationLink: "All apps", notificationsCardTitle: "Notifications", emptyNotificationTitle: "You're all caught up!", @@ -86,7 +87,7 @@ export const commonText = { "Let’s set up your workspace to get started with ToolJet", setUpToolJetButton: "Set up ToolJet", setUpadminCheckPoint: "Set up admin", - setUpworkspaceCheckPoint: "Set up workspace", + setUpworkspaceCheckPoint: "Set up your workspace!", companyProfileCheckPoint: "Company profile", setUpAdminHeader: "Set up your admin account", onboardingPageSubHeader: "This information will help us improve ToolJet.", @@ -94,17 +95,18 @@ export const commonText = { continueButton: "Continue", resetPasswordButton: "Reset password", setUpWorkspaceHeader: "Set up your workspace", + loginPasswordLabel: "Password *", userRolePageHeader: "What best describes your role?", sizeOftheCompanyHeader: "What is the size of your company?", - workspaceNameInputLabel: "Workspace name", + workspaceNameInputLabel: "Workspace name *", onboardingSeperatorText: "OR", getStartedButton: "Get started for free", emailPageHeader: "Check your mail", - spamMessage: "Did not receive an email? Check your spam folder.", + spamMessage: "Did not receive an email? Check your spam folder!", resendEmailButton: "Resend verification mail", editEmailButton: "Edit email address", emailVerifiedText: "Successfully verified email", - continueToSetUp: "Continue to set up your workspace to start using ToolJet.", + continueToSetUp: "Set up workspaces to manage users, applications & resources across various teams", createAccountCheckPoint: "Create account", verifyEmailCheckPoint: "Verify email", inalidInvitationLinkHeader: "Invalid verification link", @@ -114,15 +116,15 @@ export const commonText = { forgotPasswordPageHeader: "Forgot Password", newToTooljetText: "New to ToolJet?", emailAddressLabel: "Email address", - resetPasswordLinkButton: " Send a reset link", + resetPasswordLinkButton: "Send a reset link", passwordResetEmailToast: - "Please check your email/inbox for the password reset link", + "Please check your email for the password reset link", passwordResetPageHeader: "Reset Password", passwordResetSuccessPageHeader: "Password has been reset", - newPasswordInputLabel: "New Password", - confirmPasswordInputFieldLabel: "Re-enter the password", + newPasswordInputLabel: "New Password *", + confirmPasswordInputFieldLabel: "Re-enter the password *", passwordResetSuccessToast: "Password reset successfully", - backToLoginButton: "Back to log in", + backToLoginButton: "Back to login", resetPasswordPageDescription: "Your password has been reset successfully, log into ToolJet to continue your session", labelFullNameInput: "Enter full name", @@ -135,13 +137,13 @@ export const commonText = { addNewDataSourceButton: "Add new datasource", emailPageDescription: (email) => { - return `We’ve sent an email to ${email} with a verification link. Please use that to verify your email address.`; + return `We've sent a verification email to ${email}. Click the link inside to confirm your email and continue. This helps us ensure account security.` }, companyPageHeader: (userName) => { return `Where do you work ${userName}?`; }, resetPasswordEmailDescription: (email) => { - return `We’ve sent an email to ${email} with a password reset link. Please click on that link to reset your password.`; + return `We've sent a password reset link to ${email}. Click the link inside to reset your password and continue.`; }, userJobRole: { HeadOfEngineering: "Head of engineering", diff --git a/cypress-tests/cypress/constants/texts/workspaceConstants.js b/cypress-tests/cypress/constants/texts/workspaceConstants.js index 58a4af8568..c093327e03 100644 --- a/cypress-tests/cypress/constants/texts/workspaceConstants.js +++ b/cypress-tests/cypress/constants/texts/workspaceConstants.js @@ -1,10 +1,12 @@ export const workspaceConstantsText = { workspaceConstantsHelperText: - "To resolve a Workspace constant use {{constants.access_token}}", + "To resolve a global workspace constant use {{constants.access_token}}", emptyStateHeader: "No Workspace constants yet", emptyStateText: "Use workspace constants seamlessly in both the app builder and data source connections across ToolJet.", - addNewConstantButton: "Create new constant", + addNewConstantButton: "+ Create new constant", addConstatntText: "Add new constant in production ", - constantCreatedToast: "Constant has been created", + constantCreatedToast: (type) => { return `${type} constant created successfully!` }, + constantsExisitToast: (type) => { return `${type} constant already exists!` } + }; diff --git a/cypress-tests/cypress/e2e/happyPath/appbuilder/commonTestcases/codehinter.cy.js b/cypress-tests/cypress/e2e/happyPath/appbuilder/commonTestcases/codehinter.cy.js new file mode 100644 index 0000000000..78e5490c06 --- /dev/null +++ b/cypress-tests/cypress/e2e/happyPath/appbuilder/commonTestcases/codehinter.cy.js @@ -0,0 +1,29 @@ +import { fake } from "Fixtures/fake"; +import { addAndVerifyOnSingleLine } from "Support/utils/editor/codehinter"; +import { commonSelectors, commonWidgetSelector } from "Selectors/common"; +import { + openEditorSidebar, +} from "Support/utils/commonWidget"; + +describe("Editor- CodeHinter", () => { + let currentVersion = ""; + let newVersion = []; + let versionFrom = ""; + beforeEach(() => { + cy.apiLogin(); + cy.apiCreateApp(`${fake.companyName}-inspector-App`); + cy.apiOpenApp(); + }); + + it.only("should verify singleLine: non dynamic values", () => { + cy.dragAndDropWidget("Text", 500, 500); + addAndVerifyOnSingleLine(`{{globals.currentUser.email}} {{globals.currentUser.firstName}} {{globals.currentUser.lastName}} {{globals.currentUser.id}} {{globals.currentUser.avatarId}} {{globals.currentUser.groups[0]}} {{globals.currentUser.groups[1]}} {{globals.currentUser.groups[2]}} {{globals.currentUser.role}} {{globals.currentUser.ssoUserInfo}} {{globals.environment.id}} {{globals.environment.name}} {{globals.mode.value}} {{globals.theme.name}} {{globals.urlparams}} {{page.handle}} {{page.id}} {{page.name}}`) + cy.get('[data-cy=draggable-widget-text1]:eq(0)').invoke('text').then((text => { cy.log(text) })) + }); + it("should verify singleLine: dynamic values", () => { + }); + it("should verify multiLine: non dynamic values", () => { + }); + it("should verify multiLine: dynamic values", () => { + }); +}); diff --git a/cypress-tests/cypress/e2e/happyPath/appbuilder/commonTestcases/inspectorHappypath.cy.js b/cypress-tests/cypress/e2e/happyPath/appbuilder/commonTestcases/inspectorHappypath.cy.js index c36bc260a4..95f02d5198 100644 --- a/cypress-tests/cypress/e2e/happyPath/appbuilder/commonTestcases/inspectorHappypath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/appbuilder/commonTestcases/inspectorHappypath.cy.js @@ -1,119 +1,79 @@ import { fake } from "Fixtures/fake"; -import { - verifyMultipleComponentValuesFromInspector, - verifyComponentValueFromInspector, -} from "Support/utils/commonWidget"; -import { - verifyNodeData, - openNode, - verifyValue, - deleteComponentFromInspector, -} from "Support/utils/inspector"; -import { commonSelectors, commonWidgetSelector } from "Selectors/common"; -import { addNewPage } from "Support/utils/multipage"; -import { - selectCSA, - selectEvent, - addSupportCSAData, -} from "Support/utils/events"; +import { commonWidgetSelector } from "Selectors/common"; import { multipageSelector } from "Selectors/multipage"; -import { navigateToCreateNewVersionModal } from "Support/utils/version"; +import { addSupportCSAData, selectEvent } from "Support/utils/events"; import { createNewVersion } from "Support/utils/exportImport"; +import { deleteComponentFromInspector, openNode, verifyNodeData, verifyValue, verifyNodes, openAndVerifyNode } from "Support/utils/inspector"; +import { addNewPage } from "Support/utils/multipage"; +import { navigateToCreateNewVersionModal } from "Support/utils/version"; +import testData from "Fixtures/inspectorItems.json"; describe("Editor- Inspector", () => { let currentVersion = ""; let newVersion = []; let versionFrom = ""; + beforeEach(() => { cy.apiLogin(); cy.apiCreateApp(`${fake.companyName}-inspector-App`); - cy.openApp(); + cy.openApp("?key=value"); }); it("should verify the values of inspector", () => { - const countGlobal = - Cypress.env("environment") === "Community" ? "4 entries " : "5 entries "; - const countUser = - Cypress.env("environment") === "Community" ? "4 entries " : "5 entries "; cy.get(commonWidgetSelector.sidebarinspector).click(); cy.get(".tooltip-inner").invoke("hide"); - verifyNodeData("queries", "Object", "0 entry "); - verifyNodeData("components", "Object", "0 entry "); - verifyNodeData("globals", "Object", countGlobal); - verifyNodeData("variables", "Object", "0 entry "); - verifyNodeData("page", "Object", "4 entries "); - openNode("globals"); - verifyNodeData("theme", "Object", "1 entry "); - verifyNodeData("urlparams", "Object", "0 entry "); - verifyNodeData("currentUser", "Object", countUser); + openAndVerifyNode("globals", testData.globalsNodes, verifyNodeData); + openAndVerifyNode("currentUser", testData.currentUserNodes, verifyValue); + openAndVerifyNode("theme", testData.themeNodes, verifyValue); + openAndVerifyNode("mode", testData.modeNodes, verifyValue); + openAndVerifyNode("urlparams", testData.urlparamsNode, verifyValue); - openNode("theme"); - verifyValue("name", "String", `"light"`); - - openNode("currentUser"); - verifyValue("email", "String", `"dev@tooljet.io"`); - verifyValue("firstName", "String", `"The"`); - verifyValue("lastName", "String", `"Developer"`); - verifyNodeData("groups", "Array", "2 items "); if (Cypress.env("environment") !== "Community") { - cy.get( - '[data-cy="inspector-node-ssouserinfo"] > .node-key' - ).verifyVisibleElement("have.text", "ssoUserInfo"); - cy.get( - '[data-cy="inspector-node-ssouserinfo"] > .mx-2' - ).verifyVisibleElement("have.text", "undefined"); + const ssoUserInfoNode = '[data-cy="inspector-node-ssouserinfo"]'; + const inspectorNodeId = '[data-cy="inspector-node-id"]'; + + cy.get(`${ssoUserInfoNode} > .node-key`).should("have.text", "ssoUserInfo"); + cy.get(`${ssoUserInfoNode} > .mx-2`).should("have.text", "undefined"); + openNode("theme"); openNode("environment"); verifyValue("name", "String", `"development"`); - cy.get('[data-cy="inspector-node-id"] > .node-key').verifyVisibleElement( - "have.text", - "id" - ); + cy.get(`${inspectorNodeId} > .node-key`).should("have.text", "id"); } - openNode("mode"); - verifyValue("value", "String", `"edit"`); - openNode("groups"); - verifyValue("0", "String", `"all_users"`); - verifyValue("1", "String", `"admin"`); - verifyNodeData("constants", "Object", "0 entry "); + cy.apiDeleteApp(); + }); - openNode("globals"); - openNode("page"); - verifyValue("handle", "String", `"home"`); - verifyValue("name", "String", `"Home"`); + it("should verify dynamic items", () => { + cy.get(commonWidgetSelector.sidebarinspector).click(); + cy.get(".tooltip-inner").invoke("hide"); cy.get(multipageSelector.sidebarPageButton).click(); addNewPage("test_page"); cy.dragAndDropWidget("Button", 500, 500); selectEvent("On click", "Switch page"); - cy.get('[data-cy="switch-page-label-and-input"] > .select-search') - .click() - .type("home{enter}"); + cy.get('[data-cy="switch-page-label-and-input"] > .select-search').click().type("home{enter}"); cy.get('[data-cy="button-add-query-param"]').click(); cy.wait(3000); cy.get("body").then(($body) => { - if ( - $body.find('[data-cy="event-query-param-key-input-field"]').length == 0 - ) { + if ($body.find('[data-cy="event-query-param-key-input-field"]').length == 0) { cy.get('[data-cy="button-add-query-param"]').click(); } }); - addSupportCSAData("query-param-key", "key"); - addSupportCSAData("query-param-value", "value"); - cy.get('[data-cy="switch-page-label-and-input"] > .select-search') - .click() - .type("home{enter}"); + addSupportCSAData("event-query-param-key", "key"); + addSupportCSAData("event-query-param-value", "value"); + cy.get('[data-cy="switch-page-label-and-input"] > .select-search').click().type("home{enter}"); cy.get('[data-cy="real-canvas"]').click("topRight", { force: true }); cy.dragAndDropWidget("Button", 500, 300); selectEvent("On click", "Set variable"); - addSupportCSAData("key", "globalVar"); + addSupportCSAData("event-key", "globalVar"); addSupportCSAData("variable", "globalVar"); + cy.forceClickOnCanvas(); cy.waitForAutoSave(); cy.get(commonWidgetSelector.draggableWidget("button2")).click(); @@ -123,41 +83,41 @@ describe("Editor- Inspector", () => { selectEvent("On click", "Set page variable"); addSupportCSAData("key", "pageVar"); addSupportCSAData("variable", "pageVar"); + cy.forceClickOnCanvas(); cy.waitForAutoSave(); cy.get(commonWidgetSelector.draggableWidget("button3")).click(); cy.get(commonWidgetSelector.sidebarinspector).click(); - openNode("variables"); - verifyValue("globalVar", "String", `"globalVar"`); + openAndVerifyNode("variables", testData.variablesNodes, verifyValue); - openNode("page"); + cy.forceClickOnCanvas() + cy.wait(500) + cy.get(commonWidgetSelector.sidebarinspector).click(); + cy.get(".tooltip-inner").invoke("hide"); + + // openNode("page"); + + openAndVerifyNode("page", testData.testPageNodes, verifyValue); openNode("variables", 1); verifyValue("pageVar", "String", `"pageVar"`); - verifyValue("handle", "String", `"test-page"`); - verifyValue("name", "String", `"test_page"`); - openNode("components"); - verifyNodeData("button1", "Object", "7 entries "); - verifyNodeData("button2", "Object", "7 entries "); - verifyNodeData("button3", "Object", "7 entries "); + openAndVerifyNode("components", testData.componentsNodes, verifyNodeData); cy.get('[data-cy="real-canvas"]').click("topRight", { force: true }); cy.get(commonWidgetSelector.draggableWidget("button1")).click(); cy.get(commonWidgetSelector.sidebarinspector).click(); - openNode("page"); - verifyValue("handle", "String", `"home"`); - verifyValue("name", "String", `"Home"`); - + openAndVerifyNode("page", testData.pageNodes, verifyValue); openNode("globals"); - verifyNodeData("urlparams", "Object", "1 entry "); - openNode("urlparams"); verifyValue("key", "String", `"value"`); - cy.get(`[data-cy="inspector-node-key"] > .mx-1`).realHover(); - cy.get('[data-cy="copy-path-to-clipboard"]').realClick(); + cy.get(`[data-cy="inspector-node-key"] > .mx-1`) + .realHover() + .parent() + .find('[data-cy="copy-path-to-clipboard"]') + .realClick(); cy.realPress("Escape"); cy.window().then((win) => { @@ -166,7 +126,11 @@ describe("Editor- Inspector", () => { }); }); - cy.get('[data-cy="copy-value-to-clicpboard"]').realClick(); + cy.get(`[data-cy="inspector-node-key"] > .mx-1`) + .realHover() + .parent() + .find('[data-cy="copy-value-to-clicpboard"]') + .realClick(); cy.realPress("Escape"); cy.window().then((win) => { win.navigator.clipboard.readText().then((text) => { @@ -182,16 +146,16 @@ describe("Editor- Inspector", () => { cy.notVisible(commonWidgetSelector.draggableWidget("button1")); cy.apiDeleteApp(); }); + it("should verify deletion of component from inspector", () => { cy.dragAndDropWidget("button", 500, 500); cy.get(commonWidgetSelector.sidebarinspector).click(); deleteComponentFromInspector("button1"); - cy.verifyToastMessage( - `[class=go3958317564]`, - "Component deleted! (⌘ + Z to undo)" - ); + cy.verifyToastMessage(`[class=go3958317564]`, "Component deleted! (⌘ + Z to undo)"); + navigateToCreateNewVersionModal((currentVersion = "v1")); createNewVersion((newVersion = ["v2"]), (versionFrom = "v1")); cy.notVisible(commonWidgetSelector.draggableWidget("button1")); + cy.apiDeleteApp(); }); }); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/app-version/version.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/app-version/version.cy.js index a4dc305d73..6b1beb43da 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/app-version/version.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/app-version/version.cy.js @@ -65,15 +65,15 @@ describe("App Version Functionality", () => { closeModal(commonText.closeButton); }); - it("Verify all functionality for the app version", () => { + it.skip("Verify all functionality for the app version", () => { data.appName = `${fake.companyName}-App`; cy.apiCreateApp(data.appName); cy.openApp() cy.get('[data-cy="widget-list-box-table"]').should("be.visible"); - - cy.dragAndDropWidget("Text", 50, 50); + + // cy.dragAndDropWidget("Text", 50, 50); verifyComponent("text1"); - + navigateToCreateNewVersionModal((currentVersion = "v1")); createNewVersion((newVersion = ["v2"]), (versionFrom = "v1")); verifyComponent("text1"); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/editor/appSlug.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/editor/appSlug.cy.js index 157700f9e2..f4b7bfb71f 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/editor/appSlug.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/editor/appSlug.cy.js @@ -41,7 +41,7 @@ describe("App slug", () => { ); cy.get(commonWidgetSelector.appLinkField).verifyVisibleElement( "have.text", - `http://localhost:8082/my-workspace/apps/${Cypress.env("appId")}` + `${Cypress.config('baseUrl')}/my-workspace/apps/${Cypress.env("appId")}` ); cy.wait(500); @@ -84,11 +84,11 @@ describe("App slug", () => { ); cy.get(commonWidgetSelector.appLinkField).verifyVisibleElement( "have.text", - `http://localhost:8082/my-workspace/apps/${data.slug}` + `${Cypress.config('baseUrl')}/my-workspace/apps/${data.slug}` ); cy.url().should( "eq", - `http://localhost:8082/my-workspace/apps/${data.slug}/home` + `${Cypress.config('baseUrl')}/my-workspace/apps/${data.slug}` ); releaseApp(); @@ -97,15 +97,15 @@ describe("App slug", () => { cy.wait(2000); cy.url().should( "eq", - `http://localhost:8082/applications/${data.slug}/home?version=v1` + `${Cypress.config('baseUrl')}/applications/${data.slug}/home?version=v1` ); cy.visit("/my-workspace"); cy.wait(500); cy.visitSlug({ - actualUrl: `http://localhost:8082/applications/${data.slug}`, + actualUrl: `${Cypress.config('baseUrl')}/applications/${data.slug}`, }); - cy.url().should("eq", `http://localhost:8082/applications/${data.slug}`); + cy.url().should("eq", `${Cypress.config('baseUrl')}/applications/${data.slug}`); cy.visit("/my-workspace"); cy.wait(500); @@ -176,20 +176,20 @@ describe("App slug", () => { cy.get(commonWidgetSelector.modalCloseButton).click(); cy.url().should( "eq", - `http://localhost:8082/my-workspace/apps/${data.slug}/home` + `${Cypress.config('baseUrl')}/my-workspace/apps/${data.slug}/home` ); cy.openInCurrentTab(commonWidgetSelector.previewButton); cy.wait(1000); cy.url().should( "eq", - `http://localhost:8082/applications/${data.slug}/home?version=v1` + `${Cypress.config('baseUrl')}/applications/${data.slug}/home?version=v1` ); cy.visit("/my-workspace"); cy.wait(500); cy.visitSlug({ actualUrl: `/applications/${data.slug}` }); - cy.url().should("eq", `http://localhost:8082/applications/${data.slug}`); + cy.url().should("eq", `${Cypress.config('baseUrl')}/applications/${data.slug}`); cy.visit("/my-workspace"); cy.wait(500); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/editor/privateAndPublicApp.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/editor/privateAndPublicApp.cy.js index 4f3cfe3976..f21f16409f 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/editor/privateAndPublicApp.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/editor/privateAndPublicApp.cy.js @@ -14,6 +14,7 @@ import { addAppToGroup } from "Support/utils/manageGroups"; import { ssoSelector } from "Selectors/manageSSO"; import { fetchAndVisitInviteLink } from "Support/utils/manageUsers"; import { usersSelector } from "Selectors/manageUsers"; +import { onboardingSelectors } from "Selectors/onboarding"; describe( "App share functionality", @@ -26,7 +27,6 @@ describe( const data = {}; beforeEach(() => { cy.defaultWorkspaceLogin(); - // cy.removeAssignedApps(); cy.skipWalkthrough(); }); @@ -36,16 +36,19 @@ describe( cy.apiCreateApp(data.appName); cy.openApp(); - cy.dragAndDropWidget("Table", 250, 250); + cy.addComponentToApp(data.appName, "text1"); - verifyTooltip( - commonWidgetSelector.shareAppButton, - "Share URL is unavailable until current version is released" - ); - cy.get('[data-cy="share-button-link"]>span').should( - "have.class", - "share-disabled" - ); + //Need to automate with the new flow + + // verifyTooltip( + // commonWidgetSelector.shareAppButton, + // "Share URL is unavailable until current version is released" + // ); + + // cy.get('[data-cy="share-button-link"]>span').should( + // "have.class", + // "share-disabled" + // ); releaseApp(); cy.get(commonWidgetSelector.shareAppButton).click(); @@ -72,30 +75,30 @@ describe( logout(); cy.wait(4000); - cy.get(commonSelectors.loginButton, { timeout: 20000 }).should( + cy.get(onboardingSelectors.signInButton, { timeout: 20000 }).should( "be.visible" ); cy.visitSlug({ - actualUrl: `http://localhost:8082/applications/${data.slug}`, + actualUrl: `${Cypress.config('baseUrl')}/applications/${data.slug}`, }); cy.wait(3000); - cy.get(commonSelectors.loginButton, { timeout: 20000 }).should( + cy.get(onboardingSelectors.signInButton, { timeout: 20000 }).should( "be.visible" ); - cy.clearAndType(commonSelectors.workEmailInputField, "dev@tooljet.io"); - cy.clearAndType(commonSelectors.passwordInputField, "password"); - cy.get(commonSelectors.loginButton).click(); + cy.clearAndType(onboardingSelectors.loginEmailInput, "dev@tooljet.io"); + cy.clearAndType(onboardingSelectors.loginPasswordInput, "password"); + cy.get(onboardingSelectors.signInButton).click(); cy.wait(500); - cy.get('[data-cy="draggable-widget-table1"]').should("be.visible"); + cy.get(".text-widget-section > div").should("be.visible"); cy.get(commonSelectors.viewerPageLogo).click(); cy.openApp( "my-workspace", Cypress.env("appId"), - '[data-cy="draggable-widget-table1"]' + ".text-widget-section > div" ); cy.get(commonWidgetSelector.shareAppButton).click(); cy.get(commonWidgetSelector.makePublicAppToggle).check(); @@ -104,23 +107,22 @@ describe( logout(); cy.wait(4000); - cy.get(commonSelectors.loginButton, { timeout: 20000 }).should( + cy.get(onboardingSelectors.signInButton, { timeout: 20000 }).should( "be.visible" ); cy.visitSlug({ - actualUrl: `http://localhost:8082/applications/${data.slug}`, + actualUrl: `${Cypress.config('baseUrl')}/applications/${data.slug}`, }); cy.wait(3000); - cy.get('[data-cy="draggable-widget-table1"]').should("be.visible"); + cy.get(".text-widget-section > div").should("be.visible"); }); it("Verify app private and public app visibility for the same workspace user", () => { data.appName = `${fake.companyName} App`; data.slug = data.appName.toLowerCase().replace(/\s+/g, "-"); - cy.apiCreateApp(data.appName); cy.openApp(); - cy.dragAndDropWidget("Table", 250, 250); + cy.addComponentToApp(data.appName, "text1"); releaseApp(); cy.wait(1000); @@ -132,13 +134,13 @@ describe( cy.backToApps(); cy.visitSlug({ actualUrl: `/applications/${data.slug}` }); - cy.get('[data-cy="draggable-widget-table1"]').should("be.visible"); + cy.get(".text-widget-section > div").should("be.visible"); cy.defaultWorkspaceLogin(); cy.openApp( "my-workspace", Cypress.env("appId"), - '[data-cy="draggable-widget-table1"]' + ".text-widget-section > div" ); cy.wait(2000); cy.get(commonWidgetSelector.shareAppButton).click(); @@ -149,20 +151,21 @@ describe( logout(); cy.wait(4000); - cy.get(commonSelectors.loginButton, { timeout: 20000 }).should( + cy.get(onboardingSelectors.signInButton, { timeout: 20000 }).should( "be.visible" ); cy.visitSlug({ actualUrl: `/applications/${data.slug}` }); - cy.login("test@tooljet.com", "password"); + cy.appUILogin("test@tooljet.com", "password"); cy.get(commonSelectors.allApplicationLink).verifyVisibleElement( "have.text", commonText.allApplicationLink ); }); - it("Verify app private and public app visibility for the same instance user", () => { + //Fix the case after bug fix + it.skip("Verify app private and public app visibility for the same instance user", () => { data.firstName = fake.firstName; data.email = fake.email.toLowerCase(); data.appName = `${fake.companyName} App`; @@ -171,7 +174,8 @@ describe( cy.apiCreateApp(data.appName); cy.openApp(); - cy.dragAndDropWidget("Table", 250, 250); + cy.addComponentToApp(data.appName, "text1"); + releaseApp(); cy.wait(1000); @@ -183,13 +187,19 @@ describe( cy.logoutApi(); userSignUp(data.firstName, data.email, data.workspaceName); cy.wait(3000); + cy.backToApps(); + cy.wait(1000); cy.visitSlug({ actualUrl: `/applications/${data.slug}` }); cy.wait(1000); + cy.pause(); - cy.clearAndType(commonSelectors.workEmailInputField, data.email); - cy.clearAndType(commonSelectors.passwordInputField, "password"); - cy.get(commonSelectors.signInButton).click(); + // logout(); + + cy.clearAndType(onboardingSelectors.loginEmailInput, data.email); + cy.clearAndType(onboardingSelectors.loginPasswordInput, "password"); + cy.get(onboardingSelectors.signInButton).click(); + cy.pause(); cy.wait(1000); cy.get(ssoSelector.workspaceSubHeader).verifyVisibleElement( "have.text", @@ -211,15 +221,16 @@ describe( logout(); cy.wait(4000); - cy.get(commonSelectors.loginButton, { timeout: 20000 }).should( + cy.get(onboardingSelectors.signInButton, { timeout: 20000 }).should( "be.visible" ); cy.visitSlug({ actualUrl: `/applications/${data.slug}` }); - cy.get('[data-cy="draggable-widget-table1"]').should("be.visible"); + cy.get(".text-widget-section > div").should("be.visible"); cy.get(commonSelectors.viewerPageLogo).click(); }); - it("hould redirect to the workspace login page, allow signup, proceed to accept invite page, and load the app", () => { + //Need to update with the new permission flow + it.skip("hould redirect to the workspace login page, allow signup, proceed to accept invite page, and load the app", () => { let invitationToken, organizationToken, workspaceId, @@ -235,7 +246,8 @@ describe( setSignupStatus(true); cy.apiCreateApp(data.appName); cy.openApp(); - cy.dragAndDropWidget("Table", 250, 250); + cy.addComponentToApp(data.appName, "text1"); + releaseApp(); cy.wait(1000); @@ -258,8 +270,8 @@ describe( cy.get(commonSelectors.createAnAccountLink).click(); cy.clearAndType(commonSelectors.nameInputField, data.firstName); - cy.clearAndType(commonSelectors.emailInputField, data.email); - cy.clearAndType(commonSelectors.passwordInputField, commonText.password); + cy.clearAndType(onboardingSelectors.loginEmailInput, data.email); + cy.clearAndType(onboardingSelectors.loginPasswordInput, commonText.password); cy.get(commonSelectors.signUpButton).click(); cy.apiLogin(); @@ -296,7 +308,7 @@ describe( }); }); - cy.get('[data-cy="draggable-widget-table1"]').should("be.visible"); + cy.get(".text-widget-section > div").should("be.visible"); }); } ); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/globalDataSources/globalDataSourcePermissions.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/globalDataSources/globalDataSourcePermissions.cy.js index d5c35f5d39..74de50f461 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/globalDataSources/globalDataSourcePermissions.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/globalDataSources/globalDataSourcePermissions.cy.js @@ -215,7 +215,7 @@ describe("Global Datasource Manager", () => { cy.get('[data-cy="databases-datasource-button"]').should("be.visible"); cy.apiCreateGDS( - "http://localhost:3000/api/v2/data_sources", + `${Cypress.env("server_host")}/api/v2/data_sources`, `cypress-${data.dsName2}-postgresql`, "postgresql", [ diff --git a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/selfHost/selfHostSignUp.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/selfHost/selfHostSignUp.cy.js deleted file mode 100644 index 16fce362c2..0000000000 --- a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/selfHost/selfHostSignUp.cy.js +++ /dev/null @@ -1,166 +0,0 @@ -import { commonSelectors } from "Selectors/common"; -import { commonText } from "Texts/common"; -import * as signup from "Support/utils/selfHostSignUp"; -import { logout } from "Support/utils/common"; - -describe("Self host onboarding", () => { - beforeEach(() => { - cy.visit('/setup'); - }); - - it("verify elements on self host onboarding page", () => { - cy.get(commonSelectors.selfHostSetUpBanner).should("be.visible"); - cy.get(commonSelectors.selfHostSetUpSubBanner).should("be.visible"); - cy.get(commonSelectors.selfHostSetUpCard).should("be.visible"); - cy.get(commonSelectors.selfHostSetUpCardImage).should("be.visible"); - cy.get(commonSelectors.selfHostSetUpCardHeader).verifyVisibleElement( - "have.text", - commonText.selfHostSetUpCardHeader - ); - cy.get(commonSelectors.selfHostSetUpCardSubHeader).verifyVisibleElement( - "have.text", - commonText.selfHostSetUpCardSubHeader - ); - cy.get(commonSelectors.setUpToolJetButton) - .verifyVisibleElement("have.text", commonText.setUpToolJetButton) - .click(); - - signup.selfHostCommonElements(); - cy.get(commonSelectors.onboardingPageHeader).verifyVisibleElement( - "have.text", - commonText.setUpAdminHeader - ); - - cy.get(commonSelectors.userNameInputLabel).verifyVisibleElement( - "have.text", - commonText.userNameInputLabel - ); - cy.get(commonSelectors.nameInputField).should("be.visible"); - cy.get(commonSelectors.emailInputLabel).verifyVisibleElement( - "have.text", - commonText.emailInputLabel - ); - cy.get(commonSelectors.emailInputField).should("be.visible"); - cy.get(commonSelectors.passwordLabel).verifyVisibleElement( - "have.text", - commonText.passwordLabel - ); - cy.get(commonSelectors.passwordInputField).should("be.visible"); - - cy.get(commonSelectors.passwordHelperText).verifyVisibleElement( - "have.text", - commonText.passwordHelperText - ); - - cy.get(commonSelectors.signUpTermsHelperText).should(($el) => { - expect($el.contents().first().text().trim()).to.eq( - commonText.selfHostSignUpTermsHelperText - ); - }); - cy.get(commonSelectors.termsOfServiceLink) - .verifyVisibleElement("have.text", commonText.termsOfServiceLink) - .and("have.attr", "href") - .and("equal", "https://www.tooljet.com/terms"); - cy.get(commonSelectors.privacyPolicyLink) - .verifyVisibleElement("have.text", commonText.privacyPolicyLink) - .and("have.attr", "href") - .and("equal", "https://www.tooljet.com/privacy"); - - cy.clearAndType(commonSelectors.nameInputField, "The Developer"); - cy.clearAndType(commonSelectors.emailInputField, "dev@tooljet.io"); - cy.clearAndType(commonSelectors.passwordInputField, "password"); - cy.get(commonSelectors.continueButton).click(); - - signup.selfHostCommonElements(); - cy.get(commonSelectors.userAccountNameAvatar).should("be.visible"); - cy.get(commonSelectors.onboardingPageHeader).verifyVisibleElement( - "have.text", - "Set up your workspace" - ); - cy.get(commonSelectors.workspaceNameInputLabel).verifyVisibleElement( - "have.text", - commonText.workspaceNameInputLabel - ); - cy.get(commonSelectors.workspaceNameInputField).should("be.visible"); - cy.clearAndType(commonSelectors.workspaceNameInputField, "My workspace"); - cy.get(commonSelectors.continueButton).click(); - - signup.selfHostCommonElements(); - signup.commonElementsWorkspaceSetup(); - cy.get(commonSelectors.onboardingPageHeader).verifyVisibleElement( - "have.text", - commonText.companyPageHeader("The Developer") - ); - cy.get(commonSelectors.companyNameInputField).should("be.visible"); - cy.clearAndType(commonSelectors.companyNameInputField, "ToolJet"); - cy.get(commonSelectors.continueButton).click(); - - signup.selfHostCommonElements(); - signup.commonElementsWorkspaceSetup(); - cy.get(commonSelectors.onboardingPageHeader).verifyVisibleElement( - "have.text", - commonText.userRolePageHeader - ); - signup.verifyandModifyUserRole(); - - signup.selfHostCommonElements(); - signup.commonElementsWorkspaceSetup(); - cy.get(commonSelectors.onboardingPageHeader).verifyVisibleElement( - "have.text", - commonText.sizeOftheCompanyHeader - ); - - signup.verifyandModifySizeOftheCompany(); - - cy.get(commonSelectors.pageLogo).should("be.visible"); - cy.get(commonSelectors.setUpadminCheckPoint).verifyVisibleElement( - "have.text", - commonText.setUpadminCheckPoint - ); - cy.get(commonSelectors.setUpworkspaceCheckPoint).verifyVisibleElement( - "have.text", - commonText.setUpworkspaceCheckPoint - ); - cy.get(commonSelectors.companyProfileCheckPoint).verifyVisibleElement( - "have.text", - commonText.companyProfileCheckPoint - ); - cy.get(commonSelectors.onboardingPageSubHeader).verifyVisibleElement( - "have.text", - commonText.onboardingPageSubHeader - ); - cy.get(commonSelectors.continueButton).verifyVisibleElement( - "have.text", - commonText.continueButton - ); - - signup.commonElementsWorkspaceSetup(); - cy.get(commonSelectors.onboardingPageHeader).verifyVisibleElement( - "have.text", - "Enter your phone number" - ); - - cy.get(".form-control").should("be.visible"); - cy.get(".tj-onboarding-phone-input-wrapper") - .find("input") - .type("919876543210"); - cy.get(commonSelectors.continueButton).click(); - - cy.get("body").then(($title) => { - if (!$title.text().includes("Enter your phone number")) { - cy.get(commonSelectors.workspaceName).verifyVisibleElement( - "have.text", - "My workspace" - ); - - logout(); - cy.appUILogin(); - - cy.get(commonSelectors.workspaceName).verifyVisibleElement( - "have.text", - "My workspace" - ); - } - }); - }); -}); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/userFlow/firstUserOnboarding.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/userFlow/firstUserOnboarding.cy.js new file mode 100644 index 0000000000..43d1f0d169 --- /dev/null +++ b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/userFlow/firstUserOnboarding.cy.js @@ -0,0 +1,84 @@ +import { commonSelectors } from "Selectors/common"; +import { commonText } from "Texts/common"; +import * as signup from "Support/utils/selfHostSignUp"; +import { logout } from "Support/utils/common"; +import { onboardingSelectors } from "Selectors/onboarding"; + +describe("Self host onboarding", () => { + beforeEach(() => { + cy.visit("/setup"); + }); + + it("verify elements on self host onboarding page", () => { + cy.get(commonSelectors.HostBanner).should("be.visible"); + cy.get(commonSelectors.pageLogo).should("be.visible"); + cy.get(commonSelectors.adminSetup).should("be.visible"); + cy.get(commonSelectors.signupTerms).should("be.visible"); + + cy.get(commonSelectors.userNameInputLabel).verifyVisibleElement( + "have.text", + commonText.userNameInputLabel + ); + cy.get(commonSelectors.nameInputField).should("be.visible"); + cy.get(commonSelectors.emailInputLabel).verifyVisibleElement( + "have.text", + commonText.emailInputLabel + ); + cy.get(onboardingSelectors.emailInput).should("be.visible"); + cy.get(commonSelectors.passwordLabel).verifyVisibleElement( + "have.text", + commonText.passwordLabel + ); + cy.get(onboardingSelectors.passwordInput).should("be.visible"); + cy.get(commonSelectors.passwordHelperTextSignup).verifyVisibleElement( + "have.text", + commonText.passwordHelperText + ); + + cy.get(commonSelectors.signUpTermsHelperText).should(($el) => { + expect($el.contents().first().text().trim()).to.eq( + commonText.selfHostSignUpTermsHelperText + ); + }); + cy.get(commonSelectors.termsOfServiceLink) + .verifyVisibleElement("have.text", commonText.termsOfServiceLink) + .and("have.attr", "href") + .and("equal", "https://www.tooljet.com/terms"); + cy.get(commonSelectors.privacyPolicyLink) + .verifyVisibleElement("have.text", commonText.privacyPolicyLink) + .and("have.attr", "href") + .and("equal", "https://www.tooljet.com/privacy"); + + cy.clearAndType(commonSelectors.nameInputField, "The Developer"); + cy.clearAndType(onboardingSelectors.emailInput, "dev@tooljet.io"); + cy.clearAndType(onboardingSelectors.passwordInput, "password"); + cy.get(commonSelectors.continueButton).click(); + + cy.get(commonSelectors.setUpworkspaceCheckPoint).verifyVisibleElement( + "have.text", + "Set up your workspace!" + ); + cy.get(commonSelectors.workspaceNameInputLabel).verifyVisibleElement( + "have.text", + commonText.workspaceNameInputLabel + ); + cy.get(commonSelectors.workspaceNameInputField).should("be.visible"); + cy.clearAndType(commonSelectors.workspaceNameInputField, "My workspace"); + cy.get(commonSelectors.OnbordingContinue).click(); + + cy.get(commonSelectors.skipbutton).click(); + cy.get(commonSelectors.backLogo).click(); + cy.get(commonSelectors.backtoapps).click(); + + logout(); + cy.appUILogin(); + + cy.get(commonSelectors.workspaceName).verifyVisibleElement( + "have.text", + "My workspace" + ); + }); +}); + + + diff --git a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/workspace/manageSSO.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/workspace/manageSSO.cy.js index 95f4ad6304..e942767782 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/workspace/manageSSO.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/workspace/manageSSO.cy.js @@ -28,11 +28,6 @@ describe("Manage SSO for multi workspace", () => { commonText.breadcrumbworkspaceSettingTitle ); }); - cy.get(commonSelectors.breadcrumbPageTitle).verifyVisibleElement( - "have.text", - ssoText.pagetitle - ); - cy.get(ssoSelector.cardTitle).verifyVisibleElement( "have.text", "Workspace login" @@ -72,6 +67,7 @@ describe("Manage SSO for multi workspace", () => { it("Should verify Google SSO page elements", () => { common.navigateToManageSSO(); + cy.wait(2000); cy.get(ssoSelector.google).should("be.visible").click(); cy.get(ssoSelector.cardTitle) .eq(1) diff --git a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/workspace/workspaceConstants.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/workspace/workspaceConstants.cy.js index 2d480d4a2b..ff75efb05a 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/workspace/workspaceConstants.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/workspace/workspaceConstants.cy.js @@ -7,6 +7,7 @@ import * as common from "Support/utils/common"; import { contantsNameValidation, AddNewconstants, + existingNameValidation, } from "Support/utils/workspaceConstants"; import { buttonText } from "Texts/button"; import { editAndVerifyWidgetName } from "Support/utils/commonWidget"; @@ -28,7 +29,7 @@ describe("Workspace constants", () => { const envVar = Cypress.env("environment"); beforeEach(() => { cy.defaultWorkspaceLogin(); - cy.intercept("GET", "/api/library_apps").as("homePage"); + // cy.intercept("GET", "/api/library_apps", "homePage"); cy.skipWalkthrough(); }); it("Verify workspace constants UI and CRUD operations", () => { @@ -57,7 +58,7 @@ describe("Workspace constants", () => { cy.get(commonSelectors.documentationLink).verifyVisibleElement( "have.text", - commonText.documentationLink + "Read documentation" ); cy.get("body").then(($body) => { @@ -91,13 +92,13 @@ describe("Workspace constants", () => { cy.get(commonSelectors.nameLabel).verifyVisibleElement("have.text", "Name"); cy.get(commonSelectors.nameInputField) .invoke("attr", "placeholder") - .should("eq", "Enter Constant Name"); + .should("eq", "Enter constant name"); cy.get(commonSelectors.nameInputField).should("be.visible"); cy.get(commonSelectors.valueLabel).should(($el) => { expect($el.contents().first().text().trim()).to.eq("Value"); }); - cy.get('[data-cy="encrypted-label"]>').should("be.visible"); - cy.verifyLabel("Encrypted"); + cy.get('[data-cy="form-encrypted-label"]') + .verifyVisibleElement("have.text", "Encrypted"); cy.get(commonSelectors.valueInputField) .invoke("attr", "placeholder") .should("eq", "Enter value"); @@ -116,12 +117,12 @@ describe("Workspace constants", () => { contantsNameValidation("9", commonText.constantsNameError); contantsNameValidation("%", commonText.constantsNameError); contantsNameValidation( - "ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`a", + "Xk4jY2mLn8pQsZ9Rt6vBc7wJaHqOdEfGuVxY3NkMLzPoWX5wee", "Maximum length has been reached" ); contantsNameValidation( - "ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`afgg", - "Constant name should be between 1 and 32 characters" + "Xk4jY2mLn8pQsZ9Rt6vBc7wJaHqOdEfGuVxY3NkMLzPoWX5weetr", + "Constant name has exceeded 50 characters" ); cy.get(commonSelectors.valueInputField).click(); @@ -137,6 +138,7 @@ describe("Workspace constants", () => { cy.clearAndType(commonSelectors.nameInputField, data.constName); cy.get(commonSelectors.valueInputField).click(); cy.clearAndType(commonSelectors.valueInputField, data.constName); + cy.get(workspaceConstantsSelectors.constantsType("global")).check(); cy.get(workspaceConstantsSelectors.addConstantButton).should("be.enabled"); cy.get(commonSelectors.cancelButton).click(); cy.get(workspaceConstantsSelectors.constantName(data.constName)).should( @@ -147,26 +149,23 @@ describe("Workspace constants", () => { cy.clearAndType(commonSelectors.nameInputField, data.constName); cy.get(commonSelectors.valueInputField).click(); cy.clearAndType(commonSelectors.valueInputField, data.constName); + cy.get(workspaceConstantsSelectors.constantsType("global")).check(); cy.get(workspaceConstantsSelectors.addConstantButton).click(); cy.verifyToastMessage( commonSelectors.toastMessage, - workspaceConstantsText.constantCreatedToast + workspaceConstantsText.constantCreatedToast("Global") ); cy.get(workspaceConstantsSelectors.addNewConstantButton).click(); - contantsNameValidation( - data.constName, - "Constant with this name already exists in Production environment" - ); + existingNameValidation(data.constName, "test"); cy.get(commonSelectors.cancelButton).click(); - cy.get(workspaceConstantsSelectors.envName).verifyVisibleElement( - "have.text", - "Production" - ); + cy.get(workspaceConstantsSelectors.envName).should(($el) => { + expect($el.contents().first().text().trim()).to.eq("Production"); + }); cy.get( workspaceConstantsSelectors.addNewConstantButton - ).verifyVisibleElement("have.text", "Create new constant"); + ).verifyVisibleElement("have.text", "+ Create new constant"); cy.get( workspaceConstantsSelectors.constantsTableNameHeader ).verifyVisibleElement("have.text", "Name"); @@ -270,7 +269,8 @@ describe("Workspace constants", () => { ); }); - it("should verify the constants resolving value on components and query", () => { + //Fix after app builder + it.skip("should verify the constants resolving value on components and query", () => { cy.viewport(1200, 1300); data.widgetName = fake.firstName.toLowerCase().replaceAll("[^A-Za-z]", ""); @@ -306,9 +306,9 @@ describe("Workspace constants", () => { editAndVerifyWidgetName(data.widgetName, []); cy.waitForAutoSave(); - cy.get( - '[data-cy="default-value-input-field"]' - ).clearAndTypeOnCodeMirror(`{{queries.restapi1.data.message`); + cy.get('[data-cy="default-value-input-field"]').clearAndTypeOnCodeMirror( + `{{queries.restapi1.data.message` + ); cy.forceClickOnCanvas(); cy.waitForAutoSave(); cy.get(dataSourceSelector.queryCreateAndRunButton).click(); @@ -323,7 +323,7 @@ describe("Workspace constants", () => { commonWidgetSelector.draggableWidget(data.widgetName) ).verifyVisibleElement("have.value", "Production environment testing"); }); - it("should verify the constants resolving in datasource connection form", () => { + it.skip("should verify the constants resolving in datasource connection form", () => { data.ds = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""); data.widgetName = fake.firstName.toLowerCase().replaceAll("[^A-Za-z]", ""); @@ -341,7 +341,7 @@ describe("Workspace constants", () => { AddNewconstants(data.restapiHeaderKey, "customHeader"); AddNewconstants(data.restapiHeaderValue, "key=value"); cy.apiCreateGDS( - "http://localhost:3000/api/v2/data_sources", + `${Cypress.env("server_host")}/api/v2/data_sources`, data.ds, "restapi", [ @@ -380,7 +380,7 @@ describe("Workspace constants", () => { }; cy.request({ method: "GET", - url: `http://localhost:3000/api/app-environments/versions?app_id=${Cypress.env( + url: `${Cypress.env("server_host")}/api/app-environments/versions?app_id=${Cypress.env( "appId" )}`, headers: headers, diff --git a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/authentication/forgotPassword.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/authentication/forgotPassword.cy.js deleted file mode 100644 index 24e31d0d4f..0000000000 --- a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/authentication/forgotPassword.cy.js +++ /dev/null @@ -1,183 +0,0 @@ -import { commonSelectors } from "Selectors/common"; -import { commonText } from "Texts/common"; -import { fake } from "Fixtures/fake"; -import { addNewUser } from "Support/utils/onboarding"; -import { logout } from "Support/utils/common"; - -describe("Password reset functionality", () => { - const data = {}; - let passwordResetLink = ""; - - it("Verify wrong password limit", () => { - data.firstName = fake.firstName; - data.email = fake.email.toLowerCase(); - - cy.defaultWorkspaceLogin(); - addNewUser(data.firstName, data.email); - logout(); - - for (let i = 0; i < 5; i++) { - cy.clearAndType(commonSelectors.workEmailInputField, data.email); - cy.clearAndType(commonSelectors.passwordInputField, "passw"); - cy.get(commonSelectors.loginButton).click(); - cy.verifyToastMessage( - commonSelectors.toastMessage, - "Invalid credentials" - ); - } - cy.clearAndType(commonSelectors.workEmailInputField, data.email); - cy.clearAndType(commonSelectors.passwordInputField, "passw"); - cy.get(commonSelectors.loginButton).click(); - cy.verifyToastMessage( - commonSelectors.toastMessage, - "Maximum password retry limit reached, please reset your password using forgot password option" - ); - }); - it("Verify forgot password page elements and functionality", () => { - cy.visit("/"); - cy.get(commonSelectors.forgotPasswordLink).click(); - cy.get(commonSelectors.pageLogo).should("be.visible"); - cy.get(commonSelectors.forgotPasswordPageHeader).verifyVisibleElement( - "have.text", - commonText.forgotPasswordPageHeader - ); - cy.get(commonSelectors.forgotPasswordPageSubHeader).should(($el) => { - expect($el.contents().first().text().trim()).to.eq( - "New to" - ); - }); - cy.get(commonSelectors.createAnAccountLink).verifyVisibleElement( - "have.text", - commonText.createAnAccountLink - ); - cy.get(commonSelectors.emailInputLabel).verifyVisibleElement( - "have.text", - commonText.emailAddressLabel - ); - cy.get(commonSelectors.emailInputField).should("be.visible"); - cy.get(commonSelectors.resetPasswordLinkButton) - .verifyVisibleElement("have.text", commonText.resetPasswordLinkButton) - .and("be.disabled"); - cy.get(commonSelectors.enterIcon).should("be.visible"); - - cy.clearAndType(commonSelectors.emailInputField, data.email); - cy.get(commonSelectors.resetPasswordLinkButton).click(); - - cy.get("body").then(($title) => { - if (!$title.text().includes("Forgot Password")) { - cy.verifyToastMessage( - commonSelectors.toastMessage, - commonText.passwordResetEmailToast - ); - cy.get(commonSelectors.pageLogo).should("be.visible"); - cy.get(commonSelectors.emailImage).should("be.visible"); - cy.get(commonSelectors.onboardingPageHeader).verifyVisibleElement( - "have.text", - commonText.emailPageHeader - ); - cy.get(commonSelectors.onboardingPageDescription).verifyVisibleElement( - "have.text", - commonText.resetPasswordEmailDescription(data.email) - ); - cy.get(commonSelectors.spamMessage).verifyVisibleElement( - "have.text", - commonText.spamMessage - ); - cy.get(commonSelectors.onboardingSeperator).should("be.visible"); - cy.get(commonSelectors.onboardingSeperatorText).verifyVisibleElement( - "have.text", - commonText.onboardingSeperatorText - ); - cy.get(commonSelectors.backToLoginButton).verifyVisibleElement( - "have.text", - commonText.backToLoginButton - ); - } - }); - - cy.task("updateId", { - dbconfig: Cypress.env("app_db"), - sql: `select forgot_password_token from users where email='${data.email}';`, - }).then((resp) => { - passwordResetLink = `/reset-password/${resp.rows[0].forgot_password_token}`; - }); - }); - - it("Verify reset password page and functionality", () => { - cy.visit(passwordResetLink); - cy.get(commonSelectors.pageLogo).should("be.visible"); - cy.get(commonSelectors.passwordResetPageHeader).verifyVisibleElement( - "have.text", - commonText.passwordResetPageHeader - ); - cy.get(commonSelectors.newPasswordInputLabel).verifyVisibleElement( - "have.text", - commonText.newPasswordInputLabel - ); - cy.get(commonSelectors.newPasswordInputField).should("be.visible"); - cy.get(commonSelectors.passwordHelperText) - .eq(0) - .verifyVisibleElement("have.text", commonText.passwordHelperText); - cy.get(commonSelectors.confirmPasswordInputFieldLabel).verifyVisibleElement( - "have.text", - commonText.confirmPasswordInputFieldLabel - ); - cy.get(commonSelectors.confirmPasswordInputField).should("be.visible"); - cy.get(commonSelectors.passwordHelperText) - .eq(1) - .verifyVisibleElement("have.text", commonText.passwordHelperText); - cy.get(commonSelectors.resetPasswordButton) - .verifyVisibleElement("have.text", commonText.resetPasswordButton) - .and("be.disabled"); - cy.get(commonSelectors.enterIcon).should("be.visible"); - - cy.clearAndType(commonSelectors.newPasswordInputField, "Pass"); - cy.get(commonSelectors.resetPasswordButton).should("be.disabled"); - - cy.get(commonSelectors.newPasswordInputField).clear(); - cy.clearAndType(commonSelectors.confirmPasswordInputField, "Pass"); - cy.get(commonSelectors.resetPasswordButton).should("be.disabled"); - - cy.clearAndType(commonSelectors.newPasswordInputField, "Pass"); - cy.clearAndType(commonSelectors.confirmPasswordInputField, "Pass"); - cy.get(commonSelectors.resetPasswordButton).should("be.disabled"); - - cy.clearAndType(commonSelectors.newPasswordInputField, "password1"); - cy.clearAndType(commonSelectors.confirmPasswordInputField, "password"); - cy.get(commonSelectors.resetPasswordButton).should("be.disabled"); - - cy.clearAndType(commonSelectors.newPasswordInputField, "Password"); - cy.clearAndType(commonSelectors.confirmPasswordInputField, "password"); - cy.get(commonSelectors.resetPasswordButton).click(); - cy.verifyToastMessage(commonSelectors.toastMessage, "Password don't match"); - - cy.clearAndType(commonSelectors.newPasswordInputField, "Password"); - cy.clearAndType(commonSelectors.confirmPasswordInputField, "Password"); - cy.get(commonSelectors.resetPasswordButton).should("be.enabled").click(); - cy.verifyToastMessage( - commonSelectors.toastMessage, - commonText.passwordResetSuccessToast - ); - - cy.get(commonSelectors.pageLogo).should("be.visible"); - cy.get(commonSelectors.passwordResetPageHeader).verifyVisibleElement( - "have.text", - commonText.passwordResetSuccessPageHeader - ); - cy.get(commonSelectors.resetPasswordPageDescription).verifyVisibleElement( - "have.text", - commonText.resetPasswordPageDescription - ); - cy.get(commonSelectors.backToLoginButton).verifyVisibleElement( - "have.text", - commonText.backToLoginButton - ); - }); - it("Verify user login using new password", () => { - cy.visit("/"); - cy.clearAndType(commonSelectors.workEmailInputField, data.email); - cy.clearAndType(commonSelectors.passwordInputField, "Password"); - cy.get(commonSelectors.loginButton).click(); - cy.get(commonSelectors.workspaceName).should("be.visible"); - }); -}); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/authentication/login.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/authentication/login.cy.js deleted file mode 100644 index 62fb7106fc..0000000000 --- a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/authentication/login.cy.js +++ /dev/null @@ -1,85 +0,0 @@ -import { commonSelectors } from "Selectors/common"; -import { fake } from "Fixtures/fake"; -import { commonText, path } from "Texts/common"; - -describe("Login functionality", () => { - let user; - const invalidEmail = fake.email; - const invalidPassword = fake.password; - - beforeEach(() => { - cy.fixture("credentials/login.json").then((login) => { - user = login; - }); - cy.visit("/"); - }); - it("Should verify elements on the login page", () => { - cy.url().should("include", path.loginPath); - cy.get(commonSelectors.pageLogo).should("be.visible"); - cy.get(commonSelectors.signInHeader).verifyVisibleElement( - "have.text", - commonText.signInHeader - ); - cy.get(commonSelectors.workEmailLabel).verifyVisibleElement( - "have.text", - commonText.workEmailLabel - ); - cy.get(commonSelectors.passwordLabel).should(($el) => { - expect($el.contents().first().text().trim()).to.eq( - commonText.passwordLabel - ); - }); - cy.get(commonSelectors.forgotPasswordLink).verifyVisibleElement( - "have.text", - commonText.forgotPasswordLink - ); - cy.get(commonSelectors.loginButton).verifyVisibleElement( - "have.text", - commonText.loginButton - ); - - cy.get(commonSelectors.workEmailInputField).should("be.visible"); - cy.get(commonSelectors.passwordInputField).should("be.visible"); - }); - it("Should not be able to login with invalid credentials", () => { - cy.get(commonSelectors.loginButton).click(); - cy.get(commonSelectors.emailInputError).verifyVisibleElement( - "have.text", - commonText.emailInputError - ); - - cy.clearAndType(commonSelectors.workEmailInputField, invalidEmail); - cy.get(commonSelectors.loginButton).click(); - cy.verifyToastMessage( - commonSelectors.toastMessage, - commonText.loginErrorToast - ); - - cy.get(commonSelectors.workEmailInputField).clear(); - cy.clearAndType(commonSelectors.passwordInputField, invalidPassword); - cy.get(commonSelectors.loginButton).click(); - cy.get(commonSelectors.emailInputError).verifyVisibleElement( - "have.text", - commonText.emailInputError - ); - - cy.clearAndType(commonSelectors.workEmailInputField, user.email); - cy.get(commonSelectors.passwordInputField).clear(); - cy.get(commonSelectors.loginButton).click(); - cy.verifyToastMessage( - commonSelectors.toastMessage, - commonText.loginErrorToast - ); - - cy.get(commonSelectors.workEmailInputField).clear(); - cy.clearAndType(commonSelectors.passwordInputField, user.password); - cy.get(commonSelectors.loginButton).click(); - cy.get(commonSelectors.emailInputError).verifyVisibleElement( - "have.text", - commonText.emailInputError - ); - }); - it("Should be able to login with valid credentials", () => { - cy.login(user.email, user.password); - }); -}); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/authentication/signUp.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/authentication/signUp.cy.js deleted file mode 100644 index e605d89890..0000000000 --- a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/authentication/signUp.cy.js +++ /dev/null @@ -1,104 +0,0 @@ -import { commonSelectors } from "Selectors/common"; -import { commonText } from "Texts/common"; -import { SignUpPageElements } from "Support/utils/onboarding"; -import { fake } from "Fixtures/fake"; -import { - verifyConfirmEmailPage, - verifyConfirmPageElements, - verifyOnboardingQuestions, - verifyInvalidInvitationLink, - updateWorkspaceName -} from "Support/utils/onboarding"; -import { dashboardText } from "Texts/dashboard"; -import { - verifyandModifyUserRole, - verifyandModifySizeOftheCompany, -} from "Support/utils/selfHostSignUp"; - -describe("User signup", () => { - const data = {}; - let invitationLink = ""; - - it("Verify the signup flow and UI elements", () => { - data.fullName = fake.fullName; - data.email = fake.email.toLowerCase().replaceAll("[^A-Za-z]", ""); - data.workspaceName = fake.companyName; - - cy.visit("/"); - cy.get(commonSelectors.createAnAccountLink).realClick(); - SignUpPageElements(); - - cy.clearAndType(commonSelectors.nameInputField, data.fullName); - cy.clearAndType(commonSelectors.emailInputField, data.email); - cy.clearAndType(commonSelectors.passwordInputField, commonText.password); - cy.get(commonSelectors.signUpButton).click(); - cy.wait(500); - verifyConfirmEmailPage(data.email); - - cy.task("updateId", { - dbconfig: Cypress.env("app_db"), - sql: `select invitation_token from users where email='${data.email}';`, - }).then((resp) => { - invitationLink = `/invitations/${resp.rows[0].invitation_token}`; - cy.visit(invitationLink); - }); - - verifyConfirmPageElements(); - cy.get(commonSelectors.setUpToolJetButton).click(); - cy.wait(4000); - verifyOnboardingQuestions(data.fullName, data.workspaceName); - }); - it("Verify invalid invitation link", () => { - cy.log(invitationLink) - cy.visit(invitationLink); - verifyInvalidInvitationLink(); - cy.get(commonSelectors.backtoSignUpButton).click(); - cy.get(commonSelectors.SignUpSectionHeader).should("be.visible"); - }); - it("Verify onboarding flow", () => { - data.fullName = fake.fullName; - data.email = fake.email.toLowerCase().replaceAll("[^A-Za-z]", ""); - data.workspaceName = fake.companyName; - - cy.visit("/"); - cy.get(commonSelectors.createAnAccountLink).realClick(); - - cy.clearAndType(commonSelectors.nameInputField, data.fullName); - cy.clearAndType(commonSelectors.emailInputField, data.email); - cy.clearAndType(commonSelectors.passwordInputField, commonText.password); - cy.get(commonSelectors.signUpButton).click(); - cy.wait(8000); - cy.get(commonSelectors.resendEmailButton).click(); - cy.get(commonSelectors.editEmailButton).click(); - cy.get(commonSelectors.nameInputField).verifyVisibleElement("have.value", data.fullName) - cy.get(commonSelectors.emailInputField).verifyVisibleElement("have.value", data.email); - cy.get(commonSelectors.passwordInputField).verifyVisibleElement("have.value", ""); - - cy.task("updateId", { - dbconfig: Cypress.env("app_db"), - sql: `select invitation_token from users where email='${data.email}';`, - }).then((resp) => { - invitationLink = `/invitations/${resp.rows[0].invitation_token}`; - cy.visit(invitationLink); - }); - cy.get(commonSelectors.setUpToolJetButton).click(); - cy.clearAndType(commonSelectors.companyNameInputField, data.workspaceName); - cy.get(commonSelectors.continueButton).focus().type('{enter}'); - - cy.get(commonSelectors.backArrow).click() - cy.get(commonSelectors.companyNameInputField).verifyVisibleElement("have.value", data.workspaceName); - cy.get(commonSelectors.continueButton).focus().type('{enter}'); - cy.get('[data-cy="head-of-engineering-radio-button"]').check() - cy.get(commonSelectors.continueButton).focus().type('{enter}'); - - cy.get(commonSelectors.backArrow).click() - cy.get('[data-cy="head-of-engineering-radio-button"]').should("be.checked") - cy.get(commonSelectors.continueButton).focus().type('{enter}'); - - cy.get('[data-cy="1-10-radio-button"]').check() - cy.get(commonSelectors.continueButton).focus().type('{enter}'); - cy.get(commonSelectors.backArrow).click() - cy.get('[data-cy="1-10-radio-button"]').should("be.checked") - cy.get(commonSelectors.continueButton).focus().type('{enter}'); - }) -}); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/Login.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/Login.cy.js new file mode 100644 index 0000000000..5a2bc6485d --- /dev/null +++ b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/Login.cy.js @@ -0,0 +1,88 @@ +import { commonSelectors } from "Selectors/common"; +import { fake } from "Fixtures/fake"; +import { commonText, path } from "Texts/common"; +import { onboardingSelectors } from "Selectors/onboarding"; +import { dashboardSelector } from "Selectors/dashboard"; +import { logout } from "Support/utils/common"; + +describe("Login functionality", () => { + let user; + const invalidEmail = fake.email; + const invalidPassword = fake.password; + + beforeEach(() => { + cy.fixture("credentials/login.json").then((login) => { + user = login; + }); + cy.visit("/"); + }); + it("Should verify elements on the login page", () => { + cy.url().should("include", path.loginPath); + cy.get(commonSelectors.pageLogo).should("be.visible"); + cy.get(commonSelectors.signInHeader).verifyVisibleElement( + "have.text", + commonText.signInHeader + ); + cy.get(onboardingSelectors.emailLabel).verifyVisibleElement( + "have.text", + "Email *" + ); + cy.get(onboardingSelectors.passwordLabel).should(($el) => { + expect($el.contents().first().text().trim()).to.eq( + commonText.LoginPasswordLabel + ); + }); + cy.get(commonSelectors.forgotPasswordLink).verifyVisibleElement( + "have.text", + commonText.forgotPasswordLink + ); + cy.get(onboardingSelectors.signInButton).verifyVisibleElement( + "have.text", + "Sign in" + ); + cy.get(onboardingSelectors.signInButton).should("be.disabled"); + + cy.get(onboardingSelectors.signupEmailInput).should("be.visible"); + cy.get(onboardingSelectors.loginPasswordInput).should("be.visible"); + }); + + it("Should be able to login with valid credentials", () => { + cy.appUILogin(user.email, user.password); + cy.get(commonSelectors.settingsIcon).click(); + cy.get(dashboardSelector.logoutLink); + }); + + it("Should not be able to login with invalid credentials", () => { + cy.wait(3000); + cy.clearAndType(onboardingSelectors.signupEmailInput, "test"); + cy.clearAndType(onboardingSelectors.signupEmailInput, "test"); + cy.get(commonSelectors.emailInputError).verifyVisibleElement( + "have.text", + commonText.emailInputError + ); + cy.get(onboardingSelectors.signInButton).should("be.disabled"); + + cy.get(onboardingSelectors.signupEmailInput).clear(); + cy.clearAndType(onboardingSelectors.loginPasswordInput, invalidPassword); + cy.get(onboardingSelectors.signInButton).should("be.disabled"); + + cy.clearAndType(onboardingSelectors.signupEmailInput, user.email); + cy.get(onboardingSelectors.loginPasswordInput).clear(); + cy.get(onboardingSelectors.signInButton).should("be.disabled"); + + cy.clearAndType(onboardingSelectors.signupEmailInput, user.email); + cy.clearAndType(onboardingSelectors.loginPasswordInput, "Pass"); + cy.get(onboardingSelectors.passwordError).verifyVisibleElement( + "have.text", + "Password must be at least 5 characters long" + ); + cy.clearAndType(onboardingSelectors.loginPasswordInput, invalidPassword); + cy.get(onboardingSelectors.signInButton).click(); + cy.verifyToastMessage(commonSelectors.toastMessage, "Invalid credentials"); + }); + + it("Should be able to login with valid credentials using api", () => { + cy.appUILogin(user.email, user.password); + logout(); + }); +}); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/Signup.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/Signup.cy.js new file mode 100644 index 0000000000..0c72802bc6 --- /dev/null +++ b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/Signup.cy.js @@ -0,0 +1,91 @@ +import { commonSelectors } from "Selectors/common"; +import { commonText } from "Texts/common"; +import { SignUpPageElements } from "Support/utils/onboarding"; +import { fake } from "Fixtures/fake"; +import { + verifyConfirmEmailPage, + verifyConfirmPageElements, + verifyOnboardingQuestions, + verifyInvalidInvitationLink, + updateWorkspaceName, +} from "Support/utils/onboarding"; +import { dashboardText } from "Texts/dashboard"; +import { + verifyandModifyUserRole, + verifyandModifySizeOftheCompany, +} from "Support/utils/selfHostSignUp"; +import { onboardingSelectors } from "Selectors/onboarding"; +import { logout } from "Support/utils/common"; + +describe("User signup", () => { + const data = {}; + let invitationLink = ""; + + it("Verify the signup flow and UI elements", () => { + data.fullName = fake.fullName; + data.email = fake.email.toLowerCase().replaceAll("[^A-Za-z]", ""); + data.workspaceName = fake.companyName; + + cy.visit("/"); + cy.wait(500) + cy.get(commonSelectors.createAnAccountLink).realClick(); + SignUpPageElements(); + + cy.get(onboardingSelectors.nameInput).clear(); + cy.get(onboardingSelectors.nameInput).type(data.fullName); + cy.clearAndType(onboardingSelectors.signupEmailInput, data.email); + cy.clearAndType( + onboardingSelectors.loginPasswordInput, + commonText.password + ); + cy.get(commonSelectors.signUpButton).click(); + cy.wait(500); + verifyConfirmEmailPage(data.email); + + cy.task("updateId", { + dbconfig: Cypress.env("app_db"), + sql: `select invitation_token from users where email='${data.email}';`, + }).then((resp) => { + invitationLink = `/invitations/${resp.rows[0].invitation_token}`; + cy.visit(invitationLink); + }); + + logout(); + }); + + it("Verify invalid invitation link", () => { + cy.log(invitationLink); + cy.visit(invitationLink); + verifyInvalidInvitationLink(); + cy.get(commonSelectors.pageLogo).click(); + cy.get('[data-cy="sign-in-header"]').should("be.visible"); + }); + + it("Verify onboarding flow", () => { + // rewrite for for EE and cloud + data.fullName = fake.fullName; + data.email = fake.email.toLowerCase().replaceAll("[^A-Za-z]", ""); + data.workspaceName = fake.companyName; + + cy.visit("/"); + cy.wait(8000); + cy.get(onboardingSelectors.createAnAccountLink).click(); + cy.wait(6000); + cy.get(onboardingSelectors.nameInput).clear(); + cy.get(onboardingSelectors.nameInput).type(data.fullName); + cy.clearAndType(onboardingSelectors.signupEmailInput, data.email); + cy.clearAndType( + onboardingSelectors.loginPasswordInput, + commonText.password + ); + cy.get(commonSelectors.signUpButton).click(); + cy.wait(8000); + cy.get(commonSelectors.resendEmailButton).click(); + cy.task("updateId", { + dbconfig: Cypress.env("app_db"), + sql: `select invitation_token from users where email='${data.email}';`, + }).then((resp) => { + invitationLink = `/invitations/${resp.rows[0].invitation_token}`; + }); + }); +}); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/manageUsers.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/UserInviteFlow.cy.js similarity index 61% rename from cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/manageUsers.cy.js rename to cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/UserInviteFlow.cy.js index 2824959d31..579fe146a6 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/manageUsers.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/UserInviteFlow.cy.js @@ -11,6 +11,21 @@ import { inviteUserWithUserRole, fetchAndVisitInviteLink, } from "Support/utils/manageUsers"; +import { + addNewUser, + visitWorkspaceInvitation, + newInvite, +} from "Support/utils/onboarding"; +import { commonText } from "Texts/common"; +import { setSignupStatus, enableSignUp } from "Support/utils/manageSSO"; +import { ssoSelector } from "Selectors/manageSSO"; +import { + SignUpPageElements, + verifyConfirmEmailPage, + signUpLink, + verifyOnboardingQuestions, +} from "Support/utils/onboarding"; + import { navigateToManageUsers, logout, @@ -20,20 +35,20 @@ import { import { updateWorkspaceName } from "Support/utils/userPermissions"; import { groupsSelector } from "Selectors/manageGroups"; import { groupsText } from "Texts/manageGroups"; -import { addNewUser, visitWorkspaceInvitation } from "Support/utils/onboarding"; -import { commonText } from "Texts/common"; +import { onboardingSelectors } from "Selectors/onboarding"; + +let invitationToken, + organizationToken, + workspaceId, + userId, + url = ""; const data = {}; -describe("Manage Users", () => { +describe("user invite flow cases", () => { beforeEach(() => { cy.defaultWorkspaceLogin(); }); - let invitationToken, - organizationToken, - workspaceId, - userId, - url = ""; it("Should verify the Manage users page", () => { data.firstName = fake.firstName; data.email = fake.email.toLowerCase().replaceAll("[^A-Za-z]", ""); @@ -45,8 +60,7 @@ describe("Manage Users", () => { cy.get(usersSelector.usersPageTitle).should("be.visible"); cy.get(usersSelector.buttonAddUsers).click(); - cy.get(usersSelector.buttonInviteUsers).should('be.disabled'); - + cy.get(usersSelector.buttonInviteUsers).should("be.disabled"); cy.clearAndType(commonSelectors.inputFieldFullName, data.firstName); cy.clearAndType(commonSelectors.inputFieldEmailAddress, data.email); @@ -55,7 +69,7 @@ describe("Manage Users", () => { "have.text", "Email is not valid" ); - cy.get(usersSelector.buttonInviteUsers).should('be.disabled'); + cy.get(usersSelector.buttonInviteUsers).should("be.disabled"); cy.clearAndType(commonSelectors.inputFieldFullName, data.firstName); cy.clearAndType( @@ -64,18 +78,25 @@ describe("Manage Users", () => { ); cy.get(usersSelector.buttonInviteUsers).click(); - cy.get('[data-cy="modal-icon"]').should('be.visible') - cy.get('[data-cy="modal-header"]').verifyVisibleElement("have.text", "Duplicate email"); - cy.get(commonSelectors.modalMessage).verifyVisibleElement("have.text", "Duplicate email found. Please provide a unique email address.") - cy.get('[data-cy="close-button"]:eq(1)').should('be.visible').click(); - cy.get(commonSelectors.inputFieldEmailAddress).should("have.value", usersText.adminUserEmail) - + cy.get('[data-cy="modal-icon"]').should("be.visible"); + cy.get('[data-cy="modal-header"]').verifyVisibleElement( + "have.text", + "Duplicate email" + ); + cy.get(commonSelectors.modalMessage).verifyVisibleElement( + "have.text", + "Duplicate email found. Please provide a unique email address." + ); + cy.get('[data-cy="close-button"]:eq(1)').should("be.visible").click(); + cy.get(commonSelectors.inputFieldEmailAddress).should( + "have.value", + usersText.adminUserEmail + ); }); it("Should verify the confirm invite page and new user account", () => { data.firstName = fake.firstName; data.email = fake.email.toLowerCase().replaceAll("[^A-Za-z]", ""); - // cy.removeAssignedApps(); navigateToManageUsers(); fillUserInviteForm(data.firstName, data.email); @@ -84,9 +105,9 @@ describe("Manage Users", () => { fetchAndVisitInviteLink(data.email); confirmInviteElements(data.email); - cy.clearAndType(commonSelectors.passwordInputField, "pass"); + cy.clearAndType(onboardingSelectors.loginPasswordInput, "pass"); cy.get(commonSelectors.signUpButton).should("be.disabled"); - cy.clearAndType(commonSelectors.passwordInputField, usersText.password); + cy.clearAndType(onboardingSelectors.loginPasswordInput, usersText.password); cy.get(commonSelectors.signUpButton).should("not.be.disabled"); cy.get(commonSelectors.signUpButton).click(); @@ -98,14 +119,12 @@ describe("Manage Users", () => { "have.text", commonText.invitePageSubHeader ); - cy.verifyLabel("Name"); cy.get(commonSelectors.invitedUserName).verifyVisibleElement( "have.text", data.firstName ); - cy.verifyLabel("Email"); - - cy.get(commonSelectors.invitedUserEmail).verifyVisibleElement( + cy.wait(3000); + cy.get(commonSelectors.invitedUseremail).verifyVisibleElement( "have.text", data.email ); @@ -155,14 +174,9 @@ describe("Manage Users", () => { logout(); cy.visit("/"); - cy.clearAndType(commonSelectors.workEmailInputField, data.email); - cy.clearAndType(commonSelectors.passwordInputField, usersText.password); - cy.get(commonSelectors.loginButton).click(); - - updateWorkspaceName(data.email); - cy.get(commonSelectors.workspaceName).click(); - cy.contains("My workspace").should("not.exist"); - logout(); + cy.clearAndType(onboardingSelectors.signupEmailInput, data.email); + cy.clearAndType(onboardingSelectors.loginPasswordInput, usersText.password); + cy.get(onboardingSelectors.signInButton).click(); cy.defaultWorkspaceLogin(); navigateToManageUsers(); @@ -177,9 +191,9 @@ describe("Manage Users", () => { visitWorkspaceInvitation(data.email, "My workspace"); - cy.clearAndType(commonSelectors.workEmailInputField, data.email); - cy.clearAndType(commonSelectors.passwordInputField, "password"); - cy.get(commonSelectors.signInButton).click(); + cy.clearAndType(onboardingSelectors.signupEmailInput, data.email); + cy.clearAndType(onboardingSelectors.loginPasswordInput, "password"); + cy.get(onboardingSelectors.signInButton).click(); cy.get(usersSelector.acceptInvite).click(); cy.verifyToastMessage(commonSelectors.toastMessage, usersText.inviteToast); logout(); @@ -199,7 +213,6 @@ describe("Manage Users", () => { data.groupName1 = fake.firstName.replaceAll("[^A-Za-z]", ""); data.groupName2 = fake.firstName.replaceAll("[^A-Za-z]", ""); - const groupNames = ["All users", "Admin"]; navigateToManageUsers(); @@ -213,10 +226,6 @@ describe("Manage Users", () => { } }); cy.get('[data-cy="user-group-select"]>>>>>').eq(0).type("Test"); - cy.get(".css-1wlit7h-NoOptionsMessage").verifyVisibleElement( - "have.text", - "No groups found" - ); cy.get(commonSelectors.cancelButton).click(); cy.get(usersSelector.buttonAddUsers).click(); @@ -225,7 +234,7 @@ describe("Manage Users", () => { cy.get(commonSelectors.cancelButton).click(); cy.get(usersSelector.buttonAddUsers).click(); - cy.get('.selected-value').should('have.text', "End-user") + cy.get(".selected-value").should("have.text", "End-user"); cy.get(commonSelectors.cancelButton).click(); inviteUserWithUserRole(data.firstName, data.email, "Admin"); @@ -257,7 +266,7 @@ describe("Manage Users", () => { data.groupName2 ); logout(); - + cy.wait(3000); cy.defaultWorkspaceLogin(); navigateToManageGroups(); cy.get(groupsSelector.groupLink(data.groupName1)).click(); @@ -337,12 +346,27 @@ describe("Manage Users", () => { cy.get(usersSelector.buttonInviteUsers).click(); - cy.get('[data-cy="modal-title"] > .tj-text-md').verifyVisibleElement("have.text", "Edit user role") - cy.get('[data-cy="user-email"]').verifyVisibleElement("have.text", data.email); - cy.get('[data-cy="modal-body"]>').verifyVisibleElement("have.text", "Are you sure you want to continue?"); - cy.get('.modal-footer > [data-cy="cancel-button"]').verifyVisibleElement("have.text", "Cancel"); - cy.get('[data-cy="confim-button"]').verifyVisibleElement("have.text", "Continue"); - cy.get('[data-cy="modal-close-button"]').should('be.visible').click(); + cy.get('[data-cy="modal-title"] > .tj-text-md').verifyVisibleElement( + "have.text", + "Edit user role" + ); + cy.get('[data-cy="user-email"]').verifyVisibleElement( + "have.text", + data.email + ); + cy.get('[data-cy="modal-body"]>').verifyVisibleElement( + "have.text", + "Updating the user's details will change their role from end-user to admin. Are you sure you want to continue?" + ); + cy.get('.modal-footer > [data-cy="cancel-button"]').verifyVisibleElement( + "have.text", + "Cancel" + ); + cy.get('[data-cy="confim-button"]').verifyVisibleElement( + "have.text", + "Continue" + ); + cy.get('[data-cy="modal-close-button"]').should("be.visible").click(); cy.get(usersSelector.userActionButton).click(); cy.get(usersSelector.editUserDetailsButton).click(); @@ -359,7 +383,7 @@ describe("Manage Users", () => { cy.get('[data-cy="group-check-input"]').eq(0).check(); cy.get(usersSelector.buttonInviteUsers).click(); - cy.get('.modal-footer > [data-cy="cancel-button"]').click() + cy.get('.modal-footer > [data-cy="cancel-button"]').click(); cy.get(usersSelector.userActionButton).click(); cy.get(usersSelector.editUserDetailsButton).click(); @@ -376,15 +400,37 @@ describe("Manage Users", () => { cy.get('[data-cy="group-check-input"]').eq(0).check(); cy.get(usersSelector.buttonInviteUsers).click(); - cy.get('[data-cy="confim-button"]').click() + cy.get('[data-cy="confim-button"]').click(); cy.verifyToastMessage( commonSelectors.toastMessage, "User has been updated" ); - searchUser(data.email); - cy.get('[data-name="role-header"] [data-cy="group-chip"]').should("have.text", "Admin"); + cy.get('[data-name="role-header"] [data-cy="group-chip"]').should( + "have.text", + "Admin" + ); + + cy.get(usersSelector.userActionButton).click(); + cy.get(usersSelector.editUserDetailsButton).click(); + cy.get('[data-cy="user-group-select"]>>>>>').eq(0).type("Builder"); + cy.wait(1000); + cy.get('[data-cy="group-check-input"]').eq(0).check(); + + cy.get(usersSelector.buttonInviteUsers).click(); + cy.get('[data-cy="confim-button"]').click(); + + cy.verifyToastMessage( + commonSelectors.toastMessage, + "User has been updated" + ); + searchUser(data.email); + cy.get('[data-name="role-header"] [data-cy="group-chip"]').should( + "have.text", + "Builder" + ); + }); it("Should verify exisiting user invite flow", () => { @@ -404,10 +450,10 @@ describe("Manage Users", () => { cy.get(usersSelector.buttonInviteUsers).click(); cy.wait(2000); visitWorkspaceInvitation(data.email, workspaceName); - - cy.clearAndType(commonSelectors.workEmailInputField, data.email); - cy.clearAndType(commonSelectors.passwordInputField, "password"); - cy.get(commonSelectors.signInButton).click(); + cy.wait(3000); + cy.clearAndType(onboardingSelectors.loginEmailInput, data.email); + cy.clearAndType(onboardingSelectors.loginPasswordInput, "password"); + cy.get(onboardingSelectors.signInButton).click(); cy.get(usersSelector.acceptInvite).click(); cy.verifyToastMessage(commonSelectors.toastMessage, usersText.inviteToast); logout(); @@ -421,4 +467,118 @@ describe("Manage Users", () => { cy.get("td small").should("have.text", usersText.activeStatus); }); }); + + it("should verify the user signup after invited in a workspace", () => { + data.firstName = fake.firstName; + data.email = fake.email.toLowerCase().replaceAll("[^A-Za-z]", ""); + data.signUpName = fake.firstName; + data.workspaceName = fake.companyName; + + setSignupStatus(true); + navigateToManageUsers(); + fillUserInviteForm(data.firstName, data.email); + cy.get(usersSelector.buttonInviteUsers).click(); + cy.logoutApi(); + + cy.visit("/"); + cy.get(commonSelectors.createAnAccountLink).click(); + SignUpPageElements(); + cy.wait(3000); + cy.clearAndType(onboardingSelectors.nameInput, data.signUpName); + cy.clearAndType(onboardingSelectors.signupEmailInput, data.email); + cy.clearAndType( + onboardingSelectors.loginPasswordInput, + commonText.password + ); + cy.get(commonSelectors.signUpButton).click(); + cy.wait(1000); + signUpLink(data.email); + cy.wait(1000); + visitWorkspaceInvitation(data.email, "My workspace"); + cy.clearAndType(onboardingSelectors.signupEmailInput, data.email); + cy.clearAndType(onboardingSelectors.loginPasswordInput, usersText.password); + cy.get(onboardingSelectors.signInButton).click(); + cy.wait(3000); + cy.get(commonSelectors.invitedUserName).verifyVisibleElement( + "have.text", + data.signUpName + ); + cy.get(commonSelectors.acceptInviteButton).click(); + }); + + it("should verify the user signup with same creds after invited in a workspace", () => { + data.firstName = fake.firstName; + data.email = fake.email.toLowerCase().replaceAll("[^A-Za-z]", ""); + data.signUpName = fake.firstName; + data.workspaceName = fake.companyName; + + setSignupStatus(true); + navigateToManageUsers(); + fillUserInviteForm(data.firstName, data.email); + cy.get(usersSelector.buttonInviteUsers).click(); + logout(); + + cy.get(commonSelectors.createAnAccountLink).click(); + SignUpPageElements(); + cy.wait(5000); + + cy.clearAndType(onboardingSelectors.nameInput, data.signUpName); + cy.clearAndType(onboardingSelectors.signupEmailInput, data.email); + cy.clearAndType( + onboardingSelectors.loginPasswordInput, + commonText.password + ); + cy.get(commonSelectors.signUpButton).click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + "The user is already registered. Please check your inbox for the activation link" + ); + }); + + it("should verify exisiting user workspace signup from instance using form", () => { + data.firstName = fake.firstName; + data.email = fake.email.toLowerCase().replaceAll("[^A-Za-z]", ""); + data.signUpName = fake.firstName; + data.workspaceName = fake.firstName.toLowerCase(); + + setSignupStatus(true); + navigateToManageUsers(); + addNewUser(data.firstName, data.email); + logout(); + cy.wait(3000); + cy.get(commonSelectors.createAnAccountLink).click(); + cy.wait(1000); + cy.clearAndType(onboardingSelectors.nameInput, data.firstName); + cy.clearAndType(onboardingSelectors.signupEmailInput, data.email); + cy.clearAndType( + onboardingSelectors.loginPasswordInput, + commonText.password + ); + cy.get(commonSelectors.signUpButton).click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + "User already exists in the workspace." + ); + cy.apiLogin(); + cy.apiCreateWorkspace(data.workspaceName, data.workspaceName); + cy.visit(`${data.workspaceName}`); + cy.wait(3000); + setSignupStatus(true, data.workspaceName); + logout(); + + cy.get(commonSelectors.createAnAccountLink).click(); + cy.wait(3000); + cy.clearAndType(onboardingSelectors.nameInput, data.firstName); + cy.clearAndType(onboardingSelectors.signupEmailInput, data.email); + cy.clearAndType( + onboardingSelectors.loginPasswordInput, + commonText.password + ); + cy.get(commonSelectors.signUpButton).click(); + + cy.defaultWorkspaceLogin(); + visitWorkspaceInvitation(data.email, data.workspaceName); + cy.verifyToastMessage(commonSelectors.toastMessage, usersText.inviteToast); + logout(); + }); }); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/bulkUserUpload.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/bulkUsersUpload.cy.js similarity index 56% rename from cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/bulkUserUpload.cy.js rename to cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/bulkUsersUpload.cy.js index 91ac5a7951..ada49dc6d6 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/bulkUserUpload.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/bulkUsersUpload.cy.js @@ -1,7 +1,7 @@ import { commonSelectors } from "Selectors/common"; import { usersText } from "Texts/manageUsers"; import { usersSelector } from "Selectors/manageUsers"; -import { bulkUserUpload } from "Support/utils/manageUsers"; +import { bulkUserUpload,bulkUserUploadDuplicate} from "Support/utils/manageUsers"; import * as common from "Support/utils/common"; import { path } from "Texts/common"; import { groupsSelector } from "Selectors/manageGroups"; @@ -14,8 +14,6 @@ describe("Bulk user upload", () => { const without_email = "cypress/fixtures/bulkUser/without_email - Sheet1.csv"; const without_group = "cypress/fixtures/bulkUser/without_group - Sheet1.csv"; const same_email = "cypress/fixtures/bulkUser/same_email - Sheet1.csv"; - const invalid_group_name = - "cypress/fixtures/bulkUser/invalid_group_name - Sheet1.csv"; const empty_first_and_last_name = "cypress/fixtures/bulkUser/empty_first_and_last_name - Sheet1.csv"; const limit_exceeded_list = @@ -24,11 +22,10 @@ describe("Bulk user upload", () => { "cypress/fixtures/bulkUser/non_existing_group -Sheet1 .csv"; const multiple_groups = "cypress/fixtures/bulkUser/multiple_groups - Sheet1.csv"; - const without_firstName = - "cypress/fixtures/bulkUser/without_firstname - Sheet1.csv"; - const without_lastName = - "cypress/fixtures/bulkUser/without_lastname - Sheet1.csv"; + const without_Role = + "cypress/fixtures/bulkUser/without_Role - Sheet1.csv"; const invite_users = "cypress/fixtures/bulkUser/invite_users - Sheet1 .csv"; + const Validinvite = "cypress/fixtures/bulkUser/10usersupload.csv"; it("Verfiy bulk user upload invalid files", () => { data.firstName = fake.firstName; @@ -42,80 +39,57 @@ describe("Bulk user upload", () => { cy.get(usersSelector.buttonAddUsers).click(); cy.get(usersSelector.buttonUploadCsvFile).click(); - bulkUserUpload( without_name, "without_name", - "Invalid row(s): [first_name, last_name] in [11] row(s). No users were uploaded." + "Missing first_name,last_name,groups information in 10 row(s);. No users were uploaded, please update and try again." ); + bulkUserUpload( without_email, "without_email", - "Invalid row(s): [email] in [11] row(s). No users were uploaded." + "Missing email,groups information in 10 row(s);. No users were uploaded, please update and try again." ); - bulkUserUpload( - without_group, - "without_group", - "Invalid row(s): [groups] in [5] row(s). No users were uploaded." - ); - bulkUserUpload( + + bulkUserUploadDuplicate( same_email, "same_email", "Duplicate email found. Please provide a unique email address." ); - bulkUserUpload( - invalid_group_name, - "invalid_group_name", - "11 groups doesn't exist. No users were uploaded" - ); + bulkUserUpload( empty_first_and_last_name, "empty_first_and_last_name", - "Invalid row(s): [first_name, last_name] in [1] row(s). No users were uploaded." + "Missing first_name,last_name,groups information in 1 row(s);. No users were uploaded, please update and try again." ); bulkUserUpload( limit_exceeded_list, "500_invite_users", "You can only invite 250 users at a time" ); + bulkUserUpload( non_existing_group, "non_existing_group", - "1 group doesn't exist. No users were uploaded" + "2 groups doesn't exist. No users were uploaded" ); + bulkUserUpload( - multiple_groups, - "multiple_groups", - "Conflicting Group Memberships: User cannot be in both the Admin group and other groups simultaneously." + without_Role, + "without_Role", + "Missing user_role,groups information in 5 row(s);. No users were uploaded, please update and try again." ); - cy.get(usersSelector.inputFieldBulkUpload).selectFile(without_firstName, { - force: true, - }); - cy.get(usersSelector.uploadedFileData).should( - "contain", - "without_firstname" - ); - cy.get(usersSelector.buttonUploadUsers).click(); - cy.get(".go2072408551") - .should("be.visible") - .and("have.text", "5 users are being added"); + //add more groups and verify - cy.wait(5000); + // bulkUserUpload( + // multiple_groups, + // "multiple_groups", + // "Conflicting Group Memberships: User cannot be in both the Admin group and other groups simultaneously." + // ); + + // ); - cy.get(usersSelector.buttonAddUsers).click(); - cy.get(usersSelector.buttonUploadCsvFile).click(); - cy.get(usersSelector.inputFieldBulkUpload).selectFile(without_lastName, { - force: true, - }); - cy.get(usersSelector.uploadedFileData).should( - "contain", - "without_lastname" - ); - cy.get(usersSelector.buttonUploadUsers).click(); - cy.get(".go2072408551") - .should("be.visible") - .and("have.text", "5 users are being added"); }); it("Verify bulk user upload functionality", () => { @@ -130,22 +104,14 @@ describe("Bulk user upload", () => { cy.get(usersSelector.buttonAddUsers).click(); cy.get(usersSelector.buttonUploadCsvFile).click(); - cy.get(usersSelector.inputFieldBulkUpload).selectFile(invite_users, { - force: true, - }); - cy.get(usersSelector.uploadedFileData).should("contain", "invite_users"); - cy.get(commonSelectors.cancelButton).click(); - - cy.get(usersSelector.buttonAddUsers).click(); - cy.get(usersSelector.buttonUploadCsvFile).click(); - cy.get(usersSelector.inputFieldBulkUpload).selectFile(invite_users, { + cy.get(usersSelector.inputFieldBulkUpload).selectFile(Validinvite, { force: true, }); + cy.get(commonSelectors.fileSelector).should("contain", " 10usersupload"); cy.get(usersSelector.buttonUploadUsers).click(); - cy.wait(30000); cy.get(".go2072408551") .should("be.visible") - .and("have.text", "250 users are being added"); + .and("have.text", "10 users are being added"); common.searchUser("test12@gmail.com"); cy.contains("td", "test12@gmail.com") .parent() diff --git a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/resetPassword.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/resetPassword.cy.js new file mode 100644 index 0000000000..d9d115ee38 --- /dev/null +++ b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/resetPassword.cy.js @@ -0,0 +1,187 @@ +import { commonSelectors } from "Selectors/common"; +import { commonText } from "Texts/common"; +import { fake } from "Fixtures/fake"; +import { addNewUser } from "Support/utils/onboarding"; +import { logout } from "Support/utils/common"; +import { onboardingSelectors } from "Selectors/onboarding"; + + +describe("Password reset functionality", () => { + const data = {}; + let passwordResetLink = ""; + + it("Verify wrong password limit", () => { + data.firstName = fake.firstName; + data.email = fake.email.toLowerCase(); + + cy.defaultWorkspaceLogin(); + addNewUser(data.firstName, data.email); + logout(); + + for (let i = 0; i < 5; i++) { + cy.clearAndType(onboardingSelectors.signupEmailInput, data.email); + cy.clearAndType(onboardingSelectors.loginPasswordInput, "passw"); + cy.get(onboardingSelectors.signInButton).click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + "Invalid credentials" + ); + } + cy.clearAndType(onboardingSelectors.signupEmailInput, data.email); + cy.clearAndType(onboardingSelectors.loginPasswordInput, "passw"); + cy.get(onboardingSelectors.signInButton).click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + "Maximum password retry limit reached, please reset your password using forgot password option" + ); + }); + + it("Verify forgot password page elements and functionality", () => { + cy.visit("/"); + cy.get(commonSelectors.forgotPasswordLink).click(); + cy.get(commonSelectors.pageLogo).should("be.visible"); + cy.get(commonSelectors.forgotPasswordPageHeader).verifyVisibleElement( + "have.text", + commonText.forgotPasswordPageHeader + ); + cy.get(commonSelectors.forgotPasswordPageSubHeader).verifyVisibleElement( + "have.text", + "New to ToolJet? Create an account" + ); + + cy.get(commonSelectors.createAnAccountLink).verifyVisibleElement( + "have.text", + commonText.createAnAccountLink + ); + + cy.get('[data-cy="email-input-field-label"]').verifyVisibleElement( + "have.text", + "Email address *" + ); + + cy.get('[data-cy="email-input-field-input"]').should("be.visible"); + cy.get(commonSelectors.resetPasswordLinkButton) + .verifyVisibleElement("have.text", commonText.resetPasswordLinkButton) + .and("be.disabled"); + cy.wait(5000); + cy.clearAndType('[data-cy="email-input-field-input"]', data.email); + cy.get(commonSelectors.resetPasswordLinkButton).click(); + + cy.verifyToastMessage( + commonSelectors.toastMessage, + commonText.passwordResetEmailToast + ); + cy.get(commonSelectors.pageLogo).should("be.visible"); + + cy.get('[data-cy="check-your-mail-header"]').verifyVisibleElement( + "have.text", + "Check your mail" + ); + + cy.get(commonSelectors.onboardingPageDescription).verifyVisibleElement( + "have.text", + commonText.resetPasswordEmailDescription(data.email) + ); + cy.get(commonSelectors.spamMessage).verifyVisibleElement( + "have.text", + commonText.spamMessage + ); + cy.get(commonSelectors.onboardingSeperator).should("be.visible"); + cy.get(commonSelectors.onboardingSeperatorText).verifyVisibleElement( + "have.text", + commonText.onboardingSeperatorText + ); + cy.get(commonSelectors.backToLoginButton).verifyVisibleElement( + "have.text", + commonText.backToLoginButton + ); + + cy.task("updateId", { + dbconfig: Cypress.env("app_db"), + sql: `select forgot_password_token from users where email='${data.email}';`, + }).then((resp) => { + passwordResetLink = `/reset-password/${resp.rows[0].forgot_password_token}`; + }); + }); + + it("Verify reset password page and functionality", () => { + cy.visit(passwordResetLink); + cy.get(commonSelectors.pageLogo).should("be.visible"); + cy.get(commonSelectors.passwordResetPageHeader).verifyVisibleElement( + "have.text", + commonText.passwordResetPageHeader + ); + cy.get(commonSelectors.newPasswordInputLabel).verifyVisibleElement( + "have.text", + commonText.newPasswordInputLabel + ); + cy.get(commonSelectors.newPasswordInputField).should("be.visible"); + cy.get(commonSelectors.passwordHelperText) + .eq(0) + .verifyVisibleElement("have.text", commonText.passwordHelperText); + cy.get(commonSelectors.confirmPasswordInputFieldLabel).verifyVisibleElement( + "have.text", + commonText.confirmPasswordInputFieldLabel + ); + cy.get(commonSelectors.confirmPasswordInputField).should("be.visible"); + cy.get(commonSelectors.passwordHelperText).verifyVisibleElement( + "have.text", + commonText.passwordHelperText + ); + cy.get(commonSelectors.resetPasswordButton) + .verifyVisibleElement("have.text", commonText.resetPasswordButton) + .and("be.disabled"); + + cy.clearAndType(commonSelectors.newPasswordInputField, "Pass"); + cy.get(commonSelectors.resetPasswordButton).should("be.disabled"); + + cy.get(commonSelectors.newPasswordInputField).clear(); + cy.clearAndType(commonSelectors.confirmPasswordInputField, "Pass"); + cy.get(commonSelectors.resetPasswordButton).should("be.disabled"); + + cy.clearAndType(commonSelectors.newPasswordInputField, "Pass"); + cy.clearAndType(commonSelectors.confirmPasswordInputField, "Pass"); + cy.get(commonSelectors.resetPasswordButton).should("be.disabled"); + + cy.clearAndType(commonSelectors.newPasswordInputField, "password1"); + cy.clearAndType(commonSelectors.confirmPasswordInputField, "password"); + cy.get(commonSelectors.resetPasswordButton).should("be.disabled"); + + cy.clearAndType(commonSelectors.newPasswordInputField, "Password"); + cy.clearAndType(commonSelectors.confirmPasswordInputField, "password"); + cy.get('[data-cy="confirm-password-input-error"]').verifyVisibleElement( + "have.text", + "Passwords don't match" + ); + + cy.clearAndType(commonSelectors.newPasswordInputField, "Password"); + cy.clearAndType(commonSelectors.confirmPasswordInputField, "Password"); + cy.get(commonSelectors.resetPasswordButton).should("be.enabled").click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + commonText.passwordResetSuccessToast + ); + + cy.get(commonSelectors.pageLogo).should("be.visible"); + cy.get('[data-cy="password-has-been-reset-header"]').verifyVisibleElement( + "have.text", + commonText.passwordResetSuccessPageHeader + ); + cy.get(commonSelectors.resetPasswordPageDescription).verifyVisibleElement( + "have.text", + commonText.resetPasswordPageDescription + ); + cy.get(commonSelectors.backToLoginButton).verifyVisibleElement( + "have.text", + commonText.backToLoginButton + ); + }); + + it("Verify user login using new password", () => { + cy.visit("/"); + cy.clearAndType(onboardingSelectors.signupEmailInput, data.email); + cy.clearAndType(onboardingSelectors.loginPasswordInput, "Password"); + cy.get(onboardingSelectors.signInButton).click(); + cy.get(commonSelectors.workspaceName).should("be.visible"); + }); + }); \ No newline at end of file diff --git a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/dashboard.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/dashboard.cy.js index 5852d8d680..fe6b0c4878 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/dashboard.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/dashboard.cy.js @@ -41,13 +41,18 @@ describe("dashboard", () => { cy.intercept("GET", "/api/apps?page=1&folder=&searchKey=", { fixture: "intercept/emptyDashboard.json", }).as("emptyDashboard"); - cy.intercept("GET", "/api/folders?searchKey=", { folders: [] }).as( - "folders" - ); - cy.intercept("GET", "api/metadata", { - installed_version: "2.9.2", - version_ignored: false, + + cy.intercept("GET", "/api/folders?searchKey=", { + body: { folders: [] }, + }).as("folders"); + + cy.intercept("GET", "/api/metadata", { + body: { + installed_version: "2.9.2", + version_ignored: false, + }, }).as("version"); + cy.defaultWorkspaceLogin(); cy.wait("@emptyDashboard"); cy.wait("@folders"); @@ -59,7 +64,7 @@ describe("dashboard", () => { "My workspace" ); cy.get(commonSelectors.workspaceName).click(); - cy.get(commonSelectors.editRectangleIcon).should("be.visible"); + // cy.get(commonSelectors.editRectangleIcon).should("be.visible"); cy.get(commonSelectors.appCreateButton).verifyVisibleElement( "have.text", "Create an app" @@ -173,10 +178,14 @@ describe("dashboard", () => { }); it("Should verify app card elements and app card operations", () => { + const customLayout = { + desktop: { top: 100, left: 20 }, + mobile: { width: 8, height: 50 }, + }; cy.apiLogin(); cy.apiCreateApp(data.appName); cy.openApp(); - cy.dragAndDropWidget("Table", 250, 250); + cy.addComponentToApp(data.appName, "text1", customLayout); cy.backToApps(); @@ -190,11 +199,8 @@ describe("dashboard", () => { data.appName ); cy.get(commonSelectors.appCreationDetails).should("be.visible"); - cy.get(commonSelectors.appCreationDetails) - .should("be.visible") - .and(($el) => { - expect($el.contents().last().text().trim()).to.eq("The Developer"); - }); + + //Add the edited details }); viewAppCardOptions(data.appName); @@ -287,7 +293,7 @@ describe("dashboard", () => { .and("have.text", dashboardText.appClonedToast); cy.wait(3000); cy.renameApp(data.cloneAppName); - cy.dragAndDropWidget("button", 25, 25); + cy.addComponentToApp(data.cloneAppName, "button", 25, 25); cy.backToApps(); cy.wait("@appLibrary"); cy.wait(1000); @@ -339,11 +345,16 @@ describe("dashboard", () => { }); it("Should verify the app CRUD operation", () => { + const customLayout = { + desktop: { top: 100, left: 20 }, + mobile: { width: 8, height: 50 }, + }; + cy.skipWalkthrough(); data.appName = `${fake.companyName}-App`; cy.defaultWorkspaceLogin(); cy.createApp(data.appName); - cy.dragAndDropWidget("Button", 450, 450); + cy.addComponentToApp(data.appName, "text1", customLayout); cy.backToApps(); @@ -353,7 +364,8 @@ describe("dashboard", () => { ); navigateToAppEditor(data.appName); - cy.get(commonSelectors.canvas).should("contain", "Button"); + // cy.get(commonSelectors.canvas).should("contain", "text1"); + cy.get(".text-widget-section > div").should("be.visible"); cy.backToApps(); cy.wait("@appLibrary"); @@ -366,10 +378,16 @@ describe("dashboard", () => { }); it("Should verify the folder CRUD operation", () => { + const customLayout = { + desktop: { top: 100, left: 20 }, + mobile: { width: 8, height: 50 }, + }; + data.appName = `${fake.companyName}-App`; cy.defaultWorkspaceLogin(); cy.createApp(data.appName); - cy.dragAndDropWidget("Button", 100, 100); + + cy.addComponentToApp(data.appName, "text1", customLayout); cy.backToApps(); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/errorPage.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/errorPage.cy.js index 0e8d3127c3..fe5cbe41f4 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/errorPage.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/errorPage.cy.js @@ -36,13 +36,12 @@ describe("Redirection error pages", () => { cy.get(commonSelectors.backToHomeButton).click(); cy.get(commonSelectors.pageSectionHeader).should("be.visible"); cy.logoutApi(); - - cy.visit(`/applications/${data.lastName}`); - cy.get(commonSelectors.backToHomeButton).click(); - cy.get(commonSelectors.workEmailLabel).should("be.visible"); + cy.wait(3000); cy.apiLogin("test@tooljet.com", "password"); cy.visit(`/applications/${data.lastName}`); + cy.get(commonSelectors.backToHomeButton).click(); + }); it("Verify error message in case of restricted access", () => { @@ -52,34 +51,30 @@ describe("Redirection error pages", () => { cy.openApp(); cy.wait(1000); releaseApp(); - cy.get(commonWidgetSelector.shareAppButton).click(); - cy.clearAndType(commonWidgetSelector.appNameSlugInput, data.slug); cy.wait(1000); cy.logoutApi(); - cy.apiLogin("test@tooljet.com", "password"); cy.visit(`/applications/${data.slug}`); - cy.get(commonSelectors.modalHeader).verifyVisibleElement( "have.text", - "Restricted access" + "Invalid link" ); cy.get(commonSelectors.modalDescription).verifyVisibleElement( "have.text", - "You don’t have access to this app. Kindly contact admin to know more." + "The link you provided is invalid. Please check the link and try again." ); cy.get(commonSelectors.backToHomeButton).verifyVisibleElement( "have.text", "Back to home page" ); - cy.url().should("eq", "http://localhost:8082/error/restricted"); + cy.url().should("eq", `${Cypress.config('baseUrl')}/error/invalid-link`); cy.get(commonSelectors.backToHomeButton).click(); cy.get(commonSelectors.pageSectionHeader).should("be.visible"); }); - it.only("Verify error modal for app url of unreleased apps", () => { + it("Verify error modal for app url of unreleased apps", () => { data.appName = `${fake.companyName} App`; data.slug = data.appName.toLowerCase().replace(/\s+/g, "-"); @@ -90,7 +85,7 @@ describe("Redirection error pages", () => { cy.clearAndType(commonWidgetSelector.appSlugInput, data.slug); cy.wait(1000); - cy.visit(`http://localhost:8082/applications/${data.slug}`); + cy.visit(`${Cypress.config('baseUrl')}/applications/${data.slug}`); cy.get(commonSelectors.modalHeader).verifyVisibleElement( "have.text", "App URL Unavailable" @@ -109,10 +104,7 @@ describe("Redirection error pages", () => { "Back to home page" ); - cy.url().should( - "eq", - `http://localhost:8082/error/url-unavailable?appSlug=${data.slug}` - ); + cy.url().should('contain', '/error/') cy.get(commonSelectors.backToHomeButton).click(); cy.get(commonSelectors.pageSectionHeader).should("be.visible"); @@ -120,46 +112,28 @@ describe("Redirection error pages", () => { cy.apiLogin("test@tooljet.com", "password"); cy.wait(500); - cy.visit(`http://localhost:8082/applications/${data.slug}`); + cy.visit(`${Cypress.config('baseUrl')}/applications/${data.slug}`); cy.get(commonSelectors.modalHeader).verifyVisibleElement( "have.text", - "Restricted access" + "App URL Unavailable" ); cy.get(commonSelectors.modalDescription).verifyVisibleElement( "have.text", - "You don’t have access to this app. Kindly contact admin to know more." + "The app URL is currently unavailable because the app has not been released. Please either release it or contact admin for access." ); - // cy.get('[data-cy="open-app-button"]').verifyVisibleElement("have.text", "Open app") cy.get(commonSelectors.backToHomeButton).verifyVisibleElement( "have.text", "Back to home page" ); - cy.url().should("eq", "http://localhost:8082/error/restricted"); + cy.url().should('contain', '/error/') cy.get(commonSelectors.backToHomeButton).click(); cy.get(commonSelectors.pageSectionHeader).should("be.visible"); logout(); - - cy.defaultWorkspaceLogin(); - navigateToManageGroups(); - cy.get(groupsSelector.appsLink).click(); - cy.wait(1000); - cy.get(groupsSelector.appSearchBox).click(); - cy.wait(1000); - cy.get(groupsSelector.searchBoxOptions).contains(data.appName).click(); - cy.get(groupsSelector.selectAddButton).click(); - cy.get("table").contains("td", data.appName); - cy.contains("td", data.appName) - .parent() - .within(() => { - cy.get("td input").eq(1).check(); - }); - - cy.logoutApi(); cy.apiLogin("test@tooljet.com", "password"); cy.wait(500); - cy.visit(`http://localhost:8082/applications/${data.slug}`); + cy.visit(`${Cypress.config('baseUrl')}/applications/${data.slug}`); cy.get(commonSelectors.modalHeader).verifyVisibleElement( "have.text", "App URL Unavailable" @@ -172,10 +146,18 @@ describe("Redirection error pages", () => { "have.text", "Back to home page" ); +<<<<<<< HEAD cy.url().should( "eq", - `http://localhost:8082/error/url-unavailable?appSlug=${data.slug}` +<<<<<<< HEAD + `${Cypress.config('baseUrl')}/error/url-unavailable?appSlug=${data.slug}` +======= + `http://localhost:8082/error/restricted` +>>>>>>> main ); +======= + cy.url().should('contain', '/error/') +>>>>>>> main cy.get(commonSelectors.backToHomeButton).click(); cy.get(commonSelectors.pageSectionHeader).should("be.visible"); }); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/inviteflow.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/inviteflow.cy.js deleted file mode 100644 index 8b7c1d902b..0000000000 --- a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/inviteflow.cy.js +++ /dev/null @@ -1,149 +0,0 @@ -import { commonSelectors } from "Selectors/common"; -import { fake } from "Fixtures/fake"; -import { usersText } from "Texts/manageUsers"; -import { usersSelector } from "Selectors/manageUsers"; -import { - manageUsersElements, - fillUserInviteForm, - confirmInviteElements, - selectUserGroup, - inviteUserWithUserGroups, - fetchAndVisitInviteLink, -} from "Support/utils/manageUsers"; -import { - navigateToManageUsers, - logout, - searchUser, - navigateToManageGroups, -} from "Support/utils/common"; -import { updateWorkspaceName } from "Support/utils/userPermissions"; -import { groupsSelector } from "Selectors/manageGroups"; -import { groupsText } from "Texts/manageGroups"; -import { addNewUser, visitWorkspaceInvitation, newInvite } from "Support/utils/onboarding"; -import { commonText } from "Texts/common"; -import { setSignupStatus, enableSignUp } from "Support/utils/manageSSO"; -import { ssoSelector } from "Selectors/manageSSO"; -import { - SignUpPageElements, - verifyConfirmEmailPage, - signUpLink, - verifyOnboardingQuestions, -} from "Support/utils/onboarding"; - -const data = {}; - -describe("user invite flow cases", () => { - beforeEach(() => { - cy.defaultWorkspaceLogin(); - }); - it("should verify the user signup after invited in a workspace", () => { - data.firstName = fake.firstName; - data.email = fake.email.toLowerCase().replaceAll("[^A-Za-z]", ""); - data.signUpName = fake.firstName; - data.workspaceName = fake.companyName; - - setSignupStatus(true); - navigateToManageUsers(); - fillUserInviteForm(data.firstName, data.email); - cy.get(usersSelector.buttonInviteUsers).click(); - cy.logoutApi(); - - cy.visit("/"); - cy.get(commonSelectors.createAnAccountLink).click(); - SignUpPageElements(); - - cy.clearAndType(commonSelectors.nameInputField, data.signUpName); - cy.clearAndType(commonSelectors.emailInputField, data.email); - cy.clearAndType(commonSelectors.passwordInputField, commonText.password); - cy.get(commonSelectors.signUpButton).click(); - signUpLink(data.email); - cy.get(commonSelectors.setUpToolJetButton).click(); - verifyOnboardingQuestions(data.signUpName, data.workspaceName); - visitWorkspaceInvitation(data.email, "My workspace"); - cy.clearAndType(commonSelectors.workEmailInputField, data.email); - cy.clearAndType(commonSelectors.passwordInputField, usersText.password); - cy.get(commonSelectors.loginButton).click(); - - cy.get(commonSelectors.invitedUserName).verifyVisibleElement( - "have.text", - data.signUpName - ); - cy.get(commonSelectors.acceptInviteButton).click(); - }); - - it("should verify the user signup after invited in a workspace", () => { - data.firstName = fake.firstName; - data.email = fake.email.toLowerCase().replaceAll("[^A-Za-z]", ""); - data.signUpName = fake.firstName; - data.workspaceName = fake.companyName; - - setSignupStatus(true); - navigateToManageUsers(); - fillUserInviteForm(data.firstName, data.email); - cy.get(usersSelector.buttonInviteUsers).click(); - logout(); - - cy.get(ssoSelector.workspaceSubHeader).verifyVisibleElement( - "have.text", - "Sign in to your workspace - My workspace" - ); - cy.get(commonSelectors.signInSubHeader).verifyVisibleElement( - "have.text", - "New to this workspace?Sign up" - ); - cy.get(commonSelectors.createAnAccountLink).click(); - SignUpPageElements(); - cy.get(ssoSelector.workspaceSignUpHeader).verifyVisibleElement( - "have.text", - "Sign up to the workspace - My workspace" - ); - - cy.clearAndType(commonSelectors.nameInputField, data.signUpName); - cy.clearAndType(commonSelectors.emailInputField, data.email); - cy.clearAndType(commonSelectors.passwordInputField, commonText.password); - cy.get(commonSelectors.signUpButton).click(); - cy.verifyToastMessage( - commonSelectors.toastMessage, - "The user is already registered. Please check your inbox for the activation link" - ); - }); - - it("should verify exisiting user workspace signup", () => { - data.firstName = fake.firstName; - data.email = fake.email.toLowerCase().replaceAll("[^A-Za-z]", ""); - data.signUpName = fake.firstName; - data.workspaceName = fake.firstName.toLowerCase(); - - setSignupStatus(true); - navigateToManageUsers(); - addNewUser(data.firstName, data.email); - logout(); - - cy.get(commonSelectors.createAnAccountLink).click(); - cy.clearAndType(commonSelectors.nameInputField, data.firstName); - cy.clearAndType(commonSelectors.emailInputField, data.email); - cy.clearAndType(commonSelectors.passwordInputField, commonText.password); - cy.get(commonSelectors.signUpButton).click(); - cy.verifyToastMessage( - commonSelectors.toastMessage, - "User already exists in the workspace." - ); - cy.apiLogin(); - cy.apiCreateWorkspace(data.workspaceName, data.workspaceName); - cy.visit(`${data.workspaceName}`); - cy.wait(3000) - setSignupStatus(true, data.workspaceName); - logout(); - - cy.get(commonSelectors.createAnAccountLink).click(); - cy.clearAndType(commonSelectors.nameInputField, data.firstName); - cy.clearAndType(commonSelectors.emailInputField, data.email); - cy.clearAndType(commonSelectors.passwordInputField, commonText.password); - cy.get(commonSelectors.signUpButton).click(); - - cy.defaultWorkspaceLogin(); - visitWorkspaceInvitation(data.email, data.workspaceName); - cy.verifyToastMessage(commonSelectors.toastMessage, usersText.inviteToast); - logout(); - }); -}); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/profile.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/profile.cy.js index 2c2d5fbee7..638c89fc31 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/profile.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/profile.cy.js @@ -5,6 +5,7 @@ import { profileText } from "Texts/profile"; import { commonSelectors } from "Selectors/common"; import { fake } from "Fixtures/fake"; import { commonText } from "Texts/common"; +import { onboardingSelectors } from "Selectors/onboarding"; describe("Profile Settings", () => { const randomFirstName = fake.firstName; @@ -15,6 +16,7 @@ describe("Profile Settings", () => { common.navigateToProfile(); }); + // neeed to reset and seed bd after 1 run (as password changes will get 401 error ) it("Should verify the elements on profile settings page and name reset functionality", () => { profile.profilePageElements(); @@ -183,20 +185,16 @@ describe("Profile Settings", () => { ); common.logout(); - - cy.clearAndType(commonSelectors.workEmailInputField, commonText.email); - cy.clearAndType(commonSelectors.passwordInputField, commonText.password); - cy.get(commonSelectors.loginButton).click(); + cy.clearAndType(onboardingSelectors.loginEmailInput, commonText.email); + cy.clearAndType(onboardingSelectors.loginPasswordInput, commonText.password); + cy.get(onboardingSelectors.signInButton).click(); cy.verifyToastMessage( commonSelectors.toastMessage, profileText.loginErrorToast ); - cy.clearAndType( - commonSelectors.passwordInputField, - profileText.newPassword - ); - cy.get(commonSelectors.signInButton).click(); + cy.clearAndType(onboardingSelectors.loginPasswordInput, profileText.newPassword); + cy.get(onboardingSelectors.signInButton).click(); common.navigateToProfile(); cy.clearAndType( @@ -213,7 +211,7 @@ describe("Profile Settings", () => { common.logout(); - cy.login(commonText.email, profileText.password); + cy.appUILogin(commonText.email, profileText.password); common.logout(); }); }); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/workspace.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/workspace.cy.js index 75ca6f69ab..2bf691cfc3 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/workspace.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/workspace.cy.js @@ -52,7 +52,7 @@ describe("Workspace", () => { ); cy.get(dashboardSelector.slugField).verifyVisibleElement( "have.text", - "http://localhost:8082/" + `${Cypress.config('baseUrl')}/` ); cy.get(commonSelectors.cancelButton).verifyVisibleElement( "have.text", @@ -120,7 +120,7 @@ describe("Workspace", () => { ); cy.get(dashboardSelector.slugField).verifyVisibleElement( "have.text", - `http://localhost:8082/${data.workspaceSlug}` + `${Cypress.config('baseUrl')}/${data.workspaceSlug}` ); cy.get(dashboardSelector.slugErrorLabel).verifyVisibleElement( "have.text", @@ -171,7 +171,7 @@ describe("Workspace", () => { "have.text", data.workspaceName ); - cy.url().should("eq", `http://localhost:8082/${data.workspaceSlug}`); + cy.url().should("eq", `${Cypress.config('baseUrl')}/${data.workspaceSlug}`); cy.get(commonSelectors.workspaceName).click(); cy.get(commonSelectors.editRectangleIcon).click(); @@ -211,7 +211,7 @@ describe("Workspace", () => { ); cy.get(dashboardSelector.slugField).verifyVisibleElement( "have.text", - `http://localhost:8082/${data.workspaceSlug}` + `${Cypress.config('baseUrl')}/${data.workspaceSlug}` ); cy.get(commonSelectors.cancelButton).verifyVisibleElement( "have.text", @@ -299,6 +299,6 @@ describe("Workspace", () => { "have.text", data.workspaceName ); - cy.url().should("eq", `http://localhost:8082/${data.workspaceSlug}`); + cy.url().should("eq", `${Cypress.config('baseUrl')}/${data.workspaceSlug}`); }); }); diff --git a/cypress-tests/cypress/fixtures/bulkUser/10usersupload.csv b/cypress-tests/cypress/fixtures/bulkUser/10usersupload.csv new file mode 100644 index 0000000000..a1ef49cb8e --- /dev/null +++ b/cypress-tests/cypress/fixtures/bulkUser/10usersupload.csv @@ -0,0 +1,11 @@ +First Name,Last Name,Email,User Role,Group +test1,user,test1@gmail.com,Builder, +test2,user,test3@gmail.com,End User, +Test3,Example,test12@gmail.com,Admin, +Test4,Example,test23@gmail.com,End User, +Test5,Example,test24@gmail.com,End User, +Test6,Example,test25@gmail.com,End User, +Test7,Example,test26@gmail.com,Admin, +Test8,Example,test27@gmail.com,Builder, +Test9,Example,test28@gmail.com,Builder, +Test10,Example,test29@gmail.com,End User, diff --git a/cypress-tests/cypress/fixtures/bulkUser/500_invite_users - Sheet1.csv b/cypress-tests/cypress/fixtures/bulkUser/500_invite_users - Sheet1.csv index 598a166256..23e3f2e728 100644 --- a/cypress-tests/cypress/fixtures/bulkUser/500_invite_users - Sheet1.csv +++ b/cypress-tests/cypress/fixtures/bulkUser/500_invite_users - Sheet1.csv @@ -1,499 +1,252 @@ -First Name,Last Name,Email,Groups -Vijay,Yadav,vjyaav12@gmail.com,All Users|Admin -Vijay,Yadav,vjyaav13@gmail.com,All Users -Vijay,Yadav,vjyaav14@gmail.com,All Users -Vijay,Yadav,vjyaav15@gmail.com,All Users -Vijay,Yadav,vjyaav16@gmail.com,All Users -Vijay,Yadav,vjyaav17@gmail.com,All Users -Vijay,Yadav,vjyaav18@gmail.com,All Users -Vijay,Yadav,vjyaav19@gmail.com,All Users -Vijay,Yadav,vjyaav20@gmail.com,All Users -Vijay,Yadav,vjyaav21@gmail.com,All Users -Vijay,Yadav,vjyaav22@gmail.com,All Users -Vijay,Yadav,vjyaav23@gmail.com,All Users -Vijay,Yadav,vjyaav24@gmail.com,All Users -Vijay,Yadav,vjyaav25@gmail.com,All Users -Vijay,Yadav,vjyaav26@gmail.com,All Users -Vijay,Yadav,vjyaav27@gmail.com,All Users -Vijay,Yadav,vjyaav28@gmail.com,All Users -Vijay,Yadav,vjyaav29@gmail.com,All Users -Vijay,Yadav,vjyaav30@gmail.com,All Users -Vijay,Yadav,vjyaav31@gmail.com,All Users -Vijay,Yadav,vjyaav32@gmail.com,All Users -Vijay,Yadav,vjyaav33@gmail.com,All Users -Vijay,Yadav,vjyaav34@gmail.com,All Users -Vijay,Yadav,vjyaav35@gmail.com,All Users -Vijay,Yadav,vjyaav36@gmail.com,All Users -Vijay,Yadav,vjyaav37@gmail.com,All Users -Vijay,Yadav,vjyaav38@gmail.com,All Users -Vijay,Yadav,vjyaav39@gmail.com,All Users -Vijay,Yadav,vjyaav40@gmail.com,All Users -Vijay,Yadav,vjyaav41@gmail.com,All Users -Vijay,Yadav,vjyaav42@gmail.com,All Users -Vijay,Yadav,vjyaav43@gmail.com,All Users -Vijay,Yadav,vjyaav44@gmail.com,All Users -Vijay,Yadav,vjyaav45@gmail.com,All Users -Vijay,Yadav,vjyaav46@gmail.com,All Users -Vijay,Yadav,vjyaav47@gmail.com,All Users -Vijay,Yadav,vjyaav48@gmail.com,All Users -Vijay,Yadav,vjyaav49@gmail.com,All Users -Vijay,Yadav,vjyaav50@gmail.com,All Users -Vijay,Yadav,vjyaav51@gmail.com,All Users -Vijay,Yadav,vjyaav52@gmail.com,All Users -Vijay,Yadav,vjyaav53@gmail.com,All Users -Vijay,Yadav,vjyaav54@gmail.com,All Users -Vijay,Yadav,vjyaav55@gmail.com,All Users -Vijay,Yadav,vjyaav56@gmail.com,All Users -Vijay,Yadav,vjyaav57@gmail.com,All Users -Vijay,Yadav,vjyaav58@gmail.com,All Users -Vijay,Yadav,vjyaav59@gmail.com,All Users -Vijay,Yadav,vjyaav60@gmail.com,All Users -Vijay,Yadav,vjyaav61@gmail.com,All Users -Vijay,Yadav,vjyaav62@gmail.com,All Users -Vijay,Yadav,vjyaav63@gmail.com,All Users -Vijay,Yadav,vjyaav64@gmail.com,All Users -Vijay,Yadav,vjyaav65@gmail.com,All Users -Vijay,Yadav,vjyaav66@gmail.com,All Users -Vijay,Yadav,vjyaav67@gmail.com,All Users -Vijay,Yadav,vjyaav68@gmail.com,All Users -Vijay,Yadav,vjyaav69@gmail.com,All Users -Vijay,Yadav,vjyaav70@gmail.com,All Users -Vijay,Yadav,vjyaav71@gmail.com,All Users -Vijay,Yadav,vjyaav72@gmail.com,All Users -Vijay,Yadav,vjyaav73@gmail.com,All Users -Vijay,Yadav,vjyaav74@gmail.com,All Users -Vijay,Yadav,vjyaav75@gmail.com,All Users -Vijay,Yadav,vjyaav76@gmail.com,All Users -Vijay,Yadav,vjyaav77@gmail.com,All Users -Vijay,Yadav,vjyaav78@gmail.com,All Users -Vijay,Yadav,vjyaav79@gmail.com,All Users -Vijay,Yadav,vjyaav80@gmail.com,All Users -Vijay,Yadav,vjyaav81@gmail.com,All Users -Vijay,Yadav,vjyaav82@gmail.com,All Users -Vijay,Yadav,vjyaav83@gmail.com,All Users -Vijay,Yadav,vjyaav84@gmail.com,All Users -Vijay,Yadav,vjyaav85@gmail.com,All Users -Vijay,Yadav,vjyaav86@gmail.com,All Users -Vijay,Yadav,vjyaav87@gmail.com,All Users -Vijay,Yadav,vjyaav88@gmail.com,All Users -Vijay,Yadav,vjyaav89@gmail.com,All Users -Vijay,Yadav,vjyaav90@gmail.com,All Users -Vijay,Yadav,vjyaav91@gmail.com,All Users -Vijay,Yadav,vjyaav92@gmail.com,All Users -Vijay,Yadav,vjyaav93@gmail.com,All Users -Vijay,Yadav,vjyaav94@gmail.com,All Users -Vijay,Yadav,vjyaav95@gmail.com,All Users -Vijay,Yadav,vjyaav96@gmail.com,All Users -Vijay,Yadav,vjyaav97@gmail.com,All Users -Vijay,Yadav,vjyaav98@gmail.com,All Users -Vijay,Yadav,vjyaav99@gmail.com,All Users -Vijay,Yadav,vjyaav100@gmail.com,All Users -Vijay,Yadav,vjyaav101@gmail.com,All Users -Vijay,Yadav,vjyaav102@gmail.com,All Users -Vijay,Yadav,vjyaav103@gmail.com,All Users -Vijay,Yadav,vjyaav104@gmail.com,All Users -Vijay,Yadav,vjyaav105@gmail.com,All Users -Vijay,Yadav,vjyaav106@gmail.com,All Users -Vijay,Yadav,vjyaav107@gmail.com,All Users -Vijay,Yadav,vjyaav108@gmail.com,All Users -Vijay,Yadav,vjyaav109@gmail.com,All Users -Vijay,Yadav,vjyaav110@gmail.com,All Users -Vijay,Yadav,vjyaav111@gmail.com,All Users -Vijay,Yadav,vjyaav112@gmail.com,All Users -Vijay,Yadav,vjyaav113@gmail.com,All Users -Vijay,Yadav,vjyaav114@gmail.com,All Users -Vijay,Yadav,vjyaav115@gmail.com,All Users -Vijay,Yadav,vjyaav116@gmail.com,All Users -Vijay,Yadav,vjyaav117@gmail.com,All Users -Vijay,Yadav,vjyaav118@gmail.com,All Users -Vijay,Yadav,vjyaav119@gmail.com,All Users -Vijay,Yadav,vjyaav120@gmail.com,All Users -Vijay,Yadav,vjyaav121@gmail.com,All Users -Vijay,Yadav,vjyaav122@gmail.com,All Users -Vijay,Yadav,vjyaav123@gmail.com,All Users -Vijay,Yadav,vjyaav124@gmail.com,All Users -Vijay,Yadav,vjyaav125@gmail.com,All Users -Vijay,Yadav,vjyaav126@gmail.com,All Users -Vijay,Yadav,vjyaav127@gmail.com,All Users -Vijay,Yadav,vjyaav128@gmail.com,All Users -Vijay,Yadav,vjyaav129@gmail.com,All Users -Vijay,Yadav,vjyaav130@gmail.com,All Users -Vijay,Yadav,vjyaav131@gmail.com,All Users -Vijay,Yadav,vjyaav132@gmail.com,All Users -Vijay,Yadav,vjyaav133@gmail.com,All Users -Vijay,Yadav,vjyaav134@gmail.com,All Users -Vijay,Yadav,vjyaav135@gmail.com,All Users -Vijay,Yadav,vjyaav136@gmail.com,All Users -Vijay,Yadav,vjyaav137@gmail.com,All Users -Vijay,Yadav,vjyaav138@gmail.com,All Users -Vijay,Yadav,vjyaav139@gmail.com,All Users -Vijay,Yadav,vjyaav140@gmail.com,All Users -Vijay,Yadav,vjyaav141@gmail.com,All Users -Vijay,Yadav,vjyaav142@gmail.com,All Users -Vijay,Yadav,vjyaav143@gmail.com,All Users -Vijay,Yadav,vjyaav144@gmail.com,All Users -Vijay,Yadav,vjyaav145@gmail.com,All Users -Vijay,Yadav,vjyaav146@gmail.com,All Users -Vijay,Yadav,vjyaav147@gmail.com,All Users -Vijay,Yadav,vjyaav148@gmail.com,All Users -Vijay,Yadav,vjyaav149@gmail.com,All Users -Vijay,Yadav,vjyaav150@gmail.com,All Users -Vijay,Yadav,vjyaav151@gmail.com,All Users -Vijay,Yadav,vjyaav152@gmail.com,All Users -Vijay,Yadav,vjyaav153@gmail.com,All Users -Vijay,Yadav,vjyaav154@gmail.com,All Users -Vijay,Yadav,vjyaav155@gmail.com,All Users -Vijay,Yadav,vjyaav156@gmail.com,All Users -Vijay,Yadav,vjyaav157@gmail.com,All Users -Vijay,Yadav,vjyaav158@gmail.com,All Users -Vijay,Yadav,vjyaav159@gmail.com,All Users -Vijay,Yadav,vjyaav160@gmail.com,All Users -Vijay,Yadav,vjyaav161@gmail.com,All Users -Vijay,Yadav,vjyaav162@gmail.com,All Users -Vijay,Yadav,vjyaav163@gmail.com,All Users -Vijay,Yadav,vjyaav164@gmail.com,All Users -Vijay,Yadav,vjyaav165@gmail.com,All Users -Vijay,Yadav,vjyaav166@gmail.com,All Users -Vijay,Yadav,vjyaav167@gmail.com,All Users -Vijay,Yadav,vjyaav168@gmail.com,All Users -Vijay,Yadav,vjyaav169@gmail.com,All Users -Vijay,Yadav,vjyaav170@gmail.com,All Users -Vijay,Yadav,vjyaav171@gmail.com,All Users -Vijay,Yadav,vjyaav172@gmail.com,All Users -Vijay,Yadav,vjyaav173@gmail.com,All Users -Vijay,Yadav,vjyaav174@gmail.com,All Users -Vijay,Yadav,vjyaav175@gmail.com,All Users -Vijay,Yadav,vjyaav176@gmail.com,All Users -Vijay,Yadav,vjyaav177@gmail.com,All Users -Vijay,Yadav,vjyaav178@gmail.com,All Users -Vijay,Yadav,vjyaav179@gmail.com,All Users -Vijay,Yadav,vjyaav180@gmail.com,All Users -Vijay,Yadav,vjyaav181@gmail.com,All Users -Vijay,Yadav,vjyaav182@gmail.com,All Users -Vijay,Yadav,vjyaav183@gmail.com,All Users -Vijay,Yadav,vjyaav184@gmail.com,All Users -Vijay,Yadav,vjyaav185@gmail.com,All Users -Vijay,Yadav,vjyaav186@gmail.com,All Users -Vijay,Yadav,vjyaav187@gmail.com,All Users -Vijay,Yadav,vjyaav188@gmail.com,All Users -Vijay,Yadav,vjyaav189@gmail.com,All Users -Vijay,Yadav,vjyaav190@gmail.com,All Users -Vijay,Yadav,vjyaav191@gmail.com,All Users -Vijay,Yadav,vjyaav192@gmail.com,All Users -Vijay,Yadav,vjyaav193@gmail.com,All Users -Vijay,Yadav,vjyaav194@gmail.com,All Users -Vijay,Yadav,vjyaav195@gmail.com,All Users -Vijay,Yadav,vjyaav196@gmail.com,All Users -Vijay,Yadav,vjyaav197@gmail.com,All Users -Vijay,Yadav,vjyaav198@gmail.com,All Users -Vijay,Yadav,vjyaav199@gmail.com,All Users -Vijay,Yadav,vjyaav200@gmail.com,All Users -Vijay,Yadav,vjyaav201@gmail.com,All Users -Vijay,Yadav,vjyaav202@gmail.com,All Users -Vijay,Yadav,vjyaav203@gmail.com,All Users -Vijay,Yadav,vjyaav204@gmail.com,All Users -Vijay,Yadav,vjyaav205@gmail.com,All Users -Vijay,Yadav,vjyaav206@gmail.com,All Users -Vijay,Yadav,vjyaav207@gmail.com,All Users -Vijay,Yadav,vjyaav208@gmail.com,All Users -Vijay,Yadav,vjyaav209@gmail.com,All Users -Vijay,Yadav,vjyaav210@gmail.com,All Users -Vijay,Yadav,vjyaav211@gmail.com,All Users -Vijay,Yadav,vjyaav212@gmail.com,All Users -Vijay,Yadav,vjyaav213@gmail.com,All Users -Vijay,Yadav,vjyaav214@gmail.com,All Users -Vijay,Yadav,vjyaav215@gmail.com,All Users -Vijay,Yadav,vjyaav216@gmail.com,All Users -Vijay,Yadav,vjyaav217@gmail.com,All Users -Vijay,Yadav,vjyaav218@gmail.com,All Users -Vijay,Yadav,vjyaav219@gmail.com,All Users -Vijay,Yadav,vjyaav220@gmail.com,All Users -Vijay,Yadav,vjyaav221@gmail.com,All Users -Vijay,Yadav,vjyaav222@gmail.com,All Users -Vijay,Yadav,vjyaav223@gmail.com,All Users -Vijay,Yadav,vjyaav224@gmail.com,All Users -Vijay,Yadav,vjyaav225@gmail.com,All Users -Vijay,Yadav,vjyaav226@gmail.com,All Users -Vijay,Yadav,vjyaav227@gmail.com,All Users -Vijay,Yadav,vjyaav228@gmail.com,All Users -Vijay,Yadav,vjyaav229@gmail.com,All Users -Vijay,Yadav,vjyaav230@gmail.com,All Users -Vijay,Yadav,vjyaav231@gmail.com,All Users -Vijay,Yadav,vjyaav232@gmail.com,All Users -Vijay,Yadav,vjyaav233@gmail.com,All Users -Vijay,Yadav,vjyaav234@gmail.com,All Users -Vijay,Yadav,vjyaav235@gmail.com,All Users -Vijay,Yadav,vjyaav236@gmail.com,All Users -Vijay,Yadav,vjyaav237@gmail.com,All Users -Vijay,Yadav,vjyaav238@gmail.com,All Users -Vijay,Yadav,vjyaav239@gmail.com,All Users -Vijay,Yadav,vjyaav240@gmail.com,All Users -Vijay,Yadav,vjyaav241@gmail.com,All Users -Vijay,Yadav,vjyaav242@gmail.com,All Users -Vijay,Yadav,vjyaav243@gmail.com,All Users -Vijay,Yadav,vjyaav244@gmail.com,All Users -Vijay,Yadav,vjyaav245@gmail.com,All Users -Vijay,Yadav,vjyaav246@gmail.com,All Users -Vijay,Yadav,vjyaav247@gmail.com,All Users -Vijay,Yadav,vjyaav248@gmail.com,All Users -Vijay,Yadav,vjyaav249@gmail.com,All Users -Vijay,Yadav,vjyaav250@gmail.com,All Users -Vijay,Yadav,vjyaav251@gmail.com,All Users -Vijay,Yadav,vjyaav252@gmail.com,All Users -Vijay,Yadav,vjyaav253@gmail.com,All Users -Vijay,Yadav,vjyaav254@gmail.com,All Users -Vijay,Yadav,vjyaav255@gmail.com,All Users -Vijay,Yadav,vjyaav256@gmail.com,All Users -Vijay,Yadav,vjyaav257@gmail.com,All Users -Vijay,Yadav,vjyaav258@gmail.com,All Users -Vijay,Yadav,vjyaav259@gmail.com,All Users -Vijay,Yadav,vjyaav260@gmail.com,All Users -Vijay,Yadav,vjyaav261@gmail.com,All Users -Vijay,Yadav,vjyaav262@gmail.com,All Users -Vijay,Yadav,vjyaav263@gmail.com,All Users -Vijay,Yadav,vjyaav264@gmail.com,All Users -Vijay,Yadav,vjyaav265@gmail.com,All Users -Vijay,Yadav,vjyaav266@gmail.com,All Users -Vijay,Yadav,vjyaav267@gmail.com,All Users -Vijay,Yadav,vjyaav268@gmail.com,All Users -Vijay,Yadav,vjyaav269@gmail.com,All Users -Vijay,Yadav,vjyaav270@gmail.com,All Users -Vijay,Yadav,vjyaav271@gmail.com,All Users -Vijay,Yadav,vjyaav272@gmail.com,All Users -Vijay,Yadav,vjyaav273@gmail.com,All Users -Vijay,Yadav,vjyaav274@gmail.com,All Users -Vijay,Yadav,vjyaav275@gmail.com,All Users -Vijay,Yadav,vjyaav276@gmail.com,All Users -Vijay,Yadav,vjyaav277@gmail.com,All Users -Vijay,Yadav,vjyaav278@gmail.com,All Users -Vijay,Yadav,vjyaav279@gmail.com,All Users -Vijay,Yadav,vjyaav280@gmail.com,All Users -Vijay,Yadav,vjyaav281@gmail.com,All Users -Vijay,Yadav,vjyaav282@gmail.com,All Users -Vijay,Yadav,vjyaav283@gmail.com,All Users -Vijay,Yadav,vjyaav284@gmail.com,All Users -Vijay,Yadav,vjyaav285@gmail.com,All Users -Vijay,Yadav,vjyaav286@gmail.com,All Users -Vijay,Yadav,vjyaav287@gmail.com,All Users -Vijay,Yadav,vjyaav288@gmail.com,All Users -Vijay,Yadav,vjyaav289@gmail.com,All Users -Vijay,Yadav,vjyaav290@gmail.com,All Users -Vijay,Yadav,vjyaav291@gmail.com,All Users -Vijay,Yadav,vjyaav292@gmail.com,All Users -Vijay,Yadav,vjyaav293@gmail.com,All Users -Vijay,Yadav,vjyaav294@gmail.com,All Users -Vijay,Yadav,vjyaav295@gmail.com,All Users -Vijay,Yadav,vjyaav296@gmail.com,All Users -Vijay,Yadav,vjyaav297@gmail.com,All Users -Vijay,Yadav,vjyaav298@gmail.com,All Users -Vijay,Yadav,vjyaav299@gmail.com,All Users -Vijay,Yadav,vjyaav300@gmail.com,All Users -Vijay,Yadav,vjyaav301@gmail.com,All Users -Vijay,Yadav,vjyaav302@gmail.com,All Users -Vijay,Yadav,vjyaav303@gmail.com,All Users -Vijay,Yadav,vjyaav304@gmail.com,All Users -Vijay,Yadav,vjyaav305@gmail.com,All Users -Vijay,Yadav,vjyaav306@gmail.com,All Users -Vijay,Yadav,vjyaav307@gmail.com,All Users -Vijay,Yadav,vjyaav308@gmail.com,All Users -Vijay,Yadav,vjyaav309@gmail.com,All Users -Vijay,Yadav,vjyaav310@gmail.com,All Users -Vijay,Yadav,vjyaav311@gmail.com,All Users -Vijay,Yadav,vjyaav312@gmail.com,All Users -Vijay,Yadav,vjyaav313@gmail.com,All Users -Vijay,Yadav,vjyaav314@gmail.com,All Users -Vijay,Yadav,vjyaav315@gmail.com,All Users -Vijay,Yadav,vjyaav316@gmail.com,All Users -Vijay,Yadav,vjyaav317@gmail.com,All Users -Vijay,Yadav,vjyaav318@gmail.com,All Users -Vijay,Yadav,vjyaav319@gmail.com,All Users -Vijay,Yadav,vjyaav320@gmail.com,All Users -Vijay,Yadav,vjyaav321@gmail.com,All Users -Vijay,Yadav,vjyaav322@gmail.com,All Users -Vijay,Yadav,vjyaav323@gmail.com,All Users -Vijay,Yadav,vjyaav324@gmail.com,All Users -Vijay,Yadav,vjyaav325@gmail.com,All Users -Vijay,Yadav,vjyaav326@gmail.com,All Users -Vijay,Yadav,vjyaav327@gmail.com,All Users -Vijay,Yadav,vjyaav328@gmail.com,All Users -Vijay,Yadav,vjyaav329@gmail.com,All Users -Vijay,Yadav,vjyaav330@gmail.com,All Users -Vijay,Yadav,vjyaav331@gmail.com,All Users -Vijay,Yadav,vjyaav332@gmail.com,All Users -Vijay,Yadav,vjyaav333@gmail.com,All Users -Vijay,Yadav,vjyaav334@gmail.com,All Users -Vijay,Yadav,vjyaav335@gmail.com,All Users -Vijay,Yadav,vjyaav336@gmail.com,All Users -Vijay,Yadav,vjyaav337@gmail.com,All Users -Vijay,Yadav,vjyaav338@gmail.com,All Users -Vijay,Yadav,vjyaav339@gmail.com,All Users -Vijay,Yadav,vjyaav340@gmail.com,All Users -Vijay,Yadav,vjyaav341@gmail.com,All Users -Vijay,Yadav,vjyaav342@gmail.com,All Users -Vijay,Yadav,vjyaav343@gmail.com,All Users -Vijay,Yadav,vjyaav344@gmail.com,All Users -Vijay,Yadav,vjyaav345@gmail.com,All Users -Vijay,Yadav,vjyaav346@gmail.com,All Users -Vijay,Yadav,vjyaav347@gmail.com,All Users -Vijay,Yadav,vjyaav348@gmail.com,All Users -Vijay,Yadav,vjyaav349@gmail.com,All Users -Vijay,Yadav,vjyaav350@gmail.com,All Users -Vijay,Yadav,vjyaav351@gmail.com,All Users -Vijay,Yadav,vjyaav352@gmail.com,All Users -Vijay,Yadav,vjyaav353@gmail.com,All Users -Vijay,Yadav,vjyaav354@gmail.com,All Users -Vijay,Yadav,vjyaav355@gmail.com,All Users -Vijay,Yadav,vjyaav356@gmail.com,All Users -Vijay,Yadav,vjyaav357@gmail.com,All Users -Vijay,Yadav,vjyaav358@gmail.com,All Users -Vijay,Yadav,vjyaav359@gmail.com,All Users -Vijay,Yadav,vjyaav360@gmail.com,All Users -Vijay,Yadav,vjyaav361@gmail.com,All Users -Vijay,Yadav,vjyaav362@gmail.com,All Users -Vijay,Yadav,vjyaav363@gmail.com,All Users -Vijay,Yadav,vjyaav364@gmail.com,All Users -Vijay,Yadav,vjyaav365@gmail.com,All Users -Vijay,Yadav,vjyaav366@gmail.com,All Users -Vijay,Yadav,vjyaav367@gmail.com,All Users -Vijay,Yadav,vjyaav368@gmail.com,All Users -Vijay,Yadav,vjyaav369@gmail.com,All Users -Vijay,Yadav,vjyaav370@gmail.com,All Users -Vijay,Yadav,vjyaav371@gmail.com,All Users -Vijay,Yadav,vjyaav372@gmail.com,All Users -Vijay,Yadav,vjyaav373@gmail.com,All Users -Vijay,Yadav,vjyaav374@gmail.com,All Users -Vijay,Yadav,vjyaav375@gmail.com,All Users -Vijay,Yadav,vjyaav376@gmail.com,All Users -Vijay,Yadav,vjyaav377@gmail.com,All Users -Vijay,Yadav,vjyaav378@gmail.com,All Users -Vijay,Yadav,vjyaav379@gmail.com,All Users -Vijay,Yadav,vjyaav380@gmail.com,All Users -Vijay,Yadav,vjyaav381@gmail.com,All Users -Vijay,Yadav,vjyaav382@gmail.com,All Users -Vijay,Yadav,vjyaav383@gmail.com,All Users -Vijay,Yadav,vjyaav384@gmail.com,All Users -Vijay,Yadav,vjyaav385@gmail.com,All Users -Vijay,Yadav,vjyaav386@gmail.com,All Users -Vijay,Yadav,vjyaav387@gmail.com,All Users -Vijay,Yadav,vjyaav388@gmail.com,All Users -Vijay,Yadav,vjyaav389@gmail.com,All Users -Vijay,Yadav,vjyaav390@gmail.com,All Users -Vijay,Yadav,vjyaav391@gmail.com,All Users -Vijay,Yadav,vjyaav392@gmail.com,All Users -Vijay,Yadav,vjyaav393@gmail.com,All Users -Vijay,Yadav,vjyaav394@gmail.com,All Users -Vijay,Yadav,vjyaav395@gmail.com,All Users -Vijay,Yadav,vjyaav396@gmail.com,All Users -Vijay,Yadav,vjyaav397@gmail.com,All Users -Vijay,Yadav,vjyaav398@gmail.com,All Users -Vijay,Yadav,vjyaav399@gmail.com,All Users -Vijay,Yadav,vjyaav400@gmail.com,All Users -Vijay,Yadav,vjyaav401@gmail.com,All Users -Vijay,Yadav,vjyaav402@gmail.com,All Users -Vijay,Yadav,vjyaav403@gmail.com,All Users -Vijay,Yadav,vjyaav404@gmail.com,All Users -Vijay,Yadav,vjyaav405@gmail.com,All Users -Vijay,Yadav,vjyaav406@gmail.com,All Users -Vijay,Yadav,vjyaav407@gmail.com,All Users -Vijay,Yadav,vjyaav408@gmail.com,All Users -Vijay,Yadav,vjyaav409@gmail.com,All Users -Vijay,Yadav,vjyaav410@gmail.com,All Users -Vijay,Yadav,vjyaav411@gmail.com,All Users -Vijay,Yadav,vjyaav412@gmail.com,All Users -Vijay,Yadav,vjyaav413@gmail.com,All Users -Vijay,Yadav,vjyaav414@gmail.com,All Users -Vijay,Yadav,vjyaav415@gmail.com,All Users -Vijay,Yadav,vjyaav416@gmail.com,All Users -Vijay,Yadav,vjyaav417@gmail.com,All Users -Vijay,Yadav,vjyaav418@gmail.com,All Users -Vijay,Yadav,vjyaav419@gmail.com,All Users -Vijay,Yadav,vjyaav420@gmail.com,All Users -Vijay,Yadav,vjyaav421@gmail.com,All Users -Vijay,Yadav,vjyaav422@gmail.com,All Users -Vijay,Yadav,vjyaav423@gmail.com,All Users -Vijay,Yadav,vjyaav424@gmail.com,All Users -Vijay,Yadav,vjyaav425@gmail.com,All Users -Vijay,Yadav,vjyaav426@gmail.com,All Users -Vijay,Yadav,vjyaav427@gmail.com,All Users -Vijay,Yadav,vjyaav428@gmail.com,All Users -Vijay,Yadav,vjyaav429@gmail.com,All Users -Vijay,Yadav,vjyaav430@gmail.com,All Users -Vijay,Yadav,vjyaav431@gmail.com,All Users -Vijay,Yadav,vjyaav432@gmail.com,All Users -Vijay,Yadav,vjyaav433@gmail.com,All Users -Vijay,Yadav,vjyaav434@gmail.com,All Users -Vijay,Yadav,vjyaav435@gmail.com,All Users -Vijay,Yadav,vjyaav436@gmail.com,All Users -Vijay,Yadav,vjyaav437@gmail.com,All Users -Vijay,Yadav,vjyaav438@gmail.com,All Users -Vijay,Yadav,vjyaav439@gmail.com,All Users -Vijay,Yadav,vjyaav440@gmail.com,All Users -Vijay,Yadav,vjyaav441@gmail.com,All Users -Vijay,Yadav,vjyaav442@gmail.com,All Users -Vijay,Yadav,vjyaav443@gmail.com,All Users -Vijay,Yadav,vjyaav444@gmail.com,All Users -Vijay,Yadav,vjyaav445@gmail.com,All Users -Vijay,Yadav,vjyaav446@gmail.com,All Users -Vijay,Yadav,vjyaav447@gmail.com,All Users -Vijay,Yadav,vjyaav448@gmail.com,All Users -Vijay,Yadav,vjyaav449@gmail.com,All Users -Vijay,Yadav,vjyaav450@gmail.com,All Users -Vijay,Yadav,vjyaav451@gmail.com,All Users -Vijay,Yadav,vjyaav452@gmail.com,All Users -Vijay,Yadav,vjyaav453@gmail.com,All Users -Vijay,Yadav,vjyaav454@gmail.com,All Users -Vijay,Yadav,vjyaav455@gmail.com,All Users -Vijay,Yadav,vjyaav456@gmail.com,All Users -Vijay,Yadav,vjyaav457@gmail.com,All Users -Vijay,Yadav,vjyaav458@gmail.com,All Users -Vijay,Yadav,vjyaav459@gmail.com,All Users -Vijay,Yadav,vjyaav460@gmail.com,All Users -Vijay,Yadav,vjyaav461@gmail.com,All Users -Vijay,Yadav,vjyaav462@gmail.com,All Users -Vijay,Yadav,vjyaav463@gmail.com,All Users -Vijay,Yadav,vjyaav464@gmail.com,All Users -Vijay,Yadav,vjyaav465@gmail.com,All Users -Vijay,Yadav,vjyaav466@gmail.com,All Users -Vijay,Yadav,vjyaav467@gmail.com,All Users -Vijay,Yadav,vjyaav468@gmail.com,All Users -Vijay,Yadav,vjyaav469@gmail.com,All Users -Vijay,Yadav,vjyaav470@gmail.com,All Users -Vijay,Yadav,vjyaav471@gmail.com,All Users -Vijay,Yadav,vjyaav472@gmail.com,All Users -Vijay,Yadav,vjyaav473@gmail.com,All Users -Vijay,Yadav,vjyaav474@gmail.com,All Users -Vijay,Yadav,vjyaav475@gmail.com,All Users -Vijay,Yadav,vjyaav476@gmail.com,All Users -Vijay,Yadav,vjyaav477@gmail.com,All Users -Vijay,Yadav,vjyaav478@gmail.com,All Users -Vijay,Yadav,vjyaav479@gmail.com,All Users -Vijay,Yadav,vjyaav480@gmail.com,All Users -Vijay,Yadav,vjyaav481@gmail.com,All Users -Vijay,Yadav,vjyaav482@gmail.com,All Users -Vijay,Yadav,vjyaav483@gmail.com,All Users -Vijay,Yadav,vjyaav484@gmail.com,All Users -Vijay,Yadav,vjyaav485@gmail.com,All Users -Vijay,Yadav,vjyaav486@gmail.com,All Users -Vijay,Yadav,vjyaav487@gmail.com,All Users -Vijay,Yadav,vjyaav488@gmail.com,All Users -Vijay,Yadav,vjyaav489@gmail.com,All Users -Vijay,Yadav,vjyaav490@gmail.com,All Users -Vijay,Yadav,vjyaav491@gmail.com,All Users -Vijay,Yadav,vjyaav492@gmail.com,All Users -Vijay,Yadav,vjyaav493@gmail.com,All Users -Vijay,Yadav,vjyaav494@gmail.com,All Users -Vijay,Yadav,vjyaav495@gmail.com,All Users -Vijay,Yadav,vjyaav496@gmail.com,All Users -Vijay,Yadav,vjyaav497@gmail.com,All Users -Vijay,Yadav,vjyaav498@gmail.com,All Users -Vijay,Yadav,vjyaav499@gmail.com,All Users -Vijay,Yadav,vjyaav500@gmail.com,All Users -Vijay,Yadav,vjyaav501@gmail.com,All Users -Vijay,Yadav,vjyaav502@gmail.com,All Users -Vijay,Yadav,vjyaav503@gmail.com,All Users -Vijay,Yadav,vjyaav504@gmail.com,All Users -Vijay,Yadav,vjyaav505@gmail.com,All Users -Vijay,Yadav,vjyaav506@gmail.com,All Users -Vijay,Yadav,vjyaav507@gmail.com,All Users -Vijay,Yadav,vjyaav508@gmail.com,All Users -Vijay,Yadav,vjyaav509@gmail.com,All Users \ No newline at end of file +First Name,Last Name,Email,User Role,Group +Vijay,Yadav,vjyaav1@gmail.com,Admin, +Vijay,Yadav,vjyaav2@gmail.com,Builder, +Vijay,Yadav,vjyaav3@gmail.com,Builder, +Vijay,Yadav,vjyaav4@gmail.com,End User, +Vijay,Yadav,vjyaav5@gmail.com,End User, +Vijay,Yadav,vjyaav6@gmail.com,End User, +Vijay,Yadav,vjyaav7@gmail.com,End User, +Vijay,Yadav,vjyaav8@gmail.com,End User, +Vijay,Yadav,vjyaav9@gmail.com,End User, +Vijay,Yadav,vjyaav10@gmail.com,End User, +Vijay,Yadav,vjyaav11@gmail.com,End User, +Vijay,Yadav,vjyaav12@gmail.com,End User, +Vijay,Yadav,vjyaav13@gmail.com,End User, +Vijay,Yadav,vjyaav14@gmail.com,End User, +Vijay,Yadav,vjyaav15@gmail.com,End User, +Vijay,Yadav,vjyaav16@gmail.com,End User, +Vijay,Yadav,vjyaav17@gmail.com,End User, +Vijay,Yadav,vjyaav18@gmail.com,End User, +Vijay,Yadav,vjyaav19@gmail.com,End User, +Vijay,Yadav,vjyaav20@gmail.com,End User, +Vijay,Yadav,vjyaav21@gmail.com,End User, +Vijay,Yadav,vjyaav22@gmail.com,End User, +Vijay,Yadav,vjyaav23@gmail.com,End User, +Vijay,Yadav,vjyaav24@gmail.com,End User, +Vijay,Yadav,vjyaav25@gmail.com,End User, +Vijay,Yadav,vjyaav26@gmail.com,End User, +Vijay,Yadav,vjyaav27@gmail.com,End User, +Vijay,Yadav,vjyaav28@gmail.com,End User, +Vijay,Yadav,vjyaav29@gmail.com,End User, +Vijay,Yadav,vjyaav30@gmail.com,End User, +Vijay,Yadav,vjyaav31@gmail.com,End User, +Vijay,Yadav,vjyaav32@gmail.com,End User, +Vijay,Yadav,vjyaav33@gmail.com,End User, +Vijay,Yadav,vjyaav34@gmail.com,End User, +Vijay,Yadav,vjyaav35@gmail.com,End User, +Vijay,Yadav,vjyaav36@gmail.com,End User, +Vijay,Yadav,vjyaav37@gmail.com,End User, +Vijay,Yadav,vjyaav38@gmail.com,End User, +Vijay,Yadav,vjyaav39@gmail.com,End User, +Vijay,Yadav,vjyaav40@gmail.com,End User, +Vijay,Yadav,vjyaav41@gmail.com,End User, +Vijay,Yadav,vjyaav42@gmail.com,End User, +Vijay,Yadav,vjyaav43@gmail.com,End User, +Vijay,Yadav,vjyaav44@gmail.com,End User, +Vijay,Yadav,vjyaav45@gmail.com,End User, +Vijay,Yadav,vjyaav46@gmail.com,End User, +Vijay,Yadav,vjyaav47@gmail.com,End User, +Vijay,Yadav,vjyaav48@gmail.com,End User, +Vijay,Yadav,vjyaav49@gmail.com,End User, +Vijay,Yadav,vjyaav50@gmail.com,End User, +Vijay,Yadav,vjyaav51@gmail.com,End User, +Vijay,Yadav,vjyaav52@gmail.com,End User, +Vijay,Yadav,vjyaav53@gmail.com,End User, +Vijay,Yadav,vjyaav54@gmail.com,End User, +Vijay,Yadav,vjyaav55@gmail.com,End User, +Vijay,Yadav,vjyaav56@gmail.com,End User, +Vijay,Yadav,vjyaav57@gmail.com,End User, +Vijay,Yadav,vjyaav58@gmail.com,End User, +Vijay,Yadav,vjyaav59@gmail.com,End User, +Vijay,Yadav,vjyaav60@gmail.com,End User, +Vijay,Yadav,vjyaav61@gmail.com,End User, +Vijay,Yadav,vjyaav62@gmail.com,End User, +Vijay,Yadav,vjyaav63@gmail.com,End User, +Vijay,Yadav,vjyaav64@gmail.com,End User, +Vijay,Yadav,vjyaav65@gmail.com,End User, +Vijay,Yadav,vjyaav66@gmail.com,End User, +Vijay,Yadav,vjyaav67@gmail.com,End User, +Vijay,Yadav,vjyaav68@gmail.com,End User, +Vijay,Yadav,vjyaav69@gmail.com,End User, +Vijay,Yadav,vjyaav70@gmail.com,End User, +Vijay,Yadav,vjyaav71@gmail.com,End User, +Vijay,Yadav,vjyaav72@gmail.com,End User, +Vijay,Yadav,vjyaav73@gmail.com,End User, +Vijay,Yadav,vjyaav74@gmail.com,End User, +Vijay,Yadav,vjyaav75@gmail.com,End User, +Vijay,Yadav,vjyaav76@gmail.com,End User, +Vijay,Yadav,vjyaav77@gmail.com,End User, +Vijay,Yadav,vjyaav78@gmail.com,End User, +Vijay,Yadav,vjyaav79@gmail.com,End User, +Vijay,Yadav,vjyaav80@gmail.com,End User, +Vijay,Yadav,vjyaav81@gmail.com,End User, +Vijay,Yadav,vjyaav82@gmail.com,End User, +Vijay,Yadav,vjyaav83@gmail.com,End User, +Vijay,Yadav,vjyaav84@gmail.com,End User, +Vijay,Yadav,vjyaav85@gmail.com,End User, +Vijay,Yadav,vjyaav86@gmail.com,End User, +Vijay,Yadav,vjyaav87@gmail.com,End User, +Vijay,Yadav,vjyaav88@gmail.com,End User, +Vijay,Yadav,vjyaav89@gmail.com,End User, +Vijay,Yadav,vjyaav90@gmail.com,End User, +Vijay,Yadav,vjyaav91@gmail.com,End User, +Vijay,Yadav,vjyaav92@gmail.com,End User, +Vijay,Yadav,vjyaav93@gmail.com,End User, +Vijay,Yadav,vjyaav94@gmail.com,End User, +Vijay,Yadav,vjyaav95@gmail.com,End User, +Vijay,Yadav,vjyaav96@gmail.com,End User, +Vijay,Yadav,vjyaav97@gmail.com,End User, +Vijay,Yadav,vjyaav98@gmail.com,End User, +Vijay,Yadav,vjyaav99@gmail.com,End User, +Vijay,Yadav,vjyaav100@gmail.com,End User, +Vijay,Yadav,vjyaav101@gmail.com,End User, +Vijay,Yadav,vjyaav102@gmail.com,End User, +Vijay,Yadav,vjyaav103@gmail.com,End User, +Vijay,Yadav,vjyaav104@gmail.com,End User, +Vijay,Yadav,vjyaav105@gmail.com,End User, +Vijay,Yadav,vjyaav106@gmail.com,End User, +Vijay,Yadav,vjyaav107@gmail.com,End User, +Vijay,Yadav,vjyaav108@gmail.com,End User, +Vijay,Yadav,vjyaav109@gmail.com,End User, +Vijay,Yadav,vjyaav110@gmail.com,End User, +Vijay,Yadav,vjyaav111@gmail.com,End User, +Vijay,Yadav,vjyaav112@gmail.com,End User, +Vijay,Yadav,vjyaav113@gmail.com,End User, +Vijay,Yadav,vjyaav114@gmail.com,End User, +Vijay,Yadav,vjyaav115@gmail.com,End User, +Vijay,Yadav,vjyaav116@gmail.com,End User, +Vijay,Yadav,vjyaav117@gmail.com,End User, +Vijay,Yadav,vjyaav118@gmail.com,End User, +Vijay,Yadav,vjyaav119@gmail.com,End User, +Vijay,Yadav,vjyaav120@gmail.com,End User, +Vijay,Yadav,vjyaav121@gmail.com,End User, +Vijay,Yadav,vjyaav122@gmail.com,End User, +Vijay,Yadav,vjyaav123@gmail.com,End User, +Vijay,Yadav,vjyaav124@gmail.com,End User, +Vijay,Yadav,vjyaav125@gmail.com,End User, +Vijay,Yadav,vjyaav126@gmail.com,End User, +Vijay,Yadav,vjyaav127@gmail.com,End User, +Vijay,Yadav,vjyaav128@gmail.com,End User, +Vijay,Yadav,vjyaav129@gmail.com,End User, +Vijay,Yadav,vjyaav130@gmail.com,End User, +Vijay,Yadav,vjyaav131@gmail.com,End User, +Vijay,Yadav,vjyaav132@gmail.com,End User, +Vijay,Yadav,vjyaav133@gmail.com,End User, +Vijay,Yadav,vjyaav134@gmail.com,End User, +Vijay,Yadav,vjyaav135@gmail.com,End User, +Vijay,Yadav,vjyaav136@gmail.com,End User, +Vijay,Yadav,vjyaav137@gmail.com,End User, +Vijay,Yadav,vjyaav138@gmail.com,End User, +Vijay,Yadav,vjyaav139@gmail.com,End User, +Vijay,Yadav,vjyaav140@gmail.com,End User, +Vijay,Yadav,vjyaav141@gmail.com,End User, +Vijay,Yadav,vjyaav142@gmail.com,End User, +Vijay,Yadav,vjyaav143@gmail.com,End User, +Vijay,Yadav,vjyaav144@gmail.com,End User, +Vijay,Yadav,vjyaav145@gmail.com,End User, +Vijay,Yadav,vjyaav146@gmail.com,End User, +Vijay,Yadav,vjyaav147@gmail.com,End User, +Vijay,Yadav,vjyaav148@gmail.com,End User, +Vijay,Yadav,vjyaav149@gmail.com,End User, +Vijay,Yadav,vjyaav150@gmail.com,End User, +Vijay,Yadav,vjyaav151@gmail.com,End User, +Vijay,Yadav,vjyaav152@gmail.com,End User, +Vijay,Yadav,vjyaav153@gmail.com,End User, +Vijay,Yadav,vjyaav154@gmail.com,End User, +Vijay,Yadav,vjyaav155@gmail.com,End User, +Vijay,Yadav,vjyaav156@gmail.com,End User, +Vijay,Yadav,vjyaav157@gmail.com,End User, +Vijay,Yadav,vjyaav158@gmail.com,End User, +Vijay,Yadav,vjyaav159@gmail.com,End User, +Vijay,Yadav,vjyaav160@gmail.com,End User, +Vijay,Yadav,vjyaav161@gmail.com,End User, +Vijay,Yadav,vjyaav162@gmail.com,End User, +Vijay,Yadav,vjyaav163@gmail.com,End User, +Vijay,Yadav,vjyaav164@gmail.com,End User, +Vijay,Yadav,vjyaav165@gmail.com,End User, +Vijay,Yadav,vjyaav166@gmail.com,End User, +Vijay,Yadav,vjyaav167@gmail.com,End User, +Vijay,Yadav,vjyaav168@gmail.com,End User, +Vijay,Yadav,vjyaav169@gmail.com,End User, +Vijay,Yadav,vjyaav170@gmail.com,End User, +Vijay,Yadav,vjyaav171@gmail.com,End User, +Vijay,Yadav,vjyaav172@gmail.com,End User, +Vijay,Yadav,vjyaav173@gmail.com,End User, +Vijay,Yadav,vjyaav174@gmail.com,End User, +Vijay,Yadav,vjyaav175@gmail.com,End User, +Vijay,Yadav,vjyaav176@gmail.com,End User, +Vijay,Yadav,vjyaav177@gmail.com,End User, +Vijay,Yadav,vjyaav178@gmail.com,End User, +Vijay,Yadav,vjyaav179@gmail.com,End User, +Vijay,Yadav,vjyaav180@gmail.com,End User, +Vijay,Yadav,vjyaav181@gmail.com,End User, +Vijay,Yadav,vjyaav182@gmail.com,End User, +Vijay,Yadav,vjyaav183@gmail.com,End User, +Vijay,Yadav,vjyaav184@gmail.com,End User, +Vijay,Yadav,vjyaav185@gmail.com,End User, +Vijay,Yadav,vjyaav186@gmail.com,End User, +Vijay,Yadav,vjyaav187@gmail.com,End User, +Vijay,Yadav,vjyaav188@gmail.com,End User, +Vijay,Yadav,vjyaav189@gmail.com,End User, +Vijay,Yadav,vjyaav190@gmail.com,End User, +Vijay,Yadav,vjyaav191@gmail.com,End User, +Vijay,Yadav,vjyaav192@gmail.com,End User, +Vijay,Yadav,vjyaav193@gmail.com,End User, +Vijay,Yadav,vjyaav194@gmail.com,End User, +Vijay,Yadav,vjyaav195@gmail.com,End User, +Vijay,Yadav,vjyaav196@gmail.com,End User, +Vijay,Yadav,vjyaav197@gmail.com,End User, +Vijay,Yadav,vjyaav198@gmail.com,End User, +Vijay,Yadav,vjyaav199@gmail.com,End User, +Vijay,Yadav,vjyaav200@gmail.com,End User, +Vijay,Yadav,vjyaav201@gmail.com,End User, +Vijay,Yadav,vjyaav202@gmail.com,End User, +Vijay,Yadav,vjyaav203@gmail.com,End User, +Vijay,Yadav,vjyaav204@gmail.com,End User, +Vijay,Yadav,vjyaav205@gmail.com,End User, +Vijay,Yadav,vjyaav206@gmail.com,End User, +Vijay,Yadav,vjyaav207@gmail.com,End User, +Vijay,Yadav,vjyaav208@gmail.com,End User, +Vijay,Yadav,vjyaav209@gmail.com,End User, +Vijay,Yadav,vjyaav210@gmail.com,End User, +Vijay,Yadav,vjyaav211@gmail.com,End User, +Vijay,Yadav,vjyaav212@gmail.com,End User, +Vijay,Yadav,vjyaav213@gmail.com,End User, +Vijay,Yadav,vjyaav214@gmail.com,End User, +Vijay,Yadav,vjyaav215@gmail.com,End User, +Vijay,Yadav,vjyaav216@gmail.com,End User, +Vijay,Yadav,vjyaav217@gmail.com,End User, +Vijay,Yadav,vjyaav218@gmail.com,End User, +Vijay,Yadav,vjyaav219@gmail.com,End User, +Vijay,Yadav,vjyaav220@gmail.com,End User, +Vijay,Yadav,vjyaav221@gmail.com,End User, +Vijay,Yadav,vjyaav222@gmail.com,End User, +Vijay,Yadav,vjyaav223@gmail.com,End User, +Vijay,Yadav,vjyaav224@gmail.com,End User, +Vijay,Yadav,vjyaav225@gmail.com,End User, +Vijay,Yadav,vjyaav226@gmail.com,End User, +Vijay,Yadav,vjyaav227@gmail.com,End User, +Vijay,Yadav,vjyaav228@gmail.com,End User, +Vijay,Yadav,vjyaav229@gmail.com,End User, +Vijay,Yadav,vjyaav230@gmail.com,End User, +Vijay,Yadav,vjyaav231@gmail.com,End User, +Vijay,Yadav,vjyaav232@gmail.com,End User, +Vijay,Yadav,vjyaav233@gmail.com,End User, +Vijay,Yadav,vjyaav234@gmail.com,End User, +Vijay,Yadav,vjyaav235@gmail.com,End User, +Vijay,Yadav,vjyaav236@gmail.com,End User, +Vijay,Yadav,vjyaav237@gmail.com,End User, +Vijay,Yadav,vjyaav238@gmail.com,End User, +Vijay,Yadav,vjyaav239@gmail.com,End User, +Vijay,Yadav,vjyaav240@gmail.com,End User, +Vijay,Yadav,vjyaav241@gmail.com,End User, +Vijay,Yadav,vjyaav242@gmail.com,End User, +Vijay,Yadav,vjyaav243@gmail.com,End User, +Vijay,Yadav,vjyaav244@gmail.com,End User, +Vijay,Yadav,vjyaav245@gmail.com,End User, +Vijay,Yadav,vjyaav246@gmail.com,End User, +Vijay,Yadav,vjyaav247@gmail.com,End User, +Vijay,Yadav,vjyaav248@gmail.com,End User, +Vijay,Yadav,vjyaav249@gmail.com,End User, +Vijay,Yadav,vjyaav250@gmail.com,End User, +Vijay,Yadav,vjyaav251@gmail.com,End User, \ No newline at end of file diff --git a/cypress-tests/cypress/fixtures/bulkUser/empty_first_and_last_name - Sheet1.csv b/cypress-tests/cypress/fixtures/bulkUser/empty_first_and_last_name - Sheet1.csv index 03f89777d6..8276f35cc0 100644 --- a/cypress-tests/cypress/fixtures/bulkUser/empty_first_and_last_name - Sheet1.csv +++ b/cypress-tests/cypress/fixtures/bulkUser/empty_first_and_last_name - Sheet1.csv @@ -1,6 +1,6 @@ -First Name,Last Name,Email,Groups -,,test12empty@gmail.com,All Users -Test,Example,test12empty@gmail.com,All Users -Test,Example,test14empty@gmail.com,All Users -Test,Example,test14empty@gmail.com,All Users -Test,Example,test16empty@gmail.com,All Users \ No newline at end of file +First Name,Last Name,Email,User Role,Group +,,test12empty@gmail.com,Admin,Admin +Test,Example,test12empty@gmail.com,Builder,Builder +Test,Example,test14empty@gmail.com,End User,End User +Test,Example,test14empty@gmail.com,End User,End User +Test,Example,test16empty@gmail.com,End User,End User \ No newline at end of file diff --git a/cypress-tests/cypress/fixtures/bulkUser/invalid_group_name - Sheet1.csv b/cypress-tests/cypress/fixtures/bulkUser/invalid_group_name - Sheet1.csv deleted file mode 100644 index 3d07ab09c0..0000000000 --- a/cypress-tests/cypress/fixtures/bulkUser/invalid_group_name - Sheet1.csv +++ /dev/null @@ -1,12 +0,0 @@ -First Name,Last Name,Email,Groups -Test,Example,test12@gmail.com,All-users -Test,Example,test13@gmail.com,All-users -Test,Example,test14@gmail.com,All-users -Test,Example,test15@gmail.com,All-users -Test,Example,test16@gmail.com,All-users -Test,Example,test17@gmail.com,All-users -Test,Example,test18@gmail.com,All-users -Test,Example,test19@gmail.com,All-users -Test,Example,test20@gmail.com,All-users -Test,Example,test21@gmail.com,All-users -Test,Example,test22@gmail.com,All-users \ No newline at end of file diff --git a/cypress-tests/cypress/fixtures/bulkUser/invite_users - Sheet1 .csv b/cypress-tests/cypress/fixtures/bulkUser/invite_users - Sheet1 .csv index ddbb573859..4886865635 100644 --- a/cypress-tests/cypress/fixtures/bulkUser/invite_users - Sheet1 .csv +++ b/cypress-tests/cypress/fixtures/bulkUser/invite_users - Sheet1 .csv @@ -1,251 +1,251 @@ -First Name,Last Name,Email,Groups -Test,Example,test12@gmail.com,All Users|Admin -Test,Example,test13@gmail.com,All Users -Test,Example,test14@gmail.com,All Users -Test,Example,test15@gmail.com,All Users -Test,Example,test16@gmail.com,All Users -Test,Example,test17@gmail.com,All Users -Test,Example,test18@gmail.com,All Users -Test,Example,test19@gmail.com,All Users -Test,Example,test20@gmail.com,All Users -Test,Example,test21@gmail.com,All Users -Test,Example,test22@gmail.com,All Users -Test,Example,test23@gmail.com,All Users -Test,Example,test24@gmail.com,All Users -Test,Example,test25@gmail.com,All Users -Test,Example,test26@gmail.com,All Users -Test,Example,test27@gmail.com,All Users -Test,Example,test28@gmail.com,All Users -Test,Example,test29@gmail.com,All Users -Test,Example,test30@gmail.com,All Users -Test,Example,test31@gmail.com,All Users -Test,Example,test32@gmail.com,All Users -Test,Example,test33@gmail.com,All Users -Test,Example,test34@gmail.com,All Users -Test,Example,test35@gmail.com,All Users -Test,Example,test36@gmail.com,All Users -Test,Example,test37@gmail.com,All Users -Test,Example,test38@gmail.com,All Users -Test,Example,test39@gmail.com,All Users -Test,Example,test40@gmail.com,All Users -Test,Example,test41@gmail.com,All Users -Test,Example,test42@gmail.com,All Users -Test,Example,test43@gmail.com,All Users -Test,Example,test44@gmail.com,All Users -Test,Example,test45@gmail.com,All Users -Test,Example,test46@gmail.com,All Users -Test,Example,test47@gmail.com,All Users -Test,Example,test48@gmail.com,All Users -Test,Example,test49@gmail.com,All Users -Test,Example,test50@gmail.com,All Users -Test,Example,test51@gmail.com,All Users -Test,Example,test52@gmail.com,All Users -Test,Example,test53@gmail.com,All Users -Test,Example,test54@gmail.com,All Users -Test,Example,test55@gmail.com,All Users -Test,Example,test56@gmail.com,All Users -Test,Example,test57@gmail.com,All Users -Test,Example,test58@gmail.com,All Users -Test,Example,test59@gmail.com,All Users -Test,Example,test60@gmail.com,All Users -Test,Example,test61@gmail.com,All Users -Test,Example,test62@gmail.com,All Users -Test,Example,test63@gmail.com,All Users -Test,Example,test64@gmail.com,All Users -Test,Example,test65@gmail.com,All Users -Test,Example,test66@gmail.com,All Users -Test,Example,test67@gmail.com,All Users -Test,Example,test68@gmail.com,All Users -Test,Example,test69@gmail.com,All Users -Test,Example,test70@gmail.com,All Users -Test,Example,test71@gmail.com,All Users -Test,Example,test72@gmail.com,All Users -Test,Example,test73@gmail.com,All Users -Test,Example,test74@gmail.com,All Users -Test,Example,test75@gmail.com,All Users -Test,Example,test76@gmail.com,All Users -Test,Example,test77@gmail.com,All Users -Test,Example,test78@gmail.com,All Users -Test,Example,test79@gmail.com,All Users -Test,Example,test80@gmail.com,All Users -Test,Example,test81@gmail.com,All Users -Test,Example,test82@gmail.com,All Users -Test,Example,test83@gmail.com,All Users -Test,Example,test84@gmail.com,All Users -Test,Example,test85@gmail.com,All Users -Test,Example,test86@gmail.com,All Users -Test,Example,test87@gmail.com,All Users -Test,Example,test88@gmail.com,All Users -Test,Example,test89@gmail.com,All Users -Test,Example,test90@gmail.com,All Users -Test,Example,test91@gmail.com,All Users -Test,Example,test92@gmail.com,All Users -Test,Example,test93@gmail.com,All Users -Test,Example,test94@gmail.com,All Users -Test,Example,test95@gmail.com,All Users -Test,Example,test96@gmail.com,All Users -Test,Example,test97@gmail.com,All Users -Test,Example,test98@gmail.com,All Users -Test,Example,test99@gmail.com,All Users -Test,Example,test100@gmail.com,All Users -Test,Example,test101@gmail.com,All Users -Test,Example,test102@gmail.com,All Users -Test,Example,test103@gmail.com,All Users -Test,Example,test104@gmail.com,All Users -Test,Example,test105@gmail.com,All Users -Test,Example,test106@gmail.com,All Users -Test,Example,test107@gmail.com,All Users -Test,Example,test108@gmail.com,All Users -Test,Example,test109@gmail.com,All Users -Test,Example,test110@gmail.com,All Users -Test,Example,test111@gmail.com,All Users -Test,Example,test112@gmail.com,All Users -Test,Example,test113@gmail.com,All Users -Test,Example,test114@gmail.com,All Users -Test,Example,test115@gmail.com,All Users -Test,Example,test116@gmail.com,All Users -Test,Example,test117@gmail.com,All Users -Test,Example,test118@gmail.com,All Users -Test,Example,test119@gmail.com,All Users -Test,Example,test120@gmail.com,All Users -Test,Example,test121@gmail.com,All Users -Test,Example,test122@gmail.com,All Users -Test,Example,test123@gmail.com,All Users -Test,Example,test124@gmail.com,All Users -Test,Example,test125@gmail.com,All Users -Test,Example,test126@gmail.com,All Users -Test,Example,test127@gmail.com,All Users -Test,Example,test128@gmail.com,All Users -Test,Example,test129@gmail.com,All Users -Test,Example,test130@gmail.com,All Users -Test,Example,test131@gmail.com,All Users -Test,Example,test132@gmail.com,All Users -Test,Example,test133@gmail.com,All Users -Test,Example,test134@gmail.com,All Users -Test,Example,test135@gmail.com,All Users -Test,Example,test136@gmail.com,All Users -Test,Example,test137@gmail.com,All Users -Test,Example,test138@gmail.com,All Users -Test,Example,test139@gmail.com,All Users -Test,Example,test140@gmail.com,All Users -Test,Example,test141@gmail.com,All Users -Test,Example,test142@gmail.com,All Users -Test,Example,test143@gmail.com,All Users -Test,Example,test144@gmail.com,All Users -Test,Example,test145@gmail.com,All Users -Test,Example,test146@gmail.com,All Users -Test,Example,test147@gmail.com,All Users -Test,Example,test148@gmail.com,All Users -Test,Example,test149@gmail.com,All Users -Test,Example,test150@gmail.com,All Users -Test,Example,test151@gmail.com,All Users -Test,Example,test152@gmail.com,All Users -Test,Example,test153@gmail.com,All Users -Test,Example,test154@gmail.com,All Users -Test,Example,test155@gmail.com,All Users -Test,Example,test156@gmail.com,All Users -Test,Example,test157@gmail.com,All Users -Test,Example,test158@gmail.com,All Users -Test,Example,test159@gmail.com,All Users -Test,Example,test160@gmail.com,All Users -Test,Example,test161@gmail.com,All Users -Test,Example,test162@gmail.com,All Users -Test,Example,test163@gmail.com,All Users -Test,Example,test164@gmail.com,All Users -Test,Example,test165@gmail.com,All Users -Test,Example,test166@gmail.com,All Users -Test,Example,test167@gmail.com,All Users -Test,Example,test168@gmail.com,All Users -Test,Example,test169@gmail.com,All Users -Test,Example,test170@gmail.com,All Users -Test,Example,test171@gmail.com,All Users -Test,Example,test172@gmail.com,All Users -Test,Example,test173@gmail.com,All Users -Test,Example,test174@gmail.com,All Users -Test,Example,test175@gmail.com,All Users -Test,Example,test176@gmail.com,All Users -Test,Example,test177@gmail.com,All Users -Test,Example,test178@gmail.com,All Users -Test,Example,test179@gmail.com,All Users -Test,Example,test180@gmail.com,All Users -Test,Example,test181@gmail.com,All Users -Test,Example,test182@gmail.com,All Users -Test,Example,test183@gmail.com,All Users -Test,Example,test184@gmail.com,All Users -Test,Example,test185@gmail.com,All Users -Test,Example,test186@gmail.com,All Users -Test,Example,test187@gmail.com,All Users -Test,Example,test188@gmail.com,All Users -Test,Example,test189@gmail.com,All Users -Test,Example,test190@gmail.com,All Users -Test,Example,test191@gmail.com,All Users -Test,Example,test192@gmail.com,All Users -Test,Example,test193@gmail.com,All Users -Test,Example,test194@gmail.com,All Users -Test,Example,test195@gmail.com,All Users -Test,Example,test196@gmail.com,All Users -Test,Example,test197@gmail.com,All Users -Test,Example,test198@gmail.com,All Users -Test,Example,test199@gmail.com,All Users -Test,Example,test200@gmail.com,All Users -Test,Example,test201@gmail.com,All Users -Test,Example,test202@gmail.com,All Users -Test,Example,test203@gmail.com,All Users -Test,Example,test204@gmail.com,All Users -Test,Example,test205@gmail.com,All Users -Test,Example,test206@gmail.com,All Users -Test,Example,test207@gmail.com,All Users -Test,Example,test208@gmail.com,All Users -Test,Example,test209@gmail.com,All Users -Test,Example,test210@gmail.com,All Users -Test,Example,test211@gmail.com,All Users -Test,Example,test212@gmail.com,All Users -Test,Example,test213@gmail.com,All Users -Test,Example,test214@gmail.com,All Users -Test,Example,test215@gmail.com,All Users -Test,Example,test216@gmail.com,All Users -Test,Example,test217@gmail.com,All Users -Test,Example,test218@gmail.com,All Users -Test,Example,test219@gmail.com,All Users -Test,Example,test220@gmail.com,All Users -Test,Example,test221@gmail.com,All Users -Test,Example,test222@gmail.com,All Users -Test,Example,test223@gmail.com,All Users -Test,Example,test224@gmail.com,All Users -Test,Example,test225@gmail.com,All Users -Test,Example,test226@gmail.com,All Users -Test,Example,test227@gmail.com,All Users -Test,Example,test228@gmail.com,All Users -Test,Example,test229@gmail.com,All Users -Test,Example,test230@gmail.com,All Users -Test,Example,test231@gmail.com,All Users -Test,Example,test232@gmail.com,All Users -Test,Example,test233@gmail.com,All Users -Test,Example,test234@gmail.com,All Users -Test,Example,test235@gmail.com,All Users -Test,Example,test236@gmail.com,All Users -Test,Example,test237@gmail.com,All Users -Test,Example,test238@gmail.com,All Users -Test,Example,test239@gmail.com,All Users -Test,Example,test240@gmail.com,All Users -Test,Example,test241@gmail.com,All Users -Test,Example,test242@gmail.com,All Users -Test,Example,test243@gmail.com,All Users -Test,Example,test244@gmail.com,All Users -Test,Example,test245@gmail.com,All Users -Test,Example,test246@gmail.com,All Users -Test,Example,test247@gmail.com,All Users -Test,Example,test248@gmail.com,All Users -Test,Example,test249@gmail.com,All Users -Test,Example,test250@gmail.com,All Users -Test,Example,test251@gmail.com,All Users -Test,Example,test252@gmail.com,All Users -Test,Example,test253@gmail.com,All Users -Test,Example,test254@gmail.com,All Users -Test,Example,test255@gmail.com,All Users -Test,Example,test256@gmail.com,All Users -Test,Example,test257@gmail.com,All Users -Test,Example,test258@gmail.com,All Users -Test,Example,test259@gmail.com,All Users -Test,Example,test260@gmail.com,All Users -Test,Example,test261@gmail.com,All Users \ No newline at end of file +First Name,Last Name,Email,User Role,Group +test,test,test1@gmail.com,Admin,Admin +test,test,test2@gmail.com,Builder,Builder +test,test,test3@gmail.com,Builder,Builder +test,test,test4@gmail.com,End User,End User +test,test,test5@gmail.com,End User,End User +test,test,test6@gmail.com,End User,End User +test,test,test7@gmail.com,End User,End User +test,test,test8@gmail.com,End User,End User +test,test,test9@gmail.com,End User,End User +test,test,test10@gmail.com,End User,End User +test,test,test11@gmail.com,End User,End User +test,test,test12@gmail.com,End User,End User +test,test,test13@gmail.com,End User,End User +test,test,test14@gmail.com,End User,End User +test,test,test15@gmail.com,End User,End User +test,test,test16@gmail.com,End User,End User +test,test,test17@gmail.com,End User,End User +test,test,test18@gmail.com,End User,End User +test,test,test19@gmail.com,End User,End User +test,test,test20@gmail.com,End User,End User +test,test,test21@gmail.com,End User,End User +test,test,test22@gmail.com,End User,End User +test,test,test23@gmail.com,End User,End User +test,test,test24@gmail.com,End User,End User +test,test,test25@gmail.com,End User,End User +test,test,test26@gmail.com,End User,End User +test,test,test27@gmail.com,End User,End User +test,test,test28@gmail.com,End User,End User +test,test,test29@gmail.com,End User,End User +test,test,test30@gmail.com,End User,End User +test,test,test31@gmail.com,End User,End User +test,test,test32@gmail.com,End User,End User +test,test,test33@gmail.com,End User,End User +test,test,test34@gmail.com,End User,End User +test,test,test35@gmail.com,End User,End User +test,test,test36@gmail.com,End User,End User +test,test,test37@gmail.com,End User,End User +test,test,test38@gmail.com,End User,End User +test,test,test39@gmail.com,End User,End User +test,test,test40@gmail.com,End User,End User +test,test,test41@gmail.com,End User,End User +test,test,test42@gmail.com,End User,End User +test,test,test43@gmail.com,End User,End User +test,test,test44@gmail.com,End User,End User +test,test,test45@gmail.com,End User,End User +test,test,test46@gmail.com,End User,End User +test,test,test47@gmail.com,End User,End User +test,test,test48@gmail.com,End User,End User +test,test,test49@gmail.com,End User,End User +test,test,test50@gmail.com,End User,End User +test,test,test51@gmail.com,End User,End User +test,test,test52@gmail.com,End User,End User +test,test,test53@gmail.com,End User,End User +test,test,test54@gmail.com,End User,End User +test,test,test55@gmail.com,End User,End User +test,test,test56@gmail.com,End User,End User +test,test,test57@gmail.com,End User,End User +test,test,test58@gmail.com,End User,End User +test,test,test59@gmail.com,End User,End User +test,test,test60@gmail.com,End User,End User +test,test,test61@gmail.com,End User,End User +test,test,test62@gmail.com,End User,End User +test,test,test63@gmail.com,End User,End User +test,test,test64@gmail.com,End User,End User +test,test,test65@gmail.com,End User,End User +test,test,test66@gmail.com,End User,End User +test,test,test67@gmail.com,End User,End User +test,test,test68@gmail.com,End User,End User +test,test,test69@gmail.com,End User,End User +test,test,test70@gmail.com,End User,End User +test,test,test71@gmail.com,End User,End User +test,test,test72@gmail.com,End User,End User +test,test,test73@gmail.com,End User,End User +test,test,test74@gmail.com,End User,End User +test,test,test75@gmail.com,End User,End User +test,test,test76@gmail.com,End User,End User +test,test,test77@gmail.com,End User,End User +test,test,test78@gmail.com,End User,End User +test,test,test79@gmail.com,End User,End User +test,test,test80@gmail.com,End User,End User +test,test,test81@gmail.com,End User,End User +test,test,test82@gmail.com,End User,End User +test,test,test83@gmail.com,End User,End User +test,test,test84@gmail.com,End User,End User +test,test,test85@gmail.com,End User,End User +test,test,test86@gmail.com,End User,End User +test,test,test87@gmail.com,End User,End User +test,test,test88@gmail.com,End User,End User +test,test,test89@gmail.com,End User,End User +test,test,test90@gmail.com,End User,End User +test,test,test91@gmail.com,End User,End User +test,test,test92@gmail.com,End User,End User +test,test,test93@gmail.com,End User,End User +test,test,test94@gmail.com,End User,End User +test,test,test95@gmail.com,End User,End User +test,test,test96@gmail.com,End User,End User +test,test,test97@gmail.com,End User,End User +test,test,test98@gmail.com,End User,End User +test,test,test99@gmail.com,End User,End User +test,test,test100@gmail.com,End User,End User +test,test,test101@gmail.com,End User,End User +test,test,test102@gmail.com,End User,End User +test,test,test103@gmail.com,End User,End User +test,test,test104@gmail.com,End User,End User +test,test,test105@gmail.com,End User,End User +test,test,test106@gmail.com,End User,End User +test,test,test107@gmail.com,End User,End User +test,test,test108@gmail.com,End User,End User +test,test,test109@gmail.com,End User,End User +test,test,test110@gmail.com,End User,End User +test,test,test111@gmail.com,End User,End User +test,test,test112@gmail.com,End User,End User +test,test,test113@gmail.com,End User,End User +test,test,test114@gmail.com,End User,End User +test,test,test115@gmail.com,End User,End User +test,test,test116@gmail.com,End User,End User +test,test,test117@gmail.com,End User,End User +test,test,test118@gmail.com,End User,End User +test,test,test119@gmail.com,End User,End User +test,test,test120@gmail.com,End User,End User +test,test,test121@gmail.com,End User,End User +test,test,test122@gmail.com,End User,End User +test,test,test123@gmail.com,End User,End User +test,test,test124@gmail.com,End User,End User +test,test,test125@gmail.com,End User,End User +test,test,test126@gmail.com,End User,End User +test,test,test127@gmail.com,End User,End User +test,test,test128@gmail.com,End User,End User +test,test,test129@gmail.com,End User,End User +test,test,test130@gmail.com,End User,End User +test,test,test131@gmail.com,End User,End User +test,test,test132@gmail.com,End User,End User +test,test,test133@gmail.com,End User,End User +test,test,test134@gmail.com,End User,End User +test,test,test135@gmail.com,End User,End User +test,test,test136@gmail.com,End User,End User +test,test,test137@gmail.com,End User,End User +test,test,test138@gmail.com,End User,End User +test,test,test139@gmail.com,End User,End User +test,test,test140@gmail.com,End User,End User +test,test,test141@gmail.com,End User,End User +test,test,test142@gmail.com,End User,End User +test,test,test143@gmail.com,End User,End User +test,test,test144@gmail.com,End User,End User +test,test,test145@gmail.com,End User,End User +test,test,test146@gmail.com,End User,End User +test,test,test147@gmail.com,End User,End User +test,test,test148@gmail.com,End User,End User +test,test,test149@gmail.com,End User,End User +test,test,test150@gmail.com,End User,End User +test,test,test151@gmail.com,End User,End User +test,test,test152@gmail.com,End User,End User +test,test,test153@gmail.com,End User,End User +test,test,test154@gmail.com,End User,End User +test,test,test155@gmail.com,End User,End User +test,test,test156@gmail.com,End User,End User +test,test,test157@gmail.com,End User,End User +test,test,test158@gmail.com,End User,End User +test,test,test159@gmail.com,End User,End User +test,test,test160@gmail.com,End User,End User +test,test,test161@gmail.com,End User,End User +test,test,test162@gmail.com,End User,End User +test,test,test163@gmail.com,End User,End User +test,test,test164@gmail.com,End User,End User +test,test,test165@gmail.com,End User,End User +test,test,test166@gmail.com,End User,End User +test,test,test167@gmail.com,End User,End User +test,test,test168@gmail.com,End User,End User +test,test,test169@gmail.com,End User,End User +test,test,test170@gmail.com,End User,End User +test,test,test171@gmail.com,End User,End User +test,test,test172@gmail.com,End User,End User +test,test,test173@gmail.com,End User,End User +test,test,test174@gmail.com,End User,End User +test,test,test175@gmail.com,End User,End User +test,test,test176@gmail.com,End User,End User +test,test,test177@gmail.com,End User,End User +test,test,test178@gmail.com,End User,End User +test,test,test179@gmail.com,End User,End User +test,test,test180@gmail.com,End User,End User +test,test,test181@gmail.com,End User,End User +test,test,test182@gmail.com,End User,End User +test,test,test183@gmail.com,End User,End User +test,test,test184@gmail.com,End User,End User +test,test,test185@gmail.com,End User,End User +test,test,test186@gmail.com,End User,End User +test,test,test187@gmail.com,End User,End User +test,test,test188@gmail.com,End User,End User +test,test,test189@gmail.com,End User,End User +test,test,test190@gmail.com,End User,End User +test,test,test191@gmail.com,End User,End User +test,test,test192@gmail.com,End User,End User +test,test,test193@gmail.com,End User,End User +test,test,test194@gmail.com,End User,End User +test,test,test195@gmail.com,End User,End User +test,test,test196@gmail.com,End User,End User +test,test,test197@gmail.com,End User,End User +test,test,test198@gmail.com,End User,End User +test,test,test199@gmail.com,End User,End User +test,test,test200@gmail.com,End User,End User +test,test,test201@gmail.com,End User,End User +test,test,test202@gmail.com,End User,End User +test,test,test203@gmail.com,End User,End User +test,test,test204@gmail.com,End User,End User +test,test,test205@gmail.com,End User,End User +test,test,test206@gmail.com,End User,End User +test,test,test207@gmail.com,End User,End User +test,test,test208@gmail.com,End User,End User +test,test,test209@gmail.com,End User,End User +test,test,test210@gmail.com,End User,End User +test,test,test211@gmail.com,End User,End User +test,test,test212@gmail.com,End User,End User +test,test,test213@gmail.com,End User,End User +test,test,test214@gmail.com,End User,End User +test,test,test215@gmail.com,End User,End User +test,test,test216@gmail.com,End User,End User +test,test,test217@gmail.com,End User,End User +test,test,test218@gmail.com,End User,End User +test,test,test219@gmail.com,End User,End User +test,test,test220@gmail.com,End User,End User +test,test,test221@gmail.com,End User,End User +test,test,test222@gmail.com,End User,End User +test,test,test223@gmail.com,End User,End User +test,test,test224@gmail.com,End User,End User +test,test,test225@gmail.com,End User,End User +test,test,test226@gmail.com,End User,End User +test,test,test227@gmail.com,End User,End User +test,test,test228@gmail.com,End User,End User +test,test,test229@gmail.com,End User,End User +test,test,test230@gmail.com,End User,End User +test,test,test231@gmail.com,End User,End User +test,test,test232@gmail.com,End User,End User +test,test,test233@gmail.com,End User,End User +test,test,test234@gmail.com,End User,End User +test,test,test235@gmail.com,End User,End User +test,test,test236@gmail.com,End User,End User +test,test,test237@gmail.com,End User,End User +test,test,test238@gmail.com,End User,End User +test,test,test239@gmail.com,End User,End User +test,test,test240@gmail.com,End User,End User +test,test,test241@gmail.com,End User,End User +test,test,test242@gmail.com,End User,End User +test,test,test243@gmail.com,End User,End User +test,test,test244@gmail.com,End User,End User +test,test,test245@gmail.com,End User,End User +test,test,test246@gmail.com,End User,End User +test,test,test247@gmail.com,End User,End User +test,test,test248@gmail.com,End User,End User +test,test,test249@gmail.com,End User,End User +test,test,test250@gmail.com,End User,End User \ No newline at end of file diff --git a/cypress-tests/cypress/fixtures/bulkUser/multiple_groups - Sheet1.csv b/cypress-tests/cypress/fixtures/bulkUser/multiple_groups - Sheet1.csv index 20a08b8931..e35de511b1 100644 --- a/cypress-tests/cypress/fixtures/bulkUser/multiple_groups - Sheet1.csv +++ b/cypress-tests/cypress/fixtures/bulkUser/multiple_groups - Sheet1.csv @@ -1,7 +1,7 @@ -First Name,Last Name,Email,Groups -Test,Example,test12@example.com,All Users|Admin|Test -Test,Example,test13@example.com,All Users -Test,Example,test14@example.com,All Users -Test,Example,test15@example.com,All Users -Test,Example,test16@example.com,All Users -Test,Example,test17@example.com,All Users \ No newline at end of file +First Name,Last Name,Email,User Role,Group +Test,Example,test12@example.com,Admin,Admin|Builder +Test,Example,test13@example.com,Buider,Buider|Test +Test,Example,test14@example.com,End user,End user|Abc +Test,Example,test15@example.com,End user,End user|Abc +Test,Example,test16@example.com,End user,End user|Abc +Test,Example,test17@example.com,End user,End user|Abc \ No newline at end of file diff --git a/cypress-tests/cypress/fixtures/bulkUser/non_existing_group -Sheet1 .csv b/cypress-tests/cypress/fixtures/bulkUser/non_existing_group -Sheet1 .csv index 2f77412dbf..9de5b6cd9a 100644 --- a/cypress-tests/cypress/fixtures/bulkUser/non_existing_group -Sheet1 .csv +++ b/cypress-tests/cypress/fixtures/bulkUser/non_existing_group -Sheet1 .csv @@ -1,251 +1,3 @@ -First Name,Last Name,Email,Groups -Test,Example,test12@gmail.com,All Users|Test -Test,Example,test13@gmail.com,All Users -Test,Example,test14@gmail.com,All Users -Test,Example,test15@gmail.com,All Users -Test,Example,test16@gmail.com,All Users -Test,Example,test17@gmail.com,All Users -Test,Example,test18@gmail.com,All Users -Test,Example,test19@gmail.com,All Users -Test,Example,test20@gmail.com,All Users -Test,Example,test21@gmail.com,All Users -Test,Example,test22@gmail.com,All Users -Test,Example,test23@gmail.com,All Users -Test,Example,test24@gmail.com,All Users -Test,Example,test25@gmail.com,All Users -Test,Example,test26@gmail.com,All Users -Test,Example,test27@gmail.com,All Users -Test,Example,test28@gmail.com,All Users -Test,Example,test29@gmail.com,All Users -Test,Example,test30@gmail.com,All Users -Test,Example,test31@gmail.com,All Users -Test,Example,test32@gmail.com,All Users -Test,Example,test33@gmail.com,All Users -Test,Example,test34@gmail.com,All Users -Test,Example,test35@gmail.com,All Users -Test,Example,test36@gmail.com,All Users -Test,Example,test37@gmail.com,All Users -Test,Example,test38@gmail.com,All Users -Test,Example,test39@gmail.com,All Users -Test,Example,test40@gmail.com,All Users -Test,Example,test41@gmail.com,All Users -Test,Example,test42@gmail.com,All Users -Test,Example,test43@gmail.com,All Users -Test,Example,test44@gmail.com,All Users -Test,Example,test45@gmail.com,All Users -Test,Example,test46@gmail.com,All Users -Test,Example,test47@gmail.com,All Users -Test,Example,test48@gmail.com,All Users -Test,Example,test49@gmail.com,All Users -Test,Example,test50@gmail.com,All Users -Test,Example,test51@gmail.com,All Users -Test,Example,test52@gmail.com,All Users -Test,Example,test53@gmail.com,All Users -Test,Example,test54@gmail.com,All Users -Test,Example,test55@gmail.com,All Users -Test,Example,test56@gmail.com,All Users -Test,Example,test57@gmail.com,All Users -Test,Example,test58@gmail.com,All Users -Test,Example,test59@gmail.com,All Users -Test,Example,test60@gmail.com,All Users -Test,Example,test61@gmail.com,All Users -Test,Example,test62@gmail.com,All Users -Test,Example,test63@gmail.com,All Users -Test,Example,test64@gmail.com,All Users -Test,Example,test65@gmail.com,All Users -Test,Example,test66@gmail.com,All Users -Test,Example,test67@gmail.com,All Users -Test,Example,test68@gmail.com,All Users -Test,Example,test69@gmail.com,All Users -Test,Example,test70@gmail.com,All Users -Test,Example,test71@gmail.com,All Users -Test,Example,test72@gmail.com,All Users -Test,Example,test73@gmail.com,All Users -Test,Example,test74@gmail.com,All Users -Test,Example,test75@gmail.com,All Users -Test,Example,test76@gmail.com,All Users -Test,Example,test77@gmail.com,All Users -Test,Example,test78@gmail.com,All Users -Test,Example,test79@gmail.com,All Users -Test,Example,test80@gmail.com,All Users -Test,Example,test81@gmail.com,All Users -Test,Example,test82@gmail.com,All Users -Test,Example,test83@gmail.com,All Users -Test,Example,test84@gmail.com,All Users -Test,Example,test85@gmail.com,All Users -Test,Example,test86@gmail.com,All Users -Test,Example,test87@gmail.com,All Users -Test,Example,test88@gmail.com,All Users -Test,Example,test89@gmail.com,All Users -Test,Example,test90@gmail.com,All Users -Test,Example,test91@gmail.com,All Users -Test,Example,test92@gmail.com,All Users -Test,Example,test93@gmail.com,All Users -Test,Example,test94@gmail.com,All Users -Test,Example,test95@gmail.com,All Users -Test,Example,test96@gmail.com,All Users -Test,Example,test97@gmail.com,All Users -Test,Example,test98@gmail.com,All Users -Test,Example,test99@gmail.com,All Users -Test,Example,test100@gmail.com,All Users -Test,Example,test101@gmail.com,All Users -Test,Example,test102@gmail.com,All Users -Test,Example,test103@gmail.com,All Users -Test,Example,test104@gmail.com,All Users -Test,Example,test105@gmail.com,All Users -Test,Example,test106@gmail.com,All Users -Test,Example,test107@gmail.com,All Users -Test,Example,test108@gmail.com,All Users -Test,Example,test109@gmail.com,All Users -Test,Example,test110@gmail.com,All Users -Test,Example,test111@gmail.com,All Users -Test,Example,test112@gmail.com,All Users -Test,Example,test113@gmail.com,All Users -Test,Example,test114@gmail.com,All Users -Test,Example,test115@gmail.com,All Users -Test,Example,test116@gmail.com,All Users -Test,Example,test117@gmail.com,All Users -Test,Example,test118@gmail.com,All Users -Test,Example,test119@gmail.com,All Users -Test,Example,test120@gmail.com,All Users -Test,Example,test121@gmail.com,All Users -Test,Example,test122@gmail.com,All Users -Test,Example,test123@gmail.com,All Users -Test,Example,test124@gmail.com,All Users -Test,Example,test125@gmail.com,All Users -Test,Example,test126@gmail.com,All Users -Test,Example,test127@gmail.com,All Users -Test,Example,test128@gmail.com,All Users -Test,Example,test129@gmail.com,All Users -Test,Example,test130@gmail.com,All Users -Test,Example,test131@gmail.com,All Users -Test,Example,test132@gmail.com,All Users -Test,Example,test133@gmail.com,All Users -Test,Example,test134@gmail.com,All Users -Test,Example,test135@gmail.com,All Users -Test,Example,test136@gmail.com,All Users -Test,Example,test137@gmail.com,All Users -Test,Example,test138@gmail.com,All Users -Test,Example,test139@gmail.com,All Users -Test,Example,test140@gmail.com,All Users -Test,Example,test141@gmail.com,All Users -Test,Example,test142@gmail.com,All Users -Test,Example,test143@gmail.com,All Users -Test,Example,test144@gmail.com,All Users -Test,Example,test145@gmail.com,All Users -Test,Example,test146@gmail.com,All Users -Test,Example,test147@gmail.com,All Users -Test,Example,test148@gmail.com,All Users -Test,Example,test149@gmail.com,All Users -Test,Example,test150@gmail.com,All Users -Test,Example,test151@gmail.com,All Users -Test,Example,test152@gmail.com,All Users -Test,Example,test153@gmail.com,All Users -Test,Example,test154@gmail.com,All Users -Test,Example,test155@gmail.com,All Users -Test,Example,test156@gmail.com,All Users -Test,Example,test157@gmail.com,All Users -Test,Example,test158@gmail.com,All Users -Test,Example,test159@gmail.com,All Users -Test,Example,test160@gmail.com,All Users -Test,Example,test161@gmail.com,All Users -Test,Example,test162@gmail.com,All Users -Test,Example,test163@gmail.com,All Users -Test,Example,test164@gmail.com,All Users -Test,Example,test165@gmail.com,All Users -Test,Example,test166@gmail.com,All Users -Test,Example,test167@gmail.com,All Users -Test,Example,test168@gmail.com,All Users -Test,Example,test169@gmail.com,All Users -Test,Example,test170@gmail.com,All Users -Test,Example,test171@gmail.com,All Users -Test,Example,test172@gmail.com,All Users -Test,Example,test173@gmail.com,All Users -Test,Example,test174@gmail.com,All Users -Test,Example,test175@gmail.com,All Users -Test,Example,test176@gmail.com,All Users -Test,Example,test177@gmail.com,All Users -Test,Example,test178@gmail.com,All Users -Test,Example,test179@gmail.com,All Users -Test,Example,test180@gmail.com,All Users -Test,Example,test181@gmail.com,All Users -Test,Example,test182@gmail.com,All Users -Test,Example,test183@gmail.com,All Users -Test,Example,test184@gmail.com,All Users -Test,Example,test185@gmail.com,All Users -Test,Example,test186@gmail.com,All Users -Test,Example,test187@gmail.com,All Users -Test,Example,test188@gmail.com,All Users -Test,Example,test189@gmail.com,All Users -Test,Example,test190@gmail.com,All Users -Test,Example,test191@gmail.com,All Users -Test,Example,test192@gmail.com,All Users -Test,Example,test193@gmail.com,All Users -Test,Example,test194@gmail.com,All Users -Test,Example,test195@gmail.com,All Users -Test,Example,test196@gmail.com,All Users -Test,Example,test197@gmail.com,All Users -Test,Example,test198@gmail.com,All Users -Test,Example,test199@gmail.com,All Users -Test,Example,test200@gmail.com,All Users -Test,Example,test201@gmail.com,All Users -Test,Example,test202@gmail.com,All Users -Test,Example,test203@gmail.com,All Users -Test,Example,test204@gmail.com,All Users -Test,Example,test205@gmail.com,All Users -Test,Example,test206@gmail.com,All Users -Test,Example,test207@gmail.com,All Users -Test,Example,test208@gmail.com,All Users -Test,Example,test209@gmail.com,All Users -Test,Example,test210@gmail.com,All Users -Test,Example,test211@gmail.com,All Users -Test,Example,test212@gmail.com,All Users -Test,Example,test213@gmail.com,All Users -Test,Example,test214@gmail.com,All Users -Test,Example,test215@gmail.com,All Users -Test,Example,test216@gmail.com,All Users -Test,Example,test217@gmail.com,All Users -Test,Example,test218@gmail.com,All Users -Test,Example,test219@gmail.com,All Users -Test,Example,test220@gmail.com,All Users -Test,Example,test221@gmail.com,All Users -Test,Example,test222@gmail.com,All Users -Test,Example,test223@gmail.com,All Users -Test,Example,test224@gmail.com,All Users -Test,Example,test225@gmail.com,All Users -Test,Example,test226@gmail.com,All Users -Test,Example,test227@gmail.com,All Users -Test,Example,test228@gmail.com,All Users -Test,Example,test229@gmail.com,All Users -Test,Example,test230@gmail.com,All Users -Test,Example,test231@gmail.com,All Users -Test,Example,test232@gmail.com,All Users -Test,Example,test233@gmail.com,All Users -Test,Example,test234@gmail.com,All Users -Test,Example,test235@gmail.com,All Users -Test,Example,test236@gmail.com,All Users -Test,Example,test237@gmail.com,All Users -Test,Example,test238@gmail.com,All Users -Test,Example,test239@gmail.com,All Users -Test,Example,test240@gmail.com,All Users -Test,Example,test241@gmail.com,All Users -Test,Example,test242@gmail.com,All Users -Test,Example,test243@gmail.com,All Users -Test,Example,test244@gmail.com,All Users -Test,Example,test245@gmail.com,All Users -Test,Example,test246@gmail.com,All Users -Test,Example,test247@gmail.com,All Users -Test,Example,test248@gmail.com,All Users -Test,Example,test249@gmail.com,All Users -Test,Example,test250@gmail.com,All Users -Test,Example,test251@gmail.com,All Users -Test,Example,test252@gmail.com,All Users -Test,Example,test253@gmail.com,All Users -Test,Example,test254@gmail.com,All Users -Test,Example,test255@gmail.com,All Users -Test,Example,test256@gmail.com,All Users -Test,Example,test257@gmail.com,All Users -Test,Example,test258@gmail.com,All Users -Test,Example,test259@gmail.com,All Users -Test,Example,test260@gmail.com,All Users -Test,Example,test261@gmail.com,All Users \ No newline at end of file +First Name,Last Name,Email,User Role,Group +test,test,demo1@gmail.com,Admin,test +test,test,demo2@gmail.com,Builder,abc diff --git a/cypress-tests/cypress/fixtures/bulkUser/same_email - Sheet1.csv b/cypress-tests/cypress/fixtures/bulkUser/same_email - Sheet1.csv index 6174d94374..2537cc16f7 100644 --- a/cypress-tests/cypress/fixtures/bulkUser/same_email - Sheet1.csv +++ b/cypress-tests/cypress/fixtures/bulkUser/same_email - Sheet1.csv @@ -1,6 +1,4 @@ -First Name,Last Name,Email,Groups -Test,Example,test12@gmail.com,All Users -Test,Example,test12@gmail.com,All Users -Test,Example,test14@gmail.com,All Users -Test,Example,test14@gmail.com,All Users -Test,Example,test16@gmail.com,All Users \ No newline at end of file +First Name,Last Name,Email,User Role,Group +test,test,demo11@gmail.com,Admin, +test,test,demo11@gmail.com,Builder, +test,test,demo12@gmail.com,Builder, diff --git a/cypress-tests/cypress/fixtures/bulkUser/without_email - Sheet1.csv b/cypress-tests/cypress/fixtures/bulkUser/without_email - Sheet1.csv index c6e364c363..834aba042d 100644 --- a/cypress-tests/cypress/fixtures/bulkUser/without_email - Sheet1.csv +++ b/cypress-tests/cypress/fixtures/bulkUser/without_email - Sheet1.csv @@ -1,12 +1,11 @@ -First Name,Last Name,Email,Groups -Test,Example,,All Users -Test,Example,,All Users -Test,Example,,All Users -Test,Example,,All Users -Test,Example,,All Users -Test,Example,,All Users -Test,Example,,All Users -Test,Example,,All Users -Test,Example,,All Users -Test,Example,,All Users -Test,Example,,All Users \ No newline at end of file +First Name,Last Name,Email,User Role,Group +test,test,,Admin,Admin +test,test,,Builder,Builder +test,test,,Builder,Builder +test,test,,End User,End User +test,test,,End User,End User +test,test,,End User,End User +test,test,,End User,End User +test,test,,End User,End User +test,test,,End User,End User +test,test,,End User,End User \ No newline at end of file diff --git a/cypress-tests/cypress/fixtures/bulkUser/without_firstname - Sheet1.csv b/cypress-tests/cypress/fixtures/bulkUser/without_firstname - Sheet1.csv deleted file mode 100644 index c67c527082..0000000000 --- a/cypress-tests/cypress/fixtures/bulkUser/without_firstname - Sheet1.csv +++ /dev/null @@ -1,6 +0,0 @@ -First Name,Last Name,Email,Groups -,Example,test12withoutfirstname@gmail.com,All Users -,Example,test13withoutfirstname@gmail.com,All Users -,Example,test14withoutfirstname@gmail.com,All Users -,Example,test15withoutfirstname@gmail.com,All Users -,Example,test16withoutfirstname@gmail.com,All Users \ No newline at end of file diff --git a/cypress-tests/cypress/fixtures/bulkUser/without_group - Sheet1.csv b/cypress-tests/cypress/fixtures/bulkUser/without_group - Sheet1.csv deleted file mode 100644 index 7f779dbf8e..0000000000 --- a/cypress-tests/cypress/fixtures/bulkUser/without_group - Sheet1.csv +++ /dev/null @@ -1,6 +0,0 @@ -First Name,Last Name,Email,Groups -Test,Example,test12@gmail.com, -Test,Example,test13@gmail.com, -Test,Example,test14@gmail.com, -Test,Example,test15@gmail.com, -Test,Example,test16@gmail.com, \ No newline at end of file diff --git a/cypress-tests/cypress/fixtures/bulkUser/without_lastname - Sheet1.csv b/cypress-tests/cypress/fixtures/bulkUser/without_lastname - Sheet1.csv deleted file mode 100644 index 4cfc7cbf34..0000000000 --- a/cypress-tests/cypress/fixtures/bulkUser/without_lastname - Sheet1.csv +++ /dev/null @@ -1,6 +0,0 @@ -First Name,Last Name,Email,Groups -Test,,test12withoutlastname@gmail.com,All Users -Test,,test13withoutlastname@gmail.com,All Users -Test,,test14withoutlastname@gmail.com,All Users -Test,,test15withoutlastname@gmail.com,All Users -Test,,test16withoutlastname@gmail.com,All Users \ No newline at end of file diff --git a/cypress-tests/cypress/fixtures/bulkUser/without_name - Sheet1.csv b/cypress-tests/cypress/fixtures/bulkUser/without_name - Sheet1.csv index dc73e9b377..5db5b53489 100644 --- a/cypress-tests/cypress/fixtures/bulkUser/without_name - Sheet1.csv +++ b/cypress-tests/cypress/fixtures/bulkUser/without_name - Sheet1.csv @@ -1,12 +1,11 @@ -First Name,Last Name,Email,Groups -,,test12@gmail.com,All Users -,,test13@gmail.com,All Users -,,test14@gmail.com,All Users -,,test15@gmail.com,All Users -,,test16@gmail.com,All Users -,,test17@gmail.com,All Users -,,test18@gmail.com,All Users -,,test19@gmail.com,All Users -,,test20@gmail.com,All Users -,,test21@gmail.com,All Users -,,test22@gmail.com,All Users \ No newline at end of file +First Name,Last Name,Email,User Role,Group +,,withoutname1@gmail.com,Admin,Admin +,,withoutname2@gmail.com,Builder,Builder +,,withoutname3@gmail.com,Builder,Builder +,,withoutname4@gmail.com,End User,End User +,,withoutname5@gmail.com,End User,End User +,,withoutname6@gmail.com,End User,End User +,,withoutname7@gmail.com,End User,End User +,,withoutname8@gmail.com,End User,End User +,,withoutname9@gmail.com,End User,End User +,,withoutname10@gmail.com,End User,End User \ No newline at end of file diff --git a/cypress-tests/cypress/fixtures/bulkUser/without_role - Sheet1.csv b/cypress-tests/cypress/fixtures/bulkUser/without_role - Sheet1.csv new file mode 100644 index 0000000000..63fbe2c2ae --- /dev/null +++ b/cypress-tests/cypress/fixtures/bulkUser/without_role - Sheet1.csv @@ -0,0 +1,6 @@ +First Name,Last Name,Email,User Role,Group +Test,Example,test12@gmail.com,, +Test,Example,test13@gmail.com,, +Test,Example,test14@gmail.com,, +Test,Example,test15@gmail.com,, +Test,Example,test16@gmail.com,, \ No newline at end of file diff --git a/cypress-tests/cypress/fixtures/inspectorItems.json b/cypress-tests/cypress/fixtures/inspectorItems.json new file mode 100644 index 0000000000..b532b6b38a --- /dev/null +++ b/cypress-tests/cypress/fixtures/inspectorItems.json @@ -0,0 +1,32 @@ +{ + "globalsNodes": [ + { "key": "theme", "type": "Object", "value": "1 entry " }, + { "key": "urlparams", "type": "Object", "value": "1 entry " }, + { "key": "currentUser", "type": "Object", "value": "8 entries " } + ], + "componentsNodes": [ + { "key": "button1", "type": "Object", "value": "13 entries " }, + { "key": "button2", "type": "Object", "value": "13 entries " }, + { "key": "button3", "type": "Object", "value": "13 entries " } + ], + "pageNodes": [ + { "key": "handle", "type": "String", "value": "\"home\"" }, + { "key": "name", "type": "String", "value": "\"Home\"" } + ], + "testPageNodes": [ + { "key": "handle", "type": "String", "value": "\"test-page\"" }, + { "key": "name", "type": "String", "value": "\"test_page\"" } + ], + "currentUserNodes": [ + { "key": "email", "type": "String", "value": "\"dev@tooljet.io\"" }, + { "key": "firstName", "type": "String", "value": "\"The\"" }, + { "key": "lastName", "type": "String", "value": "\"Developer\"" }, + { "key": "role", "type": "String", "value": "\"admin\"" } + ], + "themeNodes": [{ "key": "name", "type": "String", "value": "\"light\"" }], + "modeNodes": [{ "key": "value", "type": "String", "value": "\"edit\"" }], + "urlparamsNode": [{ "key": "key", "type": "String", "value": "\"value\"" }], + "variablesNodes": [ + { "key": "globalVar", "type": "String", "value": "\"globalVar\"" } + ] +} diff --git a/cypress-tests/cypress/support/e2e.js b/cypress-tests/cypress/support/e2e.js index 5a6aa1dd32..ed0270fb78 100644 --- a/cypress-tests/cypress/support/e2e.js +++ b/cypress-tests/cypress/support/e2e.js @@ -24,3 +24,10 @@ import "@cypress/code-coverage/support"; Cypress.on("uncaught:exception", (err, runnable) => { return false; }); + +beforeEach(() => { + if (Cypress.env("deployment") === "proxy") { + cy.visit("/"); + cy.get("button").contains("Visit Site").click(); + } +}); diff --git a/cypress-tests/cypress/support/utils/commonWidget.js b/cypress-tests/cypress/support/utils/commonWidget.js index 830b4e2c65..c48cd18917 100644 --- a/cypress-tests/cypress/support/utils/commonWidget.js +++ b/cypress-tests/cypress/support/utils/commonWidget.js @@ -31,9 +31,7 @@ export const verifyAndModifyParameter = (paramName, value) => { export const openEditorSidebar = (widgetName = "") => { cy.hideTooltip(); - cy.get(`${commonWidgetSelector.draggableWidget(widgetName)}:eq(0)`).trigger( - "mouseover" - ); + cy.get(`${commonWidgetSelector.draggableWidget(widgetName)}:eq(0)`).realHover() cy.get(commonWidgetSelector.widgetConfigHandle(widgetName)).click(); }; @@ -195,8 +193,7 @@ export const verifyBoxShadowCss = ( ).should( "have.css", "box-shadow", - `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3] / 100}) ${ - shadowParam[0] + `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3] / 100}) ${shadowParam[0] }px ${shadowParam[1]}px ${shadowParam[2]}px ${shadowParam[3]}px` ); }; @@ -285,8 +282,7 @@ export const verifyLoaderColor = (widgetName, color) => { .then((style) => { const loaderColor = style.split(" ").join(""); expect(loaderColor).to.include( - `--loader-color:rgba(${color[0]},${color[1]},${color[2]},${ - color[3] / 100 + `--loader-color:rgba(${color[0]},${color[1]},${color[2]},${color[3] / 100 })` ); }); diff --git a/cypress-tests/cypress/support/utils/dashboard.js b/cypress-tests/cypress/support/utils/dashboard.js index d23984a9fe..fd819280fd 100644 --- a/cypress-tests/cypress/support/utils/dashboard.js +++ b/cypress-tests/cypress/support/utils/dashboard.js @@ -11,9 +11,9 @@ import { export const login = () => { cy.visit("/"); - cy.clearAndType(commonSelectors.workEmailInputField, "dev@tooljet.io"); - cy.clearAndType(commonSelectors.passwordInputField, "password"); - cy.get(commonSelectors.loginButton).click(); + cy.clearAndType(onboardingSelectors.loginEmailInput, "dev@tooljet.io"); + cy.clearAndType(onboardingSelectors.loginPasswordInput, "password"); + cy.get(onboardingSelectors.signInButton).click(); }; export const modifyAndVerifyAppCardIcon = (appName) => { diff --git a/cypress-tests/cypress/support/utils/dataSource.js b/cypress-tests/cypress/support/utils/dataSource.js index a79f968b9c..6e411ab7f7 100644 --- a/cypress-tests/cypress/support/utils/dataSource.js +++ b/cypress-tests/cypress/support/utils/dataSource.js @@ -79,7 +79,7 @@ export const addQueryN = (queryName, query, dbName) => { cy.clearAndType('[data-cy="gds-querymanager-search-bar"]', `${dbName}`); } }); - cy.intercept("POST", "http://localhost:3000/api/data_queries").as( + cy.intercept("POST", "/api/data_queries").as( "createQuery" ); @@ -98,7 +98,7 @@ export const addQueryN = (queryName, query, dbName) => { export const addQuery = (queryName, query, dbName) => { cy.get('[data-cy="show-ds-popover-button"]').click(); cy.get(".css-1rrkggf-Input").type(`${dbName}`); - cy.intercept("POST", "http://localhost:3000/api/data_queries").as( + cy.intercept("POST", "/api/data_queries").as( "createQuery" ); cy.contains(`[id*="react-select-"]`, dbName).click(); @@ -116,7 +116,7 @@ export const addQuery = (queryName, query, dbName) => { export const addQueryAndOpenEditor = (queryName, query, dbName, appName) => { cy.get('[data-cy="show-ds-popover-button"]').click(); cy.get(".css-1rrkggf-Input").type(`${dbName}`); - cy.intercept("POST", "http://localhost:3000/api/data_queries").as( + cy.intercept("POST", "/api/data_queries").as( "createQuery" ); cy.contains(`[id*="react-select-"]`, dbName).click(); @@ -181,7 +181,7 @@ export const createDataQuery = (appName, url, key, value) => { cy.request({ method: "POST", - url: "http://localhost:3000/api/data_queries", + url: `${Cypress.env("server_host")}/api/data_queries`, headers: headers, body: { app_id: appId, @@ -241,7 +241,7 @@ export const createrestAPIQuery = (data) => { }; cy.request({ method: "POST", - url: "http://localhost:3000/api/data_queries", + url: `${Cypress.env("server_host")}/api/data_queries`, headers: headers, body: requestBody, }).then((response) => { diff --git a/cypress-tests/cypress/support/utils/editor/codehinter.js b/cypress-tests/cypress/support/utils/editor/codehinter.js new file mode 100644 index 0000000000..83b86984d9 --- /dev/null +++ b/cypress-tests/cypress/support/utils/editor/codehinter.js @@ -0,0 +1,20 @@ +import { commonSelectors, commonWidgetSelector } from "Selectors/common"; +import { + openEditorSidebar, +} from "Support/utils/commonWidget"; + +export const addAndVerifyOnSingleLine = (data, property = '', componentName = 'text1',) => { + cy.intercept("PUT", "/api/v2/apps/**/*").as("editorAPI"); + cy.get( + commonWidgetSelector.parameterInputField(property) + ).clearAndTypeOnCodeMirror(data) + cy.forceClickOnCanvas() + cy.wait("@editorAPI"); + openEditorSidebar(componentName) + cy.get( + commonWidgetSelector.parameterInputField(property) + ) + .realClick() + .find(".cm-line") + .invoke("text").should("equals", data) +}; \ No newline at end of file diff --git a/cypress-tests/cypress/support/utils/events.js b/cypress-tests/cypress/support/utils/events.js index 7f4776e766..5f17b0dd63 100644 --- a/cypress-tests/cypress/support/utils/events.js +++ b/cypress-tests/cypress/support/utils/events.js @@ -12,13 +12,13 @@ export const selectEvent = ( .click() .find("input") .type(`{selectAll}{backspace}${event}{enter}`); - cy.get('[data-cy="event-label"]').click({force:true}) + cy.get('[data-cy="event-label"]').click({ force: true }) cy.get('[data-cy="action-selection"]') .click() .find("input") .type(`{selectAll}{backspace}${action}{enter}`); - cy.get('[data-cy="event-label"]').click({force:true}) + cy.get('[data-cy="event-label"]').click({ force: true }) cy.wait("@events"); }; @@ -32,28 +32,28 @@ export const selectCSA = ( .click() .find("input") .type(`{selectAll}{backspace}${component}{enter}`); - cy.get('[data-cy="event-label"]').click({force:true}) + cy.get('[data-cy="event-label"]').click({ force: true }) cy.get('[data-cy="action-options-action-selection-field"]') .click() .find("input") .type(`{selectAll}{backspace}${componentAction}{enter}`); - cy.get('[data-cy="event-label"]').click({force:true}) + cy.get('[data-cy="event-label"]').click({ force: true }) cy.wait("@events"); cy.get('[data-cy="debounce-input-field"]') .click() .type(`{selectAll}{backspace}${debounce}{enter}`); - cy.get('[data-cy="event-label"]').click({force:true}) + cy.get('[data-cy="event-label"]').click({ force: true }) cy.wait("@events"); }; export const addSupportCSAData = (field, data) => { cy.intercept("PUT", "events").as("events"); - cy.get(`[data-cy="event-${field}-input-field"]`) + cy.get(`[data-cy="${field}-input-field"]`) .click({ force: true }) .clearAndTypeOnCodeMirror(data); - cy.get('[data-cy="event-label"]').click({force:true}) + cy.get('[data-cy="event-label"]').click({ force: true }) }; export const selectSupportCSAData = (option) => { @@ -63,7 +63,7 @@ export const selectSupportCSAData = (option) => { .click() .find("input") .type(`{selectAll}{backspace}${option}{enter}`); - cy.get('[data-cy="event-label"]').click({force:true}) + cy.get('[data-cy="event-label"]').click({ force: true }) cy.wait("@events"); }; @@ -74,6 +74,6 @@ export const changeEventType = (event, eventIndex = 0) => { .click() .find("input") .type(`{selectAll}{backspace}${event}{enter}`); - cy.get('[data-cy="event-label"]').click({force:true}) + cy.get('[data-cy="event-label"]').click({ force: true }) cy.wait("@events"); }; diff --git a/cypress-tests/cypress/support/utils/inspector.js b/cypress-tests/cypress/support/utils/inspector.js index 3a77d8be5e..dbb15249d6 100644 --- a/cypress-tests/cypress/support/utils/inspector.js +++ b/cypress-tests/cypress/support/utils/inspector.js @@ -34,8 +34,7 @@ export const verifyValue = (node, type, children, index = 0) => { }; export const deleteComponentFromInspector = (node) => { cy.get('[data-cy="inspector-node-components"] > .node-key').click(); - cy.get(`[data-cy="inspector-node-${node}"] > .node-key`).click(); - cy.get('[style="height: 13px; width: 13px;"] > img').click(); + cy.get(`[data-cy="inspector-node-${node}"] > .node-key`).realHover().parent().find('[style="height: 13px; width: 13px;"] > img').click(); }; export const verifyfunctions = (node, type, index = 0) => { @@ -50,3 +49,12 @@ export const verifyfunctions = (node, type, index = 0) => { // .eq(index) // .verifyVisibleElement("contain.text", type); }; + +export const verifyNodes = (nodes, verificationFunction) => { + nodes.forEach(node => verificationFunction(node.key, node.type, node.value)); +}; + +export const openAndVerifyNode = (nodeName, nodes, verificationFunction) => { + openNode(nodeName); + verifyNodes(nodes, verificationFunction); +}; \ No newline at end of file diff --git a/cypress-tests/cypress/support/utils/manageGroups.js b/cypress-tests/cypress/support/utils/manageGroups.js index c31a57c0f1..487010780c 100644 --- a/cypress-tests/cypress/support/utils/manageGroups.js +++ b/cypress-tests/cypress/support/utils/manageGroups.js @@ -564,7 +564,7 @@ export const addUserToGroup = (groupName, email) => { }; export const createGroupAddAppAndUserToGroup = (groupName, email) => { - cy.intercept("GET", "http://localhost:3000/api/group_permissions").as( + cy.intercept("GET", "/api/group_permissions").as( `${groupName}` ); createGroup(groupName); @@ -582,7 +582,7 @@ export const createGroupAddAppAndUserToGroup = (groupName, email) => { cy.request({ method: "PUT", - url: `http://localhost:3000/api/group_permissions/${groupId}`, + url: `${Cypress.env("server_host")}/api/group_permissions/${groupId}`, headers: headers, body: { add_apps: [Cypress.env("appId")] }, }).then((patchResponse) => { @@ -597,7 +597,7 @@ export const createGroupAddAppAndUserToGroup = (groupName, email) => { cy.request({ method: "PUT", - url: `http://localhost:3000/api/group_permissions/${groupId}`, + url: `${Cypress.env("server_host")}/api/group_permissions/${groupId}`, headers: headers, body: { add_users: [userId] }, }).then((patchResponse) => { diff --git a/cypress-tests/cypress/support/utils/manageSSO.js b/cypress-tests/cypress/support/utils/manageSSO.js index ba77205619..971a3c10d9 100644 --- a/cypress-tests/cypress/support/utils/manageSSO.js +++ b/cypress-tests/cypress/support/utils/manageSSO.js @@ -56,12 +56,9 @@ export const generalSettings = () => { export const googleSSOPageElements = () => { cy.get(ssoSelector.googleEnableToggle).click(); + cy.wait(5000); cy.get(ssoSelector.saveButton).eq(1).click(); - - cy.get('[data-cy="modal-title"]').verifyVisibleElement( - "have.text", - "Enable Google" - ); + cy.wait(2000); cy.get('[data-cy="modal-close-button"]').should("be.visible"); cy.get('[data-cy="modal-message"]').verifyVisibleElement( "have.text", @@ -235,18 +232,18 @@ export const workspaceLoginPageElements = (workspaceName) => { }; export const passwordLoginVisible = () => { - cy.get(commonSelectors.workEmailInputField).should("be.visible"); - cy.get(commonSelectors.passwordInputField).should("be.visible"); - cy.get(commonSelectors.loginButton).verifyVisibleElement( + cy.get(onboardingSelectors.loginEmailInput).should("be.visible"); + cy.get(onboardingSelectors.loginPasswordInput).should("be.visible"); + cy.get(onboardingSelectors.signInButton).verifyVisibleElement( "have.text", commonText.loginButton ); }; export const workspaceLogin = (workspaceName) => { - cy.clearAndType(commonSelectors.workEmailInputField, "dev@tooljet.io"); - cy.clearAndType(commonSelectors.passwordInputField, "password"); - cy.get(commonSelectors.loginButton).click(); + cy.clearAndType(onboardingSelectors.loginEmailInput, "dev@tooljet.io"); + cy.clearAndType(onboardingSelectors.loginPasswordInput, "password"); + cy.get(onboardingSelectors.signInButton).click(); cy.wait(2000); cy.get(commonSelectors.homePageLogo).should("be.visible"); cy.get(commonSelectors.workspaceName).verifyVisibleElement( @@ -295,13 +292,13 @@ export const signInPageElements = () => { "have.text", commonText.forgotPasswordLink ); - cy.get(commonSelectors.loginButton).verifyVisibleElement( + cy.get(onboardingSelectors.signInButton).verifyVisibleElement( "have.text", commonText.loginButton ); - cy.get(commonSelectors.workEmailInputField).should("be.visible"); - cy.get(commonSelectors.passwordInputField).should("be.visible"); + cy.get(onboardingSelectors.loginEmailInput).should("be.visible"); + cy.get(onboardingSelectors.loginPasswordInput).should("be.visible"); cy.get("body").then(($el) => { if ($el.text().includes("Google")) { @@ -477,7 +474,7 @@ export const invitePageElements = () => { "have.text", commonText.passwordLabel ); - cy.get(commonSelectors.passwordInputField).should("be.visible"); + cy.get(onboardingSelectors.loginPasswordInput).should("be.visible"); cy.get(commonSelectors.acceptInviteButton).verifyVisibleElement( "have.text", commonText.acceptInviteButton @@ -538,7 +535,7 @@ export const defaultSSO = (enable) => { cy.request( { method: "PATCH", - url: "http://localhost:3000/api/organizations", + url: `${Cypress.env("server_host")}/api/organizations`, headers: { "Tj-Workspace-Id": Cypress.env("workspaceId"), Cookie: `tj_auth_token=${cookie.value}`, @@ -562,7 +559,7 @@ export const setSignupStatus = (enable, workspaceName = 'My workspace') => { cy.getCookie("tj_auth_token").then((cookie) => { cy.request({ method: "PATCH", - url: "http://localhost:3000/api/organizations", + url: `${Cypress.env("server_host")}/api/organizations`, headers: { "Tj-Workspace-Id": workspaceId, Cookie: `tj_auth_token=${cookie.value}`, @@ -598,7 +595,7 @@ export const resetDomain = () => { cy.request( { method: "PATCH", - url: "http://localhost:3000/api/organizations", + url: `${Cypress.env("server_host")}/api/organizations`, headers: { "Tj-Workspace-Id": Cypress.env("workspaceId"), Cookie: `tj_auth_token=${cookie.value}`, diff --git a/cypress-tests/cypress/support/utils/manageUsers.js b/cypress-tests/cypress/support/utils/manageUsers.js index 9bfc404d1b..1cd5cda938 100644 --- a/cypress-tests/cypress/support/utils/manageUsers.js +++ b/cypress-tests/cypress/support/utils/manageUsers.js @@ -6,6 +6,8 @@ import { ssoSelector } from "Selectors/manageSSO"; import { ssoText } from "Texts/manageSSO"; import * as common from "Support/utils/common"; import { commonText } from "Texts/common"; +import { onboardingSelectors } from "Selectors/onboarding"; + export const manageUsersElements = () => { cy.get(commonSelectors.breadcrumbTitle).should(($el) => { @@ -150,19 +152,19 @@ export const manageUsersElements = () => { export const inviteUser = (firstName, email) => { cy.userInviteApi(firstName, email); fetchAndVisitInviteLink(email); - cy.clearAndType(commonSelectors.passwordInputField, "password"); + cy.clearAndType(onboardingSelectors.loginPasswordInput, "password"); cy.get(commonSelectors.acceptInviteButton).click(); }; export const confirmInviteElements = (email) => { - cy.get(commonSelectors.SignUpSectionHeader).verifyVisibleElement( + cy.get(commonSelectors.signUpSectionHeader).verifyVisibleElement( "have.text", "Sign up"); - cy.get('[data-cy="workspace-signup-header"]').verifyVisibleElement( - "have.text", "Sign up to the workspace - My workspace"); + cy.get('[data-cy="signup-info"]').verifyVisibleElement( + "have.text", "Sign up to the workspace - My workspace. "); - cy.verifyLabel("Email") - cy.verifyLabel("Create a password") + // cy.verifyLabel("Email") + // cy.verifyLabel("Create a password") cy.get(commonSelectors.invitedUserEmail).verifyVisibleElement( "have.text", email); @@ -215,7 +217,19 @@ export const bulkUserUpload = (file, fileName, toastMessage) => { .should("be.visible") .and("have.text", toastMessage); cy.get(usersSelector.toastCloseButton).click(); + cy.wait(200); +}; +export const bulkUserUploadDuplicate = (file, fileName, toastMessage) => { + cy.get(usersSelector.inputFieldBulkUpload).selectFile(file, { + force: true, + }); + cy.get(usersSelector.uploadedFileData).should("contain", fileName); + cy.get(usersSelector.buttonUploadUsers).click(); + cy.get(commonSelectors.modalMessage) + .should("be.visible") + .and("have.text", toastMessage); + cy.get(usersSelector.modalClose).click(); cy.wait(200); }; @@ -242,8 +256,8 @@ export const copyInvitationLink = (firstName, email) => { export const fillUserInviteForm = (firstName, email) => { cy.get(usersSelector.buttonAddUsers).click(); - cy.clearAndType(commonSelectors.inputFieldFullName, firstName); - cy.clearAndType(commonSelectors.inputFieldEmailAddress, email); + cy.clearAndType(onboardingSelectors.nameInput, firstName); + cy.clearAndType(onboardingSelectors.signupEmailInput, email); }; export const selectUserGroup = (groupName) => { @@ -293,7 +307,8 @@ export const inviteUserWithUserGroups = ( cy.wait(1000); fetchAndVisitInviteLink(email); - cy.clearAndType(commonSelectors.passwordInputField, "password"); + cy.wait(2000); + cy.clearAndType(onboardingSelectors.loginPasswordInput, "password"); // cy.intercept('GET', '/api/organizations').as('org') cy.get(commonSelectors.signUpButton).click(); cy.wait(2000); @@ -372,7 +387,7 @@ export const inviteUserWithUserRole = ( cy.wait(1000); fetchAndVisitInviteLink(email); - cy.clearAndType(commonSelectors.passwordInputField, "password"); + cy.clearAndType(onboardingSelectors.loginPasswordInput, "password"); cy.get(commonSelectors.signUpButton).click(); cy.wait(2000); cy.get(commonSelectors.acceptInviteButton).click(); diff --git a/cypress-tests/cypress/support/utils/onboarding.js b/cypress-tests/cypress/support/utils/onboarding.js index ca04e906e9..235b750fb0 100644 --- a/cypress-tests/cypress/support/utils/onboarding.js +++ b/cypress-tests/cypress/support/utils/onboarding.js @@ -8,11 +8,12 @@ import { import { navigateToManageUsers, logout } from "Support/utils/common"; import { ssoSelector } from "Selectors/manageSSO"; import { ssoText } from "Texts/manageSSO"; +import { onboardingSelectors } from "Selectors/onboarding"; + export const verifyConfirmEmailPage = (email) => { cy.get(commonSelectors.pageLogo).should("be.visible"); - cy.get(commonSelectors.emailImage).should("be.visible"); - cy.get(commonSelectors.onboardingPageHeader).verifyVisibleElement( + cy.get('[data-cy="check-your-mail-header"]').verifyVisibleElement( "have.text", commonText.emailPageHeader ); @@ -31,32 +32,17 @@ export const verifyConfirmEmailPage = (email) => { "have.text", commonText.onboardingSeperatorText ); + cy.get(commonSelectors.resendEmailButton).should("be.visible"); - cy.get(commonSelectors.editEmailButton).verifyVisibleElement( + cy.get('[data-cy="back-to-signup"]').verifyVisibleElement( "have.text", - commonText.editEmailButton + "Back to sign up" ); }; -export const verifyConfirmPageElements = () => { - cy.get(commonSelectors.pageLogo).should("be.visible"); - cy.get(commonSelectors.emailImage).should("be.visible"); - cy.get(commonSelectors.onboardingPageHeader).verifyVisibleElement( - "have.text", - commonText.emailVerifiedText - ); - - cy.get(commonSelectors.onboardingPageDescription).verifyVisibleElement( - "have.text", - commonText.continueToSetUp - ); - cy.get(commonSelectors.setUpToolJetButton).verifyVisibleElement( - "have.text", - commonText.setUpToolJetButton - ); -}; export const verifyOnboardingQuestions = (fullName, workspaceName) => { + cy.wait(5000); cy.get(commonSelectors.pageLogo).should("be.visible"); cy.get(commonSelectors.userAccountNameAvatar).should("be.visible"); cy.get(commonSelectors.createAccountCheckMark).should("be.visible"); @@ -125,7 +111,7 @@ export const verifyOnboardingQuestions = (fullName, workspaceName) => { export const verifyInvalidInvitationLink = () => { cy.get(commonSelectors.pageLogo).should("be.visible"); - cy.get(commonSelectors.emailImage).should("be.visible"); + // cy.get(commonSelectors.emailImage).should("be.visible"); cy.get(commonSelectors.onboardingPageHeader).verifyVisibleElement( "have.text", @@ -136,20 +122,24 @@ export const verifyInvalidInvitationLink = () => { commonText.inalidInvitationLinkDescription ); - cy.get(commonSelectors.backtoSignUpButton).verifyVisibleElement( - "have.text", - commonText.backtoSignUpButton - ); + // cy.get(commonSelectors.backtoSignUpButton).verifyVisibleElement( + // "have.text", + // commonText.backtoSignUpButton + // ); }; export const userSignUp = (fullName, email, workspaceName) => { let invitationLink; + cy.intercept("GET", "/api/organizations/public-configs").as("publicConfig"); cy.visit("/"); - cy.wait(1000); + cy.wait("@publicConfig"); cy.get(commonSelectors.createAnAccountLink).realClick(); - cy.clearAndType(commonSelectors.nameInputField, fullName); - cy.clearAndType(commonSelectors.emailInputField, email); - cy.clearAndType(commonSelectors.passwordInputField, commonText.password); + cy.get(onboardingSelectors.nameInput).should('not.be.disabled'); + cy.wait(3000) + cy.get(onboardingSelectors.nameInput).clear(); + cy.get(onboardingSelectors.nameInput).type(fullName); + cy.clearAndType(onboardingSelectors.loginEmailInput, email); + cy.clearAndType(onboardingSelectors.loginPasswordInput, commonText.password); cy.get(commonSelectors.signUpButton).click(); cy.wait(500); @@ -159,10 +149,9 @@ export const userSignUp = (fullName, email, workspaceName) => { }).then((resp) => { invitationLink = `/invitations/${resp.rows[0].invitation_token}`; cy.visit(invitationLink); - cy.get(commonSelectors.setUpToolJetButton).click(); cy.wait(4000); - verifyOnboardingQuestions(fullName, workspaceName); - updateWorkspaceName(email, workspaceName); + cy.clearAndType('[data-cy="onboarding-workspace-name-input"]', workspaceName) + cy.get('[data-cy="onboarding-submit-button"]').click(); }); }; @@ -211,10 +200,10 @@ export const inviteUser = (firstName, email) => { cy.userInviteApi(firstName, email); fetchAndVisitInviteLink(email); cy.wait(1000); - cy.get(commonSelectors.passwordInputField).should("be.visible"); - cy.clearAndType(commonSelectors.passwordInputField, "password"); + cy.get(onboardingSelectors.loginPasswordInput).should("be.visible"); + cy.clearAndType(onboardingSelectors.loginPasswordInput, "password"); // cy.intercept("GET", "/api/organizations").as("org"); - cy.get(commonSelectors.signUpButton).click(); + cy.get(commonSelectors.continueButton).click(); cy.wait(2000); cy.get(commonSelectors.acceptInviteButton).click(); }; @@ -222,7 +211,7 @@ export const inviteUser = (firstName, email) => { export const addNewUser = (firstName, email) => { navigateToManageUsers(); inviteUser(firstName, email); - updateWorkspaceName(email); + // updateWorkspaceName(email); }; export const updateWorkspaceName = (email, workspaceName = email) => { @@ -300,19 +289,32 @@ export const visitWorkspaceInvitation = (email, workspaceName) => { export const SignUpPageElements = () => { cy.get(commonSelectors.pageLogo).should("be.visible"); - cy.get(commonSelectors.SignUpSectionHeader).verifyVisibleElement( + cy.get(commonSelectors.signUpSectionHeader).verifyVisibleElement( "have.text", "Sign up" ); cy.get(commonSelectors.signUpButton).verifyVisibleElement( "have.text", - commonText.getStartedButton + "Sign up" ); - cy.get(commonSelectors.signInRedirectText).should(($el) => { - expect($el.contents().first().text().trim()).to.eq( - commonText.signInRedirectText - ); - }); + + // cy.get('[data-cy="signup-info"]').should(($el) => { + // expect($el.contents().first().text().trim()).to.eq( + // commonText.signInRedirectText + // ); + // }); + + cy.get(onboardingSelectors.signupNameLabel).verifyVisibleElement("have.text", "Name *"); + cy.get(onboardingSelectors.nameInput).should('be.visible'); + cy.get(onboardingSelectors.emailLabel).verifyVisibleElement( + "have.text", + "Email *" + ); + // cy.get(commonSelectors.loginPasswordLabel).verifyVisibleElement("have.text", "Password *"); + + cy.get(onboardingSelectors.loginPasswordInput).should("be.visible"); + + cy.get(commonSelectors.signInRedirectLink).verifyVisibleElement( "have.text", commonText.signInRedirectLink @@ -357,5 +359,6 @@ export const signUpLink = (email) => { }).then((resp) => { invitationLink = `/invitations/${resp.rows[0].invitation_token}`; cy.visit(invitationLink); + cy.wait(3000); }); } \ No newline at end of file diff --git a/cypress-tests/cypress/support/utils/selfHostSignUp.js b/cypress-tests/cypress/support/utils/selfHostSignUp.js index c0626fb99e..93df52045c 100644 --- a/cypress-tests/cypress/support/utils/selfHostSignUp.js +++ b/cypress-tests/cypress/support/utils/selfHostSignUp.js @@ -3,27 +3,27 @@ import { commonText } from "Texts/common"; export const selfHostCommonElements = () => { cy.get(commonSelectors.pageLogo).should("be.visible"); - cy.get(commonSelectors.setUpadminCheckPoint).verifyVisibleElement( - "have.text", - commonText.setUpadminCheckPoint - ); + // cy.get(commonSelectors.setUpadminCheckPoint).verifyVisibleElement( + // "have.text", + // commonText.setUpadminCheckPoint + // ); cy.get(commonSelectors.setUpworkspaceCheckPoint).verifyVisibleElement( "have.text", commonText.setUpworkspaceCheckPoint ); - cy.get(commonSelectors.companyProfileCheckPoint).verifyVisibleElement( - "have.text", - commonText.companyProfileCheckPoint - ); - cy.get(commonSelectors.onboardingPageSubHeader).verifyVisibleElement( - "have.text", - commonText.onboardingPageSubHeader - ); - cy.get(commonSelectors.continueButton).verifyVisibleElement( + // cy.get(commonSelectors.companyProfileCheckPoint).verifyVisibleElement( + // "have.text", + // commonText.companyProfileCheckPoint + // ); + // cy.get(commonSelectors.onboardingPageSubHeader).verifyVisibleElement( + // "have.text", + // commonText.onboardingPageSubHeader + // ); + cy.get(commonSelectors.OnbordingContinue).verifyVisibleElement( "have.text", commonText.continueButton ); - cy.get(commonSelectors.continueButton).should("be.disabled"); + // cy.get(commonSelectors.OnbordingContinue).should("be.disabled"); }; export const commonElementsWorkspaceSetup = () => { diff --git a/cypress-tests/cypress/support/utils/workspaceConstants.js b/cypress-tests/cypress/support/utils/workspaceConstants.js index 3634c91908..03a9bc53f5 100644 --- a/cypress-tests/cypress/support/utils/workspaceConstants.js +++ b/cypress-tests/cypress/support/utils/workspaceConstants.js @@ -14,10 +14,29 @@ export const contantsNameValidation = (value, error) => { cy.get(workspaceConstantsSelectors.addConstantButton).should("be.disabled"); }; -export const AddNewconstants = (name, value) => { +export const AddNewconstants = (name, value, type = "global") => { cy.get(workspaceConstantsSelectors.addNewConstantButton).click(); cy.clearAndType(commonSelectors.nameInputField, name); cy.get(commonSelectors.valueInputField).click(); cy.clearAndType(commonSelectors.valueInputField, value); + cy.get(workspaceConstantsSelectors.constantsType(type)).check(); cy.get(workspaceConstantsSelectors.addConstantButton).click(); }; + +export const existingNameValidation = ( + constName, + constValue, + type = "Global" +) => { + cy.clearAndType(commonSelectors.nameInputField, constName); + cy.get(workspaceConstantsSelectors.constantsType(type)).check(); + cy.get(commonSelectors.valueInputField).click(); + cy.clearAndType(commonSelectors.valueInputField, constValue); + cy.get(workspaceConstantsSelectors.addConstantButton).click(); + cy.get(commonSelectors.toastMessage) + .as("toast") + .should( + "contain.text", + workspaceConstantsText.constantsExisitToast("Global") + ); +}; diff --git a/cypress-tests/package-lock.json b/cypress-tests/package-lock.json index 20353756a4..bf5250fc16 100644 --- a/cypress-tests/package-lock.json +++ b/cypress-tests/package-lock.json @@ -18,7 +18,7 @@ "@cypress/code-coverage": "^3.12.12", "@cypress/webpack-preprocessor": "^5.12.0", "@faker-js/faker": "^7.3.0", - "cypress": "^12.5.1" + "cypress": "^13.16.0" } }, "node_modules/@ampproject/remapping": { @@ -35,12 +35,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -48,30 +49,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", - "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", + "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", - "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helpers": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -87,56 +88,57 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", "dev": true, "dependencies": { - "@babel/types": "^7.24.7", + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, "peer": true, "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", - "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz", + "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==", "dev": true, "peer": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", - "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -145,20 +147,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", - "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", "semver": "^6.3.1" }, "engines": { @@ -169,14 +169,14 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", - "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz", + "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "regexpu-core": "^5.3.1", + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.1.1", "semver": "^6.3.1" }, "engines": { @@ -187,9 +187,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", "dev": true, "peer": true, "dependencies": { @@ -203,81 +203,42 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", - "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dev": true, "peer": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -287,22 +248,22 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "dev": true, "peer": true, "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", - "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", "dev": true, "peer": true, "engines": { @@ -310,15 +271,15 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", - "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-wrap-function": "^7.24.7" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -328,15 +289,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", - "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -346,120 +307,96 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", + "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", "dev": true, + "peer": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dev": true, "peer": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", - "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-function-name": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", - "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "dev": true, + "dependencies": { + "@babel/types": "^7.26.0" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -468,14 +405,30 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", - "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -485,13 +438,13 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", - "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -501,15 +454,15 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", - "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -519,14 +472,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", - "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -548,82 +501,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", - "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -633,149 +518,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", - "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -802,13 +551,13 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", - "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -818,16 +567,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", - "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -837,15 +585,15 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", - "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -855,13 +603,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", - "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", + "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -871,13 +619,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", - "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -887,14 +635,14 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", - "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -904,15 +652,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", - "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -922,19 +669,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", - "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", "globals": "^11.1.0" }, "engines": { @@ -945,14 +690,14 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", - "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/template": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -962,13 +707,13 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", - "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -978,14 +723,14 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", - "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -995,13 +740,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", - "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1010,15 +755,31 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", - "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1028,14 +789,14 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", - "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz", + "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1045,14 +806,13 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", - "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1062,14 +822,14 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", - "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1079,15 +839,15 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", - "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1097,14 +857,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", - "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1114,13 +873,13 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", - "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1130,14 +889,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", - "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1147,13 +905,13 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", - "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1163,14 +921,14 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", - "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1180,15 +938,15 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", - "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", + "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-simple-access": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1198,16 +956,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", - "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1217,14 +975,14 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", - "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1234,14 +992,14 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", - "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1251,13 +1009,13 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", - "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1267,14 +1025,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", - "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", + "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1284,14 +1041,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", - "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1301,16 +1057,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", - "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.7" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1320,14 +1075,14 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", - "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1337,14 +1092,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", - "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1354,15 +1108,14 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", - "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1372,13 +1125,13 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", - "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1388,14 +1141,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", - "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1405,16 +1158,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", - "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1424,13 +1176,13 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", - "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1440,13 +1192,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", - "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.9", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1456,14 +1208,31 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", - "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1473,13 +1242,13 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", - "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1489,14 +1258,14 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", - "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1506,13 +1275,13 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", - "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1522,13 +1291,13 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", - "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1538,13 +1307,13 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", - "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1554,13 +1323,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", - "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1570,14 +1339,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", - "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1587,14 +1356,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", - "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1604,14 +1373,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", - "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1621,92 +1390,80 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", - "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", "dev": true, "peer": true, "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", + "@babel/compat-data": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.7", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.24.7", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.24.7", - "@babel/plugin-transform-class-properties": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.24.7", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.7", - "@babel/plugin-transform-dotall-regex": "^7.24.7", - "@babel/plugin-transform-duplicate-keys": "^7.24.7", - "@babel/plugin-transform-dynamic-import": "^7.24.7", - "@babel/plugin-transform-exponentiation-operator": "^7.24.7", - "@babel/plugin-transform-export-namespace-from": "^7.24.7", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.24.7", - "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.24.7", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-member-expression-literals": "^7.24.7", - "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.7", - "@babel/plugin-transform-modules-systemjs": "^7.24.7", - "@babel/plugin-transform-modules-umd": "^7.24.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-new-target": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-object-super": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-property-literals": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-reserved-words": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.7", - "@babel/plugin-transform-unicode-escapes": "^7.24.7", - "@babel/plugin-transform-unicode-property-regex": "^7.24.7", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", + "core-js-compat": "^3.38.1", "semver": "^6.3.1" }, "engines": { @@ -1731,17 +1488,10 @@ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true, - "peer": true - }, "node_modules/@babel/runtime": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", - "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "dev": true, "peer": true, "dependencies": { @@ -1752,33 +1502,30 @@ } }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1787,14 +1534,13 @@ } }, "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1810,15 +1556,15 @@ } }, "node_modules/@cypress/code-coverage": { - "version": "3.12.39", - "resolved": "https://registry.npmjs.org/@cypress/code-coverage/-/code-coverage-3.12.39.tgz", - "integrity": "sha512-ja7I/GRmkSAW9e3O7pideWcNUEHao0WT6sRyXQEURoxkJUASJssJ7Kb/bd3eMYmkUCiD5CRFqWR5BGF4mWVaUw==", + "version": "3.13.7", + "resolved": "https://registry.npmjs.org/@cypress/code-coverage/-/code-coverage-3.13.7.tgz", + "integrity": "sha512-E8oT0D1cA363cot4q7wonaDATAPybj7/DJ3PAE+BCmEBy41aYWn5DaEYWLRYe8eg+h4IlNPkZG1QMVo33pMcfw==", "dev": true, "dependencies": { "@cypress/webpack-preprocessor": "^6.0.0", "chalk": "4.1.2", - "dayjs": "1.11.10", - "debug": "4.3.4", + "dayjs": "1.11.13", + "debug": "4.3.7", "execa": "4.1.0", "globby": "11.1.0", "istanbul-lib-coverage": "^3.0.0", @@ -1850,97 +1596,10 @@ "webpack": "^4 || ^5" } }, - "node_modules/@cypress/code-coverage/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@cypress/code-coverage/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@cypress/code-coverage/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@cypress/code-coverage/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@cypress/code-coverage/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@cypress/code-coverage/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@cypress/code-coverage/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@cypress/request": { - "version": "2.88.12", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.12.tgz", - "integrity": "sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.6.tgz", + "integrity": "sha512-fi0eVdCOtKu5Ed6+E8mYxUF6ZTFJDZvHogCBelM0xVXmrDEkyM22gRArQzq1YcHPm1V47Vf/iAD+WgVdUlJCGg==", "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -1948,16 +1607,16 @@ "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "http-signature": "~1.3.6", + "form-data": "~4.0.0", + "http-signature": "~1.4.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "performance-now": "^2.1.0", - "qs": "~6.10.3", + "qs": "6.13.0", "safe-buffer": "^5.1.2", - "tough-cookie": "^4.1.3", + "tough-cookie": "^5.0.0", "tunnel-agent": "^0.6.0", "uuid": "^8.3.2" }, @@ -2100,9 +1759,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { @@ -2151,9 +1810,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, "peer": true, "dependencies": { @@ -2173,9 +1832,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true, "peer": true }, @@ -2187,9 +1846,10 @@ "peer": true }, "node_modules/@types/node": { - "version": "16.18.101", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.101.tgz", - "integrity": "sha512-AAsx9Rgz2IzG8KJ6tXd6ndNkVcu+GYB6U/SnFAaokSPNx2N7dcIIfnighYUNumvj6YS2q39Dejz5tT0NCV7CWA==" + "version": "16.18.119", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.119.tgz", + "integrity": "sha512-ia7V9a2FnhUFfetng4/sRPBMTwHZUkPFY736rb1cg9AgG7MZdR97q7/nLR9om+sq5f1la9C857E0l/nrI0RiFQ==", + "devOptional": true }, "node_modules/@types/sinonjs__fake-timers": { "version": "8.1.1", @@ -2197,9 +1857,9 @@ "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==" }, "node_modules/@types/sizzle": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz", - "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==" + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.9.tgz", + "integrity": "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==" }, "node_modules/@types/yauzl": { "version": "2.10.3", @@ -2211,73 +1871,73 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "peer": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true, "peer": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true, "peer": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true, "peer": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "peer": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true, "peer": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "peer": true, "dependencies": { @@ -2285,9 +1945,9 @@ } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, "peer": true, "dependencies": { @@ -2295,79 +1955,79 @@ } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true, "peer": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -2386,9 +2046,9 @@ "peer": true }, "node_modules/acorn": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", - "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, "peer": true, "bin": { @@ -2398,16 +2058,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "dev": true, - "peer": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -2421,16 +2071,16 @@ } }, "node_modules/ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -2499,15 +2149,17 @@ } }, "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/append-transform": { @@ -2587,9 +2239,9 @@ } }, "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" }, "node_modules/asynckit": { "version": "0.4.0", @@ -2613,14 +2265,14 @@ } }, "node_modules/aws4": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.0.tgz", - "integrity": "sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==" }, "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dev": true, "peer": true, "dependencies": { @@ -2636,14 +2288,14 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", "dev": true, "peer": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", + "@babel/helper-define-polyfill-provider": "^0.6.3", "semver": "^6.3.1" }, "peerDependencies": { @@ -2651,27 +2303,27 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" + "@babel/helper-define-polyfill-provider": "^0.6.3" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -2744,9 +2396,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "dev": true, "funding": [ { @@ -2763,10 +2415,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -2864,9 +2516,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001638", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001638.tgz", - "integrity": "sha512-5SuJUJ7cZnhPpeLHaH0c/HPAnAHZvS6ElWyHK9GSIbVOQABLzowiI2pjmpvZ1WEbkyz46iFd4UXlOHR5SqgfMQ==", + "version": "1.0.30001684", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz", + "integrity": "sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==", "dev": true, "funding": [ { @@ -2889,17 +2541,18 @@ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/check-more-types": { @@ -2921,9 +2574,9 @@ } }, "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz", + "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==", "funding": [ { "type": "github", @@ -2993,39 +2646,6 @@ "wrap-ansi": "^6.2.0" } }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cliui/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -3041,19 +2661,20 @@ } }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/colorette": { "version": "2.0.20", @@ -3113,13 +2734,13 @@ "dev": true }, "node_modules/core-js-compat": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", - "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", + "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", "dev": true, "peer": true, "dependencies": { - "browserslist": "^4.23.0" + "browserslist": "^4.24.2" }, "funding": { "type": "opencollective", @@ -3132,9 +2753,9 @@ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3145,23 +2766,23 @@ } }, "node_modules/cypress": { - "version": "12.17.4", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.17.4.tgz", - "integrity": "sha512-gAN8Pmns9MA5eCDFSDJXWKUpaL3IDd89N9TtIupjYnzLSmlpVr+ZR+vb4U/qaMp+lB6tBvAmt7504c3Z4RU5KQ==", + "version": "13.16.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.16.0.tgz", + "integrity": "sha512-g6XcwqnvzXrqiBQR/5gN+QsyRmKRhls1y5E42fyOvsmU7JuY+wM6uHJWj4ZPttjabzbnRvxcik2WemR8+xT6FA==", "hasInstallScript": true, "dependencies": { - "@cypress/request": "2.88.12", + "@cypress/request": "^3.0.6", "@cypress/xvfb": "^1.2.4", - "@types/node": "^16.18.39", "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", "arch": "^2.2.0", "blob-util": "^2.0.2", "bluebird": "^3.7.2", - "buffer": "^5.6.0", + "buffer": "^5.7.1", "cachedir": "^2.3.0", "chalk": "^4.1.0", "check-more-types": "^2.24.0", + "ci-info": "^4.0.0", "cli-cursor": "^3.1.0", "cli-table3": "~0.6.1", "commander": "^6.2.1", @@ -3176,7 +2797,6 @@ "figures": "^3.2.0", "fs-extra": "^9.1.0", "getos": "^3.2.1", - "is-ci": "^3.0.0", "is-installed-globally": "~0.4.0", "lazy-ass": "^1.6.0", "listr2": "^3.8.3", @@ -3190,7 +2810,8 @@ "request-progress": "^3.0.0", "semver": "^7.5.3", "supports-color": "^8.1.1", - "tmp": "~0.2.1", + "tmp": "~0.2.3", + "tree-kill": "1.2.2", "untildify": "^4.0.0", "yauzl": "^2.10.0" }, @@ -3198,7 +2819,7 @@ "cypress": "bin/cypress" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=18.0.0" + "node": "^16.0.0 || ^18.0.0 || >=20.0.0" } }, "node_modules/cypress-real-events": { @@ -3209,79 +2830,15 @@ "cypress": "^4.x || ^5.x || ^6.x || ^7.x || ^8.x || ^9.x || ^10.x || ^11.x || ^12.x || ^13.x" } }, - "node_modules/cypress/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/cypress/node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, - "node_modules/cypress/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/cypress/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cypress/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cypress/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/cypress/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/cypress/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, @@ -3315,16 +2872,16 @@ } }, "node_modules/dayjs": { - "version": "1.11.10", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" }, "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3405,9 +2962,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.814", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.814.tgz", - "integrity": "sha512-GVulpHjFu1Y9ZvikvbArHmAhZXtm3wHlpjTMcXNGKl4IQ4jMQjlnz8yMQYYqdLHKi/jEL2+CBC2akWVCoIGUdw==", + "version": "1.5.64", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.64.tgz", + "integrity": "sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ==", "dev": true }, "node_modules/emoji-regex": { @@ -3424,9 +2981,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "peer": true, "dependencies": { @@ -3482,9 +3039,9 @@ "dev": true }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "engines": { "node": ">=6" @@ -3678,6 +3235,13 @@ "dev": true, "peer": true }, + "node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true, + "peer": true + }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -3773,16 +3337,16 @@ } }, "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "dependencies": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" }, "engines": { - "node": ">= 0.12" + "node": ">= 6" } }, "node_modules/fromentries": { @@ -3992,11 +3556,14 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.1.0.tgz", + "integrity": "sha512-FQoVQnqcdk4hVM4JN1eromaun4iuS34oStkdlLENLdpULsuQcTyXj8w7ayhuUfPwEYZ1ZOooOTT6fdA9Vmx/RA==", "dependencies": { - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4008,12 +3575,11 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-property-descriptors": { @@ -4028,9 +3594,12 @@ } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.1.0.tgz", + "integrity": "sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q==", + "dependencies": { + "call-bind": "^1.0.7" + }, "engines": { "node": ">= 0.4" }, @@ -4039,9 +3608,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -4092,13 +3661,13 @@ "dev": true }, "node_modules/http-signature": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", - "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz", + "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^2.0.2", - "sshpk": "^1.14.1" + "sshpk": "^1.18.0" }, "engines": { "node": ">=0.10" @@ -4132,9 +3701,9 @@ ] }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "engines": { "node": ">= 4" @@ -4182,21 +3751,10 @@ "node": ">=10" } }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, "node_modules/is-core-module": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", - "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, "peer": true, "dependencies": { @@ -4395,15 +3953,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-lib-report/node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -4420,9 +3969,9 @@ } }, "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -4431,18 +3980,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -4485,16 +4022,6 @@ "node": ">= 10.13.0" } }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -4535,15 +4062,15 @@ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-parse-even-better-errors": { @@ -4701,70 +4228,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/log-update": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", @@ -4782,36 +4245,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-update/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/log-update/node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -4880,9 +4313,9 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { "braces": "^3.0.3", @@ -4948,9 +4381,9 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/neo-async": { "version": "2.6.2", @@ -4977,9 +4410,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "node_modules/node-xlsx": { @@ -5102,9 +4535,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "engines": { "node": ">= 0.4" }, @@ -5277,13 +4710,13 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/pg": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", - "integrity": "sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==", + "version": "8.13.1", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz", + "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==", "dependencies": { - "pg-connection-string": "^2.6.4", - "pg-pool": "^3.6.2", - "pg-protocol": "^1.6.1", + "pg-connection-string": "^2.7.0", + "pg-pool": "^3.7.0", + "pg-protocol": "^1.7.0", "pg-types": "^2.1.0", "pgpass": "1.x" }, @@ -5309,9 +4742,9 @@ "optional": true }, "node_modules/pg-connection-string": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", - "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", + "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==" }, "node_modules/pg-int8": { "version": "1.0.1", @@ -5322,17 +4755,17 @@ } }, "node_modules/pg-pool": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", - "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz", + "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-protocol": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", - "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==" + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz", + "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==" }, "node_modules/pg-types": { "version": "2.2.0", @@ -5358,9 +4791,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "node_modules/picomatch": { @@ -5529,9 +4962,9 @@ } }, "node_modules/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", + "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", "dev": true, "dependencies": { "fromentries": "^1.2.0" @@ -5545,15 +4978,10 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==" }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -5563,16 +4991,18 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "peer": true, "engines": { "node": ">=6" } }, "node_modules/qs": { - "version": "6.10.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", - "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -5581,11 +5011,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -5624,9 +5049,9 @@ "peer": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "dev": true, "peer": true, "dependencies": { @@ -5654,16 +5079,16 @@ } }, "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "dev": true, "peer": true, "dependencies": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, @@ -5671,29 +5096,26 @@ "node": ">=4" } }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "peer": true + }, "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "dev": true, "peer": true, "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "peer": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, "node_modules/release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -5739,11 +5161,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -5993,36 +5410,6 @@ "node": ">=8" } }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -6140,15 +5527,14 @@ } }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -6175,9 +5561,9 @@ } }, "node_modules/terser": { - "version": "5.31.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", - "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", + "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", "dev": true, "peer": true, "dependencies": { @@ -6315,6 +5701,36 @@ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, + "node_modules/tldts": { +<<<<<<< Updated upstream + "version": "6.1.64", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.64.tgz", + "integrity": "sha512-ph4AE5BXWIOsSy9stpoeo7bYe/Cy7VfpciIH4RhVZUPItCJmhqWCN0EVzxd8BOHiyNb42vuJc6NWTjJkg91Tuw==", + "dependencies": { + "tldts-core": "^6.1.64" +======= + "version": "6.1.65", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.65.tgz", + "integrity": "sha512-xU9gLTfAGsADQ2PcWee6Hg8RFAv0DnjMGVJmDnUmI8a9+nYmapMQix4afwrdaCtT+AqP4MaxEzu7cCrYmBPbzQ==", + "dependencies": { + "tldts-core": "^6.1.65" +>>>>>>> Stashed changes + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { +<<<<<<< Updated upstream + "version": "6.1.64", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.64.tgz", + "integrity": "sha512-uqnl8vGV16KsyflHOzqrYjjArjfXaU6rMPXYy2/ZWoRKCkXtghgB4VwTDXUG+t0OTGeSewNAG31/x1gCTfLt+Q==" +======= + "version": "6.1.65", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.65.tgz", + "integrity": "sha512-Uq5t0N0Oj4nQSbU8wFN1YYENvMthvwU13MQrMJRspYCGLSAZjAfoBOJki5IQpnBM/WFskxxC/gIOTwaedmHaSg==" +>>>>>>> Stashed changes + }, "node_modules/tmp": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", @@ -6323,15 +5739,6 @@ "node": ">=14.14" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6345,31 +5752,28 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", + "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "tldts": "^6.1.32" }, "engines": { - "node": ">=6" + "node": ">=16" } }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "engines": { - "node": ">= 4.0.0" + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "bin": { + "tree-kill": "cli.js" } }, "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/tunnel-agent": { "version": "0.6.0", @@ -6408,9 +5812,9 @@ } }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, "peer": true, "engines": { @@ -6432,9 +5836,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "dev": true, "peer": true, "engines": { @@ -6468,9 +5872,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -6487,8 +5891,8 @@ } ], "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -6507,15 +5911,6 @@ "punycode": "^2.1.0" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -6538,9 +5933,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "peer": true, "dependencies": { @@ -6552,22 +5947,21 @@ } }, "node_modules/webpack": { - "version": "5.92.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz", - "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==", + "version": "5.96.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", + "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", "dev": true, "peer": true, "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", "@webassemblyjs/ast": "^1.12.1", "@webassemblyjs/wasm-edit": "^1.12.1", "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -6698,36 +6092,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -6810,9 +6174,9 @@ } }, "node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, "peer": true, "engines": { diff --git a/cypress-tests/package.json b/cypress-tests/package.json index 1bfb253c0f..57f609edef 100644 --- a/cypress-tests/package.json +++ b/cypress-tests/package.json @@ -10,7 +10,7 @@ "@cypress/code-coverage": "^3.12.12", "@cypress/webpack-preprocessor": "^5.12.0", "@faker-js/faker": "^7.3.0", - "cypress": "^12.5.1" + "cypress": "^13.16.0" }, "dependencies": { "cypress-real-events": "^1.7.6", diff --git a/docs/docs/widgets/bounded-box.md b/docs/docs/widgets/bounded-box.md index 0b86a401ef..0650d92c31 100644 --- a/docs/docs/widgets/bounded-box.md +++ b/docs/docs/widgets/bounded-box.md @@ -13,7 +13,7 @@ A **Bounded Box** is an infinitely customizable image annotation component that -
+
## Properties @@ -27,10 +27,10 @@ A **Bounded Box** is an infinitely customizable image annotation component that |
**Property**
|
**Description**
|
**Expected Value**
| | :----------- | :----------- | :----------------- | -| Image URL | The URL or image data to show it on the component. | Get the image URL dynamically from database: `{{queries.queryname.data[0].url}}` or use [image's base64 data](/docs/how-to/loading-image-pdf-from-db/) | -| Default value | The data that will load the default bounded boxes over the image when the app is loaded. | Array of objects. Check the [Default value](#default-value) data properties | -| Selector | The bounded box support selection using rectangle or point. | Click **Fx** to set the value `RECTANGLE` or `POINT` | -| List of labels | The list of label that will be displayed in the dropdown while selection in the bounded-box. | Labels in array format: `{{['Tree', 'Car', 'Stree light']}}` | +| Image URL | The URL or image data to show it on the component. | Get the image URL dynamically from database: `{{queries.queryname.data[0].url}}` or use [image's base64 data](/docs/how-to/loading-image-pdf-from-db/).| +| Default value | The data that will load the default bounded boxes over the image when the app is loaded. | Array of objects. Check the [Default value](#default-value) data properties. | +| Selector | The bounded box support selection using rectangle or point. | Click **fx** to set the value `RECTANGLE` or `POINT`. | +| List of labels | The list of label that will be displayed in the dropdown while selection in the bounded-box. | Labels in array format: `{{['Tree', 'Car', 'Stree light']}}`. | #### Default value @@ -38,12 +38,12 @@ Provide the data that will load the default bounding boxes over the image when t |
**Property**
|
**Description**
|
**Expected Value**
| | :-------- | :------ | :-------- | -| type | Sets the type of the Bounded Box. | `RECTANGLE` or `POINT` | -| width | Sets the width of the Bounded Box in pixels. | Numeric value. If the `type` value is `POINT`, set it to `0` | -| height | Sets the height of the Bounded Box in pixels. | Numeric value. If the `type` value is `POINT`, set it to `0` | -| x | Sets the x-coordinate(horizontal) position of the Bounded Box in the image. | Numerical value ex: `41` | -| y | Sets the y-coordinate(vertical) position of the Bounded Box in the image. | Numerical value ex: `22` | -| text | Sets the text value of the Bounded Box. | It should be one of the labels provided in the **[List of labels](#properties)** property | +| type | Sets the type of the Bounded Box. | `RECTANGLE` or `POINT`. | +| width | Sets the width of the Bounded Box in pixels. | Numeric value. If the `type` value is `POINT`, set it to `0`. | +| height | Sets the height of the Bounded Box in pixels. | Numeric value. If the `type` value is `POINT`, set it to `0`. | +| x | Sets the x-coordinate(horizontal) position of the Bounded Box in the image. | Numerical value ex: `41`. | +| y | Sets the y-coordinate(vertical) position of the Bounded Box in the image. | Numerical value ex: `22`. | +| text | Sets the text value of the Bounded Box. | It should be one of the labels provided in the **[List of labels](#properties)** property. | **Example of default values:** @@ -70,7 +70,7 @@ Provide the data that will load the default bounding boxes over the image when t
-
+
## Events @@ -88,7 +88,7 @@ Check [Action Reference](/docs/category/actions-reference) docs to get the detai
-
+
## Component Specific Actions (CSA) @@ -96,7 +96,7 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate
-
+
## Exposed Variables @@ -111,11 +111,11 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate | annotations.`text` | label selected for the annotation. | | annotations.`id` | unique ID of the annotation (system generated). | -The values can be accessed dynamically using `{{components.boundedbox1.annotations[0].text}}` or `{{components.boundedbox1.annotations[1].width}}` +The values can be accessed dynamically using `{{components.boundedbox1.annotations[0].text}}` or `{{components.boundedbox1.annotations[1].width}}`.
-
+
## General @@ -131,25 +131,27 @@ A Tooltip is often used to specify the extra information when the user hovers th
-
+
-## Layout +## Devices -|
Layout
|
Description
| -| :----------- | :----------- | -| Desktop | Toggle to show or hide the component in the desktop view. Dynamically configure the value by clicking on `Fx` and entering a logical expression that results in either true or false. Alternatively, the values can be set to **`{{true}}`** or **`{{false}}`**. | -| Mobile | Toggle to show or hide the component in the desktop view. Dynamically configure the value by clicking on `Fx` and entering a logical expression that results in either true or false. Alternatively, the values can be set to **`{{true}}`** or **`{{false}}`**. | +|
Property
|
Description
|
Expected Value
| +| :----------- | :----------- | :----------------- | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
-
+--- + +
## Styles |
Style
|
Description
|
Expected Value
| | :----------- | :----------- | :----------- | -| Visibility | Toggle on or off to control the visibility of the component when the app is loaded. | **`{{true}}`** or **`{{false}}`**, By default, it's set to `{{true}}` | -| Disable | Toggle on to disable the component. | **`{{true}}`** or **`{{false}}`**, By default, it's set to `{{false}}` | -| Box shadow | Sets the add shadow effects around a component's frame. You can specify the horizontal and vertical offsets(through X and Y sliders), blur and spread radius, and color of the shadow. | Values that represent x,y, blur, spread and color. Ex: `9px 11px 5px 5px #00000040` | +| Visibility | Toggle on or off to control the visibility of the component when the app is loaded. | `{{true}}` or `{{false}}`, By default, it's set to `{{true}}`. | +| Disable | Toggle on to disable the component. | `{{true}}` or `{{false}}`, By default, it's set to `{{false}}`. | +| Box shadow | Sets the add shadow effects around a component's frame. You can specify the horizontal and vertical offsets (through X and Y sliders), blur and spread radius, and color of the shadow. | Values that represent x, y, blur, spread and color. Ex: `9px 11px 5px 5px #00000040`. |
diff --git a/docs/docs/widgets/button.md b/docs/docs/widgets/button.md index c49ef58cbc..f078f3f891 100644 --- a/docs/docs/widgets/button.md +++ b/docs/docs/widgets/button.md @@ -2,11 +2,10 @@ id: button title: Button --- -# Button **Button** component can be used to trigger an action. It can be used to submit a form, navigate to another page, or trigger a query. -
+
## Properties @@ -18,8 +17,8 @@ title: Button |
Event
|
Description
| | :----------- | :----------- | -| On click | The On click event is triggered when the button is clicked. | -| On hover | The On hover event is triggered when the mouse cursor is moved over the button. | +| On click | Triggers whenever the user clicks the button. | +| On hover | Triggers whenever the user moves the mouse cursor over the button. | :::info Check [Action Reference](/docs/category/actions-reference) docs to get detailed information about all the **Actions**. @@ -27,12 +26,12 @@ Check [Action Reference](/docs/category/actions-reference) docs to get detailed |
Property
|
Description
|
Expected Value
| | :----------- | :----------- | :----------- | -| Button text | Used to set the label of the button. | Any **String** value: `Send Message`, `Delete`, or `{{queries.xyz.data.action}}` | -| Loading state | The loading state is used to show a spinner as the button content. Loading state is commonly used with isLoading property of the queries to show a loading status while a query is being run. | Toggle the switch **On** or click on **fx** to programmatically set the value to `{{true}}` or `{{false}}` | +| Button text | Used to set the label of the button. | Any **String** value: `Send Message`, `Delete`, or `{{queries.xyz.data.action}}`. | +| Loading state | The loading state is used to show a spinner as the button content. Loading state is commonly used with isLoading property of the queries to show a loading status while a query is being run. | Toggle the switch **On** or click on **fx** to programmatically set the value to `{{true}}` or `{{false}}`. |
-
+
## Component Specific Actions (CSA) @@ -48,13 +47,13 @@ Following actions of Button component can be controlled using the component spec
-
+
## Exposed Variables |
Variable
|
Description
|
How To Access
| | :----------- | :----------- | :---------- | -| buttonText | This variable stores the text displayed on the button. | Access the value dynamically through JavaScript using the following syntax: `{{components.button1.buttonText}}` | +| buttonText | This variable stores the text displayed on the button. | Access the value dynamically through JavaScript using the following syntax: `{{components.button1.buttonText}}`. | |
isValid
| Indicates if the input meets validation criteria. | Accessible dynamically with JS (for e.g., `{{components.button1.isValid}}`).| |
isLoading
| Indicates if the component is loading. | Accessible dynamically with JS (for e.g., `{{components.button1.isLoading}}`).| |
isVisible
| Indicates if the component is visible. | Accessible dynamically with JS (for e.g., `{{components.button1.isVisible}}`).| @@ -65,20 +64,20 @@ Following actions of Button component can be controlled using the component spec |
Action
|
Description
|
Configuration Options
| |:------------------|:------------|:------------------------------| -| Loading state | Enables a loading spinner, often used with `isLoading` to indicate progress. Toggle or set dynamically. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | -| Visibility | Controls component visibility. Toggle or set dynamically. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | -| Disable | Enables or disables the component. Toggle or set dynamically. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | +| Loading state | Enables a loading spinner, often used with `isLoading` to indicate progress. Toggle or set dynamically. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Visibility | Controls component visibility. Toggle or set dynamically. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Disable | Enables or disables the component. Toggle or set dynamically. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | | Tooltip | Provides additional information on hover. Set a string value for display. | String (e.g., `Button to Submit Form` ). | ## Devices **Show on desktop** -Makes the component visible in desktop view. You can set it with the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. +Makes the component visible in desktop view. You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. **Show on mobile** -Makes the component visible in mobile view. You can set it with the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. +Makes the component visible in mobile view. You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. --- @@ -90,13 +89,13 @@ Makes the component visible in mobile view. You can set it with the toggle butto |
Button Property
|
Description
|
Configuration Options
| |:------------------|:------------|:------------------------------| | Type | Sets the fill value of the Button component. | Select `Solid` for a button with a solid background and `Outline` for a transparent button with an outline. | -| Background | Sets the background color of the component. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | -| Text color | Sets the text color of the text entered in the component. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | -| Border color | Sets the border color of the component. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | -| Loader color | Sets the loader color of the component. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | -| Icon | Allows you to select an icon for the component. | Enable the icon visibility, select icon and icon color. Alternatively, you can programmatically set it using `fx`. | -| Border radius | Modifies the border radius of the component. | Enter a number or click on `fx` and enter a code that programmatically returns a numeric value. | -| Box shadow | Sets the box shadow properties of the component. | Select the box shadow color and adjust the related properties or set it programmatically using `fx`. | +| Background | Sets the background color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Text color | Sets the text color of the text entered in the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Border color | Sets the border color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Loader color | Sets the loader color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Icon | Allows you to select an icon for the component. | Enable the icon visibility, select icon and icon color. Alternatively, you can programmatically set it using **fx**. | +| Border radius | Modifies the border radius of the component. | Enter a number or click on **fx** and enter a code that programmatically returns a numeric value. | +| Box shadow | Sets the box shadow properties of the component. | Select the box shadow color and adjust the related properties or set it programmatically using **fx**. | ## Container diff --git a/docs/docs/widgets/circular-progressbar.md b/docs/docs/widgets/circular-progressbar.md index 032a2e8d69..bf4a480929 100644 --- a/docs/docs/widgets/circular-progressbar.md +++ b/docs/docs/widgets/circular-progressbar.md @@ -6,22 +6,22 @@ title: Circular Progressbar The Circular Progressbar component can be used to show progress in a progress circle. -
+
## Properties :::info -Any property having `Fx` button next to its field can be **programmatically configured**. +Any property having **fx** button next to its field can be **programmatically configured**. ::: |
Properties
|
Description
|
Expected Value
| | ----------- | ----------- | --------------- | | Text | Sets a text inside the progress circle.| It expects a `String`, you can also use js to dynamically update the text as the progress changes. | -| Progress | Sets the progress of the widget. | Progress should be an integer between 0 and 100.| +| Progress | Sets the progress of the component. | Progress should be an integer between 0 and 100.|
-
+
## Component Specific Actions (CSA) @@ -29,7 +29,7 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate
-
+
## Exposed Variables @@ -37,29 +37,31 @@ There are currently no exposed variables for the component.
-
+
## General ### Tooltip A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. -Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip.
-
+
-## Layout +## Devices -|
Layout
|
Description
| -| ----------- | ----------- | -| Show on desktop | Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on Fx to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on Fx to set the value `{{true}}` or `{{false}}`. | +|
Property
|
Description
|
Expected Value
| +| ----------- | ----------- | ----------- | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
-
+
+ +--- ## Styles @@ -71,10 +73,10 @@ Under the General accordion, you can set the value in the string format. | Stroke width | Defines the width of stroke | Value must between 0-100| | Counter clockwise | Whether to rotate progress bar in counterclockwise direction. | Accepts `{{true}}` and `{{false}}`, Default value is `false`| | Circle ratio | Defines ratio of the full circle diameter the progressbar should use. | Accepts numerical value and the default is `1` | -| Visibility | Toggle on or off to control the visibility of the widget. | Programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}` | +| Visibility | Toggle on or off to control the visibility of the component. | Programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. By default, it's set to `{{true}}` | :::info -Circular progress bar widget uses [react-circular-progress](https://github.com/kevinsqi/react-circular-progressbar) package. Check the repo for further more details about properties and styles. +Circular progress bar component uses [react-circular-progress](https://github.com/kevinsqi/react-circular-progressbar) package. Check the repo for further more details about properties and styles. ::: -
\ No newline at end of file +
diff --git a/docs/docs/widgets/code-editor.md b/docs/docs/widgets/code-editor.md index 70000f3c24..2108b6fb19 100644 --- a/docs/docs/widgets/code-editor.md +++ b/docs/docs/widgets/code-editor.md @@ -2,22 +2,21 @@ id: code-editor title: Code Editor --- -# Code Editor -**Code Editor** widget is a versatile text editor for editing code and supports several languages. +**Code Editor** component is a versatile text editor for editing code and supports several languages.
-ToolJet - Widget Reference - Code editor +ToolJet - Component Reference - Code editor
-
+
## Properties :::info -Any property having `Fx` button next to its field can be **programmatically configured**. +Any property having **fx** button next to its field can be **programmatically configured**. ::: |
Property
|
Description
|
Expected Value
| @@ -166,7 +165,7 @@ Any property having `Fx` button next to its field can be **programmatically conf
-
+
## Component Specific Actions (CSA) @@ -174,46 +173,48 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate
-
+
## Exposed Variables |
Variables
|
Description
|
How To Access
| |:----------- |:----------- |:---------- | -| value | This variable holds the value whenever the user inputs anything on the code-editor . | Access the value dynamically using JS: `{{components.codeeditor1.value}}`| +| value | Holds the value of the user inputs in the code editor. | Access the value dynamically using JS (for e.g., `{{components.codeeditor1.value}}`). |
-
+
## General ### Tooltip -A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. -Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip.
-
+
## Layout |
Layout
|
Description
| |:----------- |:----------- | -| Show on desktop | Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on Fx to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on Fx to set the value `{{true}}` or `{{false}}`. | +| Show on desktop | Toggle on or off to display the component in desktop view. You can programmatically determine the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on mobile | Toggle on or off to display the component in mobile view. You can programmatically determine the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. |
-
+
+ +--- ## Styles |
Styles
|
Description
|
Default Value
| |:----------- |:----------- |:----------- | -| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. | By default, it's set to `{{true}}` | -| Disable | This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. | By default, its value is set to `{{false}}` | +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. | By default, it's set to `{{true}}` | +| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}` | | Border radius | Modifies the border radius of the editor. The field expects only numerical value from `1` to `100`. | Default is `0`. | -
\ No newline at end of file +
diff --git a/docs/docs/widgets/color-picker.md b/docs/docs/widgets/color-picker.md index 3f5a61006e..307ff988c7 100644 --- a/docs/docs/widgets/color-picker.md +++ b/docs/docs/widgets/color-picker.md @@ -3,19 +3,17 @@ id: color-picker title: Color Picker --- -# Color Picker +**Color Picker** component is used to select the desired color from the color picker. -**Color Picker** widget is used to select the desired color from the color picker - -
+
## Properties ### Default color -The data needs to be an valid hex color +The data needs to be a valid hex color. -- One can change default color either from color picker or using `fx` (need to provide only respective hex value) +- One can change default color either from color picker or using **fx** (need to provide only respective hex value). **Example:** @@ -26,19 +24,17 @@ Invalid Color : #0000, "black" , rgb(0,0,0) ,
-
+
## Events -To add an event to a color-picker component, click on the widget handle to open the widget properties on the right sidebar. Go to the **Events** section and click on **+ Add handler**. - |
Event
|
Description
| |:----------- |:----------- | -| On change | On change event is triggered when the color is changed on the color-picker| +| On change | Triggers whenever the color is changed on the color-picker.|
-
+
## Component Specific Actions (CSA) @@ -46,44 +42,46 @@ The following actions of the component can be controlled using component specifi |
Actions
|
Description
|
How To Access
| |:----------- |:----------- |:----------- | -| setColor | Set a color on the color component via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.colorpicker1.setColor('#64A07A')` | +| setColor() | Sets a color on the color component. | Employ a RunJS query (for e.g., `await components.colorpicker1.setColor('#64A07A')`) or trigger it using an event. |
-
+
## Exposed Variables |
Variables
|
Description
|
How To Access
| |:----------- |:----------- |:---------- | -| selectedColorHex | Gets updated with HEX color code whenever a user selects a color from the color picker.| Access the value dynamically using JS: `{{components.colorpicker1.selectedColorHex}}`| -| selectedColorRGB | Gets updated with RGB color code whenever a user selects a color from the color picker. | Access the value dynamically using JS: `{{components.colorpicker1.selectedColorRGB}}`| -| selectedColorRGBA | Gets updated with RGBA color code whenever a user selects a color from the color picker.| Access the value dynamically using JS: `{{components.colorpicker1.selectedColorRGBA}}`| +| selectedColorHex | Gets updated with HEX color code whenever a user selects a color from the color picker.| Accessible dynamically with JS (for e.g., `{{components.colorpicker1.selectedColorHex}}`).| +| selectedColorRGB | Gets updated with RGB color code whenever a user selects a color from the color picker. | Accessible dynamically with JS (for e.g., `{{components.colorpicker1.selectedColorRGB}}`).| +| selectedColorRGBA | Gets updated with RGBA color code whenever a user selects a color from the color picker.| Accessible dynamically with JS (for e.g., `{{components.colorpicker1.selectedColorRGBA}}`).|
-
+
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | Programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | Programmatically determinine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
-
+---- + +
## Styles |
Style
|
Description
|
Expected Value
| |:---------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |:---------- | -| Visibility | Toggle on or off to control the visibility of the widget.| Programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}` | +| Visibility | Toggle on or off to control the visibility of the component.| Programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not visible after the app is deployed. By default, it's set to `{{true}}`. |
-
+
## Actions @@ -92,19 +90,19 @@ The following actions of the component can be controlled using component specifi | setColor | Set the color. | `color` eg - `#ffffff` | :::info -Any property having `Fx` button next to its field can be **programmatically configured**. +Any property having **fx** button next to its field can be **programmatically configured**. ::: **Example: Selecting/changing color from the color picker and getting respective hex, rgb and rgba value of selected color** -- Let's start by creating a new app and then dragging the Color Picker widget onto the canvas. -- Click on the Color Picker widget, a picker pop-up will appear, one can select desired color from the picker. +- Let's start by creating a new app and then dragging the Color Picker component onto the canvas. +- Click on the Color Picker component, a picker pop-up will appear, one can select desired color from the picker. - In order to close the appeared picker pop-up, one need's to move away mouse from the picker pop-up and picker pop-up will fade away. -- In the Inspector, inside component, look for colorpicker, where one can get respective hex, rgb and rgba color +- In the Inspector, inside component, look for colorpicker, where one can get respective hex, rgb and rgba color.
-ToolJet - Widget Reference - Color Picker +ToolJet - Component Reference - Color Picker
-
\ No newline at end of file +
diff --git a/docs/docs/widgets/date-range-picker.md b/docs/docs/widgets/date-range-picker.md index c893615588..3086237b90 100644 --- a/docs/docs/widgets/date-range-picker.md +++ b/docs/docs/widgets/date-range-picker.md @@ -2,31 +2,28 @@ id: date-range-picker title: Date-range Picker --- -# Date-Range Picker -The **Date-Range Picker** widget allows users to select a range of dates. +The **Date-Range Picker** component allows users to select a range of dates. -
+
## Properties |
Property
|
Description
| |:----------- |:----------- | -| Default start date | Set the start date to be selected by default in the widget | -| Default end date | Set the start date to be selected by default in the widget | +| Default start date | Set the start date to be selected by default in the component. | +| Default end date | Set the start date to be selected by default in the component. | | Format | The format of the date selected by the date picker. Default date format is **DD/MM/YYYY**. Date format should be followed as ISO 8601 as mentioned in the [moment documentation](https://momentjs.com/docs/). |
-
+
## Events -Date range picker supports the following events: - |
Event
|
Description
| |:----------- |:----------- | -| On select | The On select event is triggered when the a start date and end date is selected on the picker. Just like any other event on ToolJet, you can set multiple handlers for on select event. | +| On select | Triggered when a start date and end date are selected. | :::info Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. @@ -34,7 +31,7 @@ Check [Action Reference](/docs/category/actions-reference) docs to get the detai
-
+
## Component Specific Actions (CSA) @@ -42,51 +39,53 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate
-
+
## Exposed Variables |
Variables
|
Description
|
How To Access
| |:----------- |:----------- |:--------- | -| endDate | This variable holds the date of the endDate selected in the component. | Access the value dynamically using JS: `{{components.customcomponent1.data.title}}`| -| startDate | This variable holds the value assigned inside the `code` for custom component. | Access the value dynamically using JS: `{{components.customcomponent1.data.title}}`| +| endDate | This variable holds the date of the endDate selected in the component. | Access the value dynamically using JS: `{{components.customcomponent1.data.title}}`. | +| startDate | This variable holds the value assigned inside the `code` for the custom component. | Access the value dynamically using JS: `{{components.customcomponent1.data.title}}`. |
-
+
## General ### Tooltip -A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. -Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip.
-
+
## Layout |
Layout
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. |
-
+--- + +
## Styles |
Style
|
Description
|
Default Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Border radius | This is to modify the border radius of the date range picker. The field expects only numerical value from `1` to `100`| By default, it's set to `0`| -| Visibility | This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. | By default, it's set to `{{true}}`| -| Disable | This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. | By default, its value is set to `{{false}}` | +| Border radius | This is to modify the border radius of the date range picker. The field expects only numerical value from `1` to `100`. | By default, it's set to `0`. | +| Visibility | This is to control the visibility of the component. If `{{false}}` the component will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. | By default, it's set to `{{true}}`. | +| Disable | This property only accepts boolean values. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}`. | :::info -Any property having `Fx` button next to its field can be **programmatically configured**. +Any property having **fx** button next to its field can be **programmatically configured**. ::: -
\ No newline at end of file +
diff --git a/docs/docs/widgets/file-picker.md b/docs/docs/widgets/file-picker.md index 826798839b..099a2b03b8 100644 --- a/docs/docs/widgets/file-picker.md +++ b/docs/docs/widgets/file-picker.md @@ -63,7 +63,7 @@ Checkout **[this](/docs/how-to/loading-image-pdf-from-db)** guide to learn how t | Actions | Description | How To Access | |:--------|:-----------|:------------| -|
clearFiles()
| You can clear the selected files on the filepicker component via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.filepicker1.clearFiles()`. | +|
clearFiles()
| Clears the selected files from the file picker component. | Employ a RunJS query (for e.g., `await components.filepicker1.clearFiles()`) or trigger it using an event. |
@@ -73,7 +73,7 @@ Checkout **[this](/docs/how-to/loading-image-pdf-from-db)** guide to learn how t |
Variables
|
Description
|
How To Access
| |:----------- |:----------- |:-------- | -| file | This variable holds the array of objects where each object represents the file loaded on the file picker component. Each object has the following keys: **name**, **type**, **content**, **dataURL**, **base64Data**, **parsedData**, **filePath**. | The values can be accesed using `{{components.filepicker1.file[0].base64Data}}`. | +| file | Holds an array of file objects loaded in the file picker, each with properties: **name**, **type**, **content**, **dataURL**, **base64Data**, **parsedData**, **filePath**. | Accessible dynamically with JS (for e.g., `{{components.filepicker1.file[0].base64Data}}`). |
@@ -106,12 +106,12 @@ Under the General accordion, you can set the value in the string format.
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
diff --git a/docs/docs/widgets/image.md b/docs/docs/widgets/image.md index 873a044b77..8bbbf25960 100644 --- a/docs/docs/widgets/image.md +++ b/docs/docs/widgets/image.md @@ -63,12 +63,12 @@ Under the General accordion, you can set the value in the string format.
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}` | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** to set the value and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** to set the value and entering a logical expression. |
diff --git a/docs/docs/widgets/kanban-board.md b/docs/docs/widgets/kanban-board.md index 7abafbb3ae..5342f3933f 100644 --- a/docs/docs/widgets/kanban-board.md +++ b/docs/docs/widgets/kanban-board.md @@ -3,17 +3,16 @@ id: kanban title: Kanban --- -# Kanban - The **Kanban** component allows you to visually organize and prioritize your tasks with a transparent workflow. You can set the number of columns to display, enable/disable the add cards button, and bind data to the cards. :::info Restricted components Certain components are restricted from being placed within the **Card** and **Popout** of the **Kanban** component. + - **Card**: Calendar, Kanban, Form, Tabs, Modal, ListView, Container - **Popout**: Calendar, Kanban -::: + ::: -
+
## Setting Card Data @@ -28,40 +27,41 @@ For instance, you can set the `Data` property of a Text component on a card usin
-
+
## Properties :::info + - It is mandatory to provide an `id` for each column in the `column data` field. The `id` can be of type `string` or `number`. - It is mandatory to provide an `id` and a `columnId` for each card in the `Card data` field. Both `id` and `columnId` can be of type `string` or `number`. -::: + ::: |
Properties
|
Description
|
Expected Value
| -|:----------- |:----------- |:----------- | -| Column data | Enter the columns data - `id` and `title` in the form of array of objects or from a query that returns an array of objects. | `{{[{ "id": "c1", "title": "to do" },{ "id": "c2", "title": "in progress" },{ "id": "c3", "title": "Completed" }]}}` or `{{queries.xyz.data}}` | -| Card data | Enter the cards data - `id`, `title` and `columnId` in the form of array of objects or from a query that returns an array of objects. | `{{[{ id: "r1", title: "Title 1", description: "Description 1", columnId: "c1" },{ id: "r2", title: "Title 2", description: "Description 2", columnId: "c2" },{ id: "r3", title: "Title 3", description: "Description 3",columnId: "c3" }]}}` or `{{queries.abc.data}}` | -| Card width | Set the width of the card | This property expects a numerical value. By default, the value is set to `{{302}}` | -| Card height | Set the width of the card | This property expects a numerical value. By default, the value is set to `{{100}}` | -| Enable add card | This property allows you to show or hide the **+Add Cards** button on the Kanban. | By default its enabled, you can programmatically set value to `{{true}}` or `{{false}}` to enable/disable button by clicking on the `Fx` next to it | -| Show delete button | This property allows you to show or hide the **Drop here to delete cards** section at the bottom of the Kanban. | By default its enabled, you can programmatically set value to `{{true}}` or `{{false}}` to enable/disable button by clicking on the `Fx` next to it | +| :---------------- | :------------------------ | :---------------------------- | +| Column data | Enter the columns data - `id` and `title` in the form of array of objects or from a query that returns an array of objects. | `{{[{ "id": "c1", "title": "to do" },{ "id": "c2", "title": "in progress" },{ "id": "c3", "title": "Completed" }]}}` or `{{queries.xyz.data}}`. | +| Card data | Enter the cards data - `id`, `title` and `columnId` in the form of array of objects or from a query that returns an array of objects. | `{{[{ id: "r1", title: "Title 1", description: "Description 1", columnId: "c1" },{ id: "r2", title: "Title 2", description: "Description 2", columnId: "c2" },{ id: "r3", title: "Title 3", description: "Description 3",columnId: "c3" }]}}` or `{{queries.abc.data}}`. | +| Card width | Set the width of the card. | This property expects a numerical value. By default, the value is set to `{{302}}`. | +| Card height | Set the width of the card. | This property expects a numerical value. By default, the value is set to `{{100}}`. | +| Enable add card | This property allows you to show or hide the **+Add Cards** button on the Kanban. | By default its enabled, you can programmatically set value to `{{true}}` or `{{false}}` to enable/disable button by clicking on the **fx** next to it. | +| Show delete button | This property allows you to show or hide the **Drop here to delete cards** section at the bottom of the Kanban. | By default its enabled, you can programmatically set value to `{{true}}` or `{{false}}` to enable/disable button by clicking on the **fx** next to it. |
-
+
## Events To add an event, click on the component handle to open the component properties on the right sidebar. Go to the **Events** section and click on **Add handler**. -|
Event
|
Description
| -|:----------- |:----------- | -| On Update | On update event is triggered whenever the card data (id, title, description, or columnID) is updated using the component specific actions. | -| On add card click | This event is triggered whenever the **Add card** button on the Kanban is clicked. | -| Card removed | This event is triggered whenever the card is **deleted** from the Kanban by dragging it into the bottom delete box or using component specific action. | -| Card added | This event is triggered whenever a card is **added** on the Kanban using the component specific action. | -| Card moved | This event is triggered whenever the card's position is changed on the Kanban or using the component specific action. | -| Card selected | This event is triggered whenever a card is clicked to open the modal. | +|
Event
|
Description
| +| :-------------------| :----------------| +| On Update | On update event is triggered whenever the card data (id, title, description, or columnID) is updated using the component specific actions. | +| On add card click | This event is triggered whenever the **Add card** button on the Kanban is clicked. | +| Card removed | This event is triggered whenever the card is **deleted** from the Kanban by dragging it into the bottom delete box or using component specific action. | +| Card added | This event is triggered whenever a card is **added** on the Kanban using the component specific action. | +| Card moved | This event is triggered whenever the card's position is changed on the Kanban or using the component specific action. | +| Card selected | This event is triggered whenever a card is clicked to open the modal. | Just like any other event on ToolJet, you can set multiple handlers for any of the above mentioned events. @@ -73,40 +73,41 @@ Check the **[Component Specific Action](#component-specific-actions-csa)** avail
-
+
## Exposed Variables -|
Variable
|
Description
|
How To Access
| -|:-------- |:----------- |:---------- | -| updatedCardData | The `updatedCardData` variable will hold the latest values of all the cards in the Kanban. This variable won't have any values. | It will have values only when any action on any of the card is performed like when the card is moved, added, deleted, or updated. | -| lastAddedCard | The variable `lastAddedCard` holds the values of the last added card. It holds the following data - `id`, `title`, `description` and `columnId` of the last added card. | Get the values using `{{components.kanban1.lastAddedCard.title}}` | -| lastRemovedCard | The variable `lastRemovedCard` holds the properties of the card that has been recently deleted from the Kanban. It holds the following data - `id`, `title`, `description` and `columnId` of the recently deleted card. | Get the values using `{{components.kanbanboard1.lastRemovedCard.title}}` | -| lastCardMovement | The variable `lastCardMovement` holds the properties of the card that has been recently moved from its original position. It holds the following data - `originColumnId`, `destinationColumnId`, `originCardIndex`, `destinationCardIndex` and an object `cardDetails` which includes `id`, `title`, `description` and `columnId` of the moved card. | Get the values using `{{components.kanbanboard1.lastCardMovement.cardDetails.title}}` or `{{components.kanbanboard1.lastCardMovement.destinationCardIndex}}` | -| lastSelectedCard | The variable `lastSelectedCard` holds the `id`, `title`, `columnId`, and `description` of the last selected(clicked to view) card on the Kanban. | Get the values using `{{components.kanban1.lastSelectedCard.columnId}}` | -| lastUpdatedCard | The variable `lastUpdatedCard` holds the `id`, `title`, `description`, and `columnId` of the last updated card(using component specific action). | Get the values using `{{components.kanban1.lastUpdatedCard.columnId}}` | -| lastCardUpdate | The variable `lastCardUpdate` holds the old an new values of the property that has been changed in the card(using component specific action). | Get the values using `{{components.kanban1.lastCardUpdate[0].title.oldValue}}` | +|
Variable
|
Description
|
How To Access
| +| :------------- | :----------------- | :---------------- | +| updatedCardData | The `updatedCardData` variable will hold the latest values of all the cards in the Kanban. This variable won't have any values. | It will have values only when any action on any of the card is performed like when the card is moved, added, deleted, or updated. | +| lastAddedCard | The variable `lastAddedCard` holds the values of the last added card. It holds the following data - `id`, `title`, `description` and `columnId` of the last added card. | Get the values using `{{components.kanban1.lastAddedCard.title}}`. | +| lastRemovedCard | The variable `lastRemovedCard` holds the properties of the card that has been recently deleted from the Kanban. It holds the following data - `id`, `title`, `description` and `columnId` of the recently deleted card. | Get the values using `{{components.kanbanboard1.lastRemovedCard.title}}`. | +| lastCardMovement | The variable `lastCardMovement` holds the properties of the card that has been recently moved from its original position. It holds the following data - `originColumnId`, `destinationColumnId`, `originCardIndex`, `destinationCardIndex` and an object `cardDetails` which includes `id`, `title`, `description` and `columnId` of the moved card. | Get the values using `{{components.kanbanboard1.lastCardMovement.cardDetails.title}}` or `{{components.kanbanboard1.lastCardMovement.destinationCardIndex}}`. | +| lastSelectedCard | The variable `lastSelectedCard` holds the `id`, `title`, `columnId`, and `description` of the last selected(clicked to view) card on the Kanban. | Get the values using `{{components.kanban1.lastSelectedCard.columnId}}`. | +| lastUpdatedCard | The variable `lastUpdatedCard` holds the `id`, `title`, `description`, and `columnId` of the last updated card(using component specific action). | Get the values using `{{components.kanban1.lastUpdatedCard.columnId}}`. | +| lastCardUpdate | The variable `lastCardUpdate` holds the old an new values of the property that has been changed in the card(using component specific action). | Get the values using `{{components.kanban1.lastCardUpdate[0].title.oldValue}}`. |
-
+
## Component Specific Actions (CSA) Following actions of Kanban component can be controlled using the component specific actions(CSA): -|
Actions
|
Description
|
How To Access
| -|:----------- |:----------- |:----------- | -| updateCardData | Update the card data of Kanban component via a component-specific action within any event handler.| Employ a RunJS query to execute component-specific actions such as `components.kanban1.updateCardData('c1', {title: 'New Title'})` | -| moveCard | Move a card from one column to other column on the kanban via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.kanban1.moveCard('card id,'column id')` ex: `await components.kanban1.moveCard('c1','r2')` | -| addCard | Add a card onto the kanban via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.kanban1.addCard('c1', {title: 'New Title'})` | -| deleteCard | Delete a card from the kanban via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.kanban1.deleteCard('card id')` ex: `await components.kanban1.deleteCard('c2')` | +|
Actions
|
Description
|
How To Access
| +| :-------------- | :----------------- | :--------------- | +| updateCardData | Update the card data of Kanban component via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `components.kanban1.updateCardData('c1', {title: 'New Title'})`. | +| moveCard | Move a card from one column to other column on the kanban via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.kanban1.moveCard('card id,'column id')` ex: `await components.kanban1.moveCard('c1','r2')`. | +| addCard | Add a card onto the kanban via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.kanban1.addCard('c1', {title: 'New Title'})`. | +| deleteCard | Delete a card from the kanban via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.kanban1.deleteCard('card id')` ex: `await components.kanban1.deleteCard('c2')`. |
-
+
## General + ### Tooltip A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. @@ -115,25 +116,27 @@ Under the General accordion, you can set the value in the string format.
-
+
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| -|:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +|
Property
|
Description
|
Expected Value
| +| :------------ | :------------ | :-------------- | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
-
+---- + +
## Styles -|
Style
|
Description
| -|:------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Disable | If disabled or set to `{{false}}` the component will be locked and becomes non-functional. By default, its disabled i.e. its value is set to `{{true}}` . | -| Visibility | This is to control the visibility of the component. If `{{false}}`/disabled the component will not visible after the app is deployed. By default, it's enabled (set to `{{true}}`). | -| Accent color | You can change the accent color of the column title by entering the Hex color code or choosing a color of your choice from the color picker. | +|
Style
|
Description
| +| :------------- | :------------------ | +| Disable | If disabled or set to `{{false}}` the component will be locked and becomes non-functional. By default, its disabled i.e. its value is set to `{{true}}`. | +| Visibility | This is to control the visibility of the component. If `{{false}}`/disabled the component will not visible after the app is deployed. By default, it's enabled (set to `{{true}}`). | +| Accent color | You can change the accent color of the column title by entering the Hex color code or choosing a color of your choice from the color picker. |
diff --git a/docs/docs/widgets/link.md b/docs/docs/widgets/link.md index 1da853e61f..ab2718e981 100644 --- a/docs/docs/widgets/link.md +++ b/docs/docs/widgets/link.md @@ -11,9 +11,9 @@ The **Link** component allows you to add a hyperlink and navigate to the externa |
Properties
|
Description
|
Expected Value
| |:----------- |:----------- |:-------------- | -| Link target | This property sets the URL where the user needs to be taken on clicking the link. | example: `https://dev.to/tooljet` or `{{queries.xyz.data.url}}` | -| Link text | This property sets the text for the Link component. | example: **Click here** or **Open webpage** | -| Target type | This property specifies the link to be opened in the same tab or new tab on clicking the link. | Options: **New Tab** & **Same Tab** | +| Link target | This property sets the URL where the user needs to be taken on clicking the link. | example: `https://dev.to/tooljet` or `{{queries.xyz.data.url}}`. | +| Link text | This property sets the text for the Link component. | example: **Click here** or **Open webpage**. | +| Target type | This property specifies the link to be opened in the same tab or new tab on clicking the link. | Options: **New Tab** & **Same Tab**. |
@@ -23,8 +23,8 @@ The **Link** component allows you to add a hyperlink and navigate to the externa |
Event
|
Description
| |:----------- |:----------- | -| On click | **On Click** event is triggered when the link is clicked. Just like any other event on ToolJet, you can set multiple handlers for on click event. | -| On hover | **On Hover** event is triggered when the link is hovered. Just like any other event on ToolJet, you can set multiple handlers for on click event. | +| On click | Triggered when the link is clicked. | +| On hover | Triggered when the cursor hovers over the link. | :::info Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. @@ -40,7 +40,7 @@ The following actions of the link component can be controlled using the componen |
Actions
|
Description
|
How To Access
| |:----------- |:----------- |:------------ | -| click | You can trigger the click action of the Link component via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.link1.click()`. | +| click | Triggers click action of the link component. | Employ a RunJS query to execute component-specific actions such as `await components.link1.click()` or trigger it using an event. |
@@ -65,12 +65,12 @@ Under the **General** accordion, you can set the value in the string format. Now
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
@@ -84,7 +84,7 @@ Under the **General** accordion, you can set the value in the string format. Now |:----------- |:----------- | | Text color | You can change the background color of the text by entering the Hex color code or choosing a color of your choice from the color picker. | | Text size | By default, the text size is set to 14. You can enter any value from 1-100 to set a custom text size. | -| Underline | You can change the underline of the text in the following ways: **on-hover (default), never, always** | +| Underline | You can change the underline of the text in the following ways: **on-hover (default), never, always**. | | Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not visible after the app is deployed. By default, it's set to `{{true}}`. | :::info diff --git a/docs/docs/widgets/map.md b/docs/docs/widgets/map.md index fe41b20a2b..877c32ab55 100644 --- a/docs/docs/widgets/map.md +++ b/docs/docs/widgets/map.md @@ -15,21 +15,21 @@ If you are utilizing the self-hosted version of ToolJet, it is necessary to conf
-
+
## Properties |
Properties
|
Description
|
Expected Value
| |:----------- |:----------- |:------------------ | -| Initial location | default location when the app is loaded initially. | An object containing the **latitude** and **longitude** as key value pairs. ex: `{{ {"lat": 40.7128, "lng": -73.935242} }}` | -| Default markers | Number of markers that should be shown on the map | An array of objects containing the coordinates. ex: `{{ [{"lat": 40.7128, "lng": -73.935242}, {"lat": 40.7128, "lng": -73.935242}] }}` | -| Polygon points | Create a polygon on the map using the given coordinates. | An array of objects containing the coordinates. ex: `{{ [{"lat": 40.7128, "lng": -73.935242}, {"lat": 40.7128, "lng": -73.935242}] }}` | -| Add new markers | On clicking the map, a new marker will be added to the map. | By default, it's set to `On`. Toggle `off` to disable adding new markers on the map. Click `Fx` to set `{{true}}` or `{{false}}` programmatically. | -| Search for places | Enable to show the search box on the map. | By default, it's set to `On`. Toggle `off` to disable the search box on the map. Click `Fx` to set `{{true}}` or `{{false}}` programmatically. | +| Initial location | default location when the app is loaded initially. | An object containing the **latitude** and **longitude** as key value pairs. ex: `{{ {"lat": 40.7128, "lng": -73.935242} }}`. | +| Default markers | Number of markers that should be shown on the map. | An array of objects containing the coordinates. ex: `{{ [{"lat": 40.7128, "lng": -73.935242}, {"lat": 40.7128, "lng": -73.935242}] }}`. | +| Polygon points | Create a polygon on the map using the given coordinates. | An array of objects containing the coordinates. ex: `{{ [{"lat": 40.7128, "lng": -73.935242}, {"lat": 40.7128, "lng": -73.935242}] }}`. | +| Add new markers | On clicking the map, a new marker will be added to the map. | By default, it's set to `On`. Toggle `off` to disable adding new markers on the map. Click **fx** to set `{{true}}` or `{{false}}` programmatically. | +| Search for places | Enable to show the search box on the map. | By default, it's set to `On`. Toggle `off` to disable the search box on the map. Click **fx** to set `{{true}}` or `{{false}}` programmatically. |
-
+
## Events @@ -46,7 +46,7 @@ For detailed information about all the available **Actions**, please refer to th
-
+
## Component Specific Actions (CSA) @@ -54,11 +54,11 @@ Following actions of Map component can be controlled using the component specifi |
Actions
|
Description
|
How To Access
| |:---------- |:---------- |:------- | -| setLocation | Set the marker's location on map using latitude and longitude values as parameters via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as: `component.map1.setLocation(40.7128, -73.935242)` | +| setLocation | Set the marker's location on map using latitude and longitude values as parameters via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as: `component.map1.setLocation(40.7128, -73.935242)`. |
-
+
## Exposed Variables @@ -67,18 +67,18 @@ Exposed variables can be used to get data from the component. |
Variables
|
Description
|
How To Access
| |:----------- |:----------- |:--------- | | center | This variable will hold the latitude, longitude and the google map url value. | -| center.`lat` | This variable holds the latitude value of the marker on the Map component. | Access the value dynamically using JS: `{{components.map1.center.lat}}`| -| center.`lng` | This variable gets updated with RGB color code whenever a user selects a color from the color picker. | Access the value dynamically using JS: `{{components.map1.center.lng}}`| -| center.`googleMapUrl` | This variable holds the URL of the location where the center marker is placed on the Map component. | Access the value dynamically using JS: `{{components.map1.center.googleMapUrl}}`| -| markers | The markers variable will hold the value only if `add new markers` is enabled from the map properties. Each marker is an object and will have `lat` and `lng` keys. | Access the values dynamically using `{{components.map1.markers[1].lat}}` | -| selectedMarker | Object with the marker selected by the user | -| bounds | It constructs a rectangle from the points at its south-west and north-east corners | -| bounds.northEast | It holds the latitude and longitude of the north-east corner of the rectangle.| Access the value dynamically using JS: `{{components.map1.bounds.northEast.lat}}` or `{{components.map1.bounds.northEast.lng}}` | -| bounds.southWest | It holds the latitude and longitude of the south-west corner of the rectangle. | Access the value dynamically using JS: `{{components.map1.bounds.southWest.lat}}` or `{{components.map1.bounds.southWest.lng}}` | +| center.`lat` | This variable holds the latitude value of the marker on the Map component. | Access the value dynamically using JS: `{{components.map1.center.lat}}`. | +| center.`lng` | This variable gets updated with RGB color code whenever a user selects a color from the color picker. | Access the value dynamically using JS: `{{components.map1.center.lng}}`. | +| center.`googleMapUrl` | This variable holds the URL of the location where the center marker is placed on the Map component. | Access the value dynamically using JS: `{{components.map1.center.googleMapUrl}}`. | +| markers | The markers variable will hold the value only if `add new markers` is enabled from the map properties. Each marker is an object and will have `lat` and `lng` keys. | Access the values dynamically using `{{components.map1.markers[1].lat}}`. | +| selectedMarker | Object with the marker selected by the user. | +| bounds | It constructs a rectangle from the points at its south-west and north-east corners. | +| bounds.northEast | It holds the latitude and longitude of the north-east corner of the rectangle.| Access the value dynamically using JS: `{{components.map1.bounds.northEast.lat}}` or `{{components.map1.bounds.northEast.lng}}`. | +| bounds.southWest | It holds the latitude and longitude of the south-west corner of the rectangle. | Access the value dynamically using JS: `{{components.map1.bounds.southWest.lat}}` or `{{components.map1.bounds.southWest.lng}}`. |
-
+
## General ### Tooltip @@ -87,25 +87,27 @@ A Tooltip is often used to specify the extra information when the user hovers th
-
+
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
-
+
+ +---- ## Styles |
Properties
|
Description
|
Expected Value
| |:----------- |:----------- |:------------------ | -| Visibility | Toggle on or off to control the visibility of the component. | You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the component will not be visible after the app is release. By default, it's set to `{{true}}`. | -| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. | You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | -| Box shadow | Add a shadow effect to the component by providing values to X, Y, Blur, Spread and Color. | You can also programmatically set the value by clicking on the `Fx` button next to it. Ex: `{{"x": 0, "y": 0, "blur": 0, "spread": 0, "color": "#000000"}}` | +| Visibility | Toggle on or off to control the visibility of the component. | You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is release. By default, it's set to `{{true}}`. | +| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. | You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | +| Box shadow | Add a shadow effect to the component by providing values to X, Y, Blur, Spread and Color. | You can also programmatically set the value by clicking on the **fx** button next to it. Ex: `{{"x": 0, "y": 0, "blur": 0, "spread": 0, "color": "#000000"}}`. | -
\ No newline at end of file +
diff --git a/docs/docs/widgets/pagination.md b/docs/docs/widgets/pagination.md index df11c911c2..037a769a1b 100644 --- a/docs/docs/widgets/pagination.md +++ b/docs/docs/widgets/pagination.md @@ -2,7 +2,6 @@ id: pagination title: Pagination --- -# Pagination **Pagination** enables the user to select a specific page from a range of pages. It is used to separate the content into discrete pages. @@ -23,7 +22,7 @@ You can club the Pagination component with the List View component.
-## Event +## Event |
Event
|
Description
| |:------------------|:---------------------| @@ -43,10 +42,10 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate ## Exposed Variables -|
Variables
|
Description
|
How To Access
| +|
Variables
|
Description
|
How To Access
| |:----------- |:----------- |:--------- | -| totalPages | This variable holds the value of the `Number of Pages` set from the Pagination component properties. | Access the value dynamically using JS: `{{components.pagination1.totalPages}}`. | -| currentPageIndex | This variable will hold the index of the currently selected option on the Pagination component. | Access the value dynamically using JS: `{{components.pagination1.currentPageIndex}}`. | +| totalPages | Holds the value of the `Number of Pages` set from the Pagination component properties.| Accessible dynamically with JS(for e.g., `{{components.pagination1.totalPages}}`).| +| currentPageIndex | Holds the index of the currently selected option on the Pagination component. | Accessible dynamically with JS(for e.g., `{{components.pagination1.currentPageIndex}}`). |
@@ -63,12 +62,12 @@ Under the General accordion, you can set the value in the string format.
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| -|:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +|
Property
|
Description
|
Expected Value
| +|:------------ |:-------------|:--------- | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
@@ -78,10 +77,10 @@ Under the General accordion, you can set the value in the string format. ## Styles -|
Style
|
Description
|
Default Value
| +|
Style
|
Description
|
Default Value
| |:------------ |:-------------|:--------- | | Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. | By default, it's set to `{{true}}`. | -| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}`. | +| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}`. | :::info Any property having **fx** button next to its field can be **programmatically configured**. diff --git a/docs/docs/widgets/qr-scanner.md b/docs/docs/widgets/qr-scanner.md index 0127f404cd..13511dbaba 100644 --- a/docs/docs/widgets/qr-scanner.md +++ b/docs/docs/widgets/qr-scanner.md @@ -15,7 +15,7 @@ You might have to stick to the Safari browser in IOS as camera access is restric |
Event
|
Description
| |:------------------|:---------------------| -| On Detect | Triggers whenever the component successfully scans a QR code. | +| On detect | Triggers whenever the component successfully scans a QR code. | :::info Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. @@ -44,7 +44,7 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate |
Variables
|
Description
|
How To Access
| |:----------- |:----------- |:--------- | -| lastDetectedValue | This variable holds the data contained in the last QR code scanned by the component. | To fetch the data use `{{components.qrscanner1.lastDetectedValue}}`. | +| lastDetectedValue | Holds the data from the last QR code scanned by the component. | Accessible dynamically with JS (for e.g., `{{components.qrscanner1.lastDetectedValue}}`). |
@@ -63,12 +63,12 @@ Now hovering over the component will display the string as the tooltip.
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
@@ -83,4 +83,4 @@ Now hovering over the component will display the string as the tooltip. | Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. | By default, it's set to `{{true}}`. | | Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}`. | -
\ No newline at end of file +
diff --git a/docs/docs/widgets/radio-button.md b/docs/docs/widgets/radio-button.md index b53986e97a..32a29b93b0 100644 --- a/docs/docs/widgets/radio-button.md +++ b/docs/docs/widgets/radio-button.md @@ -2,32 +2,33 @@ id: radio-button title: Radio Button --- + # Radio Button -The **Radio Button** widget can be used to select one option from a group of options. +The **Radio Button** component can be used to select one option from a group of options. :::tip Radio Buttons are preferred when the list of options is less than six, and all the options can be displayed at once. ::: :::info -For more than six options, consider using **[Dropdown](/docs/widgets/dropdown)** widget. +For more than six options, consider using **[Dropdown](/docs/widgets/dropdown)** component. ::: ## Properties -|
Property
|
Description
| -|:------------ |:-------------| -| Label | The text is to be used as the label for the radio button. This field expects a `String` value. | -| Default value | The value of the default option. | -| Option values | List of values for different items/options. Refer your query data with dynamic variables `{{queries.datasource.data.map(item => item.value)}}` or populate it with sample values `{{[true, false]}}`. | -| Option labels | List of labels for different items/options. Refer your query data with dynamic variables `{{queries.datasource.data.map(item => item.label)}}` or populate it with sample values `{{["yes", "no"]}}`. | +|
Property
|
Description
| +| :--------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Label | The text is to be used as the label for the radio button. This field expects a `String` value. | +| Default value | The value of the default option. | +| Option values | List of values for different items/options. Refer your query data with dynamic variables `{{queries.datasource.data.map(item => item.value)}}` or populate it with sample values `{{[true, false]}}`. | +| Option labels | List of labels for different items/options. Refer your query data with dynamic variables `{{queries.datasource.data.map(item => item.label)}}` or populate it with sample values `{{["yes", "no"]}}`. | ## Event |
Event
|
Description
| -|:------------------|:---------------------| -| On select | This event is triggered when an option is clicked. | +| :------------------------------------------ | :------------------------------------------------ | +| On select | Triggers whenever the user clicks an option. | :::info Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. @@ -37,33 +38,36 @@ Check [Action Reference](/docs/category/actions-reference) docs to get the detai The following actions of the component can be controlled using component specific actions(CSA): -|
Actions
|
Description
|
How To Access
-|:----------- |:----------- |:------- | -| selectOption | Select an option from the radio buttons via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as: `await components.radiobutton1.selectOption('one')` | +|
Actions
|
Description
|
How To Access
| +| :-------------------------------------------- | :------------------------------------------------------------------------------------------------ | :---------------------------------------------------------------------------------------------------------------------- | +| selectOption | Select an option from the radio buttons via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as: `await components.radiobutton1.selectOption('one')` | ## Exposed Variables There are currently no exposed variables for the component. ## General + ### Tooltip -A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. -Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. ## Layout -|
Layout
|
Description
|
Expected Value
| -|:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +|
Layout
|
Description
|
Expected Value
| +| :------------------------------------------- | :------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------- | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}` | + +--- ## Styles -|
Style
|
Description
|
Default Value
| -|:------------ |:-------------|:--------- | -| Text color | Change the color of the text in the widget by providing the `Hex color code` or by choosing the color of your choice from the color picker. | | -| Active color | Change the color of active radio button by providing the `Hex color code` or by choosing the color of your choice from the color picker. | | -| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. | By default, it's set to `{{true}}` | -| Disable | This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. | By default, its value is set to `{{false}}` | +|
Style
|
Description
|
Default Value
| +| :------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------- | +| Text color | Change the color of the text in the component by providing the `Hex color code` or by choosing the color of your choice from the color picker. | | +| Active color | Change the color of active radio button by providing the `Hex color code` or by choosing the color of your choice from the color picker. | | +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. | By default, it's set to `{{true}}` | +| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}` | diff --git a/docs/docs/widgets/star-rating.md b/docs/docs/widgets/star-rating.md index 31ea7f83df..a208cd8e2a 100644 --- a/docs/docs/widgets/star-rating.md +++ b/docs/docs/widgets/star-rating.md @@ -26,7 +26,7 @@ The **Star Rating** component can be used to display as well as input ratings. T |
Event
|
Description
| |:----------- |:----------- | -| On Change | This event is triggered when a star is clicked. | +| On change | Triggers whenever the user clicks a star. | :::info Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. @@ -48,7 +48,7 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate |
Variables
|
Description
|
How To Access
| |:----------- |:----------- |:--------- | -| value | This variable holds the value whenever a rating is added on the component. The variable holds a numerical value. | Access the value dynamically using JS: `{{components.colorpicker1.selectedColorHex}}`.| +| value |Holds the value entered by the user whenever a rating is added on the component. | Accessible dynamically with JS (for e.g., `{{components.starrating1.value}}`).|
@@ -65,12 +65,12 @@ Under the General accordion, you can set the value in the string format.
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
@@ -87,4 +87,4 @@ Under the General accordion, you can set the value in the string format. | Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. | By default, it's set to `{{true}}`. | | Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}`. | -
\ No newline at end of file +
diff --git a/docs/docs/widgets/steps.md b/docs/docs/widgets/steps.md index b49397b365..f95d4429ea 100644 --- a/docs/docs/widgets/steps.md +++ b/docs/docs/widgets/steps.md @@ -78,15 +78,17 @@ Under the General accordion, you can set the value in the string format.
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
+--- +
## Styles diff --git a/docs/docs/widgets/svg-image.md b/docs/docs/widgets/svg-image.md index 88b5576d56..228d26eebf 100644 --- a/docs/docs/widgets/svg-image.md +++ b/docs/docs/widgets/svg-image.md @@ -56,21 +56,23 @@ Under the General accordion, you can set the value in the string format.
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
+--- + ## Styles -|
Style
|
Description
|
Default Value
| +|
Property
|
Description
| Configuration Options | |:------------ |:-------------|:--------- | -| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. | By default, it's set to `{{true}}`. | - +| Visibility | Controls component visibility. Toggle or set dynamically. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Box-Shadow | Sets the box shadow properties of the component. | Select the box shadow color and adjust the related properties or programmatically set it using **fx**. |
diff --git a/docs/docs/widgets/tabs.md b/docs/docs/widgets/tabs.md index cc001c3f55..15d4b1ec80 100644 --- a/docs/docs/widgets/tabs.md +++ b/docs/docs/widgets/tabs.md @@ -5,7 +5,7 @@ title: Tabs # Tabs -A **Tabs** widget contains a number of defined containers that can be navigated through the tabs. Each tab acts as a [container](/docs/widgets/container/) that can have different widgets placed inside it. +A **Tabs** component contains a number of defined containers that can be navigated through the tabs. Each tab acts as a [container](/docs/widgets/container/) that can have different component placed inside it. :::caution Restricted components In order to avoid excessively complex situations, certain components, namely **Calendar** and **Kanban**, are restricted from being placed within the Tabs component using drag-and-drop functionality. @@ -15,13 +15,13 @@ If the builder attempts to add any of the aforementioned components inside the T ` cannot be used as a child component within the Tabs.` ::: -
+
## Properties ### Tabs -This property lets you add and remove containers from the Tabs widget. Each container in the tab has its unique `id` , `title` and `disabled` for disabling individual tabs . This field expects an array of objects. +This property lets you add and remove containers from the Tabs component. Each container in the tab has its unique `id` , `title` and `disabled` for disabling individual tabs . This field expects an array of objects. ```js {{[ @@ -49,7 +49,7 @@ This property selects the container in the tab which matches the corresponding ` ### Hide tab -It allows you to hide all the tab titles defined in the Tabs property above. It accepts boolean values which can also be set using the toggle option or programmatically by clicking on the FX button. +It allows you to hide all the tab titles defined in the Tabs property above. It accepts boolean values which can also be set using the toggle option or programmatically by clicking on the **fx** button. ### Render only active tab @@ -57,7 +57,7 @@ This property is enabled by default. When enabled, only the active tab will be r
-
+
## Events @@ -71,7 +71,7 @@ Check [Action Reference](/docs/category/actions-reference) docs to get the detai
-
+
## Component Specific Actions (CSA) @@ -83,7 +83,7 @@ Following actions of Tabs component can be controlled using the component specif
-
+
## Exposed Variables @@ -93,7 +93,7 @@ Following actions of Tabs component can be controlled using the component specif
-
+
## Actions @@ -103,18 +103,20 @@ Following actions of Tabs component can be controlled using the component specif
-
+
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
-
+
+ +---- ## Styles @@ -122,11 +124,11 @@ Following actions of Tabs component can be controlled using the component specif |:----------- |:----------- | | Highlight color | You can change the highlight color of the selected tab by entering the Hex color code or choosing a color of your choice from the color picker. | | Tab width | Tab width can be set as **auto** or **equally split**. | -| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. | -| Disable | This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. By default, it's set to `{{true}}`. | +| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | :::info -Any property having `Fx` button next to its field can be **programmatically configured**. +Any property having **fx** button next to its field can be **programmatically configured**. ::: -
\ No newline at end of file +
diff --git a/docs/docs/widgets/textarea.md b/docs/docs/widgets/textarea.md index 30746bc7a5..da6616c082 100644 --- a/docs/docs/widgets/textarea.md +++ b/docs/docs/widgets/textarea.md @@ -2,22 +2,23 @@ id: textarea title: Textarea --- + # Textarea -The **Textarea** component allows users to enter text in an input field similar to the [Text Input](/docs/widgets/text-input) component. Textarea is generally preferred when we are expecting an input of multiple sentences. In this document, we'll go through all the configuration options for the **Textarea** component. +The **Textarea** component allows users to enter text in an input field similar to the [Text Input](/docs/widgets/text-input) component. Textarea is generally preferred when we are expecting an input of multiple sentences. In this document, we'll go through all the configuration options for the **Textarea** component. -
+
## Properties -|
Property
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:-------------|:------------------------------------------------------------|:------------| -| Default value| Used to set initial value in textarea on load. It is a pre-established value that can be retrieved from the Text area component if no modifications are made to it. | Enter some text as the value (example: "John Doe")| -| Placeholder | Provides a hint for the expected value. It disappears once the user interacts with the component. | Enter some instructional text as the value (example: "Type name here") | +| Default value| Used to set initial value in textarea on load. It is a pre-established value that can be retrieved from the Text area component if no modifications are made to it. | Enter some text as the value (example: "John Doe"). | +| Placeholder | Provides a hint for the expected value. It disappears once the user interacts with the component. | Enter some instructional text as the value (example: "Type name here"). |
-
+
## Component Specific Actions (CSA) @@ -30,17 +31,17 @@ Following actions of the **Textarea** component can be controlled using Componen
-
+
## Exposed Variables | Variables | Description | How To Access | -|:---------:|:-----------:|:-------------:| +|:---------|:-----------|:-------------| |
value
| This variable holds the value entered in the text area component. | Access the value dynamically using JS. For example, `{{components.textarea1.value}}` |
-
+
## General @@ -52,32 +53,32 @@ In the input field under **Tooltip**, you can enter some text and the component
-
+
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| -|:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +|
Devices
|
Description
|
Expected Value
| +| :----------- | :----------- | :------------ | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
-
+
---- +--- ## Styles -|
Style
|
Description
|
Expected Value
| -|:---------------|:-----------|:---------------| -| Visibility | Controls the visibility of the component. If set to `{{false}}`, the component will not be visible after the app is deployed.| Use the toggle button OR click on `Fx` to pass a boolean value or a logical expression that returns a boolean value i.e. either `{{true}}` or `{{false}}`| -| Disable | Makes the component non-functional when set to true. | Use the toggle button OR click on `Fx` to pass a boolean value or a logical expression that returns a boolean value i.e. either `{{true}}` or `{{false}}`| -| Border radius | Adjusts the roundness of the component's corners. | Numeric value| +|
Style
|
Description
|
Expected Value
| +| :------------- | :-------------- | :-------------- | +| Visibility | Controls the visibility of the component. If set to `{{false}}`, the component will not be visible after the app is deployed. | Use the toggle button OR click on **fx** to pass a boolean value or a logical expression that returns a boolean value i.e. either `{{true}}` or `{{false}}`. | +| Disable | Makes the component non-functional when set to true. | Use the toggle button OR click on **fx** to pass a boolean value or a logical expression that returns a boolean value i.e. either `{{true}}` or `{{false}}`. | +| Border radius | Adjusts the roundness of the component's corners. | Numeric value |
-
+
## General @@ -85,4 +86,4 @@ In the input field under **Tooltip**, you can enter some text and the component The **Box Shadow** property is used to add shadow effects around a component's frame. You can specify the horizontal and vertical offsets(through X and Y sliders), blur and spread radius, and color of the shadow. -
\ No newline at end of file +
diff --git a/docs/docs/widgets/tree-select.md b/docs/docs/widgets/tree-select.md index ae2cd17633..3ee6dfb550 100644 --- a/docs/docs/widgets/tree-select.md +++ b/docs/docs/widgets/tree-select.md @@ -5,9 +5,9 @@ title: Tree Select # Tree Select -The **Tree Select** widget is a group checkboxes in a TreeView which can be expanded or collapsed. +The **Tree Select** component is a group checkboxes in a TreeView which can be expanded or collapsed. -
+
## Properties @@ -86,7 +86,7 @@ Similar to checked values, expanded values is an array of values passed to expan
-
+
## Events @@ -102,7 +102,7 @@ Check [Action Reference](/docs/category/actions-reference) docs to get the detai
-
+
## Component Specific Actions (CSA) @@ -110,7 +110,7 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate
-
+
## Exposed Variables @@ -123,30 +123,32 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate
-
+
## Layout |
Layout
|
Description
|
Expected Value
| |:----- |:--------- |:------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}` |
-
+
+ +--- ## Styles |
Style
|
Description
|
Default Value
| |:----- |:--------- |:------------- | -| Text color | Change the color of the text in the widget by providig the `Hex color code` or choosing a color from the picker. | | -| Checkbox color | Change the color of the toggle switch in the widget by providig the `Hex color code` or choosing a color from the picker. | | -| Visibility | This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. | By default, it's set to `{{true}}`. | -| Disable | This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. | By default, its value is set to `{{false}}`. | +| Text color | Change the color of the text in the component by providig the `Hex color code` or choosing a color from the picker. | | +| Checkbox color | Change the color of the toggle switch in the component by providig the `Hex color code` or choosing a color from the picker. | | +| Visibility | This is to control the visibility of the component. If `{{false}}` the component will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. | By default, it's set to `{{true}}`. | +| Disable | This property only accepts boolean values. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}`.| :::info -Any property having `Fx` button next to its field can be **programmatically configured**. +Any property having **fx** button next to its field can be **programmatically configured**. ::: -
\ No newline at end of file +
diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/bounded-box.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/bounded-box.md index 0b86a401ef..0650d92c31 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/bounded-box.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/bounded-box.md @@ -13,7 +13,7 @@ A **Bounded Box** is an infinitely customizable image annotation component that
-
+
## Properties @@ -27,10 +27,10 @@ A **Bounded Box** is an infinitely customizable image annotation component that |
**Property**
|
**Description**
|
**Expected Value**
| | :----------- | :----------- | :----------------- | -| Image URL | The URL or image data to show it on the component. | Get the image URL dynamically from database: `{{queries.queryname.data[0].url}}` or use [image's base64 data](/docs/how-to/loading-image-pdf-from-db/) | -| Default value | The data that will load the default bounded boxes over the image when the app is loaded. | Array of objects. Check the [Default value](#default-value) data properties | -| Selector | The bounded box support selection using rectangle or point. | Click **Fx** to set the value `RECTANGLE` or `POINT` | -| List of labels | The list of label that will be displayed in the dropdown while selection in the bounded-box. | Labels in array format: `{{['Tree', 'Car', 'Stree light']}}` | +| Image URL | The URL or image data to show it on the component. | Get the image URL dynamically from database: `{{queries.queryname.data[0].url}}` or use [image's base64 data](/docs/how-to/loading-image-pdf-from-db/).| +| Default value | The data that will load the default bounded boxes over the image when the app is loaded. | Array of objects. Check the [Default value](#default-value) data properties. | +| Selector | The bounded box support selection using rectangle or point. | Click **fx** to set the value `RECTANGLE` or `POINT`. | +| List of labels | The list of label that will be displayed in the dropdown while selection in the bounded-box. | Labels in array format: `{{['Tree', 'Car', 'Stree light']}}`. | #### Default value @@ -38,12 +38,12 @@ Provide the data that will load the default bounding boxes over the image when t |
**Property**
|
**Description**
|
**Expected Value**
| | :-------- | :------ | :-------- | -| type | Sets the type of the Bounded Box. | `RECTANGLE` or `POINT` | -| width | Sets the width of the Bounded Box in pixels. | Numeric value. If the `type` value is `POINT`, set it to `0` | -| height | Sets the height of the Bounded Box in pixels. | Numeric value. If the `type` value is `POINT`, set it to `0` | -| x | Sets the x-coordinate(horizontal) position of the Bounded Box in the image. | Numerical value ex: `41` | -| y | Sets the y-coordinate(vertical) position of the Bounded Box in the image. | Numerical value ex: `22` | -| text | Sets the text value of the Bounded Box. | It should be one of the labels provided in the **[List of labels](#properties)** property | +| type | Sets the type of the Bounded Box. | `RECTANGLE` or `POINT`. | +| width | Sets the width of the Bounded Box in pixels. | Numeric value. If the `type` value is `POINT`, set it to `0`. | +| height | Sets the height of the Bounded Box in pixels. | Numeric value. If the `type` value is `POINT`, set it to `0`. | +| x | Sets the x-coordinate(horizontal) position of the Bounded Box in the image. | Numerical value ex: `41`. | +| y | Sets the y-coordinate(vertical) position of the Bounded Box in the image. | Numerical value ex: `22`. | +| text | Sets the text value of the Bounded Box. | It should be one of the labels provided in the **[List of labels](#properties)** property. | **Example of default values:** @@ -70,7 +70,7 @@ Provide the data that will load the default bounding boxes over the image when t
-
+
## Events @@ -88,7 +88,7 @@ Check [Action Reference](/docs/category/actions-reference) docs to get the detai
-
+
## Component Specific Actions (CSA) @@ -96,7 +96,7 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate
-
+
## Exposed Variables @@ -111,11 +111,11 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate | annotations.`text` | label selected for the annotation. | | annotations.`id` | unique ID of the annotation (system generated). | -The values can be accessed dynamically using `{{components.boundedbox1.annotations[0].text}}` or `{{components.boundedbox1.annotations[1].width}}` +The values can be accessed dynamically using `{{components.boundedbox1.annotations[0].text}}` or `{{components.boundedbox1.annotations[1].width}}`.
-
+
## General @@ -131,25 +131,27 @@ A Tooltip is often used to specify the extra information when the user hovers th
-
+
-## Layout +## Devices -|
Layout
|
Description
| -| :----------- | :----------- | -| Desktop | Toggle to show or hide the component in the desktop view. Dynamically configure the value by clicking on `Fx` and entering a logical expression that results in either true or false. Alternatively, the values can be set to **`{{true}}`** or **`{{false}}`**. | -| Mobile | Toggle to show or hide the component in the desktop view. Dynamically configure the value by clicking on `Fx` and entering a logical expression that results in either true or false. Alternatively, the values can be set to **`{{true}}`** or **`{{false}}`**. | +|
Property
|
Description
|
Expected Value
| +| :----------- | :----------- | :----------------- | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
-
+--- + +
## Styles |
Style
|
Description
|
Expected Value
| | :----------- | :----------- | :----------- | -| Visibility | Toggle on or off to control the visibility of the component when the app is loaded. | **`{{true}}`** or **`{{false}}`**, By default, it's set to `{{true}}` | -| Disable | Toggle on to disable the component. | **`{{true}}`** or **`{{false}}`**, By default, it's set to `{{false}}` | -| Box shadow | Sets the add shadow effects around a component's frame. You can specify the horizontal and vertical offsets(through X and Y sliders), blur and spread radius, and color of the shadow. | Values that represent x,y, blur, spread and color. Ex: `9px 11px 5px 5px #00000040` | +| Visibility | Toggle on or off to control the visibility of the component when the app is loaded. | `{{true}}` or `{{false}}`, By default, it's set to `{{true}}`. | +| Disable | Toggle on to disable the component. | `{{true}}` or `{{false}}`, By default, it's set to `{{false}}`. | +| Box shadow | Sets the add shadow effects around a component's frame. You can specify the horizontal and vertical offsets (through X and Y sliders), blur and spread radius, and color of the shadow. | Values that represent x, y, blur, spread and color. Ex: `9px 11px 5px 5px #00000040`. |
diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/button.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/button.md index c49ef58cbc..f078f3f891 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/button.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/button.md @@ -2,11 +2,10 @@ id: button title: Button --- -# Button **Button** component can be used to trigger an action. It can be used to submit a form, navigate to another page, or trigger a query. -
+
## Properties @@ -18,8 +17,8 @@ title: Button |
Event
|
Description
| | :----------- | :----------- | -| On click | The On click event is triggered when the button is clicked. | -| On hover | The On hover event is triggered when the mouse cursor is moved over the button. | +| On click | Triggers whenever the user clicks the button. | +| On hover | Triggers whenever the user moves the mouse cursor over the button. | :::info Check [Action Reference](/docs/category/actions-reference) docs to get detailed information about all the **Actions**. @@ -27,12 +26,12 @@ Check [Action Reference](/docs/category/actions-reference) docs to get detailed |
Property
|
Description
|
Expected Value
| | :----------- | :----------- | :----------- | -| Button text | Used to set the label of the button. | Any **String** value: `Send Message`, `Delete`, or `{{queries.xyz.data.action}}` | -| Loading state | The loading state is used to show a spinner as the button content. Loading state is commonly used with isLoading property of the queries to show a loading status while a query is being run. | Toggle the switch **On** or click on **fx** to programmatically set the value to `{{true}}` or `{{false}}` | +| Button text | Used to set the label of the button. | Any **String** value: `Send Message`, `Delete`, or `{{queries.xyz.data.action}}`. | +| Loading state | The loading state is used to show a spinner as the button content. Loading state is commonly used with isLoading property of the queries to show a loading status while a query is being run. | Toggle the switch **On** or click on **fx** to programmatically set the value to `{{true}}` or `{{false}}`. |
-
+
## Component Specific Actions (CSA) @@ -48,13 +47,13 @@ Following actions of Button component can be controlled using the component spec
-
+
## Exposed Variables |
Variable
|
Description
|
How To Access
| | :----------- | :----------- | :---------- | -| buttonText | This variable stores the text displayed on the button. | Access the value dynamically through JavaScript using the following syntax: `{{components.button1.buttonText}}` | +| buttonText | This variable stores the text displayed on the button. | Access the value dynamically through JavaScript using the following syntax: `{{components.button1.buttonText}}`. | |
isValid
| Indicates if the input meets validation criteria. | Accessible dynamically with JS (for e.g., `{{components.button1.isValid}}`).| |
isLoading
| Indicates if the component is loading. | Accessible dynamically with JS (for e.g., `{{components.button1.isLoading}}`).| |
isVisible
| Indicates if the component is visible. | Accessible dynamically with JS (for e.g., `{{components.button1.isVisible}}`).| @@ -65,20 +64,20 @@ Following actions of Button component can be controlled using the component spec |
Action
|
Description
|
Configuration Options
| |:------------------|:------------|:------------------------------| -| Loading state | Enables a loading spinner, often used with `isLoading` to indicate progress. Toggle or set dynamically. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | -| Visibility | Controls component visibility. Toggle or set dynamically. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | -| Disable | Enables or disables the component. Toggle or set dynamically. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | +| Loading state | Enables a loading spinner, often used with `isLoading` to indicate progress. Toggle or set dynamically. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Visibility | Controls component visibility. Toggle or set dynamically. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Disable | Enables or disables the component. Toggle or set dynamically. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | | Tooltip | Provides additional information on hover. Set a string value for display. | String (e.g., `Button to Submit Form` ). | ## Devices **Show on desktop** -Makes the component visible in desktop view. You can set it with the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. +Makes the component visible in desktop view. You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. **Show on mobile** -Makes the component visible in mobile view. You can set it with the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. +Makes the component visible in mobile view. You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. --- @@ -90,13 +89,13 @@ Makes the component visible in mobile view. You can set it with the toggle butto |
Button Property
|
Description
|
Configuration Options
| |:------------------|:------------|:------------------------------| | Type | Sets the fill value of the Button component. | Select `Solid` for a button with a solid background and `Outline` for a transparent button with an outline. | -| Background | Sets the background color of the component. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | -| Text color | Sets the text color of the text entered in the component. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | -| Border color | Sets the border color of the component. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | -| Loader color | Sets the loader color of the component. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | -| Icon | Allows you to select an icon for the component. | Enable the icon visibility, select icon and icon color. Alternatively, you can programmatically set it using `fx`. | -| Border radius | Modifies the border radius of the component. | Enter a number or click on `fx` and enter a code that programmatically returns a numeric value. | -| Box shadow | Sets the box shadow properties of the component. | Select the box shadow color and adjust the related properties or set it programmatically using `fx`. | +| Background | Sets the background color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Text color | Sets the text color of the text entered in the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Border color | Sets the border color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Loader color | Sets the loader color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Icon | Allows you to select an icon for the component. | Enable the icon visibility, select icon and icon color. Alternatively, you can programmatically set it using **fx**. | +| Border radius | Modifies the border radius of the component. | Enter a number or click on **fx** and enter a code that programmatically returns a numeric value. | +| Box shadow | Sets the box shadow properties of the component. | Select the box shadow color and adjust the related properties or set it programmatically using **fx**. | ## Container diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/circular-progressbar.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/circular-progressbar.md index 032a2e8d69..69d5ec0445 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/circular-progressbar.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/circular-progressbar.md @@ -6,22 +6,22 @@ title: Circular Progressbar The Circular Progressbar component can be used to show progress in a progress circle. -
+
## Properties :::info -Any property having `Fx` button next to its field can be **programmatically configured**. +Any property having **fx** button next to its field can be **programmatically configured**. ::: |
Properties
|
Description
|
Expected Value
| | ----------- | ----------- | --------------- | | Text | Sets a text inside the progress circle.| It expects a `String`, you can also use js to dynamically update the text as the progress changes. | -| Progress | Sets the progress of the widget. | Progress should be an integer between 0 and 100.| +| Progress | Sets the progress of the component. | Progress should be an integer between 0 and 100.|
-
+
## Component Specific Actions (CSA) @@ -29,7 +29,7 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate
-
+
## Exposed Variables @@ -37,29 +37,31 @@ There are currently no exposed variables for the component.
-
+
## General ### Tooltip A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. -Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip.
-
+
-## Layout +## Devices -|
Layout
|
Description
| -| ----------- | ----------- | -| Show on desktop | Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on Fx to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on Fx to set the value `{{true}}` or `{{false}}`. | +|
Property
|
Description
|
Expected Value
| +| ----------- | ----------- | ----------- | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
-
+
+ +--- ## Styles @@ -71,10 +73,10 @@ Under the General accordion, you can set the value in the string format. | Stroke width | Defines the width of stroke | Value must between 0-100| | Counter clockwise | Whether to rotate progress bar in counterclockwise direction. | Accepts `{{true}}` and `{{false}}`, Default value is `false`| | Circle ratio | Defines ratio of the full circle diameter the progressbar should use. | Accepts numerical value and the default is `1` | -| Visibility | Toggle on or off to control the visibility of the widget. | Programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}` | +| Visibility | Toggle on or off to control the visibility of the component. | Programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. By default, it's set to `{{true}}` | :::info -Circular progress bar widget uses [react-circular-progress](https://github.com/kevinsqi/react-circular-progressbar) package. Check the repo for further more details about properties and styles. +Circular progress bar component uses [react-circular-progress](https://github.com/kevinsqi/react-circular-progressbar) package. Check the repo for further more details about properties and styles. ::: -
\ No newline at end of file +
diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/code-editor.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/code-editor.md index 70000f3c24..2108b6fb19 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/code-editor.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/code-editor.md @@ -2,22 +2,21 @@ id: code-editor title: Code Editor --- -# Code Editor -**Code Editor** widget is a versatile text editor for editing code and supports several languages. +**Code Editor** component is a versatile text editor for editing code and supports several languages.
-ToolJet - Widget Reference - Code editor +ToolJet - Component Reference - Code editor
-
+
## Properties :::info -Any property having `Fx` button next to its field can be **programmatically configured**. +Any property having **fx** button next to its field can be **programmatically configured**. ::: |
Property
|
Description
|
Expected Value
| @@ -166,7 +165,7 @@ Any property having `Fx` button next to its field can be **programmatically conf
-
+
## Component Specific Actions (CSA) @@ -174,46 +173,48 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate
-
+
## Exposed Variables |
Variables
|
Description
|
How To Access
| |:----------- |:----------- |:---------- | -| value | This variable holds the value whenever the user inputs anything on the code-editor . | Access the value dynamically using JS: `{{components.codeeditor1.value}}`| +| value | Holds the value of the user inputs in the code editor. | Access the value dynamically using JS (for e.g., `{{components.codeeditor1.value}}`). |
-
+
## General ### Tooltip -A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. -Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip.
-
+
## Layout |
Layout
|
Description
| |:----------- |:----------- | -| Show on desktop | Toggle on or off to display the widget in desktop view. You can programmatically determine the value by clicking on Fx to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display the widget in mobile view. You can programmatically determine the value by clicking on Fx to set the value `{{true}}` or `{{false}}`. | +| Show on desktop | Toggle on or off to display the component in desktop view. You can programmatically determine the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on mobile | Toggle on or off to display the component in mobile view. You can programmatically determine the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. |
-
+
+ +--- ## Styles |
Styles
|
Description
|
Default Value
| |:----------- |:----------- |:----------- | -| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. | By default, it's set to `{{true}}` | -| Disable | This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. | By default, its value is set to `{{false}}` | +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. | By default, it's set to `{{true}}` | +| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}` | | Border radius | Modifies the border radius of the editor. The field expects only numerical value from `1` to `100`. | Default is `0`. | -
\ No newline at end of file +
diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/color-picker.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/color-picker.md index 3f5a61006e..307ff988c7 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/color-picker.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/color-picker.md @@ -3,19 +3,17 @@ id: color-picker title: Color Picker --- -# Color Picker +**Color Picker** component is used to select the desired color from the color picker. -**Color Picker** widget is used to select the desired color from the color picker - -
+
## Properties ### Default color -The data needs to be an valid hex color +The data needs to be a valid hex color. -- One can change default color either from color picker or using `fx` (need to provide only respective hex value) +- One can change default color either from color picker or using **fx** (need to provide only respective hex value). **Example:** @@ -26,19 +24,17 @@ Invalid Color : #0000, "black" , rgb(0,0,0) ,
-
+
## Events -To add an event to a color-picker component, click on the widget handle to open the widget properties on the right sidebar. Go to the **Events** section and click on **+ Add handler**. - |
Event
|
Description
| |:----------- |:----------- | -| On change | On change event is triggered when the color is changed on the color-picker| +| On change | Triggers whenever the color is changed on the color-picker.|
-
+
## Component Specific Actions (CSA) @@ -46,44 +42,46 @@ The following actions of the component can be controlled using component specifi |
Actions
|
Description
|
How To Access
| |:----------- |:----------- |:----------- | -| setColor | Set a color on the color component via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.colorpicker1.setColor('#64A07A')` | +| setColor() | Sets a color on the color component. | Employ a RunJS query (for e.g., `await components.colorpicker1.setColor('#64A07A')`) or trigger it using an event. |
-
+
## Exposed Variables |
Variables
|
Description
|
How To Access
| |:----------- |:----------- |:---------- | -| selectedColorHex | Gets updated with HEX color code whenever a user selects a color from the color picker.| Access the value dynamically using JS: `{{components.colorpicker1.selectedColorHex}}`| -| selectedColorRGB | Gets updated with RGB color code whenever a user selects a color from the color picker. | Access the value dynamically using JS: `{{components.colorpicker1.selectedColorRGB}}`| -| selectedColorRGBA | Gets updated with RGBA color code whenever a user selects a color from the color picker.| Access the value dynamically using JS: `{{components.colorpicker1.selectedColorRGBA}}`| +| selectedColorHex | Gets updated with HEX color code whenever a user selects a color from the color picker.| Accessible dynamically with JS (for e.g., `{{components.colorpicker1.selectedColorHex}}`).| +| selectedColorRGB | Gets updated with RGB color code whenever a user selects a color from the color picker. | Accessible dynamically with JS (for e.g., `{{components.colorpicker1.selectedColorRGB}}`).| +| selectedColorRGBA | Gets updated with RGBA color code whenever a user selects a color from the color picker.| Accessible dynamically with JS (for e.g., `{{components.colorpicker1.selectedColorRGBA}}`).|
-
+
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | Programmatically determine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | Programmatically determinine the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
-
+---- + +
## Styles |
Style
|
Description
|
Expected Value
| |:---------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |:---------- | -| Visibility | Toggle on or off to control the visibility of the widget.| Programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not visible after the app is deployed. By default, it's set to `{{true}}` | +| Visibility | Toggle on or off to control the visibility of the component.| Programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not visible after the app is deployed. By default, it's set to `{{true}}`. |
-
+
## Actions @@ -92,19 +90,19 @@ The following actions of the component can be controlled using component specifi | setColor | Set the color. | `color` eg - `#ffffff` | :::info -Any property having `Fx` button next to its field can be **programmatically configured**. +Any property having **fx** button next to its field can be **programmatically configured**. ::: **Example: Selecting/changing color from the color picker and getting respective hex, rgb and rgba value of selected color** -- Let's start by creating a new app and then dragging the Color Picker widget onto the canvas. -- Click on the Color Picker widget, a picker pop-up will appear, one can select desired color from the picker. +- Let's start by creating a new app and then dragging the Color Picker component onto the canvas. +- Click on the Color Picker component, a picker pop-up will appear, one can select desired color from the picker. - In order to close the appeared picker pop-up, one need's to move away mouse from the picker pop-up and picker pop-up will fade away. -- In the Inspector, inside component, look for colorpicker, where one can get respective hex, rgb and rgba color +- In the Inspector, inside component, look for colorpicker, where one can get respective hex, rgb and rgba color.
-ToolJet - Widget Reference - Color Picker +ToolJet - Component Reference - Color Picker
-
\ No newline at end of file +
diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/date-range-picker.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/date-range-picker.md index c893615588..3086237b90 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/date-range-picker.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/date-range-picker.md @@ -2,31 +2,28 @@ id: date-range-picker title: Date-range Picker --- -# Date-Range Picker -The **Date-Range Picker** widget allows users to select a range of dates. +The **Date-Range Picker** component allows users to select a range of dates. -
+
## Properties |
Property
|
Description
| |:----------- |:----------- | -| Default start date | Set the start date to be selected by default in the widget | -| Default end date | Set the start date to be selected by default in the widget | +| Default start date | Set the start date to be selected by default in the component. | +| Default end date | Set the start date to be selected by default in the component. | | Format | The format of the date selected by the date picker. Default date format is **DD/MM/YYYY**. Date format should be followed as ISO 8601 as mentioned in the [moment documentation](https://momentjs.com/docs/). |
-
+
## Events -Date range picker supports the following events: - |
Event
|
Description
| |:----------- |:----------- | -| On select | The On select event is triggered when the a start date and end date is selected on the picker. Just like any other event on ToolJet, you can set multiple handlers for on select event. | +| On select | Triggered when a start date and end date are selected. | :::info Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. @@ -34,7 +31,7 @@ Check [Action Reference](/docs/category/actions-reference) docs to get the detai
-
+
## Component Specific Actions (CSA) @@ -42,51 +39,53 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate
-
+
## Exposed Variables |
Variables
|
Description
|
How To Access
| |:----------- |:----------- |:--------- | -| endDate | This variable holds the date of the endDate selected in the component. | Access the value dynamically using JS: `{{components.customcomponent1.data.title}}`| -| startDate | This variable holds the value assigned inside the `code` for custom component. | Access the value dynamically using JS: `{{components.customcomponent1.data.title}}`| +| endDate | This variable holds the date of the endDate selected in the component. | Access the value dynamically using JS: `{{components.customcomponent1.data.title}}`. | +| startDate | This variable holds the value assigned inside the `code` for the custom component. | Access the value dynamically using JS: `{{components.customcomponent1.data.title}}`. |
-
+
## General ### Tooltip -A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. -Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip.
-
+
## Layout |
Layout
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. |
-
+--- + +
## Styles |
Style
|
Description
|
Default Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Border radius | This is to modify the border radius of the date range picker. The field expects only numerical value from `1` to `100`| By default, it's set to `0`| -| Visibility | This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. | By default, it's set to `{{true}}`| -| Disable | This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. | By default, its value is set to `{{false}}` | +| Border radius | This is to modify the border radius of the date range picker. The field expects only numerical value from `1` to `100`. | By default, it's set to `0`. | +| Visibility | This is to control the visibility of the component. If `{{false}}` the component will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. | By default, it's set to `{{true}}`. | +| Disable | This property only accepts boolean values. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}`. | :::info -Any property having `Fx` button next to its field can be **programmatically configured**. +Any property having **fx** button next to its field can be **programmatically configured**. ::: -
\ No newline at end of file +
diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/file-picker.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/file-picker.md index 826798839b..099a2b03b8 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/file-picker.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/file-picker.md @@ -63,7 +63,7 @@ Checkout **[this](/docs/how-to/loading-image-pdf-from-db)** guide to learn how t | Actions | Description | How To Access | |:--------|:-----------|:------------| -|
clearFiles()
| You can clear the selected files on the filepicker component via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.filepicker1.clearFiles()`. | +|
clearFiles()
| Clears the selected files from the file picker component. | Employ a RunJS query (for e.g., `await components.filepicker1.clearFiles()`) or trigger it using an event. |
@@ -73,7 +73,7 @@ Checkout **[this](/docs/how-to/loading-image-pdf-from-db)** guide to learn how t |
Variables
|
Description
|
How To Access
| |:----------- |:----------- |:-------- | -| file | This variable holds the array of objects where each object represents the file loaded on the file picker component. Each object has the following keys: **name**, **type**, **content**, **dataURL**, **base64Data**, **parsedData**, **filePath**. | The values can be accesed using `{{components.filepicker1.file[0].base64Data}}`. | +| file | Holds an array of file objects loaded in the file picker, each with properties: **name**, **type**, **content**, **dataURL**, **base64Data**, **parsedData**, **filePath**. | Accessible dynamically with JS (for e.g., `{{components.filepicker1.file[0].base64Data}}`). |
@@ -106,12 +106,12 @@ Under the General accordion, you can set the value in the string format.
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/image.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/image.md index 873a044b77..d41ad2f648 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/image.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/image.md @@ -63,12 +63,12 @@ Under the General accordion, you can set the value in the string format.
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}` | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/kanban-board.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/kanban-board.md index 7abafbb3ae..5342f3933f 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/kanban-board.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/kanban-board.md @@ -3,17 +3,16 @@ id: kanban title: Kanban --- -# Kanban - The **Kanban** component allows you to visually organize and prioritize your tasks with a transparent workflow. You can set the number of columns to display, enable/disable the add cards button, and bind data to the cards. :::info Restricted components Certain components are restricted from being placed within the **Card** and **Popout** of the **Kanban** component. + - **Card**: Calendar, Kanban, Form, Tabs, Modal, ListView, Container - **Popout**: Calendar, Kanban -::: + ::: -
+
## Setting Card Data @@ -28,40 +27,41 @@ For instance, you can set the `Data` property of a Text component on a card usin
-
+
## Properties :::info + - It is mandatory to provide an `id` for each column in the `column data` field. The `id` can be of type `string` or `number`. - It is mandatory to provide an `id` and a `columnId` for each card in the `Card data` field. Both `id` and `columnId` can be of type `string` or `number`. -::: + ::: |
Properties
|
Description
|
Expected Value
| -|:----------- |:----------- |:----------- | -| Column data | Enter the columns data - `id` and `title` in the form of array of objects or from a query that returns an array of objects. | `{{[{ "id": "c1", "title": "to do" },{ "id": "c2", "title": "in progress" },{ "id": "c3", "title": "Completed" }]}}` or `{{queries.xyz.data}}` | -| Card data | Enter the cards data - `id`, `title` and `columnId` in the form of array of objects or from a query that returns an array of objects. | `{{[{ id: "r1", title: "Title 1", description: "Description 1", columnId: "c1" },{ id: "r2", title: "Title 2", description: "Description 2", columnId: "c2" },{ id: "r3", title: "Title 3", description: "Description 3",columnId: "c3" }]}}` or `{{queries.abc.data}}` | -| Card width | Set the width of the card | This property expects a numerical value. By default, the value is set to `{{302}}` | -| Card height | Set the width of the card | This property expects a numerical value. By default, the value is set to `{{100}}` | -| Enable add card | This property allows you to show or hide the **+Add Cards** button on the Kanban. | By default its enabled, you can programmatically set value to `{{true}}` or `{{false}}` to enable/disable button by clicking on the `Fx` next to it | -| Show delete button | This property allows you to show or hide the **Drop here to delete cards** section at the bottom of the Kanban. | By default its enabled, you can programmatically set value to `{{true}}` or `{{false}}` to enable/disable button by clicking on the `Fx` next to it | +| :---------------- | :------------------------ | :---------------------------- | +| Column data | Enter the columns data - `id` and `title` in the form of array of objects or from a query that returns an array of objects. | `{{[{ "id": "c1", "title": "to do" },{ "id": "c2", "title": "in progress" },{ "id": "c3", "title": "Completed" }]}}` or `{{queries.xyz.data}}`. | +| Card data | Enter the cards data - `id`, `title` and `columnId` in the form of array of objects or from a query that returns an array of objects. | `{{[{ id: "r1", title: "Title 1", description: "Description 1", columnId: "c1" },{ id: "r2", title: "Title 2", description: "Description 2", columnId: "c2" },{ id: "r3", title: "Title 3", description: "Description 3",columnId: "c3" }]}}` or `{{queries.abc.data}}`. | +| Card width | Set the width of the card. | This property expects a numerical value. By default, the value is set to `{{302}}`. | +| Card height | Set the width of the card. | This property expects a numerical value. By default, the value is set to `{{100}}`. | +| Enable add card | This property allows you to show or hide the **+Add Cards** button on the Kanban. | By default its enabled, you can programmatically set value to `{{true}}` or `{{false}}` to enable/disable button by clicking on the **fx** next to it. | +| Show delete button | This property allows you to show or hide the **Drop here to delete cards** section at the bottom of the Kanban. | By default its enabled, you can programmatically set value to `{{true}}` or `{{false}}` to enable/disable button by clicking on the **fx** next to it. |
-
+
## Events To add an event, click on the component handle to open the component properties on the right sidebar. Go to the **Events** section and click on **Add handler**. -|
Event
|
Description
| -|:----------- |:----------- | -| On Update | On update event is triggered whenever the card data (id, title, description, or columnID) is updated using the component specific actions. | -| On add card click | This event is triggered whenever the **Add card** button on the Kanban is clicked. | -| Card removed | This event is triggered whenever the card is **deleted** from the Kanban by dragging it into the bottom delete box or using component specific action. | -| Card added | This event is triggered whenever a card is **added** on the Kanban using the component specific action. | -| Card moved | This event is triggered whenever the card's position is changed on the Kanban or using the component specific action. | -| Card selected | This event is triggered whenever a card is clicked to open the modal. | +|
Event
|
Description
| +| :-------------------| :----------------| +| On Update | On update event is triggered whenever the card data (id, title, description, or columnID) is updated using the component specific actions. | +| On add card click | This event is triggered whenever the **Add card** button on the Kanban is clicked. | +| Card removed | This event is triggered whenever the card is **deleted** from the Kanban by dragging it into the bottom delete box or using component specific action. | +| Card added | This event is triggered whenever a card is **added** on the Kanban using the component specific action. | +| Card moved | This event is triggered whenever the card's position is changed on the Kanban or using the component specific action. | +| Card selected | This event is triggered whenever a card is clicked to open the modal. | Just like any other event on ToolJet, you can set multiple handlers for any of the above mentioned events. @@ -73,40 +73,41 @@ Check the **[Component Specific Action](#component-specific-actions-csa)** avail
-
+
## Exposed Variables -|
Variable
|
Description
|
How To Access
| -|:-------- |:----------- |:---------- | -| updatedCardData | The `updatedCardData` variable will hold the latest values of all the cards in the Kanban. This variable won't have any values. | It will have values only when any action on any of the card is performed like when the card is moved, added, deleted, or updated. | -| lastAddedCard | The variable `lastAddedCard` holds the values of the last added card. It holds the following data - `id`, `title`, `description` and `columnId` of the last added card. | Get the values using `{{components.kanban1.lastAddedCard.title}}` | -| lastRemovedCard | The variable `lastRemovedCard` holds the properties of the card that has been recently deleted from the Kanban. It holds the following data - `id`, `title`, `description` and `columnId` of the recently deleted card. | Get the values using `{{components.kanbanboard1.lastRemovedCard.title}}` | -| lastCardMovement | The variable `lastCardMovement` holds the properties of the card that has been recently moved from its original position. It holds the following data - `originColumnId`, `destinationColumnId`, `originCardIndex`, `destinationCardIndex` and an object `cardDetails` which includes `id`, `title`, `description` and `columnId` of the moved card. | Get the values using `{{components.kanbanboard1.lastCardMovement.cardDetails.title}}` or `{{components.kanbanboard1.lastCardMovement.destinationCardIndex}}` | -| lastSelectedCard | The variable `lastSelectedCard` holds the `id`, `title`, `columnId`, and `description` of the last selected(clicked to view) card on the Kanban. | Get the values using `{{components.kanban1.lastSelectedCard.columnId}}` | -| lastUpdatedCard | The variable `lastUpdatedCard` holds the `id`, `title`, `description`, and `columnId` of the last updated card(using component specific action). | Get the values using `{{components.kanban1.lastUpdatedCard.columnId}}` | -| lastCardUpdate | The variable `lastCardUpdate` holds the old an new values of the property that has been changed in the card(using component specific action). | Get the values using `{{components.kanban1.lastCardUpdate[0].title.oldValue}}` | +|
Variable
|
Description
|
How To Access
| +| :------------- | :----------------- | :---------------- | +| updatedCardData | The `updatedCardData` variable will hold the latest values of all the cards in the Kanban. This variable won't have any values. | It will have values only when any action on any of the card is performed like when the card is moved, added, deleted, or updated. | +| lastAddedCard | The variable `lastAddedCard` holds the values of the last added card. It holds the following data - `id`, `title`, `description` and `columnId` of the last added card. | Get the values using `{{components.kanban1.lastAddedCard.title}}`. | +| lastRemovedCard | The variable `lastRemovedCard` holds the properties of the card that has been recently deleted from the Kanban. It holds the following data - `id`, `title`, `description` and `columnId` of the recently deleted card. | Get the values using `{{components.kanbanboard1.lastRemovedCard.title}}`. | +| lastCardMovement | The variable `lastCardMovement` holds the properties of the card that has been recently moved from its original position. It holds the following data - `originColumnId`, `destinationColumnId`, `originCardIndex`, `destinationCardIndex` and an object `cardDetails` which includes `id`, `title`, `description` and `columnId` of the moved card. | Get the values using `{{components.kanbanboard1.lastCardMovement.cardDetails.title}}` or `{{components.kanbanboard1.lastCardMovement.destinationCardIndex}}`. | +| lastSelectedCard | The variable `lastSelectedCard` holds the `id`, `title`, `columnId`, and `description` of the last selected(clicked to view) card on the Kanban. | Get the values using `{{components.kanban1.lastSelectedCard.columnId}}`. | +| lastUpdatedCard | The variable `lastUpdatedCard` holds the `id`, `title`, `description`, and `columnId` of the last updated card(using component specific action). | Get the values using `{{components.kanban1.lastUpdatedCard.columnId}}`. | +| lastCardUpdate | The variable `lastCardUpdate` holds the old an new values of the property that has been changed in the card(using component specific action). | Get the values using `{{components.kanban1.lastCardUpdate[0].title.oldValue}}`. |
-
+
## Component Specific Actions (CSA) Following actions of Kanban component can be controlled using the component specific actions(CSA): -|
Actions
|
Description
|
How To Access
| -|:----------- |:----------- |:----------- | -| updateCardData | Update the card data of Kanban component via a component-specific action within any event handler.| Employ a RunJS query to execute component-specific actions such as `components.kanban1.updateCardData('c1', {title: 'New Title'})` | -| moveCard | Move a card from one column to other column on the kanban via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.kanban1.moveCard('card id,'column id')` ex: `await components.kanban1.moveCard('c1','r2')` | -| addCard | Add a card onto the kanban via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.kanban1.addCard('c1', {title: 'New Title'})` | -| deleteCard | Delete a card from the kanban via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.kanban1.deleteCard('card id')` ex: `await components.kanban1.deleteCard('c2')` | +|
Actions
|
Description
|
How To Access
| +| :-------------- | :----------------- | :--------------- | +| updateCardData | Update the card data of Kanban component via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `components.kanban1.updateCardData('c1', {title: 'New Title'})`. | +| moveCard | Move a card from one column to other column on the kanban via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.kanban1.moveCard('card id,'column id')` ex: `await components.kanban1.moveCard('c1','r2')`. | +| addCard | Add a card onto the kanban via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.kanban1.addCard('c1', {title: 'New Title'})`. | +| deleteCard | Delete a card from the kanban via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.kanban1.deleteCard('card id')` ex: `await components.kanban1.deleteCard('c2')`. |
-
+
## General + ### Tooltip A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. @@ -115,25 +116,27 @@ Under the General accordion, you can set the value in the string format.
-
+
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| -|:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +|
Property
|
Description
|
Expected Value
| +| :------------ | :------------ | :-------------- | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
-
+---- + +
## Styles -|
Style
|
Description
| -|:------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Disable | If disabled or set to `{{false}}` the component will be locked and becomes non-functional. By default, its disabled i.e. its value is set to `{{true}}` . | -| Visibility | This is to control the visibility of the component. If `{{false}}`/disabled the component will not visible after the app is deployed. By default, it's enabled (set to `{{true}}`). | -| Accent color | You can change the accent color of the column title by entering the Hex color code or choosing a color of your choice from the color picker. | +|
Style
|
Description
| +| :------------- | :------------------ | +| Disable | If disabled or set to `{{false}}` the component will be locked and becomes non-functional. By default, its disabled i.e. its value is set to `{{true}}`. | +| Visibility | This is to control the visibility of the component. If `{{false}}`/disabled the component will not visible after the app is deployed. By default, it's enabled (set to `{{true}}`). | +| Accent color | You can change the accent color of the column title by entering the Hex color code or choosing a color of your choice from the color picker. |
diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/link.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/link.md index 1da853e61f..ab2718e981 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/link.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/link.md @@ -11,9 +11,9 @@ The **Link** component allows you to add a hyperlink and navigate to the externa |
Properties
|
Description
|
Expected Value
| |:----------- |:----------- |:-------------- | -| Link target | This property sets the URL where the user needs to be taken on clicking the link. | example: `https://dev.to/tooljet` or `{{queries.xyz.data.url}}` | -| Link text | This property sets the text for the Link component. | example: **Click here** or **Open webpage** | -| Target type | This property specifies the link to be opened in the same tab or new tab on clicking the link. | Options: **New Tab** & **Same Tab** | +| Link target | This property sets the URL where the user needs to be taken on clicking the link. | example: `https://dev.to/tooljet` or `{{queries.xyz.data.url}}`. | +| Link text | This property sets the text for the Link component. | example: **Click here** or **Open webpage**. | +| Target type | This property specifies the link to be opened in the same tab or new tab on clicking the link. | Options: **New Tab** & **Same Tab**. |
@@ -23,8 +23,8 @@ The **Link** component allows you to add a hyperlink and navigate to the externa |
Event
|
Description
| |:----------- |:----------- | -| On click | **On Click** event is triggered when the link is clicked. Just like any other event on ToolJet, you can set multiple handlers for on click event. | -| On hover | **On Hover** event is triggered when the link is hovered. Just like any other event on ToolJet, you can set multiple handlers for on click event. | +| On click | Triggered when the link is clicked. | +| On hover | Triggered when the cursor hovers over the link. | :::info Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. @@ -40,7 +40,7 @@ The following actions of the link component can be controlled using the componen |
Actions
|
Description
|
How To Access
| |:----------- |:----------- |:------------ | -| click | You can trigger the click action of the Link component via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.link1.click()`. | +| click | Triggers click action of the link component. | Employ a RunJS query to execute component-specific actions such as `await components.link1.click()` or trigger it using an event. |
@@ -65,12 +65,12 @@ Under the **General** accordion, you can set the value in the string format. Now
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
@@ -84,7 +84,7 @@ Under the **General** accordion, you can set the value in the string format. Now |:----------- |:----------- | | Text color | You can change the background color of the text by entering the Hex color code or choosing a color of your choice from the color picker. | | Text size | By default, the text size is set to 14. You can enter any value from 1-100 to set a custom text size. | -| Underline | You can change the underline of the text in the following ways: **on-hover (default), never, always** | +| Underline | You can change the underline of the text in the following ways: **on-hover (default), never, always**. | | Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not visible after the app is deployed. By default, it's set to `{{true}}`. | :::info diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/map.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/map.md index fe41b20a2b..7f3b5d4155 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/map.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/map.md @@ -15,21 +15,21 @@ If you are utilizing the self-hosted version of ToolJet, it is necessary to conf
-
+
## Properties |
Properties
|
Description
|
Expected Value
| |:----------- |:----------- |:------------------ | -| Initial location | default location when the app is loaded initially. | An object containing the **latitude** and **longitude** as key value pairs. ex: `{{ {"lat": 40.7128, "lng": -73.935242} }}` | -| Default markers | Number of markers that should be shown on the map | An array of objects containing the coordinates. ex: `{{ [{"lat": 40.7128, "lng": -73.935242}, {"lat": 40.7128, "lng": -73.935242}] }}` | -| Polygon points | Create a polygon on the map using the given coordinates. | An array of objects containing the coordinates. ex: `{{ [{"lat": 40.7128, "lng": -73.935242}, {"lat": 40.7128, "lng": -73.935242}] }}` | -| Add new markers | On clicking the map, a new marker will be added to the map. | By default, it's set to `On`. Toggle `off` to disable adding new markers on the map. Click `Fx` to set `{{true}}` or `{{false}}` programmatically. | -| Search for places | Enable to show the search box on the map. | By default, it's set to `On`. Toggle `off` to disable the search box on the map. Click `Fx` to set `{{true}}` or `{{false}}` programmatically. | +| Initial location | default location when the app is loaded initially. | An object containing the **latitude** and **longitude** as key value pairs. ex: `{{ {"lat": 40.7128, "lng": -73.935242} }}`. | +| Default markers | Number of markers that should be shown on the map. | An array of objects containing the coordinates. ex: `{{ [{"lat": 40.7128, "lng": -73.935242}, {"lat": 40.7128, "lng": -73.935242}] }}`. | +| Polygon points | Create a polygon on the map using the given coordinates. | An array of objects containing the coordinates. ex: `{{ [{"lat": 40.7128, "lng": -73.935242}, {"lat": 40.7128, "lng": -73.935242}] }}`. | +| Add new markers | On clicking the map, a new marker will be added to the map. | By default, it's set to `On`. Toggle `off` to disable adding new markers on the map. Click **fx** to set `{{true}}` or `{{false}}` programmatically. | +| Search for places | Enable to show the search box on the map. | By default, it's set to `On`. Toggle `off` to disable the search box on the map. Click **fx** to set `{{true}}` or `{{false}}` programmatically. |
-
+
## Events @@ -46,7 +46,7 @@ For detailed information about all the available **Actions**, please refer to th
-
+
## Component Specific Actions (CSA) @@ -54,11 +54,11 @@ Following actions of Map component can be controlled using the component specifi |
Actions
|
Description
|
How To Access
| |:---------- |:---------- |:------- | -| setLocation | Set the marker's location on map using latitude and longitude values as parameters via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as: `component.map1.setLocation(40.7128, -73.935242)` | +| setLocation | Set the marker's location on map using latitude and longitude values as parameters via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as: `component.map1.setLocation(40.7128, -73.935242)`. |
-
+
## Exposed Variables @@ -67,18 +67,18 @@ Exposed variables can be used to get data from the component. |
Variables
|
Description
|
How To Access
| |:----------- |:----------- |:--------- | | center | This variable will hold the latitude, longitude and the google map url value. | -| center.`lat` | This variable holds the latitude value of the marker on the Map component. | Access the value dynamically using JS: `{{components.map1.center.lat}}`| -| center.`lng` | This variable gets updated with RGB color code whenever a user selects a color from the color picker. | Access the value dynamically using JS: `{{components.map1.center.lng}}`| -| center.`googleMapUrl` | This variable holds the URL of the location where the center marker is placed on the Map component. | Access the value dynamically using JS: `{{components.map1.center.googleMapUrl}}`| -| markers | The markers variable will hold the value only if `add new markers` is enabled from the map properties. Each marker is an object and will have `lat` and `lng` keys. | Access the values dynamically using `{{components.map1.markers[1].lat}}` | -| selectedMarker | Object with the marker selected by the user | -| bounds | It constructs a rectangle from the points at its south-west and north-east corners | -| bounds.northEast | It holds the latitude and longitude of the north-east corner of the rectangle.| Access the value dynamically using JS: `{{components.map1.bounds.northEast.lat}}` or `{{components.map1.bounds.northEast.lng}}` | -| bounds.southWest | It holds the latitude and longitude of the south-west corner of the rectangle. | Access the value dynamically using JS: `{{components.map1.bounds.southWest.lat}}` or `{{components.map1.bounds.southWest.lng}}` | +| center.`lat` | This variable holds the latitude value of the marker on the Map component. | Access the value dynamically using JS: `{{components.map1.center.lat}}`. | +| center.`lng` | This variable gets updated with RGB color code whenever a user selects a color from the color picker. | Access the value dynamically using JS: `{{components.map1.center.lng}}`. | +| center.`googleMapUrl` | This variable holds the URL of the location where the center marker is placed on the Map component. | Access the value dynamically using JS: `{{components.map1.center.googleMapUrl}}`. | +| markers | The markers variable will hold the value only if `add new markers` is enabled from the map properties. Each marker is an object and will have `lat` and `lng` keys. | Access the values dynamically using `{{components.map1.markers[1].lat}}`. | +| selectedMarker | Object with the marker selected by the user. | +| bounds | It constructs a rectangle from the points at its south-west and north-east corners. | +| bounds.northEast | It holds the latitude and longitude of the north-east corner of the rectangle.| Access the value dynamically using JS: `{{components.map1.bounds.northEast.lat}}` or `{{components.map1.bounds.northEast.lng}}`. | +| bounds.southWest | It holds the latitude and longitude of the south-west corner of the rectangle. | Access the value dynamically using JS: `{{components.map1.bounds.southWest.lat}}` or `{{components.map1.bounds.southWest.lng}}`. |
-
+
## General ### Tooltip @@ -87,25 +87,27 @@ A Tooltip is often used to specify the extra information when the user hovers th
-
+
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
-
+
+ +---- ## Styles |
Properties
|
Description
|
Expected Value
| |:----------- |:----------- |:------------------ | -| Visibility | Toggle on or off to control the visibility of the component. | You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the component will not be visible after the app is release. By default, it's set to `{{true}}`. | -| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. | You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | -| Box shadow | Add a shadow effect to the component by providing values to X, Y, Blur, Spread and Color. | You can also programmatically set the value by clicking on the `Fx` button next to it. Ex: `{{"x": 0, "y": 0, "blur": 0, "spread": 0, "color": "#000000"}}` | +| Visibility | Toggle on or off to control the visibility of the component. | You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is release. By default, it's set to `{{true}}`. | +| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. | You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | +| Box shadow | Add a shadow effect to the component by providing values to X, Y, Blur, Spread and Color. | You can also programmatically set the value by clicking on the **fx** button next to it. Ex: `{{"x": 0, "y": 0, "blur": 0, "spread": 0, "color": "#000000"}}`. | -
\ No newline at end of file +
diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/pagination.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/pagination.md index df11c911c2..037a769a1b 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/pagination.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/pagination.md @@ -2,7 +2,6 @@ id: pagination title: Pagination --- -# Pagination **Pagination** enables the user to select a specific page from a range of pages. It is used to separate the content into discrete pages. @@ -23,7 +22,7 @@ You can club the Pagination component with the List View component.
-## Event +## Event |
Event
|
Description
| |:------------------|:---------------------| @@ -43,10 +42,10 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate ## Exposed Variables -|
Variables
|
Description
|
How To Access
| +|
Variables
|
Description
|
How To Access
| |:----------- |:----------- |:--------- | -| totalPages | This variable holds the value of the `Number of Pages` set from the Pagination component properties. | Access the value dynamically using JS: `{{components.pagination1.totalPages}}`. | -| currentPageIndex | This variable will hold the index of the currently selected option on the Pagination component. | Access the value dynamically using JS: `{{components.pagination1.currentPageIndex}}`. | +| totalPages | Holds the value of the `Number of Pages` set from the Pagination component properties.| Accessible dynamically with JS(for e.g., `{{components.pagination1.totalPages}}`).| +| currentPageIndex | Holds the index of the currently selected option on the Pagination component. | Accessible dynamically with JS(for e.g., `{{components.pagination1.currentPageIndex}}`). |
@@ -63,12 +62,12 @@ Under the General accordion, you can set the value in the string format.
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| -|:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +|
Property
|
Description
|
Expected Value
| +|:------------ |:-------------|:--------- | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
@@ -78,10 +77,10 @@ Under the General accordion, you can set the value in the string format. ## Styles -|
Style
|
Description
|
Default Value
| +|
Style
|
Description
|
Default Value
| |:------------ |:-------------|:--------- | | Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. | By default, it's set to `{{true}}`. | -| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}`. | +| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}`. | :::info Any property having **fx** button next to its field can be **programmatically configured**. diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/qr-scanner.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/qr-scanner.md index 0127f404cd..e130b4f22e 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/qr-scanner.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/qr-scanner.md @@ -15,7 +15,7 @@ You might have to stick to the Safari browser in IOS as camera access is restric |
Event
|
Description
| |:------------------|:---------------------| -| On Detect | Triggers whenever the component successfully scans a QR code. | +| On detect | Triggers whenever the component successfully scans a QR code. | :::info Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. @@ -44,7 +44,7 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate |
Variables
|
Description
|
How To Access
| |:----------- |:----------- |:--------- | -| lastDetectedValue | This variable holds the data contained in the last QR code scanned by the component. | To fetch the data use `{{components.qrscanner1.lastDetectedValue}}`. | +| lastDetectedValue | Holds the data from the last QR code scanned by the component. | Accessible dynamically with JS (for e.g., `{{components.qrscanner1.lastDetectedValue}}`). |
@@ -63,12 +63,12 @@ Now hovering over the component will display the string as the tooltip.
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
@@ -83,4 +83,4 @@ Now hovering over the component will display the string as the tooltip. | Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. | By default, it's set to `{{true}}`. | | Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}`. | -
\ No newline at end of file +
diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/radio-button.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/radio-button.md index b53986e97a..32a29b93b0 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/radio-button.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/radio-button.md @@ -2,32 +2,33 @@ id: radio-button title: Radio Button --- + # Radio Button -The **Radio Button** widget can be used to select one option from a group of options. +The **Radio Button** component can be used to select one option from a group of options. :::tip Radio Buttons are preferred when the list of options is less than six, and all the options can be displayed at once. ::: :::info -For more than six options, consider using **[Dropdown](/docs/widgets/dropdown)** widget. +For more than six options, consider using **[Dropdown](/docs/widgets/dropdown)** component. ::: ## Properties -|
Property
|
Description
| -|:------------ |:-------------| -| Label | The text is to be used as the label for the radio button. This field expects a `String` value. | -| Default value | The value of the default option. | -| Option values | List of values for different items/options. Refer your query data with dynamic variables `{{queries.datasource.data.map(item => item.value)}}` or populate it with sample values `{{[true, false]}}`. | -| Option labels | List of labels for different items/options. Refer your query data with dynamic variables `{{queries.datasource.data.map(item => item.label)}}` or populate it with sample values `{{["yes", "no"]}}`. | +|
Property
|
Description
| +| :--------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Label | The text is to be used as the label for the radio button. This field expects a `String` value. | +| Default value | The value of the default option. | +| Option values | List of values for different items/options. Refer your query data with dynamic variables `{{queries.datasource.data.map(item => item.value)}}` or populate it with sample values `{{[true, false]}}`. | +| Option labels | List of labels for different items/options. Refer your query data with dynamic variables `{{queries.datasource.data.map(item => item.label)}}` or populate it with sample values `{{["yes", "no"]}}`. | ## Event |
Event
|
Description
| -|:------------------|:---------------------| -| On select | This event is triggered when an option is clicked. | +| :------------------------------------------ | :------------------------------------------------ | +| On select | Triggers whenever the user clicks an option. | :::info Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. @@ -37,33 +38,36 @@ Check [Action Reference](/docs/category/actions-reference) docs to get the detai The following actions of the component can be controlled using component specific actions(CSA): -|
Actions
|
Description
|
How To Access
-|:----------- |:----------- |:------- | -| selectOption | Select an option from the radio buttons via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as: `await components.radiobutton1.selectOption('one')` | +|
Actions
|
Description
|
How To Access
| +| :-------------------------------------------- | :------------------------------------------------------------------------------------------------ | :---------------------------------------------------------------------------------------------------------------------- | +| selectOption | Select an option from the radio buttons via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as: `await components.radiobutton1.selectOption('one')` | ## Exposed Variables There are currently no exposed variables for the component. ## General + ### Tooltip -A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. -Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. ## Layout -|
Layout
|
Description
|
Expected Value
| -|:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +|
Layout
|
Description
|
Expected Value
| +| :------------------------------------------- | :------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------- | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}` | + +--- ## Styles -|
Style
|
Description
|
Default Value
| -|:------------ |:-------------|:--------- | -| Text color | Change the color of the text in the widget by providing the `Hex color code` or by choosing the color of your choice from the color picker. | | -| Active color | Change the color of active radio button by providing the `Hex color code` or by choosing the color of your choice from the color picker. | | -| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. | By default, it's set to `{{true}}` | -| Disable | This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. | By default, its value is set to `{{false}}` | +|
Style
|
Description
|
Default Value
| +| :------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------- | +| Text color | Change the color of the text in the component by providing the `Hex color code` or by choosing the color of your choice from the color picker. | | +| Active color | Change the color of active radio button by providing the `Hex color code` or by choosing the color of your choice from the color picker. | | +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. | By default, it's set to `{{true}}` | +| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}` | diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/star-rating.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/star-rating.md index 31ea7f83df..ae4b5bb0ae 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/star-rating.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/star-rating.md @@ -26,7 +26,7 @@ The **Star Rating** component can be used to display as well as input ratings. T |
Event
|
Description
| |:----------- |:----------- | -| On Change | This event is triggered when a star is clicked. | +| On change | Triggers whenever the user clicks a star. | :::info Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. @@ -48,7 +48,7 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate |
Variables
|
Description
|
How To Access
| |:----------- |:----------- |:--------- | -| value | This variable holds the value whenever a rating is added on the component. The variable holds a numerical value. | Access the value dynamically using JS: `{{components.colorpicker1.selectedColorHex}}`.| +| value | Holds the value entered by the user whenever a rating is added on the component. | Accessible dynamically with JS (for e.g., `{{components.starrating1.value}}`).|
@@ -65,12 +65,12 @@ Under the General accordion, you can set the value in the string format.
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
@@ -87,4 +87,4 @@ Under the General accordion, you can set the value in the string format. | Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. | By default, it's set to `{{true}}`. | | Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}`. | -
\ No newline at end of file +
diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/steps.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/steps.md index 26d33cdea9..4fc832dab7 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/steps.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/steps.md @@ -79,15 +79,17 @@ Under the General accordion, you can set the value in the string format.
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
+--- +
## Styles diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/svg-image.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/svg-image.md index 88b5576d56..687754fe38 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/svg-image.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/svg-image.md @@ -56,21 +56,24 @@ Under the General accordion, you can set the value in the string format.
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
+--- + ## Styles -|
Style
|
Description
|
Default Value
| +|
Property
|
Description
| Configuration Options | |:------------ |:-------------|:--------- | -| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. | By default, it's set to `{{true}}`. | +| Visibility | Controls component visibility. Toggle or set dynamically. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Box-shadow | Sets the box shadow properties of the component. | Select the box shadow color and adjust the related properties or programmatically set it using **fx**. |
diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/tabs.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/tabs.md index cc001c3f55..0b0473fb60 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/tabs.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/tabs.md @@ -5,7 +5,7 @@ title: Tabs # Tabs -A **Tabs** widget contains a number of defined containers that can be navigated through the tabs. Each tab acts as a [container](/docs/widgets/container/) that can have different widgets placed inside it. +A **Tabs** component contains a number of defined containers that can be navigated through the tabs. Each tab acts as a [container](/docs/widgets/container/) that can have different component placed inside it. :::caution Restricted components In order to avoid excessively complex situations, certain components, namely **Calendar** and **Kanban**, are restricted from being placed within the Tabs component using drag-and-drop functionality. @@ -15,13 +15,13 @@ If the builder attempts to add any of the aforementioned components inside the T ` cannot be used as a child component within the Tabs.` ::: -
+
## Properties ### Tabs -This property lets you add and remove containers from the Tabs widget. Each container in the tab has its unique `id` , `title` and `disabled` for disabling individual tabs . This field expects an array of objects. +This property lets you add and remove containers from the Tabs component. Each container in the tab has its unique `id` , `title` and `disabled` for disabling individual tabs . This field expects an array of objects. ```js {{[ @@ -49,7 +49,7 @@ This property selects the container in the tab which matches the corresponding ` ### Hide tab -It allows you to hide all the tab titles defined in the Tabs property above. It accepts boolean values which can also be set using the toggle option or programmatically by clicking on the FX button. +It allows you to hide all the tab titles defined in the Tabs property above. It accepts boolean values which can also be set using the toggle option or programmatically by clicking on the **fx** button. ### Render only active tab @@ -57,7 +57,7 @@ This property is enabled by default. When enabled, only the active tab will be r
-
+
## Events @@ -71,7 +71,7 @@ Check [Action Reference](/docs/category/actions-reference) docs to get the detai
-
+
## Component Specific Actions (CSA) @@ -83,7 +83,7 @@ Following actions of Tabs component can be controlled using the component specif
-
+
## Exposed Variables @@ -93,7 +93,7 @@ Following actions of Tabs component can be controlled using the component specif
-
+
## Actions @@ -103,18 +103,20 @@ Following actions of Tabs component can be controlled using the component specif
-
+
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
-
+
+ +---- ## Styles @@ -122,11 +124,11 @@ Following actions of Tabs component can be controlled using the component specif |:----------- |:----------- | | Highlight color | You can change the highlight color of the selected tab by entering the Hex color code or choosing a color of your choice from the color picker. | | Tab width | Tab width can be set as **auto** or **equally split**. | -| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. | -| Disable | This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. By default, it's set to `{{true}}`. | +| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | :::info -Any property having `Fx` button next to its field can be **programmatically configured**. +Any property having **fx** button next to its field can be **programmatically configured**. ::: -
\ No newline at end of file +
diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/textarea.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/textarea.md index 30746bc7a5..5b3ffee785 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/textarea.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/textarea.md @@ -2,22 +2,23 @@ id: textarea title: Textarea --- + # Textarea -The **Textarea** component allows users to enter text in an input field similar to the [Text Input](/docs/widgets/text-input) component. Textarea is generally preferred when we are expecting an input of multiple sentences. In this document, we'll go through all the configuration options for the **Textarea** component. +The **Textarea** component allows users to enter text in an input field similar to the [Text Input](/docs/widgets/text-input) component. Textarea is generally preferred when we are expecting an input of multiple sentences. In this document, we'll go through all the configuration options for the **Textarea** component. -
+
## Properties -|
Property
|
Description
|
Expected Value
| +|
Property
|
Description
|
Expected Value
| |:-------------|:------------------------------------------------------------|:------------| -| Default value| Used to set initial value in textarea on load. It is a pre-established value that can be retrieved from the Text area component if no modifications are made to it. | Enter some text as the value (example: "John Doe")| -| Placeholder | Provides a hint for the expected value. It disappears once the user interacts with the component. | Enter some instructional text as the value (example: "Type name here") | +| Default value| Used to set initial value in textarea on load. It is a pre-established value that can be retrieved from the Text area component if no modifications are made to it. | Enter some text as the value (example: "John Doe"). | +| Placeholder | Provides a hint for the expected value. It disappears once the user interacts with the component. | Enter some instructional text as the value (example: "Type name here"). |
-
+
## Component Specific Actions (CSA) @@ -30,17 +31,17 @@ Following actions of the **Textarea** component can be controlled using Componen
-
+
## Exposed Variables | Variables | Description | How To Access | -|:---------:|:-----------:|:-------------:| +|:---------|:-----------|:-------------| |
value
| This variable holds the value entered in the text area component. | Access the value dynamically using JS. For example, `{{components.textarea1.value}}` |
-
+
## General @@ -52,32 +53,33 @@ In the input field under **Tooltip**, you can enter some text and the component
-
+
-## Layout +## Devices -|
Layout
|
Description
|
Expected Value
| -|:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +|
Devices
|
Description
|
Expected Value
| +| :----------- | :----------- | :------------ | +| Show on desktop | Makes the component visible in desktop view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Show on mobile | Makes the component visible in mobile view. | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. |
-
+
---- +--- ## Styles -|
Style
|
Description
|
Expected Value
| -|:---------------|:-----------|:---------------| -| Visibility | Controls the visibility of the component. If set to `{{false}}`, the component will not be visible after the app is deployed.| Use the toggle button OR click on `Fx` to pass a boolean value or a logical expression that returns a boolean value i.e. either `{{true}}` or `{{false}}`| -| Disable | Makes the component non-functional when set to true. | Use the toggle button OR click on `Fx` to pass a boolean value or a logical expression that returns a boolean value i.e. either `{{true}}` or `{{false}}`| -| Border radius | Adjusts the roundness of the component's corners. | Numeric value| +|
Style
|
Description
|
Expected Value
| +| :------------- | :-------------- | :-------------- | +| Visibility | Controls the visibility of the component. If set to `{{false}}`, the component will not be visible after the app is deployed. | Use the toggle button OR click on **fx** to pass a boolean value or a logical expression that returns a boolean value i.e. either `{{true}}` or `{{false}}`. | +| Disable | Makes the component non-functional when set to true. | Use the toggle button OR click on **fx** to pass a boolean value or a logical expression that returns a boolean value i.e. either `{{true}}` or `{{false}}`. | +| Border radius | Adjusts the roundness of the component's corners. | Numeric value | +
-
+
## General @@ -85,4 +87,4 @@ In the input field under **Tooltip**, you can enter some text and the component The **Box Shadow** property is used to add shadow effects around a component's frame. You can specify the horizontal and vertical offsets(through X and Y sliders), blur and spread radius, and color of the shadow. -
\ No newline at end of file +
diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/tree-select.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/tree-select.md index ae2cd17633..3ee6dfb550 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/tree-select.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/tree-select.md @@ -5,9 +5,9 @@ title: Tree Select # Tree Select -The **Tree Select** widget is a group checkboxes in a TreeView which can be expanded or collapsed. +The **Tree Select** component is a group checkboxes in a TreeView which can be expanded or collapsed. -
+
## Properties @@ -86,7 +86,7 @@ Similar to checked values, expanded values is an array of values passed to expan
-
+
## Events @@ -102,7 +102,7 @@ Check [Action Reference](/docs/category/actions-reference) docs to get the detai
-
+
## Component Specific Actions (CSA) @@ -110,7 +110,7 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate
-
+
## Exposed Variables @@ -123,30 +123,32 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate
-
+
## Layout |
Layout
|
Description
|
Expected Value
| |:----- |:--------- |:------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}` |
-
+
+ +--- ## Styles |
Style
|
Description
|
Default Value
| |:----- |:--------- |:------------- | -| Text color | Change the color of the text in the widget by providig the `Hex color code` or choosing a color from the picker. | | -| Checkbox color | Change the color of the toggle switch in the widget by providig the `Hex color code` or choosing a color from the picker. | | -| Visibility | This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. | By default, it's set to `{{true}}`. | -| Disable | This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. | By default, its value is set to `{{false}}`. | +| Text color | Change the color of the text in the component by providig the `Hex color code` or choosing a color from the picker. | | +| Checkbox color | Change the color of the toggle switch in the component by providig the `Hex color code` or choosing a color from the picker. | | +| Visibility | This is to control the visibility of the component. If `{{false}}` the component will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. | By default, it's set to `{{true}}`. | +| Disable | This property only accepts boolean values. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}`.| :::info -Any property having `Fx` button next to its field can be **programmatically configured**. +Any property having **fx** button next to its field can be **programmatically configured**. ::: -
\ No newline at end of file +
diff --git a/frontend/.version b/frontend/.version index a35c54823f..49b32b2c1c 100644 --- a/frontend/.version +++ b/frontend/.version @@ -1 +1 @@ -3.0.5-ce +3.1.1-ce diff --git a/frontend/assets/images/icons/widgets/index.jsx b/frontend/assets/images/icons/widgets/index.jsx index ebbb50eee0..8d6997b4c2 100644 --- a/frontend/assets/images/icons/widgets/index.jsx +++ b/frontend/assets/images/icons/widgets/index.jsx @@ -39,6 +39,7 @@ import Passwordinput from './passwordinput.jsx'; import Pdf from './pdf.jsx'; import Qrscanner from './qrscanner.jsx'; import RadioButton from './radio-button.jsx'; +import RadioButtonV2 from './radiobuttonV2.jsx'; import Rangeslider from './rangeslider.jsx'; import Rating from './rating.jsx'; import Spinner from './spinner.jsx'; @@ -140,8 +141,10 @@ const WidgetIcon = (props) => { return ; case 'qrscanner': return ; - case 'radiobutton': + case 'radiobuttonlegacy': return ; + case 'radiobutton': + return ; case 'rangeslider': return ; case 'rating': diff --git a/frontend/assets/images/icons/widgets/radiobuttonV2.jsx b/frontend/assets/images/icons/widgets/radiobuttonV2.jsx new file mode 100644 index 0000000000..28b6349eb7 --- /dev/null +++ b/frontend/assets/images/icons/widgets/radiobuttonV2.jsx @@ -0,0 +1,17 @@ +import React from 'react'; + +const RadioButtonV2 = ({ fill = '#D7DBDF', width = 24, className = '', viewBox = '0 0 49 48' }) => ( + + + + +); + +export default RadioButtonV2; diff --git a/frontend/assets/images/templates/advanced-data-visualization-dark.png b/frontend/assets/images/templates/advanced-data-visualization-dark.png new file mode 100644 index 0000000000..20b7ae8a80 Binary files /dev/null and b/frontend/assets/images/templates/advanced-data-visualization-dark.png differ diff --git a/frontend/assets/images/templates/advanced-data-visualization.png b/frontend/assets/images/templates/advanced-data-visualization.png new file mode 100644 index 0000000000..0f17cccecf Binary files /dev/null and b/frontend/assets/images/templates/advanced-data-visualization.png differ diff --git a/frontend/assets/images/templates/ai-powered-code-explainer-dark.png b/frontend/assets/images/templates/ai-powered-code-explainer-dark.png new file mode 100644 index 0000000000..b72056d307 Binary files /dev/null and b/frontend/assets/images/templates/ai-powered-code-explainer-dark.png differ diff --git a/frontend/assets/images/templates/ai-powered-code-explainer.png b/frontend/assets/images/templates/ai-powered-code-explainer.png new file mode 100644 index 0000000000..74185245e2 Binary files /dev/null and b/frontend/assets/images/templates/ai-powered-code-explainer.png differ diff --git a/frontend/assets/images/templates/ai-powered-reimbursement-tracker-with-ocr-dark.png b/frontend/assets/images/templates/ai-powered-reimbursement-tracker-with-ocr-dark.png new file mode 100644 index 0000000000..85c10bba2c Binary files /dev/null and b/frontend/assets/images/templates/ai-powered-reimbursement-tracker-with-ocr-dark.png differ diff --git a/frontend/assets/images/templates/ai-powered-reimbursement-tracker-with-ocr.png b/frontend/assets/images/templates/ai-powered-reimbursement-tracker-with-ocr.png new file mode 100644 index 0000000000..7e3611e196 Binary files /dev/null and b/frontend/assets/images/templates/ai-powered-reimbursement-tracker-with-ocr.png differ diff --git a/frontend/assets/images/templates/ai-powered-sql-query-generator-dark.png b/frontend/assets/images/templates/ai-powered-sql-query-generator-dark.png new file mode 100644 index 0000000000..501faa9716 Binary files /dev/null and b/frontend/assets/images/templates/ai-powered-sql-query-generator-dark.png differ diff --git a/frontend/assets/images/templates/ai-powered-sql-query-generator.png b/frontend/assets/images/templates/ai-powered-sql-query-generator.png new file mode 100644 index 0000000000..ebeb9c2fd9 Binary files /dev/null and b/frontend/assets/images/templates/ai-powered-sql-query-generator.png differ diff --git a/frontend/assets/images/templates/base64-encoder-decoder-dark.png b/frontend/assets/images/templates/base64-encoder-decoder-dark.png new file mode 100644 index 0000000000..152fbc65c8 Binary files /dev/null and b/frontend/assets/images/templates/base64-encoder-decoder-dark.png differ diff --git a/frontend/assets/images/templates/base64-encoder-decoder.png b/frontend/assets/images/templates/base64-encoder-decoder.png new file mode 100644 index 0000000000..4feb9f1eb4 Binary files /dev/null and b/frontend/assets/images/templates/base64-encoder-decoder.png differ diff --git a/frontend/assets/images/templates/course-management-system-dark.png b/frontend/assets/images/templates/course-management-system-dark.png new file mode 100644 index 0000000000..8b4d97c0d9 Binary files /dev/null and b/frontend/assets/images/templates/course-management-system-dark.png differ diff --git a/frontend/assets/images/templates/course-management-system.png b/frontend/assets/images/templates/course-management-system.png new file mode 100644 index 0000000000..0eaa5986ba Binary files /dev/null and b/frontend/assets/images/templates/course-management-system.png differ diff --git a/frontend/assets/images/templates/digital-asset-management-dark.png b/frontend/assets/images/templates/digital-asset-management-dark.png new file mode 100644 index 0000000000..5158cca281 Binary files /dev/null and b/frontend/assets/images/templates/digital-asset-management-dark.png differ diff --git a/frontend/assets/images/templates/digital-asset-management.png b/frontend/assets/images/templates/digital-asset-management.png new file mode 100644 index 0000000000..e98df135ea Binary files /dev/null and b/frontend/assets/images/templates/digital-asset-management.png differ diff --git a/frontend/assets/images/templates/documentation-checklist-dark.png b/frontend/assets/images/templates/documentation-checklist-dark.png new file mode 100644 index 0000000000..993e7e058a Binary files /dev/null and b/frontend/assets/images/templates/documentation-checklist-dark.png differ diff --git a/frontend/assets/images/templates/documentation-checklist.png b/frontend/assets/images/templates/documentation-checklist.png new file mode 100644 index 0000000000..0f4c03e41b Binary files /dev/null and b/frontend/assets/images/templates/documentation-checklist.png differ diff --git a/frontend/assets/images/templates/inventory-management-airtable-dark.png b/frontend/assets/images/templates/inventory-management-airtable-dark.png new file mode 100644 index 0000000000..81ee075c41 Binary files /dev/null and b/frontend/assets/images/templates/inventory-management-airtable-dark.png differ diff --git a/frontend/assets/images/templates/inventory-management-airtable.png b/frontend/assets/images/templates/inventory-management-airtable.png new file mode 100644 index 0000000000..ea1b36bb0f Binary files /dev/null and b/frontend/assets/images/templates/inventory-management-airtable.png differ diff --git a/frontend/assets/images/templates/invoice-tracker-and-generator-dark.png b/frontend/assets/images/templates/invoice-tracker-and-generator-dark.png new file mode 100644 index 0000000000..fe29f40ae7 Binary files /dev/null and b/frontend/assets/images/templates/invoice-tracker-and-generator-dark.png differ diff --git a/frontend/assets/images/templates/invoice-tracker-and-generator.png b/frontend/assets/images/templates/invoice-tracker-and-generator.png new file mode 100644 index 0000000000..59a793e131 Binary files /dev/null and b/frontend/assets/images/templates/invoice-tracker-and-generator.png differ diff --git a/frontend/assets/images/templates/json-formatter-dark.png b/frontend/assets/images/templates/json-formatter-dark.png new file mode 100644 index 0000000000..501bf49d22 Binary files /dev/null and b/frontend/assets/images/templates/json-formatter-dark.png differ diff --git a/frontend/assets/images/templates/json-formatter.png b/frontend/assets/images/templates/json-formatter.png new file mode 100644 index 0000000000..ebfb63cf16 Binary files /dev/null and b/frontend/assets/images/templates/json-formatter.png differ diff --git a/frontend/assets/images/templates/library-management-system-dark.png b/frontend/assets/images/templates/library-management-system-dark.png new file mode 100644 index 0000000000..bb7d7585fc Binary files /dev/null and b/frontend/assets/images/templates/library-management-system-dark.png differ diff --git a/frontend/assets/images/templates/library-management-system.png b/frontend/assets/images/templates/library-management-system.png new file mode 100644 index 0000000000..d0219b2945 Binary files /dev/null and b/frontend/assets/images/templates/library-management-system.png differ diff --git a/frontend/assets/images/templates/personal-finance-tracker-dark.png b/frontend/assets/images/templates/personal-finance-tracker-dark.png new file mode 100644 index 0000000000..be160e6618 Binary files /dev/null and b/frontend/assets/images/templates/personal-finance-tracker-dark.png differ diff --git a/frontend/assets/images/templates/personal-finance-tracker.png b/frontend/assets/images/templates/personal-finance-tracker.png new file mode 100644 index 0000000000..5fbb39c1ab Binary files /dev/null and b/frontend/assets/images/templates/personal-finance-tracker.png differ diff --git a/frontend/assets/images/templates/placeholder-image-generator-dark.png b/frontend/assets/images/templates/placeholder-image-generator-dark.png new file mode 100644 index 0000000000..6513a14e32 Binary files /dev/null and b/frontend/assets/images/templates/placeholder-image-generator-dark.png differ diff --git a/frontend/assets/images/templates/placeholder-image-generator.png b/frontend/assets/images/templates/placeholder-image-generator.png new file mode 100644 index 0000000000..d77849a3a0 Binary files /dev/null and b/frontend/assets/images/templates/placeholder-image-generator.png differ diff --git a/frontend/assets/images/templates/promo-code-management-postgresql-dark.png b/frontend/assets/images/templates/promo-code-management-postgresql-dark.png new file mode 100644 index 0000000000..a0a994a7b5 Binary files /dev/null and b/frontend/assets/images/templates/promo-code-management-postgresql-dark.png differ diff --git a/frontend/assets/images/templates/promo-code-management-postgresql.png b/frontend/assets/images/templates/promo-code-management-postgresql.png new file mode 100644 index 0000000000..e6ac79ae0d Binary files /dev/null and b/frontend/assets/images/templates/promo-code-management-postgresql.png differ diff --git a/frontend/assets/images/templates/real-estate-management-dark.png b/frontend/assets/images/templates/real-estate-management-dark.png new file mode 100644 index 0000000000..d813165300 Binary files /dev/null and b/frontend/assets/images/templates/real-estate-management-dark.png differ diff --git a/frontend/assets/images/templates/real-estate-management.png b/frontend/assets/images/templates/real-estate-management.png new file mode 100644 index 0000000000..1fbf7fd3ba Binary files /dev/null and b/frontend/assets/images/templates/real-estate-management.png differ diff --git a/frontend/assets/images/templates/sql-query-formatter-dark.png b/frontend/assets/images/templates/sql-query-formatter-dark.png new file mode 100644 index 0000000000..715f9d5027 Binary files /dev/null and b/frontend/assets/images/templates/sql-query-formatter-dark.png differ diff --git a/frontend/assets/images/templates/sql-query-formatter.png b/frontend/assets/images/templates/sql-query-formatter.png new file mode 100644 index 0000000000..c7f4028cb9 Binary files /dev/null and b/frontend/assets/images/templates/sql-query-formatter.png differ diff --git a/frontend/assets/images/templates/strong-password-generator-dark.png b/frontend/assets/images/templates/strong-password-generator-dark.png new file mode 100644 index 0000000000..37bb258718 Binary files /dev/null and b/frontend/assets/images/templates/strong-password-generator-dark.png differ diff --git a/frontend/assets/images/templates/strong-password-generator.png b/frontend/assets/images/templates/strong-password-generator.png new file mode 100644 index 0000000000..41c03d9175 Binary files /dev/null and b/frontend/assets/images/templates/strong-password-generator.png differ diff --git a/frontend/assets/images/templates/student-attendance-tracker-dark.png b/frontend/assets/images/templates/student-attendance-tracker-dark.png new file mode 100644 index 0000000000..68cd3f0e7c Binary files /dev/null and b/frontend/assets/images/templates/student-attendance-tracker-dark.png differ diff --git a/frontend/assets/images/templates/student-attendance-tracker.png b/frontend/assets/images/templates/student-attendance-tracker.png new file mode 100644 index 0000000000..3cb4c18698 Binary files /dev/null and b/frontend/assets/images/templates/student-attendance-tracker.png differ diff --git a/frontend/assets/images/templates/student-management-system-dark.png b/frontend/assets/images/templates/student-management-system-dark.png new file mode 100644 index 0000000000..b4848683e6 Binary files /dev/null and b/frontend/assets/images/templates/student-management-system-dark.png differ diff --git a/frontend/assets/images/templates/student-management-system.png b/frontend/assets/images/templates/student-management-system.png new file mode 100644 index 0000000000..7111f60dfa Binary files /dev/null and b/frontend/assets/images/templates/student-management-system.png differ diff --git a/frontend/assets/images/templates/task-management-system-dark.png b/frontend/assets/images/templates/task-management-system-dark.png new file mode 100644 index 0000000000..9c1c5ebbea Binary files /dev/null and b/frontend/assets/images/templates/task-management-system-dark.png differ diff --git a/frontend/assets/images/templates/task-management-system.png b/frontend/assets/images/templates/task-management-system.png new file mode 100644 index 0000000000..eb718ee16a Binary files /dev/null and b/frontend/assets/images/templates/task-management-system.png differ diff --git a/frontend/assets/images/templates/transporation-logistics-tracker-dark.png b/frontend/assets/images/templates/transporation-logistics-tracker-dark.png new file mode 100644 index 0000000000..3da10d30ed Binary files /dev/null and b/frontend/assets/images/templates/transporation-logistics-tracker-dark.png differ diff --git a/frontend/assets/images/templates/transporation-logistics-tracker.png b/frontend/assets/images/templates/transporation-logistics-tracker.png new file mode 100644 index 0000000000..7cde7650c9 Binary files /dev/null and b/frontend/assets/images/templates/transporation-logistics-tracker.png differ diff --git a/frontend/assets/images/templates/url-splitter-and-parser-dark.png b/frontend/assets/images/templates/url-splitter-and-parser-dark.png new file mode 100644 index 0000000000..dc55980327 Binary files /dev/null and b/frontend/assets/images/templates/url-splitter-and-parser-dark.png differ diff --git a/frontend/assets/images/templates/url-splitter-and-parser.png b/frontend/assets/images/templates/url-splitter-and-parser.png new file mode 100644 index 0000000000..c0c6fab6fc Binary files /dev/null and b/frontend/assets/images/templates/url-splitter-and-parser.png differ diff --git a/frontend/assets/images/templates/utf-8-encoder-and-decoder-dark.png b/frontend/assets/images/templates/utf-8-encoder-and-decoder-dark.png new file mode 100644 index 0000000000..7b3bb87e2d Binary files /dev/null and b/frontend/assets/images/templates/utf-8-encoder-and-decoder-dark.png differ diff --git a/frontend/assets/images/templates/utf-8-encoder-and-decoder.png b/frontend/assets/images/templates/utf-8-encoder-and-decoder.png new file mode 100644 index 0000000000..83aa493a53 Binary files /dev/null and b/frontend/assets/images/templates/utf-8-encoder-and-decoder.png differ diff --git a/frontend/src/AppBuilder/AppCanvas/ConfigHandle/configHandle.scss b/frontend/src/AppBuilder/AppCanvas/ConfigHandle/configHandle.scss index 4298cb9439..1f88e79baa 100644 --- a/frontend/src/AppBuilder/AppCanvas/ConfigHandle/configHandle.scss +++ b/frontend/src/AppBuilder/AppCanvas/ConfigHandle/configHandle.scss @@ -78,10 +78,6 @@ visibility: visible !important; } -.main-editor-canvas .widget-target:hover .widget-target:hover > .config-handle { - visibility: visible !important; -} - .main-editor-canvas .widget-target:hover .widget-target:hover > .widget-target > .config-handle { visibility: hidden !important; -} \ No newline at end of file +} diff --git a/frontend/src/AppBuilder/AppCanvas/Grid/Grid.jsx b/frontend/src/AppBuilder/AppCanvas/Grid/Grid.jsx index a8a10caf55..c8f1311033 100644 --- a/frontend/src/AppBuilder/AppCanvas/Grid/Grid.jsx +++ b/frontend/src/AppBuilder/AppCanvas/Grid/Grid.jsx @@ -353,6 +353,7 @@ export default function Grid({ gridWidth, currentLayout }) { // eslint-disable-next-line react-hooks/exhaustive-deps [boxList, currentLayout, gridWidth] ); + if (mode !== 'edit') return null; return ( @@ -425,6 +426,22 @@ export default function Grid({ gridWidth, currentLayout }) { document.getElementById('resize-ghost-widget').style.height = `${e.target.clientHeight}px`; } }} + onResizeStart={(e) => { + if ( + e.target.id && + useGridStore.getState().resizingComponentId !== e.target.id && + !e.target.classList.contains('delete-icon') + ) { + // When clicked on widget boundary/resizer, select the component + setSelectedComponents([e.target.id]); + } + + if (!isComponentVisible(e.target.id)) { + return false; + } + useGridStore.getState().actions.setResizingComponentId(e.target.id); + e.setMin([gridWidth, 10]); + }} onResizeEnd={(e) => { try { useGridStore.getState().actions.setResizingComponentId(null); @@ -491,13 +508,6 @@ export default function Grid({ gridWidth, currentLayout }) { useGridStore.getState().actions.setDragTarget(); toggleCanvasUpdater(); }} - onResizeStart={(e) => { - if (!isComponentVisible(e.target.id)) { - return false; - } - useGridStore.getState().actions.setResizingComponentId(e.target.id); - e.setMin([gridWidth, 10]); - }} onResizeGroupStart={({ events }) => { const parentElm = events[0].target.closest('.real-canvas'); parentElm.classList.add('show-grid'); @@ -582,7 +592,12 @@ export default function Grid({ gridWidth, currentLayout }) { onDragStart={(e) => { e?.moveable?.controlBox?.removeAttribute('data-off-screen'); const box = boxList.find((box) => box.id === e.target.id); - let isDragOnTableORCalendar = false; + + // This flag indicates whether the drag event originated on a child element within a component + // (e.g., inside a Table's columns, Calendar's dates, or Kanban's cards). + // When true, it prevents the parent component from being dragged, allowing the inner elements + // to handle their own interactions like column resizing or card dragging + let isDragOnInnerElement = false; /* If the drag or click is on a calender popup draggable interactions are not executed so that popups and other components inside calender popup works. Also user dont need to drag an calender from using popup */ @@ -593,20 +608,24 @@ export default function Grid({ gridWidth, currentLayout }) { /* Checking if the dragged elemenent is a table. If its a table drag is disabled since it will affect column resizing and reordering */ if (box?.component?.component === 'Table') { const tableElem = e.target.querySelector('.jet-data-table'); - isDragOnTableORCalendar = tableElem.contains(e.inputEvent.target); + isDragOnInnerElement = tableElem.contains(e.inputEvent.target); } if (box?.component?.component === 'Calendar') { const calenderElem = e.target.querySelector('.rbc-month-view') || e.target.querySelector('.rbc-time-view') || e.target.querySelector('.rbc-day-view'); - isDragOnTableORCalendar = calenderElem.contains(e.inputEvent.target); + isDragOnInnerElement = calenderElem.contains(e.inputEvent.target); } - if ( - ['RangeSlider', 'Container', 'BoundedBox', 'Kanban'].includes(box?.component?.component) || - isDragOnTableORCalendar - ) { + if (box?.component?.component === 'Kanban') { + const handleContainers = e.target.querySelectorAll('.handle-container'); + isDragOnInnerElement = Array.from(handleContainers).some((container) => + container.contains(e.inputEvent.target) + ); + } + + if (['RangeSlider', 'BoundedBox'].includes(box?.component?.component) || isDragOnInnerElement) { const targetElems = document.elementsFromPoint(e.clientX, e.clientY); const isHandle = targetElems.find((ele) => ele.classList.contains('handle-content')); if (!isHandle) { @@ -666,7 +685,9 @@ export default function Grid({ gridWidth, currentLayout }) { let left = e.lastEvent?.translate[0]; let top = e.lastEvent?.translate[1]; if ( - ['Listview', 'Kanban'].includes(boxList.find((box) => box.id === draggedOverElemId)?.component?.component) + ['Listview', 'Kanban', 'Container'].includes( + boxList.find((box) => box.id === draggedOverElemId)?.component?.component + ) ) { const elemContainer = e.target.closest('.real-canvas'); const containerHeight = elemContainer.clientHeight; @@ -683,10 +704,19 @@ export default function Grid({ gridWidth, currentLayout }) { if (draggedOverElemId !== currentParentId) { if (isParentChangeAllowed) { const draggedOverWidget = boxList.find((box) => box.id === draggedOverElemId); + + let parentWidgetType = boxList.find((box) => box.id === draggedOverElemId)?.component?.component; + // @TODO - When dropping back to container from canvas, the boxList doesn't have canvas header, + // boxList will return null. But we need to tell getMouseDistanceFromParentDiv parentWidgetType is container + // As container id is like 'canvas-2375e23765e-123234' + if (parentId && !parentWidgetType && draggedOverElemId.includes('-header')) { + parentWidgetType = 'Container'; + } + let { left: _left, top: _top } = getMouseDistanceFromParentDiv( e, draggedOverWidget?.component?.component === 'Kanban' ? draggedOverElem : draggedOverElemId, - boxList.find((box) => box.id === draggedOverElemId)?.component?.component + parentWidgetType ); left = _left; top = _top; diff --git a/frontend/src/AppBuilder/AppCanvas/RenderWidget.jsx b/frontend/src/AppBuilder/AppCanvas/RenderWidget.jsx index de89652d18..ec91b5fdf3 100644 --- a/frontend/src/AppBuilder/AppCanvas/RenderWidget.jsx +++ b/frontend/src/AppBuilder/AppCanvas/RenderWidget.jsx @@ -18,6 +18,7 @@ const shouldAddBoxShadowAndVisibility = [ 'ToggleSwitchV2', 'DropdownV2', 'MultiselectV2', + 'RadioButtonV2', ]; const RenderWidget = ({ @@ -175,6 +176,7 @@ const RenderWidget = ({ onComponentClick={onComponentClick} darkMode={darkMode} componentName={componentName} + dataCy={`draggable-widget-${componentName}`} />
diff --git a/frontend/src/AppBuilder/AppCanvas/Selecto.jsx b/frontend/src/AppBuilder/AppCanvas/Selecto.jsx index 6fcc85ea67..dae6fed99a 100644 --- a/frontend/src/AppBuilder/AppCanvas/Selecto.jsx +++ b/frontend/src/AppBuilder/AppCanvas/Selecto.jsx @@ -61,9 +61,8 @@ export const EditorSelecto = () => { if (selection) { selection.removeAllRanges(); } - const target = e.inputEvent.target; - // This condition is to ensure selection happens only on main app canvas and not on child containers + // This condition is to ensure selection happens only on main app canvas and not on subcontainers if (target.getAttribute('component-id') === 'canvas') { return true; } diff --git a/frontend/src/AppBuilder/AppCanvas/appCanvasConstants.js b/frontend/src/AppBuilder/AppCanvas/appCanvasConstants.js index 6d15fea9ad..a96dc9f9c7 100644 --- a/frontend/src/AppBuilder/AppCanvas/appCanvasConstants.js +++ b/frontend/src/AppBuilder/AppCanvas/appCanvasConstants.js @@ -6,7 +6,7 @@ export const CANVAS_WIDTHS = Object.freeze({ rightSideBarWidth: 300, }); -export const WIDGETS_WITH_DEFAULT_CHILDREN = ['Listview', 'Tabs', 'Form', 'Kanban']; +export const WIDGETS_WITH_DEFAULT_CHILDREN = ['Listview', 'Tabs', 'Form', 'Kanban', 'Container']; export const DEFAULT_CANVAS_WIDTH = 1292; diff --git a/frontend/src/AppBuilder/AppCanvas/appCanvasUtils.js b/frontend/src/AppBuilder/AppCanvas/appCanvasUtils.js index 6171473174..c4e4ec6402 100644 --- a/frontend/src/AppBuilder/AppCanvas/appCanvasUtils.js +++ b/frontend/src/AppBuilder/AppCanvas/appCanvasUtils.js @@ -3,7 +3,7 @@ import { deepClone } from '@/_helpers/utilities/utils.helpers'; import { componentTypes } from '../WidgetManager'; import useStore from '@/AppBuilder/_stores/store'; import { toast } from 'react-hot-toast'; -import { CANVAS_WIDTHS, NO_OF_GRIDS } from './appCanvasConstants'; +import { CANVAS_WIDTHS, NO_OF_GRIDS, WIDGETS_WITH_DEFAULT_CHILDREN } from './appCanvasConstants'; import _ from 'lodash'; export function snapToGrid(canvasWidth, x, y) { @@ -42,8 +42,6 @@ export const addNewWidgetToTheEditor = (componentType, eventMonitorObject, curre componentData.definition.others.showOnMobile.value = `{{true}}`; } - const widgetsWithDefaultComponents = ['Listview', 'Tabs', 'Form', 'Kanban']; - const nonActiveLayout = currentLayout === 'desktop' ? 'mobile' : 'desktop'; const newComponent = { id: uuidv4(), @@ -66,7 +64,7 @@ export const addNewWidgetToTheEditor = (componentType, eventMonitorObject, curre height: defaultHeight, }, }, - withDefaultChildren: widgetsWithDefaultComponents.includes(componentData.component), + withDefaultChildren: WIDGETS_WITH_DEFAULT_CHILDREN.includes(componentData.component), }; return newComponent; @@ -136,13 +134,14 @@ export function addChildrenWidgetsToParent(componentType, parentId, currentLayou } const nonActiveLayout = currentLayout === 'desktop' ? 'mobile' : 'desktop'; + const _parent = getParentComponentIdByType(child, parentMeta.component, parentId); const newChildComponent = { id: uuidv4(), name: widgetName, component: { ...componentData, - parent: parentMeta.component === 'Tabs' ? parentId + '-' + tab : parentId, + parent: getParentComponentIdByType(child, parentMeta.component, parentId), }, layouts: { [currentLayout]: { @@ -193,7 +192,8 @@ export const getAllChildComponents = (allComponents, parentId) => { const isParentTabORCalendar = allComponents[parentId]?.component?.component === 'Tabs' || allComponents[parentId]?.component?.component === 'Calendar' || - allComponents[parentId]?.component?.component === 'Kanban'; + allComponents[parentId]?.component?.component === 'Kanban' || + allComponents[parentId]?.component?.component === 'Container'; if (componentParentId && isParentTabORCalendar) { let childComponent = deepClone(allComponents[componentId]); @@ -336,7 +336,11 @@ const isChildOfTabsOrCalendar = (component, allComponents = [], componentParentI const parentComponent = allComponents?.[parentId]; if (parentComponent) { - return parentComponent.component.component === 'Tabs' || parentComponent.component.component === 'Calendar'; + return ( + parentComponent.component.component === 'Tabs' || + parentComponent.component.component === 'Calendar' || + parentComponent.component.component === 'Container' + ); } return false; @@ -457,3 +461,11 @@ export const computeViewerBackgroundColor = (isAppDarkMode, canvasBgColor) => { } return canvasBgColor; }; + +export const getParentComponentIdByType = (child, parentComponent, parentId) => { + const { tab } = child; + + if (parentComponent === 'Tabs') return `${parentId}-${tab}`; + else if (parentComponent === 'Container') return `${parentId}-header`; + return parentId; +}; diff --git a/frontend/src/AppBuilder/LeftSidebar/PageMenu/PageMenuItem.jsx b/frontend/src/AppBuilder/LeftSidebar/PageMenu/PageMenuItem.jsx index 528a2262dd..214b01435c 100644 --- a/frontend/src/AppBuilder/LeftSidebar/PageMenu/PageMenuItem.jsx +++ b/frontend/src/AppBuilder/LeftSidebar/PageMenu/PageMenuItem.jsx @@ -172,7 +172,7 @@ export const PageMenuItem = withRouter( ...computedStyles?.pill, }} > -
+
{icon()} {page.name} diff --git a/frontend/src/AppBuilder/RightSideBar/ComponentsManagerTab/ComponentsManagerTab.jsx b/frontend/src/AppBuilder/RightSideBar/ComponentsManagerTab/ComponentsManagerTab.jsx index a699b3d97f..aca9eff7cb 100644 --- a/frontend/src/AppBuilder/RightSideBar/ComponentsManagerTab/ComponentsManagerTab.jsx +++ b/frontend/src/AppBuilder/RightSideBar/ComponentsManagerTab/ComponentsManagerTab.jsx @@ -124,7 +124,7 @@ export const ComponentsManagerTab = ({ darkMode }) => { 'MultiselectV2', 'RichTextEditor', 'Checkbox', - 'RadioButton', + 'RadioButtonV2', 'Datepicker', 'DateRangePicker', 'FilePicker', diff --git a/frontend/src/AppBuilder/RightSideBar/ComponentsManagerTab/constants.js b/frontend/src/AppBuilder/RightSideBar/ComponentsManagerTab/constants.js index 82bfbfc4d2..bc7d91d4cb 100644 --- a/frontend/src/AppBuilder/RightSideBar/ComponentsManagerTab/constants.js +++ b/frontend/src/AppBuilder/RightSideBar/ComponentsManagerTab/constants.js @@ -1 +1 @@ -export const LEGACY_ITEMS = ['ToggleSwitch', 'DropDown', 'Multiselect']; +export const LEGACY_ITEMS = ['ToggleSwitch', 'DropDown', 'Multiselect', 'RadioButton']; diff --git a/frontend/src/AppBuilder/RightSideBar/Inspector/Components/Chart.jsx b/frontend/src/AppBuilder/RightSideBar/Inspector/Components/Chart.jsx index ebe03675e7..fe6c33341b 100644 --- a/frontend/src/AppBuilder/RightSideBar/Inspector/Components/Chart.jsx +++ b/frontend/src/AppBuilder/RightSideBar/Inspector/Components/Chart.jsx @@ -181,22 +181,25 @@ class Chart extends React.Component { ), }); } + } - items.push({ - title: 'Options', - children: ( - <> - {renderElement( - component, - componentMeta, - paramUpdated, - dataQueries, - 'loadingState', - 'properties', - currentState - )} - {renderElement(component, componentMeta, paramUpdated, dataQueries, 'showAxes', 'properties', currentState)} - {renderElement( + items.push({ + title: 'Options', + children: ( + <> + {renderElement( + component, + componentMeta, + paramUpdated, + dataQueries, + 'loadingState', + 'properties', + currentState + )} + {chartType !== 'pie' && + renderElement(component, componentMeta, paramUpdated, dataQueries, 'showAxes', 'properties', currentState)} + {chartType !== 'pie' && + renderElement( component, componentMeta, paramUpdated, @@ -205,10 +208,9 @@ class Chart extends React.Component { 'properties', currentState )} - - ), - }); - } + + ), + }); items.push({ title: 'Events', diff --git a/frontend/src/AppBuilder/RightSideBar/Inspector/Components/DefaultComponent.jsx b/frontend/src/AppBuilder/RightSideBar/Inspector/Components/DefaultComponent.jsx index 74ae7c6e47..8ab5c9356a 100644 --- a/frontend/src/AppBuilder/RightSideBar/Inspector/Components/DefaultComponent.jsx +++ b/frontend/src/AppBuilder/RightSideBar/Inspector/Components/DefaultComponent.jsx @@ -12,6 +12,7 @@ import { shallow } from 'zustand/shallow'; const SHOW_ADDITIONAL_ACTIONS = [ 'Text', + 'Container', 'TextInput', 'NumberInput', 'PasswordInput', @@ -20,6 +21,7 @@ const SHOW_ADDITIONAL_ACTIONS = [ 'DropdownV2', 'MultiselectV2', 'Button', + 'RichTextEditor', ]; const PROPERTIES_VS_ACCORDION_TITLE = { Text: 'Data', diff --git a/frontend/src/AppBuilder/RightSideBar/Inspector/EventManager.jsx b/frontend/src/AppBuilder/RightSideBar/Inspector/EventManager.jsx index 09c813fc7c..c3add3f1cc 100644 --- a/frontend/src/AppBuilder/RightSideBar/Inspector/EventManager.jsx +++ b/frontend/src/AppBuilder/RightSideBar/Inspector/EventManager.jsx @@ -352,6 +352,7 @@ export const EventManager = ({ actionId: 'show-alert', message: 'Hello world!', alertType: 'info', + component: eventMetaDefinition.name, ...customEventRefs, }, eventType: eventSourceType, diff --git a/frontend/src/AppBuilder/RightSideBar/Inspector/Inspector.jsx b/frontend/src/AppBuilder/RightSideBar/Inspector/Inspector.jsx index e09862bc38..fdebdaaab5 100644 --- a/frontend/src/AppBuilder/RightSideBar/Inspector/Inspector.jsx +++ b/frontend/src/AppBuilder/RightSideBar/Inspector/Inspector.jsx @@ -66,6 +66,7 @@ const NEW_REVAMPED_COMPONENTS = [ 'Checkbox', 'DropdownV2', 'MultiselectV2', + 'RadioButtonV2', 'Button', ]; @@ -702,6 +703,7 @@ const GetAccordion = React.memo( case 'DropdownV2': case 'MultiselectV2': + case 'RadioButtonV2': return { + onSelect(option.value); + fireEvent('onSelectionChange'); + }} + disabled={option.isDisabled} + /> + + + ); + })} +
+ )} +
+
+
+ {!isValid && validationError} +
+ + ); +}; diff --git a/frontend/src/Editor/Components/RadioButtonV2/radioButtonV2.scss b/frontend/src/Editor/Components/RadioButtonV2/radioButtonV2.scss new file mode 100644 index 0000000000..d7552b7bdd --- /dev/null +++ b/frontend/src/Editor/Components/RadioButtonV2/radioButtonV2.scss @@ -0,0 +1,66 @@ + /* label container */ + .radio-button-container { + position: relative; + padding-left: 22px; + margin-bottom: 8px; + margin-right: 20px; + font-size: 14px; + line-height: 20px; + font-weight: 400; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + + // /* Hide the browser's default radio button */ + .radio-button-container input { + position: absolute; + opacity: 0; + cursor: pointer; + } + + /* Create a custom radio button */ + .checkmark { + position: absolute; + top: 2px; + left: 0; + height: 16px; + width: 16px; + border-radius: 50%; + } + + // // /* On mouse-over, add a grey background color */ + // .radio-button-container:focus input ~ .checkmark { + // border-color: red + // } + + // /* When the radio button is checked */ + .radio-button-container input:checked ~ .checkmark { + background-color: var(--selected-background-color); + border-color: var(--selected-border-color); + } + + + // /* Create the indicator (the dot/circle - hidden when not checked) */ + .checkmark:after { + content: ""; + position: absolute; + display: none; + } + + // /* Show the indicator (dot/circle) when checked */ + .radio-button-container input:checked ~ .checkmark:after { + display: block; + } + + // /* Style the indicator (dot/circle) */ + .radio-button-container .checkmark:after { + transform: translate(50%, 50%); + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--selected-handle-color); + } + \ No newline at end of file diff --git a/frontend/src/Editor/Components/RichTextEditor.jsx b/frontend/src/Editor/Components/RichTextEditor.jsx index 4115d8deb8..2a591afba0 100644 --- a/frontend/src/Editor/Components/RichTextEditor.jsx +++ b/frontend/src/Editor/Components/RichTextEditor.jsx @@ -1,4 +1,5 @@ -import React, { useEffect } from 'react'; +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useEffect, useRef, useState } from 'react'; import 'draft-js/dist/Draft.css'; import { DraftEditor } from './DraftEditor'; @@ -8,17 +9,38 @@ export const RichTextEditor = function RichTextEditor({ properties, styles, setExposedVariable, + setExposedVariables, dataCy, }) { + const isInitialRender = useRef(true); const { visibility, disabledState, boxShadow } = styles; const placeholder = properties.placeholder; const defaultValue = properties?.defaultValue ?? ''; - // exposing the default value at first + const [isDisabled, setIsDisabled] = useState(disabledState); + const [isVisible, setIsVisible] = useState(visibility); + const [isLoading, setIsLoading] = useState(properties?.loadingState); + useEffect(() => { - setExposedVariable('value', defaultValue); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + if (isDisabled !== disabledState) setIsDisabled(disabledState); + if (isVisible !== visibility) setIsVisible(visibility); + if (isLoading !== properties.loadingState) setIsLoading(properties.loadingState); + }, [properties.loadingState, styles.visibility, styles.disabledState]); + + useEffect(() => { + if (isInitialRender.current) return; + setExposedVariable('isDisabled', disabledState); + }, [disabledState]); + + useEffect(() => { + if (isInitialRender.current) return; + setExposedVariable('isVisible', visibility); + }, [visibility]); + + useEffect(() => { + if (isInitialRender.current) return; + setExposedVariable('isLoading', isLoading); + }, [isLoading]); function handleChange(html) { setExposedVariable('value', html); @@ -26,16 +48,25 @@ export const RichTextEditor = function RichTextEditor({ return (
); diff --git a/frontend/src/Editor/Inspector/Elements/Components/ToolTip.jsx b/frontend/src/Editor/Inspector/Elements/Components/ToolTip.jsx index 218bbe5e24..57e653ae4c 100644 --- a/frontend/src/Editor/Inspector/Elements/Components/ToolTip.jsx +++ b/frontend/src/Editor/Inspector/Elements/Components/ToolTip.jsx @@ -18,8 +18,12 @@ export const ToolTip = ({ label, meta, labelClass, bold = false }) => { if (meta?.tip) { return ( - -
-