diff --git a/.github/config.json b/.github/config.json index 1e541bd76b49..b7fe7053c0d5 100644 --- a/.github/config.json +++ b/.github/config.json @@ -1 +1 @@ -{"runners":[{"versioning":{"source":"milestones","type":"SemVer"},"prereleaseName":"alpha","issue":{"labels":{"Widgets Product":{"conditions":[{"label":"Button Widget","type":"hasLabel","value":true},{"label":"Chart Widget","type":"hasLabel","value":true},{"label":"Container Widget","type":"hasLabel","value":true},{"label":"Date Picker Widget","type":"hasLabel","value":true},{"label":"Select Widget","type":"hasLabel","value":true},{"label":"File Picker Widget","type":"hasLabel","value":true},{"label":"Form Widget","type":"hasLabel","value":true},{"label":"Image Widget","type":"hasLabel","value":true},{"label":"Input Widget","type":"hasLabel","value":true},{"label":"List Widget","type":"hasLabel","value":true},{"label":"MultiSelect Widget","type":"hasLabel","value":true},{"label":"Map Widget","type":"hasLabel","value":true},{"label":"Modal Widget","type":"hasLabel","value":true},{"label":"Radio Widget","type":"hasLabel","value":true},{"label":"Rich Text Editor Widget","type":"hasLabel","value":true},{"label":"Tab Widget","type":"hasLabel","value":true},{"label":"Table Widget","type":"hasLabel","value":true},{"label":"Text Widget","type":"hasLabel","value":true},{"label":"Video Widget","type":"hasLabel","value":true},{"label":"iFrame","type":"hasLabel","value":true},{"label":"Menu Button","type":"hasLabel","value":true},{"label":"Rating","type":"hasLabel","value":true},{"label":"Widget Validation","type":"hasLabel","value":true},{"label":"New Widget","type":"hasLabel","value":true},{"label":"Switch widget","type":"hasLabel","value":true},{"label":"Audio Widget","type":"hasLabel","value":true},{"label":"Icon Button Widget","type":"hasLabel","value":true},{"label":"Stat Box Widget","type":"hasLabel","value":true},{"label":"Voice Recorder Widget","type":"hasLabel","value":true},{"label":"Calendar Widget","type":"hasLabel","value":true},{"label":"Menu Button Widget","type":"hasLabel","value":true},{"label":"Divider Widget","type":"hasLabel","value":true},{"label":"Rating Widget","type":"hasLabel","value":true},{"label":"View Mode","type":"hasLabel","value":true},{"label":"Widget Property","type":"hasLabel","value":true},{"label":"Document Viewer Widget","type":"hasLabel","value":true},{"label":"Radio Group Widget","type":"hasLabel","value":true},{"label":"Currency Input Widget","type":"hasLabel","value":true},{"label":"TreeSelect","type":"hasLabel","value":true},{"label":"MultiTree Select Widget","type":"hasLabel","value":true},{"label":"Phone Input Widget","type":"hasLabel","value":true},{"label":"JSON Form","type":"hasLabel","value":true},{"label":"All Widgets","type":"hasLabel","value":true},{"label":"Button Group widget","type":"hasLabel","value":true},{"label":"Progress bar widget","type":"hasLabel","value":true},{"label":"Audio Recorder Widget","type":"hasLabel","value":true},{"label":"Camera Widget","type":"hasLabel","value":true},{"label":"Table Widget V2","type":"hasLabel","value":true},{"label":"Map Chart Widget","type":"hasLabel","value":true},{"label":"Code Scanner Widget","type":"hasLabel","value":true},{"label":"Widget keyboard accessibility","type":"hasLabel","value":true},{"label":"List Widget V2","type":"hasLabel","value":true},{"label":"Slider Widget","type":"hasLabel","value":true},{"label":"One-click Binding","type":"hasLabel","value":true},{"label":"Old widget version","type":"hasLabel","value":true},{"label":"Widget Discoverability","type":"hasLabel","value":true},{"label":"Switch Group Widget","type":"hasLabel","value":true},{"label":"Checkbox Group widget","type":"hasLabel","value":true},{"label":"Checkbox Widget","type":"hasLabel","value":true},{"label":"Table Inline Edit","type":"hasLabel","value":true},{"label":"Custom Widgets","type":"hasLabel","value":true}],"requires":1},"Javascript Product":{"conditions":[{"label":"JS Linting & Errors","type":"hasLabel","value":true},{"label":"Autocomplete","type":"hasLabel","value":true},{"label":"Evaluated Value","type":"hasLabel","value":true},{"label":"Slash Command","type":"hasLabel","value":true},{"label":"New JS Function","type":"hasLabel","value":true},{"label":"JS Usability","type":"hasLabel","value":true},{"label":"Framework Functions","type":"hasLabel","value":true},{"label":"JS Objects","type":"hasLabel","value":true},{"label":"JS Evaluation","type":"hasLabel","value":true},{"label":"Custom JS Libraries","type":"hasLabel","value":true},{"label":"Action Selector","type":"hasLabel","value":true},{"label":"Widget setter method","type":"hasLabel","value":true},{"label":"Entity Refactor","type":"hasLabel","value":true},{"label":"AST-frontend","type":"hasLabel","value":true},{"label":"Sniping Mode","type":"hasLabel","value":true},{"label":"AST-backend","type":"hasLabel","value":true}],"requires":1},"IDE Product":{"conditions":[{"label":"IDE Product","type":"hasLabel","value":true},{"label":"IDE Infra","type":"hasLabel","value":true},{"label":"IDE Navigation","type":"hasLabel","value":true},{"label":"IDE tabs","type":"hasLabel","value":true},{"label":"Omnibar","type":"hasLabel","value":true},{"label":"Entity Explorer","type":"hasLabel","value":true},{"label":"Page Management","type":"hasLabel","value":true},{"label":"Preview mode","type":"hasLabel","value":true}],"requires":1},"Accelerators Product":{"conditions":[{"label":"Generate Page","type":"hasLabel","value":true},{"label":"Building blocks","type":"hasLabel","value":true}],"requires":1},"Templates Product":{"conditions":[{"label":"Partial-import-export","type":"hasLabel","value":true},{"label":"Templates Product","type":"hasLabel","value":true}],"requires":1},"Design System Product":{"conditions":[{"label":"Design System Product","type":"hasLabel","value":true},{"label":"ADS Component Issue","type":"hasLabel","value":true},{"label":"Keyboard accessibility ","type":"hasLabel","value":true},{"label":"Toggle button","type":"hasLabel","value":true},{"label":"ADS Category Token","type":"hasLabel","value":true},{"label":"ADS Component Documentation","type":"hasLabel","value":true},{"label":"ADS Migration","type":"hasLabel","value":true},{"label":"ADS Deduplication ","type":"hasLabel","value":true},{"label":"ADS Revamp","type":"hasLabel","value":true},{"label":"ADS Deduplication","type":"hasLabel","value":true},{"label":"ADS Unit Test","type":"hasLabel","value":true},{"label":"ADS Components","type":"hasLabel","value":true},{"label":"ADS Grayscale","type":"hasLabel","value":true},{"label":"Design System","type":"hasLabel","value":true},{"label":"ADS Typography","type":"hasLabel","value":true},{"label":"ADS Visual Styles","type":"hasLabel","value":true},{"label":"ADS Component Design","type":"hasLabel","value":true},{"label":"Modal Component","type":"hasLabel","value":true},{"label":"ADS Spacing","type":"hasLabel","value":true},{"label":"ads unit test","type":"hasLabel","value":true},{"label":"ads revamp","type":"hasLabel","value":true},{"label":"ads deduplication","type":"hasLabel","value":true}],"requires":1},"RBAC Product":{"conditions":[{"label":"Invite users","type":"hasLabel","value":true},{"label":"RBAC Product","type":"hasLabel","value":true}],"requires":1},"Workspace Product":{"conditions":[{"label":"Home Page","type":"hasLabel","value":true},{"label":"Workspace Product","type":"hasLabel","value":true}],"requires":1},"Billing & Licensing Product":{"conditions":[{"label":"Customer Portal","type":"hasLabel","value":true},{"label":"Cloud Services","type":"hasLabel","value":true},{"label":"Billing","type":"hasLabel","value":true},{"label":"Self Serve","type":"hasLabel","value":true},{"label":"Enterprise Billing","type":"hasLabel","value":true},{"label":"Analytics Improvements","type":"hasLabel","value":true},{"label":"Self Serve 1.0","type":"hasLabel","value":true},{"label":"License","type":"hasLabel","value":true},{"label":"BE instance","type":"hasLabel","value":true},{"label":"Invite flow","type":"hasLabel","value":true},{"label":"CE Instance Usage","type":"hasLabel","value":true},{"label":"Feature Flagging","type":"hasLabel","value":true}],"requires":1},"Packages Product":{"conditions":[{"label":"Packages Product","type":"hasLabel","value":true}],"requires":1},"Environments Product":{"conditions":[{"label":"Environments Product","type":"hasLabel","value":true}],"requires":1},"UI Building Product":{"conditions":[{"label":"Property Pane","type":"hasLabel","value":true},{"label":"Copy Paste","type":"hasLabel","value":true},{"label":"Drag & Drop","type":"hasLabel","value":true},{"label":"Undo/Redo","type":"hasLabel","value":true},{"label":"Widgets Pane","type":"hasLabel","value":true},{"label":"UI Performance","type":"hasLabel","value":true},{"label":"Widget Grouping","type":"hasLabel","value":true},{"label":"Reflow & Resize","type":"hasLabel","value":true},{"label":"Canvas / Grid","type":"hasLabel","value":true},{"label":"Auto Height","type":"hasLabel","value":true},{"label":"Browser specific","type":"hasLabel","value":true},{"label":"Auto Layout","type":"hasLabel","value":true},{"label":"Fixed layout","type":"hasLabel","value":true},{"label":"App Navigation","type":"hasLabel","value":true}],"requires":1},"Onboarding Product":{"conditions":[{"label":"Welcome Screen","type":"hasLabel","value":true}],"requires":1},"Git Product":{"conditions":[{"label":"Git Product","type":"hasLabel","value":true},{"label":"Git Auto-commit","type":"hasLabel","value":true},{"label":"Auto-commit","type":"hasLabel","value":true},{"label":"Continuous Deployment","type":"hasLabel","value":true},{"label":"Default branch","type":"hasLabel","value":true},{"label":"Git status","type":"hasLabel","value":true},{"label":"Git performance","type":"hasLabel","value":true},{"label":"SDLC","type":"hasLabel","value":true},{"label":"Git IA","type":"hasLabel","value":true},{"label":"Branch management","type":"hasLabel","value":true}],"requires":1},"Embedding Apps Product":{"conditions":[{"label":"Embedding Apps Product","type":"hasLabel","value":true}],"requires":1},"Integrations Product":{"conditions":[{"label":"New Datasource","type":"hasLabel","value":true},{"label":"Firestore","type":"hasLabel","value":true},{"label":"Google Sheets","type":"hasLabel","value":true},{"label":"Mongo","type":"hasLabel","value":true},{"label":"Redshift","type":"hasLabel","value":true},{"label":"snowflake","type":"hasLabel","value":true},{"label":"S3","type":"hasLabel","value":true},{"label":"Redis","type":"hasLabel","value":true},{"label":"Postgres","type":"hasLabel","value":true},{"label":"GraphQL Plugin","type":"hasLabel","value":true},{"label":"ArangoDB","type":"hasLabel","value":true},{"label":"MsSQL","type":"hasLabel","value":true},{"label":"Elastic Search","type":"hasLabel","value":true},{"label":"OAuth","type":"hasLabel","value":true},{"label":"Airtable","type":"hasLabel","value":true},{"label":"CURL","type":"hasLabel","value":true},{"label":"DynamoDB","type":"hasLabel","value":true},{"label":"Zendesk","type":"hasLabel","value":true},{"label":"Hubspot","type":"hasLabel","value":true},{"label":"Query Forms","type":"hasLabel","value":true},{"label":"Twilio","type":"hasLabel","value":true},{"label":"MySQL","type":"hasLabel","value":true},{"label":"Connection pool","type":"hasLabel","value":true},{"label":"MariaDB","type":"hasLabel","value":true},{"label":"Integrations Pod General","type":"hasLabel","value":true},{"label":"SMTP plugin","type":"hasLabel","value":true},{"label":"Oracle SQL DB","type":"hasLabel","value":true},{"label":"Query filter","type":"hasLabel","value":true},{"label":"Activation - datasources","type":"hasLabel","value":true},{"label":"REST API","type":"hasLabel","value":true},{"label":"REST API","type":"hasLabel","value":true},{"label":"Datasources","type":"hasLabel","value":true},{"label":"REST API plugin","type":"hasLabel","value":true},{"label":"Prepared statements","type":"hasLabel","value":true},{"label":"Query Generation","type":"hasLabel","value":true},{"label":"Core Query Execution","type":"hasLabel","value":true},{"label":"Query Management","type":"hasLabel","value":true},{"label":"Query Settings","type":"hasLabel","value":true},{"label":"Query performance","type":"hasLabel","value":true},{"label":"Datatype issue","type":"hasLabel","value":true},{"label":"SmartSubstitution","type":"hasLabel","value":true},{"label":"Suggested Widgets","type":"hasLabel","value":true},{"label":"SAAS Plugins","type":"hasLabel","value":true},{"label":"Reconnect DS modal","type":"hasLabel","value":true},{"label":"OnPageLoad","type":"hasLabel","value":true},{"label":"File upload issues","type":"hasLabel","value":true},{"label":"AI","type":"hasLabel","value":true},{"label":"Appsmith AI","type":"hasLabel","value":true},{"label":"Database Schema","type":"hasLabel","value":true}],"requires":1},"Identity & Authentication Product":{"conditions":[{"label":"Login / Signup","type":"hasLabel","value":true},{"label":"SSO","type":"hasLabel","value":true},{"label":"SCIM","type":"hasLabel","value":true},{"label":"Email verification","type":"hasLabel","value":true}],"requires":1},"Artifact Platform Product":{"conditions":[{"label":"Fork App","type":"hasLabel","value":true},{"label":"Publish App","type":"hasLabel","value":true},{"label":"Secret Management","type":"hasLabel","value":true},{"label":"Import-Export-App","type":"hasLabel","value":true}],"requires":1},"DevOps Pod":{"conditions":[{"label":"Docker","type":"hasLabel","value":true},{"label":"Super Admin","type":"hasLabel","value":true},{"label":"Deployment","type":"hasLabel","value":true},{"label":"K8s","type":"hasLabel","value":true},{"label":"Email Config","type":"hasLabel","value":true},{"label":"Backup & Restore","type":"hasLabel","value":true},{"label":"AWS AMI","type":"hasLabel","value":true},{"label":"Observability","type":"hasLabel","value":true},{"label":"Heroku","type":"hasLabel","value":true},{"label":"New Deployment Mode","type":"hasLabel","value":true},{"label":"Supervisor","type":"hasLabel","value":true},{"label":"Deployment Certificates","type":"hasLabel","value":true},{"label":"Mock Data","type":"hasLabel","value":true},{"label":"AWS ECS","type":"hasLabel","value":true},{"label":"Ingress","type":"hasLabel","value":true},{"label":"Nginx","type":"hasLabel","value":true},{"label":"Setup Issues","type":"hasLabel","value":true}],"requires":1},"Performance Pod":{"conditions":[{"label":"Performance","type":"hasLabel","value":true},{"label":"Performance infra","type":"hasLabel","value":true}],"requires":1},"IDE Pod":{"conditions":[{"label":"Telemetry","type":"hasLabel","value":true},{"label":"i18n","type":"hasLabel","value":true},{"label":"IDE Product","type":"hasLabel","value":true},{"label":"App setting","type":"hasLabel","value":true},{"label":"Debugger Product","type":"hasLabel","value":true},{"label":"Embedding Apps Product","type":"hasLabel","value":true}],"requires":1},"Platform Administration Pod":{"conditions":[{"label":"Airgap","type":"hasLabel","value":true},{"label":"Enterprise Edition","type":"hasLabel","value":true},{"label":"Invite flow","type":"hasLabel","value":true},{"label":"User Profile","type":"hasLabel","value":true},{"label":"User Session ","type":"hasLabel","value":true},{"label":"User Session","type":"hasLabel","value":true},{"label":"Admin Settings Product","type":"hasLabel","value":true},{"label":"RBAC Product","type":"hasLabel","value":true},{"label":"Workspace Product","type":"hasLabel","value":true},{"label":"Branding Product","type":"hasLabel","value":true},{"label":"Audit Logs Product","type":"hasLabel","value":true},{"label":"Identity & Authentication Product","type":"hasLabel","value":true}],"requires":1},"DB Infrastructure Pod":{"conditions":[{"label":"Move to Postgres","type":"hasLabel","value":true}],"requires":1},"Widgets & Accelerators Pod":{"conditions":[{"label":"Accelerators Product","type":"hasLabel","value":true},{"label":"Templates Product","type":"hasLabel","value":true},{"label":"Widgets Product","type":"hasLabel","value":true},{"label":"App Theming Product","type":"hasLabel","value":true}],"requires":1},"Packages Pod":{"conditions":[{"label":"Module creator","type":"hasLabel","value":true},{"label":"Module consumer","type":"hasLabel","value":true},{"label":"Package versioning","type":"hasLabel","value":true},{"label":"Convert to module","type":"hasLabel","value":true},{"label":"Query module","type":"hasLabel","value":true},{"label":"JS module","type":"hasLabel","value":true},{"label":"UI module","type":"hasLabel","value":true},{"label":"Packages Pod","type":"hasLabel","value":true}],"requires":1},"Workflows Pod":{"conditions":[{"label":"Workflows Product","type":"hasLabel","value":true}],"requires":1},"Query & JS Pod":{"conditions":[{"label":"Javascript Product","type":"hasLabel","value":true},{"label":"Onboarding Product","type":"hasLabel","value":true},{"label":"Integrations Product","type":"hasLabel","value":true},{"label":"Reconfigure Datasource Modal","type":"hasLabel","value":true}],"requires":1},"QA Pod":{"conditions":[{"label":"QA","type":"hasLabel","value":true},{"label":"Automation Test","type":"hasLabel","value":true},{"label":"TestGap","type":"hasLabel","value":true},{"label":"Automation failures","type":"hasLabel","value":true},{"label":"Needs automation","type":"hasLabel","value":true}],"requires":1},"Anvil POD":{"conditions":[{"label":"Checkbox Component","type":"hasLabel","value":true},{"label":"WDS team","type":"hasLabel","value":true},{"label":"Anvil POD","type":"hasLabel","value":true},{"label":"WDS - all widgets","type":"hasLabel","value":true},{"label":"WDS - input widget","type":"hasLabel","value":true},{"label":"WDS - paragraph widget","type":"hasLabel","value":true},{"label":"WDS - statbox widget","type":"hasLabel","value":true},{"label":"WDS - modal widget","type":"hasLabel","value":true},{"label":"WDS - icon widget","type":"hasLabel","value":true},{"label":"WDS - checkbox widget","type":"hasLabel","value":true},{"label":"WDS - table widget","type":"hasLabel","value":true},{"label":"WDS - keyValue widget","type":"hasLabel","value":true},{"label":"WDS - switch group widget","type":"hasLabel","value":true},{"label":"WDS - theming","type":"hasLabel","value":true},{"label":"Anvil layout","type":"hasLabel","value":true},{"label":"Anvil - theming","type":"hasLabel","value":true},{"label":"Anvil - vertical alignment","type":"hasLabel","value":true},{"label":"Anvil - layout component","type":"hasLabel","value":true},{"label":"Anvil - drag & drop","type":"hasLabel","value":true},{"label":"Anvil - zones & sections","type":"hasLabel","value":true},{"label":"Anvil - copy paste experience","type":"hasLabel","value":true},{"label":"WDS - phone widget","type":"hasLabel","value":true},{"label":"WDS - responsive widget","type":"hasLabel","value":true},{"label":"Anvil - responsive viewport","type":"hasLabel","value":true},{"label":"WDS - widget styling","type":"hasLabel","value":true},{"label":"Anvil - spacing","type":"hasLabel","value":true},{"label":"Anvil - responsive canvas","type":"hasLabel","value":true},{"label":"WDS - inline button widget","type":"hasLabel","value":true},{"label":"Anvil team","type":"hasLabel","value":true}],"requires":1},"Activation Pod":{"conditions":[{"label":"Activation","type":"hasLabel","value":true}],"requires":1},"Stability Pod":{"conditions":[{"label":"Stability Issue","type":"hasLabel","value":true},{"label":"cypress-flaky-fix","type":"hasLabel","value":true},{"label":"Cypress flaky tests","type":"hasLabel","value":true}],"requires":1},"Documentation Pod":{"conditions":[{"label":"Documentation","type":"hasLabel","value":true}],"requires":1},"Packages & Git Pod":{"conditions":[{"label":"Packages Pod","type":"hasLabel","value":true},{"label":"Git Product","type":"hasLabel","value":true},{"label":"Packages Product","type":"hasLabel","value":true},{"label":"Git Platform","type":"hasLabel","value":true}],"requires":1},"Git Platform":{"conditions":[{"label":"Environments Product","type":"hasLabel","value":true},{"label":"Artifact Platform Product","type":"hasLabel","value":true}],"requires":1}}},"root":"."}],"labels":{"Tab Widget":{"color":"e2c76c","name":"Tab Widget","description":""},"Dont merge":{"color":"ADB39C","name":"Dont merge","description":""},"Epic":{"color":"3E4B9E","name":"Epic","description":"A zenhub epic that describes a project"},"Menu Button Widget":{"color":"235708","name":"Menu Button Widget","description":"Issues related to Menu Button widget"},"Checkbox Group widget":{"color":"bbeecd","name":"Checkbox Group widget","description":"Issues related to Checkbox Group Widget"},"Input Widget":{"color":"ae65d8","name":"Input Widget","description":""},"Security":{"color":"99139C","name":"Security","description":""},"QA":{"color":"","name":"QA","description":"Needs QA attention"},"Verified":{"color":"9bf416","name":"Verified","description":""},"Wont Fix":{"color":"ffffff","name":"Wont Fix","description":"This will not be worked on"},"MySQL":{"color":"c9ddc6","name":"MySQL","description":"Issues related to MySQL plugin"},"Development":{"color":"9F8A02","name":"Development","description":""},"Help Wanted":{"color":"008672","name":"Help Wanted","description":"Extra attention is needed"},"Home Page":{"color":"","name":"Home Page","description":"Issues related to the application home page"},"Rating Widget":{"color":"235708","name":"Rating Widget","description":"Issues related to the rating widget"},"Stat Box Widget":{"color":"f1c9ce","name":"Stat Box Widget","description":"Issues related to stat box"},"Enhancement":{"color":"a2eeef","name":"Enhancement","description":"New feature or request"},"Fork App":{"color":"af87c7","name":"Fork App","description":"Issues related to forking apps"},"Container Widget":{"color":"19AD0D","name":"Container Widget","description":"Container widget"},"Papercut":{"color":"B562F6","name":"Papercut","description":""},"Needs Design":{"color":"bfd4f2","name":"Needs Design","description":"needs design or changes to design"},"i18n":{"color":"1799b0","name":"i18n","description":"Represents issues that need to be tackled to handle internationalization"},"Rich Text Editor Widget":{"color":"f72cac","name":"Rich Text Editor Widget","description":""},"skip-changelog":{"color":"06086F","name":"skip-changelog","description":"Adding this label to a PR prevents it from being listed in the changelog"},"Low":{"color":"79e53b","name":"Low","description":"An issue that is neither critical nor breaks a user flow"},"potential-duplicate":{"color":"d3cb2e","name":"potential-duplicate","description":"This label marks issues that are potential duplicates of already open issues"},"Audio Widget":{"color":"447B9A","name":"Audio Widget","description":"Issues related to Audio Widget"},"Firestore":{"color":"8078b0","name":"Firestore","description":"Issues related to the firestore Integration"},"New Widget":{"color":"be4cf2","name":"New Widget","description":"A request for a new widget"},"Modal Widget":{"color":"03846f","name":"Modal Widget","description":""},"UX Improvement":{"color":"f4a089","name":"UX Improvement","description":""},"S3":{"color":"8078b0","name":"S3","description":"Issues related to the S3 plugin"},"Release Blocker":{"color":"5756bf","name":"Release Blocker","description":"This issue must be resolved before the release"},"safari":{"color":"51C6AA","name":"safari","description":"Bugs seen on safari browser"},"Example Apps":{"color":"1799b0","name":"Example Apps","description":"Example apps created for new signups"},"MultiSelect Widget":{"color":"AB62D4","name":"MultiSelect Widget","description":"Issues related to MultiSelect Widget"},"Calendar Widget":{"color":"8c6644","name":"Calendar Widget","description":""},"Website":{"color":"151720","name":"Website","description":"Related to www.appsmith.com website"},"Low effort":{"color":"8B59F0","name":"Low effort","description":"Something that'll take a few days to build"},"Checkbox Widget":{"color":"bbeecd","name":"Checkbox Widget","description":""},"Spam":{"color":"620faf","name":"Spam","description":""},"Voice Recorder Widget":{"color":"85bc87","name":"Voice Recorder Widget","description":""},"Select Widget":{"color":"0c669e","name":"Select Widget","description":"Select or dropdown widget"},"Bug":{"color":"8ba6fd","name":"Bug","description":"Something isn't right"},"Widget Validation":{"color":"6990BC","name":"Widget Validation","description":"Issues related to widget property validation"},"Generate Page":{"color":"2b4664","name":"Generate Page","description":"Issures related to page generation"},"File Picker Widget":{"color":"6ae4f2","name":"File Picker Widget","description":""},"snowflake":{"color":"8078b0","name":"snowflake","description":"Issues related to the snowflake Integration"},"Automation":{"color":"CCAF60","name":"Automation","description":""},"hotfix":{"color":"BA3F1D","name":"hotfix","description":""},"Import-Export-App":{"color":"48883f","name":"Import-Export-App","description":"Issues related to importing and exporting apps"},"High effort":{"color":"A7E87B","name":"High effort","description":"Something that'll take more than a month to build"},"Telemetry":{"color":"bc70f9","name":"Telemetry","description":"Issues related to instrumenting appsmith"},"Radio Widget":{"color":"91ef15","name":"Radio Widget","description":""},"Omnibar":{"color":"1bb96a","name":"Omnibar","description":"Issues related to the omnibar for navigation"},"Button Widget":{"color":"34efae","name":"Button Widget","description":""},"Switch widget":{"color":"33A8CE","name":"Switch widget","description":"The switch widget"},"Map Widget":{"color":"7eef7a","name":"Map Widget","description":""},"Task":{"color":"085630","name":"Task","description":"A simple Todo"},"Design System":{"color":"2958a4","name":"Design System","description":"Design system"},"opera":{"color":"C63F5B","name":"opera","description":"Any issues identified on the opera browser"},"Login / Signup":{"color":"","name":"Login / Signup","description":"Authentication flows"},"Image Widget":{"color":"8de8ad","name":"Image Widget","description":""},"firefox":{"color":"6d56e2","name":"firefox","description":""},"Property Pane":{"color":"b356ff","name":"Property Pane","description":"Issues related to the behaviour of the property pane"},"Deployment":{"color":"93491f","name":"Deployment","description":"Installation process of appsmith"},"Production":{"color":"b60205","name":"Production","description":""},"Dependencies":{"color":"0366d6","name":"Dependencies","description":"Pull requests that update a dependency file"},"Google Sheets":{"color":"8078b0","name":"Google Sheets","description":"Issues related to Google Sheets"},"Icon Button Widget":{"color":"D319CE","name":"Icon Button Widget","description":"Issues related to the icon button widget"},"Mongo":{"color":"8078b0","name":"Mongo","description":"Issues related to Mongo DB plugin"},"Documentation":{"color":"a8dff7","name":"Documentation","description":"Improvements or additions to documentation"},"TestGap":{"color":"","name":"TestGap","description":"Issues identified for test plan improvement"},"keyboard shortcut":{"color":"0688B6","name":"keyboard shortcut","description":""},"Reopen":{"color":"897548","name":"Reopen","description":""},"Redshift":{"color":"8078b0","name":"Redshift","description":"Issues related to the redshift integration"},"Date Picker Widget":{"color":"ef1ce1","name":"Date Picker Widget","description":""},"Entity Explorer":{"color":"1bb96a","name":"Entity Explorer","description":"Issues related to navigation using the entity explorer"},"JS Linting & Errors":{"color":"E56AA5","name":"JS Linting & Errors","description":"Issues related to JS Linting and errors"},"iFrame":{"color":"3CD1DB","name":"iFrame","description":"Issues related to iFrame"},"Stale":{"color":"ededed","name":"Stale","description":null},"Text Widget":{"color":"d130d1","name":"Text Widget","description":""},"Video Widget":{"color":"23dd4b","name":"Video Widget","description":""},"Datasources":{"color":"3d590f","name":"Datasources","description":"Issues related to configuring datasource on appsmith"},"error":{"color":"B66773","name":"error","description":"All issues connected to error messages"},"Form Widget":{"color":"09ed77","name":"Form Widget","description":""},"Needs Triaging":{"color":"e8b851","name":"Needs Triaging","description":"Needs attention from maintainers to triage"},"Autocomplete":{"color":"235708","name":"Autocomplete","description":"Issues related to the autocomplete"},"hacktoberfest":{"color":"0052cc","name":"hacktoberfest","description":"All issues that can be solved by the community during Hacktoberfest"},"Medium effort":{"color":"D31156","name":"Medium effort","description":"Something that'll take more than a week but less than a month to build"},"Release":{"color":"57e5e0","name":"Release","description":""},"High":{"color":"c94d14","name":"High","description":"This issue blocks a user from building or impacts a lot of users"},"UI Performance":{"color":"1799b0","name":"UI Performance","description":"Issues related to UI performance"},"Deploy Preview":{"color":"bfdadc","name":"Deploy Preview","description":"Issues found in Deploy Preview"},"Needs Tests":{"color":"8ee263","name":"Needs Tests","description":"Needs automated tests to assert a feature/bug fix"},"Refactor":{"color":"B96662","name":"Refactor","description":"needs refactoring of code"},"Divider Widget":{"color":"235708","name":"Divider Widget","description":"Issues related to the divider widget"},"Table Widget":{"color":"2eead1","name":"Table Widget","description":""},"Needs More Info":{"color":"e54c10","name":"Needs More Info","description":"Needs additional information"},"Good First Issue":{"color":"7057ff","name":"Good First Issue","description":"Good for newcomers"},"UI Improvement":{"color":"9aeef4","name":"UI Improvement","description":""},"Backend":{"color":"d4c5f9","name":"Backend","description":"This marks the issue or pull request to reference server code"},"Frontend":{"color":"87c7f2","name":"Frontend","description":"This label marks the issue or pull request to reference client code"},"Chart Widget":{"color":"616ecc","name":"Chart Widget","description":""},"List Widget":{"color":"8508A0","name":"List Widget","description":"Issues related to the list widget"},"Duplicate":{"color":"cfd3d7","name":"Duplicate","description":"This issue or pull request already exists"},"JS Snippets":{"color":"8d62d2","name":"JS Snippets","description":"issues related to JS Snippets"},"Copy Paste":{"name":"Copy Paste","description":"Issues related to copy paste","color":"b4f0a9"},"Drag & Drop":{"name":"Drag & Drop","description":"Issues related to the drag & drop experience","color":"92115a"},"Sniping Mode":{"name":"Sniping Mode","description":"Issues related to sniping mode","color":"48883f"},"Redis":{"name":"Redis","description":"Issues related to Redis","color":"8078b0"},"New Datasource":{"color":"60b14c","name":"New Datasource","description":"Requests for new datasources"},"Evaluated Value":{"name":"Evaluated Value","description":"Issues related to evaluated values","color":"39f6e7"},"Undo/Redo":{"name":"Undo/Redo","description":"Issues related to undo/redo","color":"f25880"},"App Navigation":{"name":"App Navigation","description":"Issues related to the topbar navigation and configuring it","color":"4773ab"},"Widgets Pane":{"name":"Widgets Pane","description":"Issues related to the discovery and organisation of widgets","color":"ad5d78"},"View Mode":{"color":"1799b0","name":"View Mode","description":"Issues related to the view mode"},"Content":{"name":"Content","description":"For content related topics i.e blogs, templates, videos","color":"a8dff7"},"Slash Command":{"name":"Slash Command","description":"Issues related to the slash command","color":"a0608e"},"Widget Property":{"name":"Widget Property","description":"Issues related to adding / modifying widget properties across widgets","color":"5e92cb"},"Windows":{"name":"Windows","description":"Issues related exclusively to Windows systems","color":"b4cb8a"},"Old App Issues":{"name":"Old App Issues","description":"Issues related to apps old apps a few weeks old and app issues in stale browser session","color":"87ab18"},"Document Viewer Widget":{"name":"Document Viewer Widget","description":"Issues related to Document Viewer Widget","color":"899d4b"},"Radio Group Widget":{"name":"Radio Group Widget","description":"Issues related to radio group widget","color":"b68495"},"Super Admin":{"name":"Super Admin","description":"Issues related to the super admin page","color":"aa95cf"},"Postgres":{"name":"Postgres","description":"Postgres related issues","color":"8078b0"},"New JS Function":{"name":"New JS Function","description":"Issues related to adding a JS Function","color":"8e8aa4"},"Cannot Reproduce Issue":{"color":"93c9cc","name":"Cannot Reproduce Issue","description":"Issues that cannot be reproduced"},"Widget Grouping":{"name":"Widget Grouping","description":"Issues related to Widget Grouping","color":"a49951"},"K8s":{"name":"K8s","description":"Kubernetes related issues","color":"5f318a"},"Docker":{"name":"Docker","description":"Issues related to docker","color":"89b808"},"Camera Widget":{"name":"Camera Widget","description":"Issues and enhancements related to camera widget","color":"e6038e"},"SAAS Plugins":{"name":"SAAS Plugins","description":"Issues related to SAAS Plugins","color":"80e18f"},"JS Promises":{"name":"JS Promises","description":"Issues related to promises","color":"d7771f"},"OnPageLoad":{"name":"OnPageLoad","description":"OnPageLoad issues on functions and queries","color":"2b4664"},"JS Usability":{"name":"JS Usability","description":"usability issues with JS editor and JS elsewhere","color":"a302b0"},"Currency Input Widget":{"name":"Currency Input Widget","description":"Issues related to currency input widget","color":"b2164f"},"TreeSelect":{"name":"TreeSelect","description":"Issues related to TreeSelect Widget","color":"a1633e"},"MultiTree Select Widget":{"name":"MultiTree Select Widget","description":"Issues related to MultiTree Select Widget","color":"a1633e"},"Welcome Screen":{"name":"Welcome Screen","description":"Issues related to the welcome screen","color":"48883f"},"Realtime Commenting":{"color":"a70b86","name":"Realtime Commenting","description":"In-app communication between teams"},"Phone Input Widget":{"name":"Phone Input Widget","description":"Issues related to the Phone Input widget","color":"a70b86"},"JSON Form":{"name":"JSON Form","description":"Issue / features related to the JSON form wiget","color":"46b209"},"All Widgets":{"name":"All Widgets","description":"Issues related to all widgets","color":"972b36"},"V1":{"name":"V1","description":"V1","color":"67ab2e"},"Reflow & Resize":{"name":"Reflow & Resize","description":"All issues related to reflow and resize experience","color":"748a13"},"SSO":{"name":"SSO","description":"Issues, requests and enhancements around Single sign-on.","color":""},"Multi User Realtime":{"name":"Multi User Realtime","description":"Issues related to multiple users using or editing an application","color":"e7b6ce"},"Ready for design":{"name":"Ready for design","description":"this issue is ready for design: it contains clear problem statements and other required information","color":"ebf442"},"Support":{"name":"Support","description":"Issues created by the A-force team to address user queries","color":"1740f3"},"Button Group widget":{"name":"Button Group widget","description":"Issue and enhancements related to the button group widget","color":"f17025"},"GraphQL Plugin":{"name":"GraphQL Plugin","description":"Issues related to GraphQL plugin","color":"8078b0"},"DevOps Pod":{"name":"DevOps Pod","description":"Issues related to devops","color":"d956c7"},"medium":{"name":"medium","description":"Issues that frustrate users due to poor UX","color":"23dfd9"},"ArangoDB":{"name":"ArangoDB","description":"Issues related to arangoDB","color":"8078b0"},"Code Refactoring":{"name":"Code Refactoring","description":"Issues related to code refactoring","color":"76310e"},"Progress bar widget":{"name":"Progress bar widget","description":"To track issues related to progress bar","color":"2d7abf"},"Audio Recorder Widget":{"name":"Audio Recorder Widget","description":"Issues related to Audio Recorder Widget","color":"9accef"},"Airtable":{"name":"Airtable","description":"Issues for Airtable","color":"60885f"},"Canvas / Grid":{"name":"Canvas / Grid","description":"Issues related to the canvas","color":"16b092"},"Email Config":{"name":"Email Config","description":"Issues related to configuring the email service","color":"2a21d1"},"CURL":{"name":"CURL","description":"Issues related to CURL impor","color":"60885f"},"Canvas Zooms":{"name":"Canvas Zooms","description":"Issues related to zooming the canvas","color":"e6038e"},"business":{"name":"business","description":"Features that will be a part of our business edition","color":"cd59eb"},"Action Pod":{"name":"Action Pod","description":"","color":"ee2e36"},"AutomationGap1":{"color":"a5e07c","name":"AutomationGap1","description":"Issues that needs automated tests"},"A-Force11":{"name":"A-Force11","description":"Issues raised by A-Force team","color":"d667b6"},"Business Edition":{"name":"Business Edition","description":"Features that will be a part of our business edition","color":"89bb6c"},"storeValue":{"name":"storeValue","description":"Issues related to the store value function","color":"5d3e66"},"DynamoDB":{"name":"DynamoDB","description":"Issues that are related to DynamoDB should have this label","color":"60885f"},"Backup & Restore":{"name":"Backup & Restore","description":"Issues related to backup and restore","color":"86874d"},"Billing":{"name":"Billing","description":"Billing infrastructure and flows for Business Edition and Trial users","color":"d2bc40"},"Datatype issue":{"name":"Datatype issue","description":"Issues that have risen because data types weren't handled","color":"cef66b"},"OAuth":{"name":"OAuth","description":"OAuth related bugs or features","color":"60885f"},"Table Widget V2":{"name":"Table Widget V2","description":"Issues related to Table Widget V2","color":"3a7192"},"IDE Navigation":{"name":"IDE Navigation","description":"Issues/feature requests related to IDE navigation, and context switching","color":"1bb96a"},"Query performance":{"name":"Query performance","description":"Issues that have to do with lack in performance of query execution","color":"cef66b"},"SAAS Manager App":{"name":"SAAS Manager App","description":"Issues with the SAAS manager app","color":"d427db"},"Twilio":{"name":"Twilio","description":"Issues related to Twilio integration","color":"23ba8d"},"Hubspot":{"name":"Hubspot","description":"Issues related to Hubspot integration","color":"60885f"},"Zendesk":{"name":"Zendesk","description":"Issues related to Zendesk integration","color":"60885f"},"Entity Refactor":{"name":"Entity Refactor","description":"Issues related to refactor logic","color":"705a2c"},"Map Chart Widget":{"name":"Map Chart Widget","description":"Issues related to Map Chart Widgets","color":"c8397f"},"Product Catchup":{"name":"Product Catchup","description":"Issues created in the product catchup","color":"29cd2c"},"Framework Functions":{"name":"Framework Functions","description":"Issues related to internal functions like showAlert(), navigateTo() etc...","color":"c25a09"},"Frontend Libraries Upgrade":{"name":"Frontend Libraries Upgrade","description":"Issues related to frontend libraries upgrade","color":"ede1fc"},"MsSQL":{"name":"MsSQL","description":"Issues related to MsSQL plugin","color":"8078b0"},"Elastic Search":{"name":"Elastic Search","description":"Issues related to the elastic search datasource","color":"8078b0"},"Core Query Execution":{"color":"cef66b","name":"Core Query Execution","description":"Issues related to the execution of all queries"},"Query Management":{"name":"Query Management","description":"Issues related to the CRUD of actions or queries","color":"cef66b"},"Query Settings":{"name":"Query Settings","description":"Issues related to the settings of all queries","color":"cef66b"},"Code Editor":{"name":"Code Editor","description":"Issues related to the code editor","color":"4ca16e"},"Query Forms":{"color":"12b253","name":"Query Forms","description":"Isuses related to the query forms"},"JS Objects":{"color":"22962c","name":"JS Objects","description":"Issues related to JS Objects"},"JS Evaluation":{"color":"22962c","name":"JS Evaluation","description":"Issues related to JS evaluation on the platform"},"SmartSubstitution":{"name":"SmartSubstitution","description":"Issues related to Smart substitution of mustache bindings in queries","color":"bae511"},"Query Generation":{"name":"Query Generation","description":"Issues related to query generation","color":"cef66b"},"Suggested Widgets":{"name":"Suggested Widgets","description":"Issues related to suggesting widgets based on query response","color":"6ac063"},"Code Scanner Widget":{"name":"Code Scanner Widget","description":"Issues related to code scanner widget","color":"9bc1a0"},"Clean URLs":{"name":"Clean URLs","description":"Issues related to clean URLs epic","color":"112623"},"Widget keyboard accessibility":{"name":"Widget keyboard accessibility","description":"All issues related to keyboard accessibility in widgets","color":"b626fd"},"Connection pool":{"name":"Connection pool","description":"issues to do with connection pooling of various plugins","color":"94fe36"},"List Widget V2":{"name":"List Widget V2","description":"Issues related to the list widget v2","color":"adaaf7"},"Auto Height":{"name":"Auto Height","description":"Issues related to dynamic height of widgets","color":"5149cf"},"cypress_failed_test":{"name":"cypress_failed_test","description":"Cypress failed tests","color":"4745d5"},"Needs validation":{"name":"Needs validation","description":"Needs problem validation before being picked up","color":"66673d"},"Slider Widget":{"name":"Slider Widget","description":"Issues raised for slider widgets.","color":"2eef5f"},"Multitenancy":{"name":"Multitenancy","description":"Support multitenancy within single appsmith instance","color":"8c49a9"},"Conversion Algorithm":{"name":"Conversion Algorithm","description":"All issue related to converting app from fixed to flex mode & vice versa","color":"d12d2e"},"Browser specific":{"name":"Browser specific","description":"All issue related to browser","color":"d12d2e"},"Performance infra":{"name":"Performance infra","description":"all issue related to the performance infra","color":"8a60f6"},"DSL Update":{"name":"DSL Update","description":"Issues related to storing and updating the DSL","color":"e16cf3"},"AST-frontend":{"name":"AST-frontend","description":"Issues related to maintaining AST logic","color":"2b4664"},"AST-backend":{"name":"AST-backend","description":"Backend issues related to AST parsing","color":"48883f"},"MariaDB":{"name":"MariaDB","description":"MariaDB datasource","color":"8428c3"},"ADS Component Issue":{"name":"ADS Component Issue","description":"Issues which are caused due to ADS components","color":"d89119"},"Regressed":{"color":"723fd0","name":"Regressed","description":"Scenarios that were working before but have now regressed"},"Needs RCA":{"name":"Needs RCA","description":"a critical or high priority issue that needs an RCA","color":"2cc68f"},"Custom JS Libraries":{"name":"Custom JS Libraries","description":"Issues related to adding custom JS library","color":"bacb6d"},"Integrations Pod General":{"name":"Integrations Pod General","description":"Issues related to the Integrations Pod that don't fit into other tags.","color":"287823"},"Performance Pod":{"name":"Performance Pod","description":"All things related to Appsmith performance","color":"b5a25d"},"Performance":{"name":"Performance","description":"Issues related to performance","color":"9a18d7"},"File upload issues":{"name":"File upload issues","description":"Issues related to uploading any type of files from within Appsmith","color":"2b4664"},"Action Selector":{"name":"Action Selector","description":"Issues related to action selector on the property pane","color":"2f9e20"},"Community Reported":{"name":"Community Reported","description":"issues reported by community members","color":"1402e5"},"JS Function execution":{"name":"JS Function execution","description":"JS function execution","color":"7c2de1"},"Self Serve":{"name":"Self Serve","description":"For all issues related to self-serve flow for business edition","color":"4dacfc"},"Self Serve 1.0":{"name":"Self Serve 1.0","description":"For all issues related to v1 of the self serve project","color":"ae839e"},"Customer Portal":{"name":"Customer Portal","description":"For all tasks/issues pertaining to customer.appsmith.com","color":"d2bc40"},"Cloud Services":{"name":"Cloud Services","description":"For all tasks/issues on Appsmith cloud-services relating to licensing, usage and billing","color":"d2bc40"},"One-click Binding":{"name":"One-click Binding","description":"Issues related to the One click binding epic","color":"f1661c"},"Airgap":{"name":"Airgap","description":"Tickets related to supporting air-gapped Appsmith instances","color":"1cb294"},"SMTP plugin":{"name":"SMTP plugin","description":"Issues related to SMTP plugin","color":"541457"},"AWS AMI":{"name":"AWS AMI","description":"Issues Related to AWS AMI","color":"b44680"},"Old widget version":{"name":"Old widget version","description":"Use this label to raise issue specific only to an older version of a widget","color":"ff3814"},"Enterprise Billing":{"name":"Enterprise Billing","description":"To track all tasks/issues related to licensing & billing for enterprise customers","color":"14c156"},"Oracle SQL DB":{"name":"Oracle SQL DB","description":"Issues related to the Oracle plugin","color":"cbabcb"},"Community Contributor":{"name":"Community Contributor","description":"Meant to track issues that are assigned to external contributors","color":"149ab6"},"widget vertical alignment":{"name":"widget vertical alignment","description":"All issue related widget vertical alignment on the auto layout canvas","color":"d12d2e"},"Observability":{"name":"Observability","description":"Issues related to observability on the Appsmith instance","color":"dff913"},"Checkbox Component":{"name":"Checkbox Component","description":"This labels deals with checkbox component in wds package","color":"75a401"},"Analytics Improvements":{"name":"Analytics Improvements","description":"For all tasks focused on improving our overall analytics and fixing any issues ","color":"29b8ed"},"WDS team":{"name":"WDS team","description":"","color":"8d675a"},"Enterprise Edition":{"name":"Enterprise Edition","description":"Features that will be supported in Enterprise Edition only","color":"984f5e"},"Query filter":{"name":"Query filter","description":"Issues related to query filtering, e.g., WHERE clause","color":"a15134"},"Keyboard accessibility ":{"name":"Keyboard accessibility ","description":"All issue related to ADS component keyboard accessibility","color":"2ba696"},"Toggle button":{"name":"Toggle button","description":"All issue related to ADS toggle button","color":"edc47f"},"SCIM":{"name":"SCIM","description":"Label to collate our SCIM issues","color":"48883f"},"ADS Category Token":{"name":"ADS Category Token","description":"All issues related appsmith design system category tokens","color":"920961"},"ADS Component Documentation":{"name":"ADS Component Documentation","description":"All issues Appsmith design system component documentation","color":"64c46a"},"ADS Migration":{"name":"ADS Migration","description":"All issues related to Appsmith design system migration","color":"b082d6"},"ADS Deduplication ":{"name":"ADS Deduplication ","description":"Replacing component with ADS components","color":"b082d6"},"ADS Revamp":{"name":"ADS Revamp","description":"All issues related to ads revamp. ","color":"b082d6"},"ADS Deduplication":{"name":"ADS Deduplication","description":"Replacing component with ADS components","color":"b082d6"},"ADS Grayscale":{"name":"ADS Grayscale","description":"Support grayscale color changes","color":"b03577"},"ADS Unit Test":{"name":"ADS Unit Test","description":"All issue related ads unit cases ","color":"b082d6"},"ADS Components":{"name":"ADS Components","description":"All issues related ADS components","color":"b082d6"},"Widget Discoverability":{"name":"Widget Discoverability","description":"Issues related to Widget Discoverability","color":"7b55ce"},"Widget setter method":{"name":"Widget setter method","description":"Issues with widget property setters","color":"8dce87"},"License":{"name":"License","description":"For all issues/tasks related to licensing of appsmith-ee edition","color":"90ee98"},"Platformization":{"name":"Platformization","description":"Issues or tasks related to platformization of Appsmith codebase","color":"4e972b"},"Activation - datasources":{"name":"Activation - datasources","description":"issues related to activation projects","color":"7c7ace"},"Partial-import-export":{"name":"Partial-import-export","description":"Label for granular reusability.","color":"717732"},"AI":{"name":"AI","description":"All tasks related to AI","color":"2b4664"},"ADS Typography":{"name":"ADS Typography","description":"All issue related typographical changes","color":"2dbe8d"},"Auto Layout":{"name":"Auto Layout","description":"Issues relates to auto layout","color":"92cf8c"},"Heroku":{"name":"Heroku","description":"Issues related to Heroku","color":"a81b69"},"ADS Visual Styles":{"name":"ADS Visual Styles","description":"All issues related to ADS visual styles","color":"d3da89"},"ADS Component Design":{"name":"ADS Component Design","description":"All issue related to component design","color":"5cc91e"},"Modal Component":{"name":"Modal Component","description":"All issue related to ads modal component","color":"ee63f3"},"App setting":{"name":"App setting","description":"Related to app settings panel within the app","color":"174f98"},"BE instance":{"name":"BE instance","description":"For all issues related to license, billing on BE instance","color":"ae8f98"},"Fixed layout":{"name":"Fixed layout","description":"issues related to fixed layout","color":"b66681"},"Anvil layout":{"name":"Anvil layout","description":"issues related to the new layout system anvil","color":"5e0904"},"New Deployment Mode":{"name":"New Deployment Mode","description":"Support a new mode of deployment","color":"108033"},"Custom widgets":{"name":"Custom widgets","description":"For all issues related to the custom widget project","color":"c9db9c"},"Homepage Experience V2":{"name":"Homepage Experience V2","description":"Label for reporting new tasks and bug fixes related to revamped homepage experience","color":"c55d54"},"Customer Success":{"name":"Customer Success","description":"Issues that the success team cares about","color":"6ccabd"},"Invite flow":{"name":"Invite flow","description":"Invite users flow and any associated actions","color":"881b35"},"Invite users":{"name":"Invite users","description":"Invite users flow and any associated actions","color":""},"Workflows Pod":{"name":"Workflows Pod","description":"Issues that the workflows team owns","color":"446925"},"DailyPromotionBlocker":{"name":"DailyPromotionBlocker","description":"DailyPromotion Blocker","color":"9b2280"},"JS Binding":{"name":"JS Binding","description":"All issues related to the JS Binding experience","color":"422fed"},"REST API":{"name":"REST API","description":"REST API plugin related issues","color":"e3ede5"},"Critical":{"color":"a1e3db","name":"Critical","description":"This issue breaks existing apps. Drop everything else to resolve"},"Module creator":{"name":"Module creator","description":"Issues related to the module creator side","color":"bb2c05"},"Module consumer":{"name":"Module consumer","description":"Issues related to the module consumer side","color":"83d3c5"},"Package versioning":{"name":"Package versioning","description":"ISsues related to how we manage versions for packages","color":"4c5218"},"Convert to module":{"name":"Convert to module","description":"Issues related to the module creation flow using conversion","color":"4c5218"},"Query module":{"name":"Query module","description":"Issues affecting query modules or its instances","color":"b11a7e"},"JS module":{"name":"JS module","description":"Issues affecting JS modules or its instances","color":"bf76f6"},"Secret Management":{"name":"Secret Management","description":"Issues related to secret management","color":"2b4664"},"REST API plugin":{"name":"REST API plugin","description":"REST API plugin related issues","color":"b5948a"},"UI module":{"name":"UI module","description":"Issues affecting UI modules or its instances","color":"d2acee"},"Preview mode":{"name":"Preview mode","description":"Issues related to app previews","color":"48883f"},"Git Auto-commit":{"name":"Git Auto-commit","description":"Issues related to autocommit","color":"717732"},"QA Pod":{"name":"QA Pod","description":"Issues under the QA Pod","color":"717732"},"Automation Test":{"name":"Automation Test","description":"","color":""},"Automation failures":{"name":"Automation failures","description":"","color":""},"Needs automation":{"name":"Needs automation","description":"Issues that needs automated tests","color":""},"Prepared statements":{"name":"Prepared statements","description":"Issues related to prepared statement flow","color":""},"Switch Group Widget":{"name":"Switch Group Widget","description":"Issues related to Switch group Widget","color":""},"Supervisor":{"name":"Supervisor","description":"Issues related to supervisor","color":"2c5813"},"Deployment Certificates":{"name":"Deployment Certificates","description":"Issues related to lets encrypt","color":"e148aa"},"Mock Data":{"name":"Mock Data","description":"Issues related to mock databases","color":"ebf251"},"AWS ECS":{"name":"AWS ECS","description":"Issues related to ECS Fargate","color":"e506ff"},"Publish App":{"name":"Publish App","description":"Issues related to app deployment","color":"2b4664"},"IDE Infra":{"name":"IDE Infra","description":"Issues related to the IDE infrastructure like saving changes","color":"1bb96a"},"User Profile":{"name":"User Profile","description":"Issues related to a user profile","color":"a60d34"},"Page Management":{"color":"1bb96a","name":"Page Management","description":"Issues related to configuring pages"},"Ingress":{"name":"Ingress","description":"Ingress Controller","color":"a86802"},"Nginx":{"name":"Nginx","description":"Issues related to Nginx","color":"e54195"},"Building blocks":{"name":"Building blocks","description":"Building blocks on cavas, on templates listing or drag and drop of building blocks.","color":"48883f"},"Table Inline Edit":{"name":"Table Inline Edit","description":"Issues related to inline editing","color":"60895a"},"User Session ":{"name":"User Session ","description":"For all issues/tasks related to user sessions","color":"65a3f5"},"WDS - all widgets":{"name":"WDS - all widgets","description":"all widget present in WDS","color":"2670ae"},"WDS - input widget":{"name":"WDS - input widget","description":"Issues related to input widget on WDS","color":"2670ae"},"WDS - paragraph widget":{"name":"WDS - paragraph widget","description":"issues related to paragraph widget on WDS","color":"2670ae"},"WDS - statbox widget":{"name":"WDS - statbox widget","description":"issues related to statbox widget on WDS","color":"2670ae"},"WDS - modal widget":{"name":"WDS - modal widget","description":"Issues related to modal widget on WDS","color":"2670ae"},"WDS - icon widget":{"name":"WDS - icon widget","description":"Issues related to icon widget on WDS","color":"2670ae"},"WDS - checkbox widget":{"name":"WDS - checkbox widget","description":"Issues related to checkbox widget on WDS","color":"2670ae"},"WDS - table widget":{"name":"WDS - table widget","description":"Issues related to table widget on WDS","color":"2670ae"},"WDS - keyValue widget":{"name":"WDS - keyValue widget","description":"Issues related to key-value widget on WDS","color":"2670ae"},"WDS - switch group widget":{"name":"WDS - switch group widget","description":"Issues related to switch group widget on WDS","color":"2670ae"},"WDS - theming":{"name":"WDS - theming","description":"Issues related to theming on the Anvil instance","color":"2670ae"},"Anvil POD":{"name":"Anvil POD","description":"Issue related to Anvil project","color":"5e0904"},"Anvil - theming":{"name":"Anvil - theming","description":"Issues related to theming on the Anvil instance","color":"c28de5"},"Anvil - vertical alignment":{"name":"Anvil - vertical alignment","description":"Issues related to vertical alignment on the Anvil layout","color":"c28de5"},"Anvil - layout component":{"name":"Anvil - layout component","description":"Issues related to layout component on the Anvil layout","color":"c28de5"},"Anvil - drag & drop":{"name":"Anvil - drag & drop","description":"Issues related to drag & drop experience on Anvil","color":"c28de5"},"Anvil - zones & sections":{"name":"Anvil - zones & sections","description":"Issues related to zones and sections on the Anvil layout","color":"c28de5"},"Anvil - copy paste experience":{"name":"Anvil - copy paste experience","description":"Issues related to copy paste experience on the Anvil layout","color":"c28de5"},"WDS - phone widget":{"name":"WDS - phone widget","description":"Issues related to phone widget on WDS","color":"c28de5"},"WDS - responsive widget":{"name":"WDS - responsive widget","description":"All issues related to widget responsiveness","color":"11ee05"},"Anvil - responsive viewport":{"color":"11ee05","name":"Anvil - responsive viewport","description":"Issues seen on different viewports like mobile"},"WDS - widget styling":{"color":"11ee05","name":"WDS - widget styling","description":"all about widget styling"},"Anvil - spacing":{"name":"Anvil - spacing","description":"Related to spacing between widgets in auto layout","color":"11ee05"},"Anvil - responsive canvas":{"name":"Anvil - responsive canvas","description":"All issues related to canvas responsiveness","color":"11ee05"},"WDS - inline button widget":{"name":"WDS - inline button widget","description":"Issues related to inline button widget on WDS","color":"7cef83"},"Activation Pod":{"name":"Activation Pod","description":"for Activation group","color":"d67d00"},"Activation":{"name":"Activation","description":"for Activation group","color":"d67d00"},"Tests":{"name":"Tests","description":"Test issues","color":"4fc7b6"},"Ballpark: XXS":{"name":"Ballpark: XXS","description":"~1xDev in 1/2xSprint","color":""},"Ballpark: XS":{"name":"Ballpark: XS","description":"~1xDev in 1xSprint","color":"53bf71"},"Ballpark: S":{"name":"Ballpark: S","description":"~2xDev in 1xSprint","color":"6e9e65"},"Ballpark: M":{"name":"Ballpark: M","description":"~1xPOD in 1xSprint","color":"2229e6"},"Ballpark: L":{"name":"Ballpark: L","description":"~1xPOD in 3xSprint or 2xPODs in 1xSprint","color":"49962f"},"Ballpark: XL":{"name":"Ballpark: XL","description":"~1xPOD in 1xQuarter or 2xPODs in 2xSprint","color":"b524c9"},"Ballpark: XXL":{"name":"Ballpark: XXL","description":"~2xPODs in 1xQuarter","color":"22092c"},"Auto-commit":{"name":"Auto-commit","description":"Issues related to auto-generated commits showing up on git ","color":"e25b89"},"Continuous Deployment":{"name":"Continuous Deployment","description":"Issues related to CD pipeline on git","color":"aea47c"},"Default branch":{"name":"Default branch","description":"Issues related to using a default branch on git","color":"195737"},"Git status":{"name":"Git status","description":"Issues related to information shown on git status modal or number of changes appearing in a branch","color":"c851b8"},"Git performance":{"name":"Git performance","description":"Issues related to perceived performance on any git operation","color":"189af6"},"Anvil team":{"name":"Anvil team","description":"issues related to the new layout system anvil","color":"798200"},"SDLC":{"name":"SDLC","description":"Issues related to software development lifecycle experiences","color":"bae511"},"Reconnect DS modal":{"name":"Reconnect DS modal","description":"Issues related to reconnect datasource modal post app import","color":"2e398b"},"Stability Pod":{"name":"Stability Pod","description":"For all issues/tasks to be prioritized under Stability pod","color":"86ddf6"},"Stability Issue":{"name":"Stability Issue","description":"Every issue handle by Stability Pod","color":"4d024a"},"Move to Postgres":{"name":"Move to Postgres","description":"Issues required to be solved for the move to Postgres as repository layer","color":"4e13ac"},"User Session":{"name":"User Session","description":"Issues related to user sessions","color":"8255e5"},"IDE tabs":{"name":"IDE tabs","description":"query and js tabs","color":"1bb96a"},"Inviting Contribution":{"name":"Inviting Contribution","description":"Issues that we would like contributions to","color":""},"cypress-flaky-fix":{"name":"cypress-flaky-fix","description":"This label is auto-added when a PR which only has Cypress fixes are merged to release","color":"722cbc"},"Cypress flaky tests":{"name":"Cypress flaky tests","description":"Test scripts that need to be fixed on Cypress by dev or SDET","color":"722cbc"},"Help enterprise":{"name":"Help enterprise","description":"Requested by Appsmith customers or prospects","color":"FF8C00"},"Learnability":{"name":"Learnability","description":"Issues affecting the product learnability, making the product harder for new users.","color":"800c2f"},"ADS Spacing":{"name":"ADS Spacing","description":"","color":"686ebb"},"ads unit test":{"name":"ads unit test","description":"All issue related ads unit cases","color":"686ebb"},"ads revamp":{"name":"ads revamp","description":"All issues related to ads revamp.","color":"686ebb"},"Javascript Product":{"color":"709a21","name":"Javascript Product","description":"Issues related to users writing javascript in appsmith"},"IDE Product":{"color":"1bb96a","name":"IDE Product","description":"Issues related to the IDE Product"},"IDE Pod":{"color":"1bb96a","name":"IDE Pod","description":"Issues that new developers face while exploring the IDE"},"Accelerators Product":{"name":"Accelerators Product","description":"Issues related to app building accelerators","color":"f3fce6"},"Templates Product":{"name":"Templates Product","description":"Issues related to Templates","color":"f3fce6"},"Design System Product":{"name":"Design System Product","description":"Appsmith design system related issues","color":"2b4664"},"ads deduplication":{"name":"ads deduplication","description":"Replacing component with ADS components","color":"708943"},"Admin Settings Product":{"color":"708943","name":"Admin Settings Product","description":"Issues in admin settings pages"},"Appsmith AI":{"name":"Appsmith AI","description":"All issues related to the Appsmith AI datasource","color":"708943"},"Query & JS Pod":{"color":"709a21","name":"Query & JS Pod","description":"Issues related to the query & JS Pod"},"RBAC Product":{"name":"RBAC Product","description":"Issues, requests and enhancements around RBAC.","color":""},"Workspace Product":{"name":"Workspace Product","description":"Issues related to workspaces","color":""},"CE Instance Usage":{"name":"CE Instance Usage","description":"For all issues relating to usage, licensing or billing on the CE instance","color":""},"Billing & Licensing Product":{"name":"Billing & Licensing Product","description":"Issues pertaining to licensing, billing and usage across self serve and enterprise customers","color":"446925"},"Platform Administration Pod":{"color":"446925","name":"Platform Administration Pod","description":"Issues related to platform administration & management"},"DB Infrastructure Pod":{"name":"DB Infrastructure Pod","description":"Pod to handle database infrastructure","color":"446925"},"Packages Product":{"name":"Packages Product","description":"Issues related to packages","color":"7e018f"},"Workflows Product":{"name":"Workflows Product","description":"Issues related to the workflows product","color":"446925"},"Debugger Product":{"color":"857f58","name":"Debugger Product","description":"Issues related to the debugger"},"Packages Pod":{"name":"Packages Pod","description":"issues that belong to the packages pod","color":"53742c"},"Environments Product":{"name":"Environments Product","description":"Issues related to datasource environments","color":"857f58"},"Custom Widgets":{"name":"Custom Widgets","description":"For all issues related to the custom widget project","color":"857f58"},"Branding Product":{"name":"Branding Product","description":"All issues under branding and whitelabelling appsmith ecosystem","color":"857f58"},"Widgets & Accelerators Pod":{"name":"Widgets & Accelerators Pod","description":"Issues related to widgets & Accelerators","color":"27496a"},"Widgets Product":{"name":"Widgets Product","description":"This label groups issues related to widgets","color":"f3fce6"},"App Theming Product":{"name":"App Theming Product","description":"Items that are related to the App level theming controls epic","color":"48883f"},"UI Building Product":{"color":"48883f","name":"UI Building Product","description":"Issues related to the UI Building experience"},"Onboarding Product":{"color":"48883f","name":"Onboarding Product","description":"Issues related to onboarding new developers"},"Database Schema":{"name":"Database Schema","description":"Issues related to database schema","color":"48883f"},"Git Product":{"color":"7e018f","name":"Git Product","description":"Issues related to version control product"},"Embedding Apps Product":{"name":"Embedding Apps Product","description":"Issues related to embedding","color":"48883f"},"Integrations Product":{"name":"Integrations Product","description":"Issues related to a specific integration","color":"b9f21c"},"Feature Flagging":{"name":"Feature Flagging","description":"Anything related feature flagging","color":"4574ae"},"Audit Logs Product":{"name":"Audit Logs Product","description":"Audit trails to ensure data security","color":"4574ae"},"Identity & Authentication Product":{"name":"Identity & Authentication Product","description":"Issues related to user identity & authentication","color":"4574ae"},"Email verification":{"name":"Email verification","description":"Email verification issues","color":"4574ae"},"Artifact Platform Product":{"name":"Artifact Platform Product","description":"Issues related to the application platform","color":"4574ae"},"Git IA":{"name":"Git IA","description":"Issues related to Git IA changes","color":"df8bd6"},"Documentation Pod":{"name":"Documentation Pod","description":"Issues related to user education","color":"8c8c02"},"Branch management":{"name":"Branch management","description":"Issues related to using a branch management on git","color":"ebe6af"},"Reconfigure Datasource Modal":{"name":"Reconfigure Datasource Modal","description":"Issues related to reconfigure DS modal that comes after importing applications","color":"5ac17b"},"Setup Issues":{"name":"Setup Issues","description":"Issues related to setting up appsmith","color":"3fc837"},"Packages & Git Pod":{"name":"Packages & Git Pod","description":"All issues belonging to Packages and Git","color":"46ac0e"},"Git Platform":{"name":"Git Platform","description":"Issues related to the git & the app platform","color":"c9ab80"}},"success":true} \ No newline at end of file +{"runners":[{"versioning":{"source":"milestones","type":"SemVer"},"prereleaseName":"alpha","issue":{"labels":{"Widgets Product":{"conditions":[{"label":"Button Widget","type":"hasLabel","value":true},{"label":"Chart Widget","type":"hasLabel","value":true},{"label":"Container Widget","type":"hasLabel","value":true},{"label":"Date Picker Widget","type":"hasLabel","value":true},{"label":"Select Widget","type":"hasLabel","value":true},{"label":"File Picker Widget","type":"hasLabel","value":true},{"label":"Form Widget","type":"hasLabel","value":true},{"label":"Image Widget","type":"hasLabel","value":true},{"label":"Input Widget","type":"hasLabel","value":true},{"label":"List Widget","type":"hasLabel","value":true},{"label":"MultiSelect Widget","type":"hasLabel","value":true},{"label":"Map Widget","type":"hasLabel","value":true},{"label":"Modal Widget","type":"hasLabel","value":true},{"label":"Radio Widget","type":"hasLabel","value":true},{"label":"Rich Text Editor Widget","type":"hasLabel","value":true},{"label":"Tab Widget","type":"hasLabel","value":true},{"label":"Table Widget","type":"hasLabel","value":true},{"label":"Text Widget","type":"hasLabel","value":true},{"label":"Video Widget","type":"hasLabel","value":true},{"label":"iFrame","type":"hasLabel","value":true},{"label":"Menu Button","type":"hasLabel","value":true},{"label":"Rating","type":"hasLabel","value":true},{"label":"Widget Validation","type":"hasLabel","value":true},{"label":"New Widget","type":"hasLabel","value":true},{"label":"Switch widget","type":"hasLabel","value":true},{"label":"Audio Widget","type":"hasLabel","value":true},{"label":"Icon Button Widget","type":"hasLabel","value":true},{"label":"Stat Box Widget","type":"hasLabel","value":true},{"label":"Voice Recorder Widget","type":"hasLabel","value":true},{"label":"Calendar Widget","type":"hasLabel","value":true},{"label":"Menu Button Widget","type":"hasLabel","value":true},{"label":"Divider Widget","type":"hasLabel","value":true},{"label":"Rating Widget","type":"hasLabel","value":true},{"label":"View Mode","type":"hasLabel","value":true},{"label":"Widget Property","type":"hasLabel","value":true},{"label":"Document Viewer Widget","type":"hasLabel","value":true},{"label":"Radio Group Widget","type":"hasLabel","value":true},{"label":"Currency Input Widget","type":"hasLabel","value":true},{"label":"TreeSelect","type":"hasLabel","value":true},{"label":"MultiTree Select Widget","type":"hasLabel","value":true},{"label":"Phone Input Widget","type":"hasLabel","value":true},{"label":"JSON Form","type":"hasLabel","value":true},{"label":"All Widgets","type":"hasLabel","value":true},{"label":"Button Group widget","type":"hasLabel","value":true},{"label":"Progress bar widget","type":"hasLabel","value":true},{"label":"Audio Recorder Widget","type":"hasLabel","value":true},{"label":"Camera Widget","type":"hasLabel","value":true},{"label":"Table Widget V2","type":"hasLabel","value":true},{"label":"Map Chart Widget","type":"hasLabel","value":true},{"label":"Code Scanner Widget","type":"hasLabel","value":true},{"label":"Widget keyboard accessibility","type":"hasLabel","value":true},{"label":"List Widget V2","type":"hasLabel","value":true},{"label":"Slider Widget","type":"hasLabel","value":true},{"label":"One-click Binding","type":"hasLabel","value":true},{"label":"Old widget version","type":"hasLabel","value":true},{"label":"Widget Discoverability","type":"hasLabel","value":true},{"label":"Switch Group Widget","type":"hasLabel","value":true},{"label":"Checkbox Group widget","type":"hasLabel","value":true},{"label":"Checkbox Widget","type":"hasLabel","value":true},{"label":"Table Inline Edit","type":"hasLabel","value":true},{"label":"Custom Widgets","type":"hasLabel","value":true}],"requires":1},"Javascript Product":{"conditions":[{"label":"JS Linting & Errors","type":"hasLabel","value":true},{"label":"Autocomplete","type":"hasLabel","value":true},{"label":"Evaluated Value","type":"hasLabel","value":true},{"label":"Slash Command","type":"hasLabel","value":true},{"label":"New JS Function","type":"hasLabel","value":true},{"label":"JS Usability","type":"hasLabel","value":true},{"label":"Framework Functions","type":"hasLabel","value":true},{"label":"JS Objects","type":"hasLabel","value":true},{"label":"JS Evaluation","type":"hasLabel","value":true},{"label":"Custom JS Libraries","type":"hasLabel","value":true},{"label":"Action Selector","type":"hasLabel","value":true},{"label":"Widget setter method","type":"hasLabel","value":true},{"label":"Entity Refactor","type":"hasLabel","value":true},{"label":"AST-frontend","type":"hasLabel","value":true},{"label":"Sniping Mode","type":"hasLabel","value":true},{"label":"AST-backend","type":"hasLabel","value":true}],"requires":1},"IDE Product":{"conditions":[{"label":"IDE Product","type":"hasLabel","value":true},{"label":"IDE Infra","type":"hasLabel","value":true},{"label":"IDE Navigation","type":"hasLabel","value":true},{"label":"IDE tabs","type":"hasLabel","value":true},{"label":"Omnibar","type":"hasLabel","value":true},{"label":"Entity Explorer","type":"hasLabel","value":true},{"label":"Page Management","type":"hasLabel","value":true},{"label":"Preview mode","type":"hasLabel","value":true},{"label":"Entity Management","type":"hasLabel","value":true}],"requires":1},"Accelerators Product":{"conditions":[{"label":"Generate Page","type":"hasLabel","value":true},{"label":"Building blocks","type":"hasLabel","value":true}],"requires":1},"Templates Product":{"conditions":[{"label":"Partial-import-export","type":"hasLabel","value":true},{"label":"Templates Product","type":"hasLabel","value":true}],"requires":1},"Design System Product":{"conditions":[{"label":"Design System Product","type":"hasLabel","value":true},{"label":"ADS Component Issue","type":"hasLabel","value":true},{"label":"Keyboard accessibility ","type":"hasLabel","value":true},{"label":"Toggle button","type":"hasLabel","value":true},{"label":"ADS Category Token","type":"hasLabel","value":true},{"label":"ADS Component Documentation","type":"hasLabel","value":true},{"label":"ADS Migration","type":"hasLabel","value":true},{"label":"ADS Deduplication ","type":"hasLabel","value":true},{"label":"ADS Revamp","type":"hasLabel","value":true},{"label":"ADS Deduplication","type":"hasLabel","value":true},{"label":"ADS Unit Test","type":"hasLabel","value":true},{"label":"ADS Components","type":"hasLabel","value":true},{"label":"ADS Grayscale","type":"hasLabel","value":true},{"label":"Design System","type":"hasLabel","value":true},{"label":"ADS Typography","type":"hasLabel","value":true},{"label":"ADS Visual Styles","type":"hasLabel","value":true},{"label":"ADS Component Design","type":"hasLabel","value":true},{"label":"Modal Component","type":"hasLabel","value":true},{"label":"ADS Spacing","type":"hasLabel","value":true},{"label":"ads unit test","type":"hasLabel","value":true},{"label":"ads revamp","type":"hasLabel","value":true},{"label":"ads deduplication","type":"hasLabel","value":true}],"requires":1},"RBAC Product":{"conditions":[{"label":"Invite users","type":"hasLabel","value":true},{"label":"RBAC Product","type":"hasLabel","value":true}],"requires":1},"Workspace Product":{"conditions":[{"label":"Home Page","type":"hasLabel","value":true},{"label":"Workspace Product","type":"hasLabel","value":true}],"requires":1},"Billing & Licensing Product":{"conditions":[{"label":"Customer Portal","type":"hasLabel","value":true},{"label":"Cloud Services","type":"hasLabel","value":true},{"label":"Billing","type":"hasLabel","value":true},{"label":"Self Serve","type":"hasLabel","value":true},{"label":"Enterprise Billing","type":"hasLabel","value":true},{"label":"Analytics Improvements","type":"hasLabel","value":true},{"label":"Self Serve 1.0","type":"hasLabel","value":true},{"label":"License","type":"hasLabel","value":true},{"label":"BE instance","type":"hasLabel","value":true},{"label":"Invite flow","type":"hasLabel","value":true},{"label":"CE Instance Usage","type":"hasLabel","value":true},{"label":"Feature Flagging","type":"hasLabel","value":true}],"requires":1},"Packages Product":{"conditions":[{"label":"Packages Product","type":"hasLabel","value":true}],"requires":1},"Environments Product":{"conditions":[{"label":"Environments Product","type":"hasLabel","value":true}],"requires":1},"UI Building Product":{"conditions":[{"label":"Property Pane","type":"hasLabel","value":true},{"label":"Copy Paste","type":"hasLabel","value":true},{"label":"Drag & Drop","type":"hasLabel","value":true},{"label":"Undo/Redo","type":"hasLabel","value":true},{"label":"Widgets Pane","type":"hasLabel","value":true},{"label":"UI Performance","type":"hasLabel","value":true},{"label":"Widget Grouping","type":"hasLabel","value":true},{"label":"Reflow & Resize","type":"hasLabel","value":true},{"label":"Canvas / Grid","type":"hasLabel","value":true},{"label":"Auto Height","type":"hasLabel","value":true},{"label":"Browser specific","type":"hasLabel","value":true},{"label":"Auto Layout","type":"hasLabel","value":true},{"label":"Fixed layout","type":"hasLabel","value":true},{"label":"App Navigation","type":"hasLabel","value":true}],"requires":1},"Onboarding Product":{"conditions":[{"label":"Welcome Screen","type":"hasLabel","value":true}],"requires":1},"Git Product":{"conditions":[{"label":"Git Product","type":"hasLabel","value":true},{"label":"Git Auto-commit","type":"hasLabel","value":true},{"label":"Auto-commit","type":"hasLabel","value":true},{"label":"Continuous Deployment","type":"hasLabel","value":true},{"label":"Default branch","type":"hasLabel","value":true},{"label":"Git status","type":"hasLabel","value":true},{"label":"Git performance","type":"hasLabel","value":true},{"label":"SDLC","type":"hasLabel","value":true},{"label":"Git IA","type":"hasLabel","value":true},{"label":"Branch management","type":"hasLabel","value":true}],"requires":1},"Embedding Apps Product":{"conditions":[{"label":"Embedding Apps Product","type":"hasLabel","value":true}],"requires":1},"Integrations Product":{"conditions":[{"label":"New Datasource","type":"hasLabel","value":true},{"label":"Firestore","type":"hasLabel","value":true},{"label":"Google Sheets","type":"hasLabel","value":true},{"label":"Mongo","type":"hasLabel","value":true},{"label":"Redshift","type":"hasLabel","value":true},{"label":"snowflake","type":"hasLabel","value":true},{"label":"S3","type":"hasLabel","value":true},{"label":"Redis","type":"hasLabel","value":true},{"label":"Postgres","type":"hasLabel","value":true},{"label":"GraphQL Plugin","type":"hasLabel","value":true},{"label":"ArangoDB","type":"hasLabel","value":true},{"label":"MsSQL","type":"hasLabel","value":true},{"label":"Elastic Search","type":"hasLabel","value":true},{"label":"OAuth","type":"hasLabel","value":true},{"label":"Airtable","type":"hasLabel","value":true},{"label":"CURL","type":"hasLabel","value":true},{"label":"DynamoDB","type":"hasLabel","value":true},{"label":"Zendesk","type":"hasLabel","value":true},{"label":"Hubspot","type":"hasLabel","value":true},{"label":"Query Forms","type":"hasLabel","value":true},{"label":"Twilio","type":"hasLabel","value":true},{"label":"MySQL","type":"hasLabel","value":true},{"label":"Connection pool","type":"hasLabel","value":true},{"label":"MariaDB","type":"hasLabel","value":true},{"label":"Integrations Pod General","type":"hasLabel","value":true},{"label":"SMTP plugin","type":"hasLabel","value":true},{"label":"Oracle SQL DB","type":"hasLabel","value":true},{"label":"Query filter","type":"hasLabel","value":true},{"label":"Activation - datasources","type":"hasLabel","value":true},{"label":"REST API","type":"hasLabel","value":true},{"label":"REST API","type":"hasLabel","value":true},{"label":"Datasources","type":"hasLabel","value":true},{"label":"REST API plugin","type":"hasLabel","value":true},{"label":"Prepared statements","type":"hasLabel","value":true},{"label":"Query Generation","type":"hasLabel","value":true},{"label":"Core Query Execution","type":"hasLabel","value":true},{"label":"Query Management","type":"hasLabel","value":true},{"label":"Query Settings","type":"hasLabel","value":true},{"label":"Query performance","type":"hasLabel","value":true},{"label":"Datatype issue","type":"hasLabel","value":true},{"label":"SmartSubstitution","type":"hasLabel","value":true},{"label":"Suggested Widgets","type":"hasLabel","value":true},{"label":"SAAS Plugins","type":"hasLabel","value":true},{"label":"Reconnect DS modal","type":"hasLabel","value":true},{"label":"OnPageLoad","type":"hasLabel","value":true},{"label":"File upload issues","type":"hasLabel","value":true},{"label":"AI","type":"hasLabel","value":true},{"label":"Appsmith AI","type":"hasLabel","value":true},{"label":"Database Schema","type":"hasLabel","value":true}],"requires":1},"Identity & Authentication Product":{"conditions":[{"label":"Login / Signup","type":"hasLabel","value":true},{"label":"SSO","type":"hasLabel","value":true},{"label":"SCIM","type":"hasLabel","value":true},{"label":"Email verification","type":"hasLabel","value":true}],"requires":1},"Artifact Platform Product":{"conditions":[{"label":"Fork App","type":"hasLabel","value":true},{"label":"Publish App","type":"hasLabel","value":true},{"label":"Secret Management","type":"hasLabel","value":true},{"label":"Import-Export-App","type":"hasLabel","value":true}],"requires":1},"DevOps Pod":{"conditions":[{"label":"Docker","type":"hasLabel","value":true},{"label":"Super Admin","type":"hasLabel","value":true},{"label":"Deployment","type":"hasLabel","value":true},{"label":"K8s","type":"hasLabel","value":true},{"label":"Email Config","type":"hasLabel","value":true},{"label":"Backup & Restore","type":"hasLabel","value":true},{"label":"AWS AMI","type":"hasLabel","value":true},{"label":"Observability","type":"hasLabel","value":true},{"label":"Heroku","type":"hasLabel","value":true},{"label":"New Deployment Mode","type":"hasLabel","value":true},{"label":"Supervisor","type":"hasLabel","value":true},{"label":"Deployment Certificates","type":"hasLabel","value":true},{"label":"Mock Data","type":"hasLabel","value":true},{"label":"AWS ECS","type":"hasLabel","value":true},{"label":"Ingress","type":"hasLabel","value":true},{"label":"Nginx","type":"hasLabel","value":true},{"label":"Setup Issues","type":"hasLabel","value":true}],"requires":1},"Performance Pod":{"conditions":[{"label":"Performance","type":"hasLabel","value":true},{"label":"Performance infra","type":"hasLabel","value":true}],"requires":1},"IDE Pod":{"conditions":[{"label":"Telemetry","type":"hasLabel","value":true},{"label":"i18n","type":"hasLabel","value":true},{"label":"IDE Product","type":"hasLabel","value":true},{"label":"App setting","type":"hasLabel","value":true},{"label":"Debugger Product","type":"hasLabel","value":true},{"label":"Embedding Apps Product","type":"hasLabel","value":true}],"requires":1},"Platform Administration Pod":{"conditions":[{"label":"Airgap","type":"hasLabel","value":true},{"label":"Enterprise Edition","type":"hasLabel","value":true},{"label":"Invite flow","type":"hasLabel","value":true},{"label":"User Profile","type":"hasLabel","value":true},{"label":"User Session ","type":"hasLabel","value":true},{"label":"User Session","type":"hasLabel","value":true},{"label":"Admin Settings Product","type":"hasLabel","value":true},{"label":"RBAC Product","type":"hasLabel","value":true},{"label":"Workspace Product","type":"hasLabel","value":true},{"label":"Branding Product","type":"hasLabel","value":true},{"label":"Audit Logs Product","type":"hasLabel","value":true},{"label":"Identity & Authentication Product","type":"hasLabel","value":true}],"requires":1},"DB Infrastructure Pod":{"conditions":[{"label":"Move to Postgres","type":"hasLabel","value":true}],"requires":1},"Widgets & Accelerators Pod":{"conditions":[{"label":"Accelerators Product","type":"hasLabel","value":true},{"label":"Templates Product","type":"hasLabel","value":true},{"label":"Widgets Product","type":"hasLabel","value":true},{"label":"App Theming Product","type":"hasLabel","value":true}],"requires":1},"Packages Pod":{"conditions":[{"label":"Module creator","type":"hasLabel","value":true},{"label":"Module consumer","type":"hasLabel","value":true},{"label":"Package versioning","type":"hasLabel","value":true},{"label":"Convert to module","type":"hasLabel","value":true},{"label":"Query module","type":"hasLabel","value":true},{"label":"JS module","type":"hasLabel","value":true},{"label":"UI module","type":"hasLabel","value":true},{"label":"Packages Pod","type":"hasLabel","value":true}],"requires":1},"Workflows Pod":{"conditions":[{"label":"Workflows Product","type":"hasLabel","value":true}],"requires":1},"Query & JS Pod":{"conditions":[{"label":"Javascript Product","type":"hasLabel","value":true},{"label":"Onboarding Product","type":"hasLabel","value":true},{"label":"Integrations Product","type":"hasLabel","value":true},{"label":"Reconfigure Datasource Modal","type":"hasLabel","value":true}],"requires":1},"QA Pod":{"conditions":[{"label":"QA","type":"hasLabel","value":true},{"label":"Automation Test","type":"hasLabel","value":true},{"label":"TestGap","type":"hasLabel","value":true},{"label":"Automation failures","type":"hasLabel","value":true},{"label":"Needs automation","type":"hasLabel","value":true}],"requires":1},"Anvil POD":{"conditions":[{"label":"Checkbox Component","type":"hasLabel","value":true},{"label":"WDS team","type":"hasLabel","value":true},{"label":"Anvil POD","type":"hasLabel","value":true},{"label":"WDS - all widgets","type":"hasLabel","value":true},{"label":"WDS - input widget","type":"hasLabel","value":true},{"label":"WDS - paragraph widget","type":"hasLabel","value":true},{"label":"WDS - statbox widget","type":"hasLabel","value":true},{"label":"WDS - modal widget","type":"hasLabel","value":true},{"label":"WDS - icon widget","type":"hasLabel","value":true},{"label":"WDS - checkbox widget","type":"hasLabel","value":true},{"label":"WDS - table widget","type":"hasLabel","value":true},{"label":"WDS - keyValue widget","type":"hasLabel","value":true},{"label":"WDS - switch group widget","type":"hasLabel","value":true},{"label":"WDS - theming","type":"hasLabel","value":true},{"label":"Anvil layout","type":"hasLabel","value":true},{"label":"Anvil - theming","type":"hasLabel","value":true},{"label":"Anvil - vertical alignment","type":"hasLabel","value":true},{"label":"Anvil - layout component","type":"hasLabel","value":true},{"label":"Anvil - drag & drop","type":"hasLabel","value":true},{"label":"Anvil - zones & sections","type":"hasLabel","value":true},{"label":"Anvil - copy paste experience","type":"hasLabel","value":true},{"label":"WDS - phone widget","type":"hasLabel","value":true},{"label":"WDS - responsive widget","type":"hasLabel","value":true},{"label":"Anvil - responsive viewport","type":"hasLabel","value":true},{"label":"WDS - widget styling","type":"hasLabel","value":true},{"label":"Anvil - spacing","type":"hasLabel","value":true},{"label":"Anvil - responsive canvas","type":"hasLabel","value":true},{"label":"WDS - inline button widget","type":"hasLabel","value":true},{"label":"Anvil team","type":"hasLabel","value":true}],"requires":1},"Activation Pod":{"conditions":[{"label":"Activation","type":"hasLabel","value":true}],"requires":1},"Stability Pod":{"conditions":[{"label":"Stability Issue","type":"hasLabel","value":true},{"label":"cypress-flaky-fix","type":"hasLabel","value":true},{"label":"Cypress flaky tests","type":"hasLabel","value":true}],"requires":1},"Documentation Pod":{"conditions":[{"label":"Documentation","type":"hasLabel","value":true}],"requires":1},"Packages & Git Pod":{"conditions":[{"label":"Packages Pod","type":"hasLabel","value":true},{"label":"Git Product","type":"hasLabel","value":true},{"label":"Packages Product","type":"hasLabel","value":true},{"label":"Git Platform","type":"hasLabel","value":true}],"requires":1},"Git Platform":{"conditions":[{"label":"Environments Product","type":"hasLabel","value":true},{"label":"Artifact Platform Product","type":"hasLabel","value":true}],"requires":1}}},"root":"."}],"labels":{"Tab Widget":{"color":"e2c76c","name":"Tab Widget","description":""},"Dont merge":{"color":"ADB39C","name":"Dont merge","description":""},"Epic":{"color":"3E4B9E","name":"Epic","description":"A zenhub epic that describes a project"},"Menu Button Widget":{"color":"235708","name":"Menu Button Widget","description":"Issues related to Menu Button widget"},"Checkbox Group widget":{"color":"bbeecd","name":"Checkbox Group widget","description":"Issues related to Checkbox Group Widget"},"Input Widget":{"color":"ae65d8","name":"Input Widget","description":""},"Security":{"color":"99139C","name":"Security","description":""},"QA":{"color":"","name":"QA","description":"Needs QA attention"},"Verified":{"color":"9bf416","name":"Verified","description":""},"Wont Fix":{"color":"ffffff","name":"Wont Fix","description":"This will not be worked on"},"MySQL":{"color":"c9ddc6","name":"MySQL","description":"Issues related to MySQL plugin"},"Development":{"color":"9F8A02","name":"Development","description":""},"Help Wanted":{"color":"008672","name":"Help Wanted","description":"Extra attention is needed"},"Home Page":{"color":"","name":"Home Page","description":"Issues related to the application home page"},"Rating Widget":{"color":"235708","name":"Rating Widget","description":"Issues related to the rating widget"},"Stat Box Widget":{"color":"f1c9ce","name":"Stat Box Widget","description":"Issues related to stat box"},"Enhancement":{"color":"a2eeef","name":"Enhancement","description":"New feature or request"},"Fork App":{"color":"af87c7","name":"Fork App","description":"Issues related to forking apps"},"Container Widget":{"color":"19AD0D","name":"Container Widget","description":"Container widget"},"Papercut":{"color":"B562F6","name":"Papercut","description":""},"Needs Design":{"color":"bfd4f2","name":"Needs Design","description":"needs design or changes to design"},"i18n":{"color":"1799b0","name":"i18n","description":"Represents issues that need to be tackled to handle internationalization"},"Rich Text Editor Widget":{"color":"f72cac","name":"Rich Text Editor Widget","description":""},"skip-changelog":{"color":"06086F","name":"skip-changelog","description":"Adding this label to a PR prevents it from being listed in the changelog"},"Low":{"color":"79e53b","name":"Low","description":"An issue that is neither critical nor breaks a user flow"},"potential-duplicate":{"color":"d3cb2e","name":"potential-duplicate","description":"This label marks issues that are potential duplicates of already open issues"},"Audio Widget":{"color":"447B9A","name":"Audio Widget","description":"Issues related to Audio Widget"},"Firestore":{"color":"8078b0","name":"Firestore","description":"Issues related to the firestore Integration"},"New Widget":{"color":"be4cf2","name":"New Widget","description":"A request for a new widget"},"Modal Widget":{"color":"03846f","name":"Modal Widget","description":""},"UX Improvement":{"color":"f4a089","name":"UX Improvement","description":""},"S3":{"color":"8078b0","name":"S3","description":"Issues related to the S3 plugin"},"Release Blocker":{"color":"5756bf","name":"Release Blocker","description":"This issue must be resolved before the release"},"safari":{"color":"51C6AA","name":"safari","description":"Bugs seen on safari browser"},"Example Apps":{"color":"1799b0","name":"Example Apps","description":"Example apps created for new signups"},"MultiSelect Widget":{"color":"AB62D4","name":"MultiSelect Widget","description":"Issues related to MultiSelect Widget"},"Calendar Widget":{"color":"8c6644","name":"Calendar Widget","description":""},"Website":{"color":"151720","name":"Website","description":"Related to www.appsmith.com website"},"Low effort":{"color":"8B59F0","name":"Low effort","description":"Something that'll take a few days to build"},"Checkbox Widget":{"color":"bbeecd","name":"Checkbox Widget","description":""},"Spam":{"color":"620faf","name":"Spam","description":""},"Voice Recorder Widget":{"color":"85bc87","name":"Voice Recorder Widget","description":""},"Select Widget":{"color":"0c669e","name":"Select Widget","description":"Select or dropdown widget"},"Bug":{"color":"8ba6fd","name":"Bug","description":"Something isn't right"},"Widget Validation":{"color":"6990BC","name":"Widget Validation","description":"Issues related to widget property validation"},"Generate Page":{"color":"2b4664","name":"Generate Page","description":"Issures related to page generation"},"File Picker Widget":{"color":"6ae4f2","name":"File Picker Widget","description":""},"snowflake":{"color":"8078b0","name":"snowflake","description":"Issues related to the snowflake Integration"},"Automation":{"color":"CCAF60","name":"Automation","description":""},"hotfix":{"color":"BA3F1D","name":"hotfix","description":""},"Import-Export-App":{"color":"48883f","name":"Import-Export-App","description":"Issues related to importing and exporting apps"},"High effort":{"color":"A7E87B","name":"High effort","description":"Something that'll take more than a month to build"},"Telemetry":{"color":"bc70f9","name":"Telemetry","description":"Issues related to instrumenting appsmith"},"Radio Widget":{"color":"91ef15","name":"Radio Widget","description":""},"Omnibar":{"color":"1bb96a","name":"Omnibar","description":"Issues related to the omnibar for navigation"},"Button Widget":{"color":"34efae","name":"Button Widget","description":""},"Switch widget":{"color":"33A8CE","name":"Switch widget","description":"The switch widget"},"Map Widget":{"color":"7eef7a","name":"Map Widget","description":""},"Task":{"color":"085630","name":"Task","description":"A simple Todo"},"Design System":{"color":"2958a4","name":"Design System","description":"Design system"},"opera":{"color":"C63F5B","name":"opera","description":"Any issues identified on the opera browser"},"Login / Signup":{"color":"","name":"Login / Signup","description":"Authentication flows"},"Image Widget":{"color":"8de8ad","name":"Image Widget","description":""},"firefox":{"color":"6d56e2","name":"firefox","description":""},"Property Pane":{"color":"b356ff","name":"Property Pane","description":"Issues related to the behaviour of the property pane"},"Deployment":{"color":"93491f","name":"Deployment","description":"Installation process of appsmith"},"Production":{"color":"b60205","name":"Production","description":""},"Dependencies":{"color":"0366d6","name":"Dependencies","description":"Pull requests that update a dependency file"},"Google Sheets":{"color":"8078b0","name":"Google Sheets","description":"Issues related to Google Sheets"},"Icon Button Widget":{"color":"D319CE","name":"Icon Button Widget","description":"Issues related to the icon button widget"},"Mongo":{"color":"8078b0","name":"Mongo","description":"Issues related to Mongo DB plugin"},"Documentation":{"color":"a8dff7","name":"Documentation","description":"Improvements or additions to documentation"},"TestGap":{"color":"","name":"TestGap","description":"Issues identified for test plan improvement"},"keyboard shortcut":{"color":"0688B6","name":"keyboard shortcut","description":""},"Reopen":{"color":"897548","name":"Reopen","description":""},"Redshift":{"color":"8078b0","name":"Redshift","description":"Issues related to the redshift integration"},"Date Picker Widget":{"color":"ef1ce1","name":"Date Picker Widget","description":""},"Entity Explorer":{"color":"1bb96a","name":"Entity Explorer","description":"Issues related to navigation using the entity explorer"},"JS Linting & Errors":{"color":"E56AA5","name":"JS Linting & Errors","description":"Issues related to JS Linting and errors"},"iFrame":{"color":"3CD1DB","name":"iFrame","description":"Issues related to iFrame"},"Stale":{"color":"ededed","name":"Stale","description":null},"Text Widget":{"color":"d130d1","name":"Text Widget","description":""},"Video Widget":{"color":"23dd4b","name":"Video Widget","description":""},"Datasources":{"color":"3d590f","name":"Datasources","description":"Issues related to configuring datasource on appsmith"},"error":{"color":"B66773","name":"error","description":"All issues connected to error messages"},"Form Widget":{"color":"09ed77","name":"Form Widget","description":""},"Needs Triaging":{"color":"e8b851","name":"Needs Triaging","description":"Needs attention from maintainers to triage"},"Autocomplete":{"color":"235708","name":"Autocomplete","description":"Issues related to the autocomplete"},"hacktoberfest":{"color":"0052cc","name":"hacktoberfest","description":"All issues that can be solved by the community during Hacktoberfest"},"Medium effort":{"color":"D31156","name":"Medium effort","description":"Something that'll take more than a week but less than a month to build"},"Release":{"color":"57e5e0","name":"Release","description":""},"High":{"color":"c94d14","name":"High","description":"This issue blocks a user from building or impacts a lot of users"},"UI Performance":{"color":"1799b0","name":"UI Performance","description":"Issues related to UI performance"},"Deploy Preview":{"color":"bfdadc","name":"Deploy Preview","description":"Issues found in Deploy Preview"},"Needs Tests":{"color":"8ee263","name":"Needs Tests","description":"Needs automated tests to assert a feature/bug fix"},"Refactor":{"color":"B96662","name":"Refactor","description":"needs refactoring of code"},"Divider Widget":{"color":"235708","name":"Divider Widget","description":"Issues related to the divider widget"},"Table Widget":{"color":"2eead1","name":"Table Widget","description":""},"Needs More Info":{"color":"e54c10","name":"Needs More Info","description":"Needs additional information"},"Good First Issue":{"color":"7057ff","name":"Good First Issue","description":"Good for newcomers"},"UI Improvement":{"color":"9aeef4","name":"UI Improvement","description":""},"Backend":{"color":"d4c5f9","name":"Backend","description":"This marks the issue or pull request to reference server code"},"Frontend":{"color":"87c7f2","name":"Frontend","description":"This label marks the issue or pull request to reference client code"},"Chart Widget":{"color":"616ecc","name":"Chart Widget","description":""},"List Widget":{"color":"8508A0","name":"List Widget","description":"Issues related to the list widget"},"Duplicate":{"color":"cfd3d7","name":"Duplicate","description":"This issue or pull request already exists"},"JS Snippets":{"color":"8d62d2","name":"JS Snippets","description":"issues related to JS Snippets"},"Copy Paste":{"name":"Copy Paste","description":"Issues related to copy paste","color":"b4f0a9"},"Drag & Drop":{"name":"Drag & Drop","description":"Issues related to the drag & drop experience","color":"92115a"},"Sniping Mode":{"name":"Sniping Mode","description":"Issues related to sniping mode","color":"48883f"},"Redis":{"name":"Redis","description":"Issues related to Redis","color":"8078b0"},"New Datasource":{"color":"60b14c","name":"New Datasource","description":"Requests for new datasources"},"Evaluated Value":{"name":"Evaluated Value","description":"Issues related to evaluated values","color":"39f6e7"},"Undo/Redo":{"name":"Undo/Redo","description":"Issues related to undo/redo","color":"f25880"},"App Navigation":{"name":"App Navigation","description":"Issues related to the topbar navigation and configuring it","color":"4773ab"},"Widgets Pane":{"name":"Widgets Pane","description":"Issues related to the discovery and organisation of widgets","color":"ad5d78"},"View Mode":{"color":"1799b0","name":"View Mode","description":"Issues related to the view mode"},"Content":{"name":"Content","description":"For content related topics i.e blogs, templates, videos","color":"a8dff7"},"Slash Command":{"name":"Slash Command","description":"Issues related to the slash command","color":"a0608e"},"Widget Property":{"name":"Widget Property","description":"Issues related to adding / modifying widget properties across widgets","color":"5e92cb"},"Windows":{"name":"Windows","description":"Issues related exclusively to Windows systems","color":"b4cb8a"},"Old App Issues":{"name":"Old App Issues","description":"Issues related to apps old apps a few weeks old and app issues in stale browser session","color":"87ab18"},"Document Viewer Widget":{"name":"Document Viewer Widget","description":"Issues related to Document Viewer Widget","color":"899d4b"},"Radio Group Widget":{"name":"Radio Group Widget","description":"Issues related to radio group widget","color":"b68495"},"Super Admin":{"name":"Super Admin","description":"Issues related to the super admin page","color":"aa95cf"},"Postgres":{"name":"Postgres","description":"Postgres related issues","color":"8078b0"},"New JS Function":{"name":"New JS Function","description":"Issues related to adding a JS Function","color":"8e8aa4"},"Cannot Reproduce Issue":{"color":"93c9cc","name":"Cannot Reproduce Issue","description":"Issues that cannot be reproduced"},"Widget Grouping":{"name":"Widget Grouping","description":"Issues related to Widget Grouping","color":"a49951"},"K8s":{"name":"K8s","description":"Kubernetes related issues","color":"5f318a"},"Docker":{"name":"Docker","description":"Issues related to docker","color":"89b808"},"Camera Widget":{"name":"Camera Widget","description":"Issues and enhancements related to camera widget","color":"e6038e"},"SAAS Plugins":{"name":"SAAS Plugins","description":"Issues related to SAAS Plugins","color":"80e18f"},"JS Promises":{"name":"JS Promises","description":"Issues related to promises","color":"d7771f"},"OnPageLoad":{"name":"OnPageLoad","description":"OnPageLoad issues on functions and queries","color":"2b4664"},"JS Usability":{"name":"JS Usability","description":"usability issues with JS editor and JS elsewhere","color":"a302b0"},"Currency Input Widget":{"name":"Currency Input Widget","description":"Issues related to currency input widget","color":"b2164f"},"TreeSelect":{"name":"TreeSelect","description":"Issues related to TreeSelect Widget","color":"a1633e"},"MultiTree Select Widget":{"name":"MultiTree Select Widget","description":"Issues related to MultiTree Select Widget","color":"a1633e"},"Welcome Screen":{"name":"Welcome Screen","description":"Issues related to the welcome screen","color":"48883f"},"Realtime Commenting":{"color":"a70b86","name":"Realtime Commenting","description":"In-app communication between teams"},"Phone Input Widget":{"name":"Phone Input Widget","description":"Issues related to the Phone Input widget","color":"a70b86"},"JSON Form":{"name":"JSON Form","description":"Issue / features related to the JSON form wiget","color":"46b209"},"All Widgets":{"name":"All Widgets","description":"Issues related to all widgets","color":"972b36"},"V1":{"name":"V1","description":"V1","color":"67ab2e"},"Reflow & Resize":{"name":"Reflow & Resize","description":"All issues related to reflow and resize experience","color":"748a13"},"SSO":{"name":"SSO","description":"Issues, requests and enhancements around Single sign-on.","color":""},"Multi User Realtime":{"name":"Multi User Realtime","description":"Issues related to multiple users using or editing an application","color":"e7b6ce"},"Ready for design":{"name":"Ready for design","description":"this issue is ready for design: it contains clear problem statements and other required information","color":"ebf442"},"Support":{"name":"Support","description":"Issues created by the A-force team to address user queries","color":"1740f3"},"Button Group widget":{"name":"Button Group widget","description":"Issue and enhancements related to the button group widget","color":"f17025"},"GraphQL Plugin":{"name":"GraphQL Plugin","description":"Issues related to GraphQL plugin","color":"8078b0"},"DevOps Pod":{"name":"DevOps Pod","description":"Issues related to devops","color":"d956c7"},"medium":{"name":"medium","description":"Issues that frustrate users due to poor UX","color":"23dfd9"},"ArangoDB":{"name":"ArangoDB","description":"Issues related to arangoDB","color":"8078b0"},"Code Refactoring":{"name":"Code Refactoring","description":"Issues related to code refactoring","color":"76310e"},"Progress bar widget":{"name":"Progress bar widget","description":"To track issues related to progress bar","color":"2d7abf"},"Audio Recorder Widget":{"name":"Audio Recorder Widget","description":"Issues related to Audio Recorder Widget","color":"9accef"},"Airtable":{"name":"Airtable","description":"Issues for Airtable","color":"60885f"},"Canvas / Grid":{"name":"Canvas / Grid","description":"Issues related to the canvas","color":"16b092"},"Email Config":{"name":"Email Config","description":"Issues related to configuring the email service","color":"2a21d1"},"CURL":{"name":"CURL","description":"Issues related to CURL impor","color":"60885f"},"Canvas Zooms":{"name":"Canvas Zooms","description":"Issues related to zooming the canvas","color":"e6038e"},"business":{"name":"business","description":"Features that will be a part of our business edition","color":"cd59eb"},"Action Pod":{"name":"Action Pod","description":"","color":"ee2e36"},"AutomationGap1":{"color":"a5e07c","name":"AutomationGap1","description":"Issues that needs automated tests"},"A-Force11":{"name":"A-Force11","description":"Issues raised by A-Force team","color":"d667b6"},"Business Edition":{"name":"Business Edition","description":"Features that will be a part of our business edition","color":"89bb6c"},"storeValue":{"name":"storeValue","description":"Issues related to the store value function","color":"5d3e66"},"DynamoDB":{"name":"DynamoDB","description":"Issues that are related to DynamoDB should have this label","color":"60885f"},"Backup & Restore":{"name":"Backup & Restore","description":"Issues related to backup and restore","color":"86874d"},"Billing":{"name":"Billing","description":"Billing infrastructure and flows for Business Edition and Trial users","color":"d2bc40"},"Datatype issue":{"name":"Datatype issue","description":"Issues that have risen because data types weren't handled","color":"cef66b"},"OAuth":{"name":"OAuth","description":"OAuth related bugs or features","color":"60885f"},"Table Widget V2":{"name":"Table Widget V2","description":"Issues related to Table Widget V2","color":"3a7192"},"IDE Navigation":{"name":"IDE Navigation","description":"Issues/feature requests related to IDE navigation, and context switching","color":"1bb96a"},"Query performance":{"name":"Query performance","description":"Issues that have to do with lack in performance of query execution","color":"cef66b"},"SAAS Manager App":{"name":"SAAS Manager App","description":"Issues with the SAAS manager app","color":"d427db"},"Twilio":{"name":"Twilio","description":"Issues related to Twilio integration","color":"23ba8d"},"Hubspot":{"name":"Hubspot","description":"Issues related to Hubspot integration","color":"60885f"},"Zendesk":{"name":"Zendesk","description":"Issues related to Zendesk integration","color":"60885f"},"Entity Refactor":{"name":"Entity Refactor","description":"Issues related to refactor logic","color":"705a2c"},"Map Chart Widget":{"name":"Map Chart Widget","description":"Issues related to Map Chart Widgets","color":"c8397f"},"Product Catchup":{"name":"Product Catchup","description":"Issues created in the product catchup","color":"29cd2c"},"Framework Functions":{"name":"Framework Functions","description":"Issues related to internal functions like showAlert(), navigateTo() etc...","color":"c25a09"},"Frontend Libraries Upgrade":{"name":"Frontend Libraries Upgrade","description":"Issues related to frontend libraries upgrade","color":"ede1fc"},"MsSQL":{"name":"MsSQL","description":"Issues related to MsSQL plugin","color":"8078b0"},"Elastic Search":{"name":"Elastic Search","description":"Issues related to the elastic search datasource","color":"8078b0"},"Core Query Execution":{"color":"cef66b","name":"Core Query Execution","description":"Issues related to the execution of all queries"},"Query Management":{"name":"Query Management","description":"Issues related to the CRUD of actions or queries","color":"cef66b"},"Query Settings":{"name":"Query Settings","description":"Issues related to the settings of all queries","color":"cef66b"},"Code Editor":{"name":"Code Editor","description":"Issues related to the code editor","color":"4ca16e"},"Query Forms":{"color":"12b253","name":"Query Forms","description":"Isuses related to the query forms"},"JS Objects":{"color":"22962c","name":"JS Objects","description":"Issues related to JS Objects"},"JS Evaluation":{"color":"22962c","name":"JS Evaluation","description":"Issues related to JS evaluation on the platform"},"SmartSubstitution":{"name":"SmartSubstitution","description":"Issues related to Smart substitution of mustache bindings in queries","color":"bae511"},"Query Generation":{"name":"Query Generation","description":"Issues related to query generation","color":"cef66b"},"Suggested Widgets":{"name":"Suggested Widgets","description":"Issues related to suggesting widgets based on query response","color":"6ac063"},"Code Scanner Widget":{"name":"Code Scanner Widget","description":"Issues related to code scanner widget","color":"9bc1a0"},"Clean URLs":{"name":"Clean URLs","description":"Issues related to clean URLs epic","color":"112623"},"Widget keyboard accessibility":{"name":"Widget keyboard accessibility","description":"All issues related to keyboard accessibility in widgets","color":"b626fd"},"Connection pool":{"name":"Connection pool","description":"issues to do with connection pooling of various plugins","color":"94fe36"},"List Widget V2":{"name":"List Widget V2","description":"Issues related to the list widget v2","color":"adaaf7"},"Auto Height":{"name":"Auto Height","description":"Issues related to dynamic height of widgets","color":"5149cf"},"cypress_failed_test":{"name":"cypress_failed_test","description":"Cypress failed tests","color":"4745d5"},"Needs validation":{"name":"Needs validation","description":"Needs problem validation before being picked up","color":"66673d"},"Slider Widget":{"name":"Slider Widget","description":"Issues raised for slider widgets.","color":"2eef5f"},"Multitenancy":{"name":"Multitenancy","description":"Support multitenancy within single appsmith instance","color":"8c49a9"},"Conversion Algorithm":{"name":"Conversion Algorithm","description":"All issue related to converting app from fixed to flex mode & vice versa","color":"d12d2e"},"Browser specific":{"name":"Browser specific","description":"All issue related to browser","color":"d12d2e"},"Performance infra":{"name":"Performance infra","description":"all issue related to the performance infra","color":"8a60f6"},"DSL Update":{"name":"DSL Update","description":"Issues related to storing and updating the DSL","color":"e16cf3"},"AST-frontend":{"name":"AST-frontend","description":"Issues related to maintaining AST logic","color":"2b4664"},"AST-backend":{"name":"AST-backend","description":"Backend issues related to AST parsing","color":"48883f"},"MariaDB":{"name":"MariaDB","description":"MariaDB datasource","color":"8428c3"},"ADS Component Issue":{"name":"ADS Component Issue","description":"Issues which are caused due to ADS components","color":"d89119"},"Regressed":{"color":"723fd0","name":"Regressed","description":"Scenarios that were working before but have now regressed"},"Needs RCA":{"name":"Needs RCA","description":"a critical or high priority issue that needs an RCA","color":"2cc68f"},"Custom JS Libraries":{"name":"Custom JS Libraries","description":"Issues related to adding custom JS library","color":"bacb6d"},"Integrations Pod General":{"name":"Integrations Pod General","description":"Issues related to the Integrations Pod that don't fit into other tags.","color":"287823"},"Performance Pod":{"name":"Performance Pod","description":"All things related to Appsmith performance","color":"b5a25d"},"Performance":{"name":"Performance","description":"Issues related to performance","color":"9a18d7"},"File upload issues":{"name":"File upload issues","description":"Issues related to uploading any type of files from within Appsmith","color":"2b4664"},"Action Selector":{"name":"Action Selector","description":"Issues related to action selector on the property pane","color":"2f9e20"},"Community Reported":{"name":"Community Reported","description":"issues reported by community members","color":"1402e5"},"JS Function execution":{"name":"JS Function execution","description":"JS function execution","color":"7c2de1"},"Self Serve":{"name":"Self Serve","description":"For all issues related to self-serve flow for business edition","color":"4dacfc"},"Self Serve 1.0":{"name":"Self Serve 1.0","description":"For all issues related to v1 of the self serve project","color":"ae839e"},"Customer Portal":{"name":"Customer Portal","description":"For all tasks/issues pertaining to customer.appsmith.com","color":"d2bc40"},"Cloud Services":{"name":"Cloud Services","description":"For all tasks/issues on Appsmith cloud-services relating to licensing, usage and billing","color":"d2bc40"},"One-click Binding":{"name":"One-click Binding","description":"Issues related to the One click binding epic","color":"f1661c"},"Airgap":{"name":"Airgap","description":"Tickets related to supporting air-gapped Appsmith instances","color":"1cb294"},"SMTP plugin":{"name":"SMTP plugin","description":"Issues related to SMTP plugin","color":"541457"},"AWS AMI":{"name":"AWS AMI","description":"Issues Related to AWS AMI","color":"b44680"},"Old widget version":{"name":"Old widget version","description":"Use this label to raise issue specific only to an older version of a widget","color":"ff3814"},"Enterprise Billing":{"name":"Enterprise Billing","description":"To track all tasks/issues related to licensing & billing for enterprise customers","color":"14c156"},"Oracle SQL DB":{"name":"Oracle SQL DB","description":"Issues related to the Oracle plugin","color":"cbabcb"},"Community Contributor":{"name":"Community Contributor","description":"Meant to track issues that are assigned to external contributors","color":"149ab6"},"widget vertical alignment":{"name":"widget vertical alignment","description":"All issue related widget vertical alignment on the auto layout canvas","color":"d12d2e"},"Observability":{"name":"Observability","description":"Issues related to observability on the Appsmith instance","color":"dff913"},"Checkbox Component":{"name":"Checkbox Component","description":"This labels deals with checkbox component in wds package","color":"75a401"},"Analytics Improvements":{"name":"Analytics Improvements","description":"For all tasks focused on improving our overall analytics and fixing any issues ","color":"29b8ed"},"WDS team":{"name":"WDS team","description":"","color":"8d675a"},"Enterprise Edition":{"name":"Enterprise Edition","description":"Features that will be supported in Enterprise Edition only","color":"984f5e"},"Query filter":{"name":"Query filter","description":"Issues related to query filtering, e.g., WHERE clause","color":"a15134"},"Keyboard accessibility ":{"name":"Keyboard accessibility ","description":"All issue related to ADS component keyboard accessibility","color":"2ba696"},"Toggle button":{"name":"Toggle button","description":"All issue related to ADS toggle button","color":"edc47f"},"SCIM":{"name":"SCIM","description":"Label to collate our SCIM issues","color":"48883f"},"ADS Category Token":{"name":"ADS Category Token","description":"All issues related appsmith design system category tokens","color":"920961"},"ADS Component Documentation":{"name":"ADS Component Documentation","description":"All issues Appsmith design system component documentation","color":"64c46a"},"ADS Migration":{"name":"ADS Migration","description":"All issues related to Appsmith design system migration","color":"b082d6"},"ADS Deduplication ":{"name":"ADS Deduplication ","description":"Replacing component with ADS components","color":"b082d6"},"ADS Revamp":{"name":"ADS Revamp","description":"All issues related to ads revamp. ","color":"b082d6"},"ADS Deduplication":{"name":"ADS Deduplication","description":"Replacing component with ADS components","color":"b082d6"},"ADS Grayscale":{"name":"ADS Grayscale","description":"Support grayscale color changes","color":"b03577"},"ADS Unit Test":{"name":"ADS Unit Test","description":"All issue related ads unit cases ","color":"b082d6"},"ADS Components":{"name":"ADS Components","description":"All issues related ADS components","color":"b082d6"},"Widget Discoverability":{"name":"Widget Discoverability","description":"Issues related to Widget Discoverability","color":"7b55ce"},"Widget setter method":{"name":"Widget setter method","description":"Issues with widget property setters","color":"8dce87"},"License":{"name":"License","description":"For all issues/tasks related to licensing of appsmith-ee edition","color":"90ee98"},"Platformization":{"name":"Platformization","description":"Issues or tasks related to platformization of Appsmith codebase","color":"4e972b"},"Activation - datasources":{"name":"Activation - datasources","description":"issues related to activation projects","color":"7c7ace"},"Partial-import-export":{"name":"Partial-import-export","description":"Label for granular reusability.","color":"717732"},"AI":{"name":"AI","description":"All tasks related to AI","color":"2b4664"},"ADS Typography":{"name":"ADS Typography","description":"All issue related typographical changes","color":"2dbe8d"},"Auto Layout":{"name":"Auto Layout","description":"Issues relates to auto layout","color":"92cf8c"},"Heroku":{"name":"Heroku","description":"Issues related to Heroku","color":"a81b69"},"ADS Visual Styles":{"name":"ADS Visual Styles","description":"All issues related to ADS visual styles","color":"d3da89"},"ADS Component Design":{"name":"ADS Component Design","description":"All issue related to component design","color":"5cc91e"},"Modal Component":{"name":"Modal Component","description":"All issue related to ads modal component","color":"ee63f3"},"App setting":{"name":"App setting","description":"Related to app settings panel within the app","color":"174f98"},"BE instance":{"name":"BE instance","description":"For all issues related to license, billing on BE instance","color":"ae8f98"},"Fixed layout":{"name":"Fixed layout","description":"issues related to fixed layout","color":"b66681"},"Anvil layout":{"name":"Anvil layout","description":"issues related to the new layout system anvil","color":"5e0904"},"New Deployment Mode":{"name":"New Deployment Mode","description":"Support a new mode of deployment","color":"108033"},"Custom widgets":{"name":"Custom widgets","description":"For all issues related to the custom widget project","color":"c9db9c"},"Homepage Experience V2":{"name":"Homepage Experience V2","description":"Label for reporting new tasks and bug fixes related to revamped homepage experience","color":"c55d54"},"Customer Success":{"name":"Customer Success","description":"Issues that the success team cares about","color":"6ccabd"},"Invite flow":{"name":"Invite flow","description":"Invite users flow and any associated actions","color":"881b35"},"Invite users":{"name":"Invite users","description":"Invite users flow and any associated actions","color":""},"Workflows Pod":{"name":"Workflows Pod","description":"Issues that the workflows team owns","color":"446925"},"DailyPromotionBlocker":{"name":"DailyPromotionBlocker","description":"DailyPromotion Blocker","color":"9b2280"},"JS Binding":{"name":"JS Binding","description":"All issues related to the JS Binding experience","color":"422fed"},"REST API":{"name":"REST API","description":"REST API plugin related issues","color":"e3ede5"},"Critical":{"color":"a1e3db","name":"Critical","description":"This issue breaks existing apps. Drop everything else to resolve"},"Module creator":{"name":"Module creator","description":"Issues related to the module creator side","color":"bb2c05"},"Module consumer":{"name":"Module consumer","description":"Issues related to the module consumer side","color":"83d3c5"},"Package versioning":{"name":"Package versioning","description":"ISsues related to how we manage versions for packages","color":"4c5218"},"Convert to module":{"name":"Convert to module","description":"Issues related to the module creation flow using conversion","color":"4c5218"},"Query module":{"name":"Query module","description":"Issues affecting query modules or its instances","color":"b11a7e"},"JS module":{"name":"JS module","description":"Issues affecting JS modules or its instances","color":"bf76f6"},"Secret Management":{"name":"Secret Management","description":"Issues related to secret management","color":"2b4664"},"REST API plugin":{"name":"REST API plugin","description":"REST API plugin related issues","color":"b5948a"},"UI module":{"name":"UI module","description":"Issues affecting UI modules or its instances","color":"d2acee"},"Preview mode":{"name":"Preview mode","description":"Issues related to app previews","color":"48883f"},"Git Auto-commit":{"name":"Git Auto-commit","description":"Issues related to autocommit","color":"717732"},"QA Pod":{"name":"QA Pod","description":"Issues under the QA Pod","color":"717732"},"Automation Test":{"name":"Automation Test","description":"","color":""},"Automation failures":{"name":"Automation failures","description":"","color":""},"Needs automation":{"name":"Needs automation","description":"Issues that needs automated tests","color":""},"Prepared statements":{"name":"Prepared statements","description":"Issues related to prepared statement flow","color":""},"Switch Group Widget":{"name":"Switch Group Widget","description":"Issues related to Switch group Widget","color":""},"Supervisor":{"name":"Supervisor","description":"Issues related to supervisor","color":"2c5813"},"Deployment Certificates":{"name":"Deployment Certificates","description":"Issues related to lets encrypt","color":"e148aa"},"Mock Data":{"name":"Mock Data","description":"Issues related to mock databases","color":"ebf251"},"AWS ECS":{"name":"AWS ECS","description":"Issues related to ECS Fargate","color":"e506ff"},"Publish App":{"name":"Publish App","description":"Issues related to app deployment","color":"2b4664"},"IDE Infra":{"name":"IDE Infra","description":"Issues related to the IDE infrastructure like saving changes","color":"1bb96a"},"User Profile":{"name":"User Profile","description":"Issues related to a user profile","color":"a60d34"},"Page Management":{"color":"1bb96a","name":"Page Management","description":"Issues related to configuring pages"},"Ingress":{"name":"Ingress","description":"Ingress Controller","color":"a86802"},"Nginx":{"name":"Nginx","description":"Issues related to Nginx","color":"e54195"},"Building blocks":{"name":"Building blocks","description":"Building blocks on cavas, on templates listing or drag and drop of building blocks.","color":"48883f"},"Table Inline Edit":{"name":"Table Inline Edit","description":"Issues related to inline editing","color":"60895a"},"User Session ":{"name":"User Session ","description":"For all issues/tasks related to user sessions","color":"65a3f5"},"WDS - all widgets":{"name":"WDS - all widgets","description":"all widget present in WDS","color":"2670ae"},"WDS - input widget":{"name":"WDS - input widget","description":"Issues related to input widget on WDS","color":"2670ae"},"WDS - paragraph widget":{"name":"WDS - paragraph widget","description":"issues related to paragraph widget on WDS","color":"2670ae"},"WDS - statbox widget":{"name":"WDS - statbox widget","description":"issues related to statbox widget on WDS","color":"2670ae"},"WDS - modal widget":{"name":"WDS - modal widget","description":"Issues related to modal widget on WDS","color":"2670ae"},"WDS - icon widget":{"name":"WDS - icon widget","description":"Issues related to icon widget on WDS","color":"2670ae"},"WDS - checkbox widget":{"name":"WDS - checkbox widget","description":"Issues related to checkbox widget on WDS","color":"2670ae"},"WDS - table widget":{"name":"WDS - table widget","description":"Issues related to table widget on WDS","color":"2670ae"},"WDS - keyValue widget":{"name":"WDS - keyValue widget","description":"Issues related to key-value widget on WDS","color":"2670ae"},"WDS - switch group widget":{"name":"WDS - switch group widget","description":"Issues related to switch group widget on WDS","color":"2670ae"},"WDS - theming":{"name":"WDS - theming","description":"Issues related to theming on the Anvil instance","color":"2670ae"},"Anvil POD":{"name":"Anvil POD","description":"Issue related to Anvil project","color":"5e0904"},"Anvil - theming":{"name":"Anvil - theming","description":"Issues related to theming on the Anvil instance","color":"c28de5"},"Anvil - vertical alignment":{"name":"Anvil - vertical alignment","description":"Issues related to vertical alignment on the Anvil layout","color":"c28de5"},"Anvil - layout component":{"name":"Anvil - layout component","description":"Issues related to layout component on the Anvil layout","color":"c28de5"},"Anvil - drag & drop":{"name":"Anvil - drag & drop","description":"Issues related to drag & drop experience on Anvil","color":"c28de5"},"Anvil - zones & sections":{"name":"Anvil - zones & sections","description":"Issues related to zones and sections on the Anvil layout","color":"c28de5"},"Anvil - copy paste experience":{"name":"Anvil - copy paste experience","description":"Issues related to copy paste experience on the Anvil layout","color":"c28de5"},"WDS - phone widget":{"name":"WDS - phone widget","description":"Issues related to phone widget on WDS","color":"c28de5"},"WDS - responsive widget":{"name":"WDS - responsive widget","description":"All issues related to widget responsiveness","color":"11ee05"},"Anvil - responsive viewport":{"color":"11ee05","name":"Anvil - responsive viewport","description":"Issues seen on different viewports like mobile"},"WDS - widget styling":{"color":"11ee05","name":"WDS - widget styling","description":"all about widget styling"},"Anvil - spacing":{"name":"Anvil - spacing","description":"Related to spacing between widgets in auto layout","color":"11ee05"},"Anvil - responsive canvas":{"name":"Anvil - responsive canvas","description":"All issues related to canvas responsiveness","color":"11ee05"},"WDS - inline button widget":{"name":"WDS - inline button widget","description":"Issues related to inline button widget on WDS","color":"7cef83"},"Activation Pod":{"name":"Activation Pod","description":"for Activation group","color":"d67d00"},"Activation":{"name":"Activation","description":"for Activation group","color":"d67d00"},"Tests":{"name":"Tests","description":"Test issues","color":"4fc7b6"},"Ballpark: XXS":{"name":"Ballpark: XXS","description":"~1xDev in 1/2xSprint","color":""},"Ballpark: XS":{"name":"Ballpark: XS","description":"~1xDev in 1xSprint","color":"53bf71"},"Ballpark: S":{"name":"Ballpark: S","description":"~2xDev in 1xSprint","color":"6e9e65"},"Ballpark: M":{"name":"Ballpark: M","description":"~1xPOD in 1xSprint","color":"2229e6"},"Ballpark: L":{"name":"Ballpark: L","description":"~1xPOD in 3xSprint or 2xPODs in 1xSprint","color":"49962f"},"Ballpark: XL":{"name":"Ballpark: XL","description":"~1xPOD in 1xQuarter or 2xPODs in 2xSprint","color":"b524c9"},"Ballpark: XXL":{"name":"Ballpark: XXL","description":"~2xPODs in 1xQuarter","color":"22092c"},"Auto-commit":{"name":"Auto-commit","description":"Issues related to auto-generated commits showing up on git ","color":"e25b89"},"Continuous Deployment":{"name":"Continuous Deployment","description":"Issues related to CD pipeline on git","color":"aea47c"},"Default branch":{"name":"Default branch","description":"Issues related to using a default branch on git","color":"195737"},"Git status":{"name":"Git status","description":"Issues related to information shown on git status modal or number of changes appearing in a branch","color":"c851b8"},"Git performance":{"name":"Git performance","description":"Issues related to perceived performance on any git operation","color":"189af6"},"Anvil team":{"name":"Anvil team","description":"issues related to the new layout system anvil","color":"798200"},"SDLC":{"name":"SDLC","description":"Issues related to software development lifecycle experiences","color":"bae511"},"Reconnect DS modal":{"name":"Reconnect DS modal","description":"Issues related to reconnect datasource modal post app import","color":"2e398b"},"Stability Pod":{"name":"Stability Pod","description":"For all issues/tasks to be prioritized under Stability pod","color":"86ddf6"},"Stability Issue":{"name":"Stability Issue","description":"Every issue handle by Stability Pod","color":"4d024a"},"Move to Postgres":{"name":"Move to Postgres","description":"Issues required to be solved for the move to Postgres as repository layer","color":"4e13ac"},"User Session":{"name":"User Session","description":"Issues related to user sessions","color":"8255e5"},"IDE tabs":{"name":"IDE tabs","description":"query and js tabs","color":"1bb96a"},"Inviting Contribution":{"name":"Inviting Contribution","description":"Issues that we would like contributions to","color":""},"cypress-flaky-fix":{"name":"cypress-flaky-fix","description":"This label is auto-added when a PR which only has Cypress fixes are merged to release","color":"722cbc"},"Cypress flaky tests":{"name":"Cypress flaky tests","description":"Test scripts that need to be fixed on Cypress by dev or SDET","color":"722cbc"},"Help enterprise":{"name":"Help enterprise","description":"Requested by Appsmith customers or prospects","color":"FF8C00"},"Learnability":{"name":"Learnability","description":"Issues affecting the product learnability, making the product harder for new users.","color":"800c2f"},"ADS Spacing":{"name":"ADS Spacing","description":"","color":"686ebb"},"ads unit test":{"name":"ads unit test","description":"All issue related ads unit cases","color":"686ebb"},"ads revamp":{"name":"ads revamp","description":"All issues related to ads revamp.","color":"686ebb"},"Javascript Product":{"color":"709a21","name":"Javascript Product","description":"Issues related to users writing javascript in appsmith"},"IDE Product":{"color":"1bb96a","name":"IDE Product","description":"Issues related to the IDE Product"},"IDE Pod":{"color":"1bb96a","name":"IDE Pod","description":"Issues that new developers face while exploring the IDE"},"Accelerators Product":{"name":"Accelerators Product","description":"Issues related to app building accelerators","color":"f3fce6"},"Templates Product":{"name":"Templates Product","description":"Issues related to Templates","color":"f3fce6"},"Design System Product":{"name":"Design System Product","description":"Appsmith design system related issues","color":"2b4664"},"ads deduplication":{"name":"ads deduplication","description":"Replacing component with ADS components","color":"708943"},"Admin Settings Product":{"color":"708943","name":"Admin Settings Product","description":"Issues in admin settings pages"},"Appsmith AI":{"name":"Appsmith AI","description":"All issues related to the Appsmith AI datasource","color":"708943"},"Query & JS Pod":{"color":"709a21","name":"Query & JS Pod","description":"Issues related to the query & JS Pod"},"RBAC Product":{"name":"RBAC Product","description":"Issues, requests and enhancements around RBAC.","color":""},"Workspace Product":{"name":"Workspace Product","description":"Issues related to workspaces","color":""},"CE Instance Usage":{"name":"CE Instance Usage","description":"For all issues relating to usage, licensing or billing on the CE instance","color":""},"Billing & Licensing Product":{"name":"Billing & Licensing Product","description":"Issues pertaining to licensing, billing and usage across self serve and enterprise customers","color":"446925"},"Platform Administration Pod":{"color":"446925","name":"Platform Administration Pod","description":"Issues related to platform administration & management"},"DB Infrastructure Pod":{"name":"DB Infrastructure Pod","description":"Pod to handle database infrastructure","color":"446925"},"Packages Product":{"name":"Packages Product","description":"Issues related to packages","color":"7e018f"},"Workflows Product":{"name":"Workflows Product","description":"Issues related to the workflows product","color":"446925"},"Debugger Product":{"color":"857f58","name":"Debugger Product","description":"Issues related to the debugger"},"Packages Pod":{"name":"Packages Pod","description":"issues that belong to the packages pod","color":"53742c"},"Environments Product":{"name":"Environments Product","description":"Issues related to datasource environments","color":"857f58"},"Custom Widgets":{"name":"Custom Widgets","description":"For all issues related to the custom widget project","color":"857f58"},"Branding Product":{"name":"Branding Product","description":"All issues under branding and whitelabelling appsmith ecosystem","color":"857f58"},"Widgets & Accelerators Pod":{"name":"Widgets & Accelerators Pod","description":"Issues related to widgets & Accelerators","color":"27496a"},"Widgets Product":{"name":"Widgets Product","description":"This label groups issues related to widgets","color":"f3fce6"},"App Theming Product":{"name":"App Theming Product","description":"Items that are related to the App level theming controls epic","color":"48883f"},"UI Building Product":{"color":"48883f","name":"UI Building Product","description":"Issues related to the UI Building experience"},"Onboarding Product":{"color":"48883f","name":"Onboarding Product","description":"Issues related to onboarding new developers"},"Database Schema":{"name":"Database Schema","description":"Issues related to database schema","color":"48883f"},"Git Product":{"color":"7e018f","name":"Git Product","description":"Issues related to version control product"},"Embedding Apps Product":{"name":"Embedding Apps Product","description":"Issues related to embedding","color":"48883f"},"Integrations Product":{"name":"Integrations Product","description":"Issues related to a specific integration","color":"b9f21c"},"Feature Flagging":{"name":"Feature Flagging","description":"Anything related feature flagging","color":"4574ae"},"Audit Logs Product":{"name":"Audit Logs Product","description":"Audit trails to ensure data security","color":"4574ae"},"Identity & Authentication Product":{"name":"Identity & Authentication Product","description":"Issues related to user identity & authentication","color":"4574ae"},"Email verification":{"name":"Email verification","description":"Email verification issues","color":"4574ae"},"Artifact Platform Product":{"name":"Artifact Platform Product","description":"Issues related to the application platform","color":"4574ae"},"Git IA":{"name":"Git IA","description":"Issues related to Git IA changes","color":"df8bd6"},"Documentation Pod":{"name":"Documentation Pod","description":"Issues related to user education","color":"8c8c02"},"Branch management":{"name":"Branch management","description":"Issues related to using a branch management on git","color":"ebe6af"},"Reconfigure Datasource Modal":{"name":"Reconfigure Datasource Modal","description":"Issues related to reconfigure DS modal that comes after importing applications","color":"5ac17b"},"Setup Issues":{"name":"Setup Issues","description":"Issues related to setting up appsmith","color":"3fc837"},"Packages & Git Pod":{"name":"Packages & Git Pod","description":"All issues belonging to Packages and Git","color":"46ac0e"},"Git Platform":{"name":"Git Platform","description":"Issues related to the git & the app platform","color":"c9ab80"},"Entity Management":{"name":"Entity Management","description":"Copy / Move / Delete widgets / queries / datasources","color":"74c33c"}},"success":true} \ No newline at end of file diff --git a/.github/workflows/ci-test-limited.yml b/.github/workflows/ci-test-limited.yml index 0407cc6440da..d58b7cb1c23e 100644 --- a/.github/workflows/ci-test-limited.yml +++ b/.github/workflows/ci-test-limited.yml @@ -48,7 +48,13 @@ jobs: ports: # Opens tcp port 6379 on the host and service container - 6379:6379 + postgres: + if: github.base_ref == 'pg' || github.ref_name == 'pg' + image: postgres:14 + ports: + - 5432:5432 mongo: + if: github.base_ref == 'release' || github.ref_name == 'release' image: mongo ports: - 27017:27017 diff --git a/app/client/cypress/e2e/GSheet/AllAccess_Spec.ts b/app/client/cypress/e2e/GSheet/AllAccess_Spec.ts index b40e773c0e61..5414dad27dd9 100644 --- a/app/client/cypress/e2e/GSheet/AllAccess_Spec.ts +++ b/app/client/cypress/e2e/GSheet/AllAccess_Spec.ts @@ -46,7 +46,7 @@ describe.skip( it("1. Add and verify fetch details query", () => { entityExplorer.CreateNewDsQuery(dataSourceName); - agHelper.RenameWithInPane("Fetch_Details"); + agHelper.RenameQuery("Fetch_Details"); dataSources.ValidateNSelectDropdown( "Operation", "Fetch Many", diff --git a/app/client/cypress/e2e/GSheet/GsheetMisc_Spec.ts b/app/client/cypress/e2e/GSheet/GsheetMisc_Spec.ts index e217201be66a..30e61e78aee7 100644 --- a/app/client/cypress/e2e/GSheet/GsheetMisc_Spec.ts +++ b/app/client/cypress/e2e/GSheet/GsheetMisc_Spec.ts @@ -66,7 +66,7 @@ describe.skip( it("1. Add query from active ds tab and verify", () => { dataSources.CreateQueryForDS(dataSourceName); // entityExplorer.CreateNewDsQuery(dataSourceName); - agHelper.RenameWithInPane("Fetch_Details"); + agHelper.RenameQuery("Fetch_Details"); dataSources.ValidateNSelectDropdown( "Operation", "Fetch Many", diff --git a/app/client/cypress/e2e/GSheet/ReadNWrite_Access_Spec.ts b/app/client/cypress/e2e/GSheet/ReadNWrite_Access_Spec.ts index a9d8d6818247..006a67e42ef7 100644 --- a/app/client/cypress/e2e/GSheet/ReadNWrite_Access_Spec.ts +++ b/app/client/cypress/e2e/GSheet/ReadNWrite_Access_Spec.ts @@ -50,7 +50,7 @@ describe.skip( it("1. Add and verify fetch details query", () => { entityExplorer.CreateNewDsQuery(dataSourceName.readNWrite); - agHelper.RenameWithInPane("Fetch_Details"); + agHelper.RenameQuery("Fetch_Details"); dataSources.ValidateNSelectDropdown( "Operation", "Fetch Many", diff --git a/app/client/cypress/e2e/GSheet/ReadOnly_Access_Spec.ts b/app/client/cypress/e2e/GSheet/ReadOnly_Access_Spec.ts index ed651b75fccc..987a767a155b 100644 --- a/app/client/cypress/e2e/GSheet/ReadOnly_Access_Spec.ts +++ b/app/client/cypress/e2e/GSheet/ReadOnly_Access_Spec.ts @@ -50,7 +50,7 @@ describe.skip( it("1. Add and verify fetch details query", () => { entityExplorer.CreateNewDsQuery(dataSourceName.readOnly); - agHelper.RenameWithInPane("Fetch_Details"); + agHelper.RenameQuery("Fetch_Details"); dataSources.ValidateNSelectDropdown( "Operation", "Fetch Many", diff --git a/app/client/cypress/e2e/GSheet/SelectedSheet_Access_Spec.ts b/app/client/cypress/e2e/GSheet/SelectedSheet_Access_Spec.ts index 62f0423f2d2a..50028ae77c4d 100644 --- a/app/client/cypress/e2e/GSheet/SelectedSheet_Access_Spec.ts +++ b/app/client/cypress/e2e/GSheet/SelectedSheet_Access_Spec.ts @@ -34,7 +34,7 @@ describe( it("1. Add and verify fetch details query", () => { entityExplorer.CreateNewDsQuery(dataSourceName); - agHelper.RenameWithInPane("Fetch_Details"); + agHelper.RenameQuery("Fetch_Details"); dataSources.ValidateNSelectDropdown( "Operation", "Fetch Many", diff --git a/app/client/cypress/e2e/Regression/ClientSide/Binding/JSObjectToListWidget_Spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Binding/JSObjectToListWidget_Spec.ts index eedf46751a57..17d085543a6e 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Binding/JSObjectToListWidget_Spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Binding/JSObjectToListWidget_Spec.ts @@ -2,7 +2,7 @@ import * as _ from "../../../../support/Objects/ObjectsCore"; import EditorNavigation, { EntityType, } from "../../../../support/Pages/EditorNavigation"; -import BottomPane from "../../../../support/Pages/IDE/BottomPane"; +import BottomTabs from "../../../../support/Pages/IDE/BottomTabs"; let valueToTest: any, jsName: any; @@ -19,7 +19,7 @@ describe( _.dataManager.dsValues[_.dataManager.defaultEnviorment].mockApiUrl, ); _.apiPage.RunAPI(); - BottomPane.response.switchResponseType("JSON"); + BottomTabs.response.switchResponseType("JSON"); _.apiPage.ReadApiResponsebyKey("name"); cy.get("@apiResp").then((value) => { valueToTest = value; diff --git a/app/client/cypress/e2e/Regression/ClientSide/BugTests/Binding_Bug28287_Spec.ts b/app/client/cypress/e2e/Regression/ClientSide/BugTests/Binding_Bug28287_Spec.ts index 3f92ef47c03a..3a16d0052f11 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/BugTests/Binding_Bug28287_Spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/BugTests/Binding_Bug28287_Spec.ts @@ -8,7 +8,7 @@ import { import EditorNavigation, { EntityType, } from "../../../../support/Pages/EditorNavigation"; -import BottomPane from "../../../../support/Pages/IDE/BottomPane"; +import BottomTabs from "../../../../support/Pages/IDE/BottomTabs"; let dsName: any; let queryName: string; @@ -44,10 +44,10 @@ describe( EditorNavigation.SelectEntityByName(queryName, EntityType.Query); - BottomPane.response.switchToResponseTab(); - BottomPane.response.openResponseTypeMenu(); + BottomTabs.response.switchToResponseTab(); + BottomTabs.response.openResponseTypeMenu(); agHelper.AssertElementVisibility( - BottomPane.response.locators.responseTypeMenuItem("TABLE"), + BottomTabs.response.locators.responseTypeMenuItem("TABLE"), ); }); }); diff --git a/app/client/cypress/e2e/Regression/ClientSide/BugTests/Bug14987_spec.js b/app/client/cypress/e2e/Regression/ClientSide/BugTests/Bug14987_spec.js index ace0a7d92fed..616015dde858 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/BugTests/Bug14987_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/BugTests/Bug14987_spec.js @@ -1,9 +1,9 @@ -const queryLocators = require("../../../../locators/QueryEditor.json"); import { dataSources, agHelper, entityItems, } from "../../../../support/Objects/ObjectsCore"; +import { PluginActionForm } from "../../../../support/Pages/PluginActionForm"; describe( "Verify setting tab form controls not to have tooltip and tooltip (underline) styles", @@ -17,6 +17,7 @@ describe( }, function () { let guid, datasourceName; + let pluginActionForm = new PluginActionForm(); before("Creates a new Mongo datasource", () => { dataSources.CreateDataSource("Mongo"); @@ -28,7 +29,7 @@ describe( it("1. We make sure the label in the settings tab does not have any underline styles", function () { dataSources.CreateQueryForDS(datasourceName); - cy.xpath(queryLocators.querySettingsTab).click(); + pluginActionForm.toolbar.toggleSettings(); cy.get(".label-icon-wrapper") .contains("Run the query on page load") diff --git a/app/client/cypress/e2e/Regression/ClientSide/BugTests/DSDiscardBugs_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/BugTests/DSDiscardBugs_spec.ts index fa47f87c3aa1..8ace7099d0cb 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/BugTests/DSDiscardBugs_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/BugTests/DSDiscardBugs_spec.ts @@ -20,7 +20,7 @@ describe( // because I do not need to fill the datasource form and use the same default data _.dataSources.CreatePlugIn("PostgreSQL"); dsName = "Postgres" + uid; - _.agHelper.RenameWithInPane(dsName, false); + _.agHelper.RenameDatasource(dsName); _.dataSources.SaveDatasource(); _.agHelper.Sleep(); _.dataSources.EditDatasource(); @@ -39,7 +39,7 @@ describe( // because I do not need to fill the datasource form and use the same default data _.dataSources.CreatePlugIn("Authenticated API"); dsName = "AuthDS" + uid; - _.agHelper.RenameWithInPane(dsName, false); + _.agHelper.RenameDatasource(dsName); _.dataSources.FillAuthAPIUrl(); _.dataSources.SaveDatasource(); _.agHelper.Sleep(); @@ -62,7 +62,7 @@ describe( // because I do not need to fill the datasource form and use the same default data _.dataSources.CreatePlugIn("MongoDB"); dsName = "Mongo" + uid; - _.agHelper.RenameWithInPane(dsName, false); + _.agHelper.RenameDatasource(dsName); _.dataSources.FillMongoDSForm(); _.dataSources.SaveDatasource(); _.agHelper.Sleep(); @@ -86,7 +86,7 @@ describe( // because I do not need to fill the datasource form and use the same default data _.dataSources.CreatePlugIn("MongoDB"); dsName = "Mongo" + uid; - _.agHelper.RenameWithInPane(dsName, false); + _.agHelper.RenameDatasource(dsName); _.dataSources.FillMongoDSForm(); _.dataSources.SaveDatasource(); _.agHelper.Sleep(); @@ -110,7 +110,7 @@ describe( // because I do not need to fill the datasource form and use the same default data _.dataSources.CreatePlugIn("MongoDB"); dsName = "Mongo" + uid; - _.agHelper.RenameWithInPane(dsName, false); + _.agHelper.RenameDatasource(dsName); _.dataSources.FillMongoDSForm(); _.dataSources.SaveDatasource(); _.agHelper.Sleep(); @@ -133,7 +133,7 @@ describe( // because I do not need to fill the datasource form and use the same default data _.dataSources.CreatePlugIn("MongoDB"); dsName = "Mongo" + uid; - _.agHelper.RenameWithInPane(dsName, false); + _.agHelper.RenameDatasource(dsName); _.dataSources.FillMongoDSForm(); _.dataSources.SaveDatasource(); _.agHelper.Sleep(); diff --git a/app/client/cypress/e2e/Regression/ClientSide/BugTests/DS_Bug19893_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/BugTests/DS_Bug19893_spec.ts index a82491e9c6c3..3ed795b93a6d 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/BugTests/DS_Bug19893_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/BugTests/DS_Bug19893_spec.ts @@ -12,7 +12,7 @@ describe( cy.get("@guid").then((uid) => { dsName = "AuthAPI " + uid; _.dataSources.CreatePlugIn("Authenticated API"); - _.agHelper.RenameWithInPane(dsName, false); + _.agHelper.RenameDatasource(dsName); _.dataSources.FillAuthAPIUrl(); _.dataSources.AssertCursorPositionForTextInput( _.dataSources._urlInputControl, diff --git a/app/client/cypress/e2e/Regression/ClientSide/BugTests/DS_Bug25148_Spec.ts b/app/client/cypress/e2e/Regression/ClientSide/BugTests/DS_Bug25148_Spec.ts index 6002c827a39d..a2c5228fa9dc 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/BugTests/DS_Bug25148_Spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/BugTests/DS_Bug25148_Spec.ts @@ -13,7 +13,7 @@ describe( cy.get("@guid").then((uid) => { dsName = "AuthAPI " + uid; dataSources.CreatePlugIn("Authenticated API"); - agHelper.RenameWithInPane(dsName, false); + agHelper.RenameDatasource(dsName); dataSources.FillAuthAPIUrl(); dataSources.SaveDatasource(); apiPage.CreateApi("API" + uid, "GET", true); diff --git a/app/client/cypress/e2e/Regression/ClientSide/BugTests/DatasourceSchema_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/BugTests/DatasourceSchema_spec.ts index 0ed9a482eb3a..e130bf896944 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/BugTests/DatasourceSchema_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/BugTests/DatasourceSchema_spec.ts @@ -29,7 +29,7 @@ describe( dataSourceName = "Postgres " + guid; dataSources.NavigateToDSCreateNew(); dataSources.CreatePlugIn("PostgreSQL"); - agHelper.RenameWithInPane(dataSourceName, false); + agHelper.RenameDatasource(dataSourceName); dataSources.FillPostgresDSForm( "Production", false, diff --git a/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/CopyQuery_RenameDatasource_spec.js b/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/CopyQuery_RenameDatasource_spec.js index 535ec4df3c5c..93ae8fd4f180 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/CopyQuery_RenameDatasource_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/CopyQuery_RenameDatasource_spec.js @@ -41,7 +41,7 @@ describe( dataSources.EnterQuery("select * from users"); cy.EvaluateCurrentValue("select * from users"); - cy.get(".t--action-name-edit-field").click({ force: true }); + cy.get("@saveDatasource").then((httpResponse) => { datasourceName = httpResponse.response.body.data.name; PageLeftPane.switchSegment(PagePaneSegment.Queries); diff --git a/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Entity_Naming_conflict_spec.js b/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Entity_Naming_conflict_spec.js index 65705fcab66c..cc5adce21b1b 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Entity_Naming_conflict_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Entity_Naming_conflict_spec.js @@ -3,8 +3,6 @@ import { PagePaneSegment, } from "../../../../support/Pages/EditorNavigation"; -const apiwidget = require("../../../../locators/apiWidgetslocator.json"); - import * as _ from "../../../../support/Objects/ObjectsCore"; describe( @@ -20,10 +18,6 @@ describe( it("1. Rename API with table widget name validation test", function () { cy.log("Login Successful"); cy.CreateApiAndValidateUniqueEntityName(apiName); - cy.get(apiwidget.apiTxt) - .clear() - .type(tableName, { force: true }) - .should("have.value", tableName); //Rename Table widget with api name validation test PageLeftPane.switchSegment(PagePaneSegment.UI); PageLeftPane.assertPresence("Table1"); diff --git a/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Query_Datasource_spec.js b/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Query_Datasource_spec.js index 70e051f3101e..4a23492a2ac3 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Query_Datasource_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Query_Datasource_spec.js @@ -63,11 +63,11 @@ describe( datasourceName, EntityType.Datasource, ); - agHelper.RenameWithInPane(`${datasourceName}new`, false); + agHelper.RenameDatasource(`${datasourceName}new`); cy.contains(dataSources._datasourceCard, `${datasourceName}new`); // reverting the name - agHelper.RenameWithInPane(datasourceName, false); + agHelper.RenameDatasource(datasourceName); // going to the query create page EditorNavigation.SelectEntityByName("Query1", EntityType.Query); @@ -81,7 +81,7 @@ describe( dataSources.EnterQuery("select * from users"); cy.EvaluateCurrentValue("select * from users"); - cy.get(".t--action-name-edit-field").click({ force: true }); + entityExplorer.ActionContextMenuByEntityName({ entityNameinLeftSidebar: "Query1", action: "Show bindings", diff --git a/app/client/cypress/e2e/Regression/ClientSide/Git/GitSync/GitSyncedApps_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Git/GitSync/GitSyncedApps_spec.js index e3d4b01a7ad4..6b7998269c3f 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Git/GitSync/GitSyncedApps_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Git/GitSync/GitSyncedApps_spec.js @@ -154,12 +154,10 @@ describe( apiPage.ResponseStatusCheck("200 OK"); cy.get("@curlImport").then((response) => { cy.expect(response.response.body.responseMeta.success).to.eq(true); - cy.get(apiwidget.ApiName) - .invoke("text") - .then((text) => { - const someText = text; - expect(someText).to.equal(response.response.body.data.name); - }); + agHelper.GetObjectName().then((text) => { + const someText = text; + expect(someText).to.equal(response.response.body.data.name); + }); }); EditorNavigation.ShowCanvas(); // bind input widgets to the api calls responses diff --git a/app/client/cypress/e2e/Regression/ClientSide/IDE/Command_Click_Navigation_spec.js b/app/client/cypress/e2e/Regression/ClientSide/IDE/Command_Click_Navigation_spec.js index 114e4230103b..f2300cc4b0c0 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/IDE/Command_Click_Navigation_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/IDE/Command_Click_Navigation_spec.js @@ -1,3 +1,4 @@ +import ApiEditor from "../../../../locators/ApiEditor"; import reconnectDatasourceModal from "../../../../locators/ReconnectLocators"; import { agHelper, @@ -86,7 +87,7 @@ describe( //Assert working on url field cy.updateCodeInput( - ".t--dataSourceField", + ApiEditor.dataSourceField, "http://host.docker.internal:5001/{{ SQL_Query.data }}", ); agHelper.Sleep(); diff --git a/app/client/cypress/e2e/Regression/ClientSide/IDE/Focus_retentions_inputs_spec.js b/app/client/cypress/e2e/Regression/ClientSide/IDE/Focus_retentions_inputs_spec.js index 85b373a4cdd4..562ff0e8119a 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/IDE/Focus_retentions_inputs_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/IDE/Focus_retentions_inputs_spec.js @@ -10,11 +10,14 @@ import EditorNavigation, { EntityType, PagePaneSegment, } from "../../../../support/Pages/EditorNavigation"; +import { PluginActionForm } from "../../../../support/Pages/PluginActionForm"; const apiwidget = require("../../../../locators/apiWidgetslocator.json"); const queryLocators = require("../../../../locators/QueryEditor.json"); describe("Focus Retention of Inputs", { tags: ["@tag.IDE"] }, function () { + let pluginActionForm = new PluginActionForm(); + before("Import the test application", () => { homePage.NavigateToHome(); homePage.ImportApp("ContextSwitching.json"); @@ -181,16 +184,15 @@ describe("Focus Retention of Inputs", { tags: ["@tag.IDE"] }, function () { dataSources.ToggleUsePreparedStatement(false); EditorNavigation.SelectEntityByName("S3_Query", EntityType.Query); - cy.xpath(queryLocators.querySettingsTab).click(); cy.setQueryTimeout(10000); EditorNavigation.SelectEntityByName("SQL_Query", EntityType.Query); - cy.get(".bp3-editable-text-content").should("contain.text", "SQL_Query"); - cy.xpath(queryLocators.querySettingsTab).click(); + cy.get(locators._queryName).should("contain.text", "SQL_Query"); + pluginActionForm.toolbar.toggleSettings(); agHelper.GetElement(dataSources._usePreparedStatement).should("be.focused"); EditorNavigation.SelectEntityByName("S3_Query", EntityType.Query); agHelper.Sleep(); - cy.xpath(queryLocators.querySettingsTab).click(); + pluginActionForm.toolbar.toggleSettings(); cy.xpath(queryLocators.queryTimeout).should("be.focused"); }); diff --git a/app/client/cypress/e2e/Regression/ClientSide/JSObject/JSObjectMutation_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/JSObject/JSObjectMutation_spec.ts index dbcd6c681a5a..0a18978f516b 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/JSObject/JSObjectMutation_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/JSObject/JSObjectMutation_spec.ts @@ -130,7 +130,7 @@ describe("JSObject testing", { tags: ["@tag.JS", "@tag.Binding"] }, () => { toRun: false, shouldCreateNewJSObj: true, }); - _.agHelper.GetNAssertContains(locators._selectionItem, "getData"); + _.agHelper.GetNAssertContains(_.jsEditor._funcDropdownValue, "getData"); _.jsEditor.SelectFunctionDropdown("myFun1"); _.jsEditor.RunJSObj(); EditorNavigation.SelectEntityByName("Text2", EntityType.Widget); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Linting/BasicLint_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Linting/BasicLint_spec.ts index 46c873407562..f03dbac8bb6d 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Linting/BasicLint_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Linting/BasicLint_spec.ts @@ -115,12 +115,12 @@ describe("Linting", { tags: ["@tag.JS", "@tag.Binding"] }, () => { it("2. TC 1927 Cont'd - Doesn't show lint errors when Api is renamed", () => { EditorNavigation.SelectEntityByName("Api1", EntityType.Api); - agHelper.RenameWithInPane("Api2"); + agHelper.RenameQuery("Api2"); clickButtonAndAssertLintError(false); EditorNavigation.SelectEntityByName("Api2", EntityType.Api); - agHelper.RenameWithInPane("Api1"); + agHelper.RenameQuery("Api1"); clickButtonAndAssertLintError(false); }); @@ -237,13 +237,13 @@ describe("Linting", { tags: ["@tag.JS", "@tag.Binding"] }, () => { it("6. TC 1928 Cont'd - Shows correct lint error when Query is renamed", () => { EditorNavigation.SelectEntityByName("Query1", EntityType.Query); - agHelper.RenameWithInPane("Query2"); + agHelper.RenameQuery("Query2"); // Assert Absence of lint error clickButtonAndAssertLintError(false); EditorNavigation.SelectEntityByName("Query2", EntityType.Query); - agHelper.RenameWithInPane("Query1"); + agHelper.RenameQuery("Query1"); // Assert Absence of lint error clickButtonAndAssertLintError(false); diff --git a/app/client/cypress/e2e/Regression/ClientSide/OneClickBinding/PropertyControl_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/OneClickBinding/PropertyControl_spec.ts index ee10834b2a82..003c08a2d5cb 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/OneClickBinding/PropertyControl_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/OneClickBinding/PropertyControl_spec.ts @@ -109,7 +109,7 @@ describe( }); dataSources.NavigateToDSCreateNew(); dataSources.CreatePlugIn("Mongo"); - agHelper.RenameWithInPane("myinvalidds", false); + agHelper.RenameDatasource("myinvalidds"); agHelper.ClearNType(dataSources._host(), "127.0.0.1"); agHelper.ClearNType(dataSources._port, "8000"); @@ -136,7 +136,7 @@ describe( [1, 2].forEach((I) => { dataSources.NavigateToDSCreateNew(); dataSources.CreatePlugIn("Mongo"); - agHelper.RenameWithInPane(`dummy${I}`, false); + agHelper.RenameDatasource(`dummy${I}`); agHelper.ClearNType(dataSources._host(), "127.0.0.1"); agHelper.ClearNType(dataSources._port, "8000"); diff --git a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/GlobalSearch_spec.js b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/GlobalSearch_spec.js index d719772fe1ca..e5863e922975 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/GlobalSearch_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/GlobalSearch_spec.js @@ -161,9 +161,7 @@ describe("GlobalSearch", { tags: ["@tag.Sanity"] }, function () { .first() .click(); cy.wait("@createNewApi"); - cy.get(datasourceHomeLocators.apiTxt) - .invoke("val") - .then((title) => expect(title).includes("Api")); + _.agHelper.GetObjectName().then((title) => expect(title).includes("Api")); }); // since now datasource will only be saved once user clicks on save button explicitly, diff --git a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Logs2_spec.js b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Logs2_spec.js index e3579989ff1d..975abb8972b0 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Logs2_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Logs2_spec.js @@ -98,7 +98,7 @@ describe( _.debuggerHelper.DoesConsoleLogExist(logString, false); // Run function and verify logs are visible - _.agHelper.GetNClick(_.jsEditor._runButton); + _.jsEditor.toolbar.clickRunButton(); _.agHelper.GetNClick(_.jsEditor._logsTab); _.debuggerHelper.DoesConsoleLogExist(logString); }); @@ -292,8 +292,6 @@ describe( _.debuggerHelper.OpenDebugger(); _.debuggerHelper.ClicklogEntityLink(); - - cy.get(".t--js-action-name-edit-field").should("exist"); }); it("10. Bug #24039 - Logs errors from setInterval callback into debugger", () => { diff --git a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Omnibar_spec.js b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Omnibar_spec.js index 7d6b717c08df..c0bab8211eba 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Omnibar_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Omnibar_spec.js @@ -6,6 +6,7 @@ const omnibar = require("../../../../locators/Omnibar.json"); import { agHelper, assertHelper, + jsEditor, } from "../../../../support/Objects/ObjectsCore"; describe("Omnibar functionality test cases", () => { @@ -51,7 +52,7 @@ describe("Omnibar functionality test cases", () => { cy.wait(1000); cy.wait("@createNewJSCollection"); cy.wait(1000); - cy.get(".t--js-action-name-edit-field").type(jsObjectName).wait(1000); + jsEditor.RenameJSObjFromPane(jsObjectName); agHelper.GetNClick(omnibar.globalSearch, 0, true, 2000); agHelper.GetNClickByContains( @@ -66,7 +67,7 @@ describe("Omnibar functionality test cases", () => { assertHelper.AssertNetworkStatus("@createNewApi", 201); EditorNavigation.SelectEntityByName("Api1", EntityType.Api); agHelper.AssertURL("/api"); - agHelper.RenameWithInPane(apiName); + agHelper.RenameQuery(apiName); agHelper.GetNClick(omnibar.globalSearch, 0, true); agHelper.GetNClickByContains(omnibar.categoryTitle, "Create new"); diff --git a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Replay_Editor_spec.js b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Replay_Editor_spec.js index 51b7f35df772..f1df823c3c6b 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Replay_Editor_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Replay_Editor_spec.js @@ -8,6 +8,9 @@ import { jsEditor, dataSources, } from "../../../../support/Objects/ObjectsCore"; +import { PluginActionForm } from "../../../../support/Pages/PluginActionForm"; + +let pluginActionForm = new PluginActionForm(); describe( "Undo/Redo functionality", @@ -67,7 +70,7 @@ describe( ); cy.get(`${apiwidget.headerKey}`).type("Authorization"); cy.get("body").click(0, 0); - cy.get(apiwidget.settings).click({ force: true }); + pluginActionForm.toolbar.toggleSettings(); //cy.get(apiwidget.onPageLoad).click({ force: true }); cy.get("body").click(0, 0); cy.get("body").type(`{${modifierKey}}z`); diff --git a/app/client/cypress/e2e/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js b/app/client/cypress/e2e/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js index 7f8692969748..1aecdcb9ae20 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js @@ -210,7 +210,7 @@ myFun2: async () => { agHelper.GetNClick(jsEditor._lineinJsEditor(26)); // click run button and take a snap to make sure prettify did not revert - agHelper.GetNClick(jsEditor._runButton); + jsEditor.toolbar.clickRunButton(); agHelper.Sleep(); // allow time to run //Close bottom bar after execution. debuggerHelper.CloseBottomBar(); @@ -313,7 +313,7 @@ myFun2: async () => { agHelper.GetNClick(jsEditor._lineinJsEditor(26)); // click run button and take a snap to make sure prettify did not revert - agHelper.GetNClick(jsEditor._runButton); + jsEditor.toolbar.clickRunButton(); agHelper.Sleep(); // allow time to run //Close bottom bar after execution. debuggerHelper.CloseBottomBar(); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/ListV2_PageNo_PageSize_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/ListV2_PageNo_PageSize_spec.js index 2d5cc6eb0d93..dd9a14bb8507 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/ListV2_PageNo_PageSize_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/ListV2_PageNo_PageSize_spec.js @@ -3,7 +3,6 @@ import EditorNavigation, { } from "../../../../../support/Pages/EditorNavigation"; const commonlocators = require("../../../../../locators/commonlocators.json"); -const queryLocators = require("../../../../../locators/QueryEditor.json"); import * as _ from "../../../../../support/Objects/ObjectsCore"; @@ -162,11 +161,7 @@ describe( _.dataSources.CreateDataSource("Postgres"); _.dataSources.CreateQueryAfterDSSaved(); - // Click the editing field - cy.get(".t--action-name-edit-field").click({ force: true }); - - // Click the editing field - cy.get(queryLocators.queryNameField).type("Query1"); + _.agHelper.RenameQuery("Query1"); // switching off Use Prepared Statement toggle _.dataSources.ToggleUsePreparedStatement(false); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/Listv2_BasicServerSideData_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/Listv2_BasicServerSideData_spec.js index fde5879d85cd..7545db048242 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/Listv2_BasicServerSideData_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/Listv2_BasicServerSideData_spec.js @@ -3,7 +3,6 @@ import EditorNavigation, { } from "../../../../../support/Pages/EditorNavigation"; const publishLocators = require("../../../../../locators/publishWidgetspage.json"); -const queryLocators = require("../../../../../locators/QueryEditor.json"); const commonlocators = require("../../../../../locators/commonlocators.json"); import * as _ from "../../../../../support/Objects/ObjectsCore"; const toggleJSButton = (name) => `.t--property-control-${name} .t--js-toggle`; @@ -189,13 +188,8 @@ describe( _.dataSources.CreateDataSource("Postgres"); cy.wait(1000); _.dataSources.CreateQueryAfterDSSaved(); - // Click the editing field - cy.get(".t--action-name-edit-field").click({ - force: true, - }); - // Click the editing field - cy.get(queryLocators.queryNameField).type("Query2"); + _.agHelper.RenameQuery("Query2"); // switching off Use Prepared Statement toggle _.dataSources.ToggleUsePreparedStatement(false); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/columnTypes/Select1_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/columnTypes/Select1_spec.ts index 4d7d7036575a..dcbe68ccd274 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/columnTypes/Select1_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/columnTypes/Select1_spec.ts @@ -408,7 +408,7 @@ describe( ); _.dataSources.ToggleUsePreparedStatement(false); cy.wait("@saveAction"); - cy.get(".t--run-query").click(); + cy.get(_.dataSources._runQueryBtn).click(); cy.wait("@postExecute"); PageLeftPane.switchSegment(PagePaneSegment.UI); cy.openPropertyPane("tablewidgetv2"); diff --git a/app/client/cypress/e2e/Regression/ServerSide/ApiTests/API_CurlPOSTImport_spec.js b/app/client/cypress/e2e/Regression/ServerSide/ApiTests/API_CurlPOSTImport_spec.js index 573b74152c34..0058e844f16d 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/ApiTests/API_CurlPOSTImport_spec.js +++ b/app/client/cypress/e2e/Regression/ServerSide/ApiTests/API_CurlPOSTImport_spec.js @@ -1,5 +1,9 @@ const apiwidget = require("../../../../locators/apiWidgetslocator.json"); -import { apiPage, assertHelper } from "../../../../support/Objects/ObjectsCore"; +import { + apiPage, + assertHelper, + agHelper, +} from "../../../../support/Objects/ObjectsCore"; describe( "Test curl import flow", @@ -19,12 +23,10 @@ describe( assertHelper.AssertNetworkExecutionSuccess("@postExecute"); cy.get("@curlImport").then((response) => { cy.expect(response.response.body.responseMeta.success).to.eq(true); - cy.get(apiwidget.ApiName) - .invoke("text") - .then((text) => { - const someText = text; - expect(someText).to.equal(response.response.body.data.name); - }); + agHelper.GetObjectName().then((text) => { + const someText = text; + expect(someText).to.equal(response.response.body.data.name); + }); }); }); }); diff --git a/app/client/cypress/e2e/Regression/ServerSide/Datasources/ConnectionErrors_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Datasources/ConnectionErrors_Spec.ts index 9b7e3aeff018..8dd539d4ec7d 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Datasources/ConnectionErrors_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Datasources/ConnectionErrors_Spec.ts @@ -22,7 +22,7 @@ describe( cy.get("@guid").then((uid) => { dataSources.CreatePlugIn("PostgreSQL"); dataSourceName = "PostgreSQL" + " " + uid; - agHelper.RenameWithInPane(dataSourceName, false); + agHelper.RenameDatasource(dataSourceName); dataSources.TestDatasource(false); agHelper.ValidateToastMessage("Missing username for authentication."); @@ -81,7 +81,7 @@ describe( cy.get("@guid").then((uid) => { dataSources.CreatePlugIn("MySQL"); dataSourceName = "MySQL" + " " + uid; - agHelper.RenameWithInPane(dataSourceName, false); + agHelper.RenameDatasource(dataSourceName); dataSources.TestDatasource(false); agHelper.ValidateToastMessage("Host value cannot be empty"); @@ -133,7 +133,7 @@ describe( cy.get("@guid").then((uid) => { dataSources.CreatePlugIn("MongoDB"); dataSourceName = "MongoDB" + " " + uid; - agHelper.RenameWithInPane(dataSourceName, false); + agHelper.RenameDatasource(dataSourceName); dataSources.TestDatasource(false); agHelper.ValidateToastMessage( @@ -234,7 +234,7 @@ describe( cy.get("@guid").then((uid) => { dataSources.CreatePlugIn("Redis"); dataSourceName = "Redis" + " " + uid; - agHelper.RenameWithInPane(dataSourceName, false); + agHelper.RenameDatasource(dataSourceName); dataSources.TestDatasource(false); agHelper.ValidateToastMessage( @@ -255,7 +255,7 @@ describe( cy.get("@guid").then((uid) => { dataSources.CreatePlugIn("S3"); dataSourceName = "S3" + " " + uid; - agHelper.RenameWithInPane(dataSourceName, false); + agHelper.RenameDatasource(dataSourceName); dataSources.TestDatasource(false); agHelper.ValidateToastMessage( diff --git a/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/MongoURI_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/MongoURI_Spec.ts index 0f7ab34774bf..13472013c5e3 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/MongoURI_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/MongoURI_Spec.ts @@ -30,7 +30,7 @@ describe( cy.get("@guid").then((uid) => { dataSources.CreatePlugIn("MongoDB"); dsName = "Mongo" + uid; - agHelper.RenameWithInPane(dsName, false); + agHelper.RenameDatasource(dsName); dataSources.FillMongoDatasourceFormWithURI(); dataSources.TestSaveDatasource(); AppSidebar.navigate(AppSidebarButton.Editor); diff --git a/app/client/cypress/e2e/Regression/ServerSide/JsFunctionExecution/JSFunctionExecution_spec.ts b/app/client/cypress/e2e/Regression/ServerSide/JsFunctionExecution/JSFunctionExecution_spec.ts index a704db310d01..46ca38bd5210 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/JsFunctionExecution/JSFunctionExecution_spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/JsFunctionExecution/JSFunctionExecution_spec.ts @@ -399,8 +399,6 @@ describe( cy.get("@jsObjName").then((jsObjName: any) => { jsObj = jsObjName; }); - // Switch to settings tab - agHelper.GetNClick(jsEditor._settingsTab); // Add settings for each function (according to data) Object.values(FUNCTIONS_SETTINGS_DEFAULT_DATA).forEach( (functionSetting) => { @@ -410,15 +408,16 @@ describe( ); }, ); - // Switch to settings tab - agHelper.GetNClick(jsEditor._settingsTab); + + // open settings popup + jsEditor.toolbar.toggleSettings(); //After JSObj is created - check methods are in alphabetical order assertAsyncFunctionsOrder(FUNCTIONS_SETTINGS_DEFAULT_DATA); agHelper.RefreshPage(); agHelper.Sleep(2000); //for confirmatiom modal to appear before clicking on "Yes" button for CI runs - // Switch to settings tab and assert order - agHelper.GetNClick(jsEditor._settingsTab); + // open settings popup + jsEditor.toolbar.toggleSettings(); assertAsyncFunctionsOrder(FUNCTIONS_SETTINGS_DEFAULT_DATA); }); @@ -463,14 +462,15 @@ describe( agHelper.Sleep(); EditorNavigation.SelectEntityByName(jsObj, EntityType.JSObject); - agHelper.GetNClick(jsEditor._settingsTab); + + jsEditor.toolbar.toggleSettings(); assertAsyncFunctionsOrder(FUNCTIONS_SETTINGS_DEFAULT_DATA); // rename functions and assert order - agHelper.GetNClick(jsEditor._codeTab); + jsEditor.toolbar.toggleSettings(); jsEditor.EditJSObj(getJSObject(FUNCTIONS_SETTINGS_RENAMED_DATA), false); agHelper.Sleep(3000); - agHelper.GetNClick(jsEditor._settingsTab); + jsEditor.toolbar.toggleSettings(); assertAsyncFunctionsOrder(FUNCTIONS_SETTINGS_RENAMED_DATA); agHelper.ActionContextMenuWithInPane({ action: "Delete", @@ -499,8 +499,6 @@ return "yes";`; prettify: false, }); - // Switch to settings tab - agHelper.GetNClick(jsEditor._settingsTab); // Enable all settings jsEditor.EnableDisableAsyncFuncSettings("asyncToSync", true); diff --git a/app/client/cypress/e2e/Regression/ServerSide/MySQL_Datatypes/Basic_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/MySQL_Datatypes/Basic_Spec.ts index 77211348bab2..d165faec45d4 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/MySQL_Datatypes/Basic_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/MySQL_Datatypes/Basic_Spec.ts @@ -50,7 +50,7 @@ describe( inputData.tableName, "Insert", ); - agHelper.RenameWithInPane("insertRecord"); + agHelper.RenameQuery("insertRecord"); dataSources.EnterQuery(query); query = inputData.query.dropTable; @@ -59,7 +59,7 @@ describe( inputData.tableName, "Delete", ); - agHelper.RenameWithInPane("dropTable"); + agHelper.RenameQuery("dropTable"); dataSources.EnterQuery(query); //Creating SELECT query @@ -68,7 +68,7 @@ describe( inputData.tableName, "Select", ); - agHelper.RenameWithInPane("selectRecords"); + agHelper.RenameQuery("selectRecords"); dataSources.RunQuery(); agHelper .GetText(dataSources._noRecordFound) diff --git a/app/client/cypress/e2e/Regression/ServerSide/MySQL_Datatypes/False_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/MySQL_Datatypes/False_Spec.ts index 821b89ff3f72..b72eefa047b1 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/MySQL_Datatypes/False_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/MySQL_Datatypes/False_Spec.ts @@ -32,7 +32,7 @@ describe( inputData.tableName, "Insert", ); - agHelper.RenameWithInPane("falseCases"); + agHelper.RenameQuery("falseCases"); inputData.falseResult.forEach((res_array, i) => { res_array.forEach((value) => { query = diff --git a/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/JSOnLoad4_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/JSOnLoad4_Spec.ts index 4d86a896aa8d..14dd7d2f0c30 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/JSOnLoad4_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/JSOnLoad4_Spec.ts @@ -66,7 +66,7 @@ describe( }); function VerifyFunctionDropdown(functions: string[]) { - cy.get(jsEditor._funcDropdown).click(); + cy.get(jsEditor.runFunctionSelectLocator).click({ force: true }); cy.get(jsEditor._funcDropdownOptions).then(function ($ele) { expect($ele.eq(0).text()).to.be.oneOf(functions); expect($ele.eq(1).text()).to.be.oneOf(functions); @@ -76,7 +76,7 @@ describe( expect($ele.eq(5).text()).to.be.oneOf(functions); expect($ele.eq(6).text()).to.be.oneOf(functions); }); - cy.get(jsEditor._funcDropdown).click(); + cy.get(jsEditor.runFunctionSelectLocator).click({ force: true }); } }, ); diff --git a/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/JSOnLoad_cyclic_dependency_errors_spec.js b/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/JSOnLoad_cyclic_dependency_errors_spec.js index 28b691664998..c7855cb54cbc 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/JSOnLoad_cyclic_dependency_errors_spec.js +++ b/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/JSOnLoad_cyclic_dependency_errors_spec.js @@ -5,7 +5,6 @@ import EditorNavigation, { } from "../../../../support/Pages/EditorNavigation"; const widgetsPage = require("../../../../locators/Widgets.json"); -const queryLocators = require("../../../../locators/QueryEditor.json"); let queryName = "Query1"; @@ -161,7 +160,6 @@ describe( // Case 6: When updating Datasource query EditorNavigation.SelectEntityByName(queryName, EntityType.Query); // update query and check no cyclic dependency issue should occur - cy.xpath(queryLocators.query).click({ force: true }); cy.get(".CodeMirror textarea").first().focus().type(" ", { force: true, parseSpecialCharSequences: false, diff --git a/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/OnLoadActions_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/OnLoadActions_Spec.ts index f3215412c138..befa58330cbb 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/OnLoadActions_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/OnLoadActions_Spec.ts @@ -13,7 +13,7 @@ import { import EditorNavigation, { EntityType, } from "../../../../support/Pages/EditorNavigation"; -import BottomPane from "../../../../support/Pages/IDE/BottomPane"; +import BottomTabs from "../../../../support/Pages/IDE/BottomTabs"; describe( "Layout OnLoad Actions tests", @@ -56,7 +56,7 @@ describe( ); apiPage.RunAPI(); - BottomPane.response.switchResponseType("JSON"); + BottomTabs.response.switchResponseType("JSON"); apiPage.CreateAndFillApi( "http://host.docker.internal:5001/v1/favqs/qotd", @@ -65,7 +65,7 @@ describe( ); apiPage.EnterHeader("dependency", "{{RandomUser.data}}"); //via Params tab apiPage.RunAPI(); - BottomPane.response.switchResponseType("JSON"); + BottomTabs.response.switchResponseType("JSON"); apiPage.CreateAndFillApi( "http://host.docker.internal:5001/v1/boredapi/activity", @@ -74,7 +74,7 @@ describe( ); apiPage.EnterHeader("dependency", "{{InspiringQuotes.data.data}}"); apiPage.RunAPI(); - BottomPane.response.switchResponseType("JSON"); + BottomTabs.response.switchResponseType("JSON"); apiPage.CreateAndFillApi( "http://host.docker.internal:5001/v1/genderize/sampledata", @@ -83,7 +83,7 @@ describe( ); apiPage.EnterParams("name", "{{RandomUser.data[0].name}}"); //via Params tab apiPage.RunAPI(); - BottomPane.response.switchResponseType("JSON"); + BottomTabs.response.switchResponseType("JSON"); //Adding dependency in right order matters! EditorNavigation.SelectEntityByName("Image1", EntityType.Widget); @@ -163,7 +163,7 @@ describe( value: "{{RandomUser.data[0].name}}", }); // verifies Bug 10055 apiPage.RunAPI(); - BottomPane.response.switchResponseType("JSON"); + BottomTabs.response.switchResponseType("JSON"); deployMode.DeployApp( locators._widgetInDeployed("textwidget"), diff --git a/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/PostgresConnections_spec.ts b/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/PostgresConnections_spec.ts index df94b5bc09d7..241a4a602b27 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/PostgresConnections_spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/PostgresConnections_spec.ts @@ -25,7 +25,7 @@ describe( dataSources.NavigateToDSCreateNew(); dataSources.CreatePlugIn("PostgreSQL"); guid = uid.toLowerCase(); - agHelper.RenameWithInPane("Postgres_1_" + guid, false); + agHelper.RenameDatasource("Postgres_1_" + guid); dataSources.FillPostgresDSForm(); dataSources.TestSaveDatasource(); @@ -56,7 +56,7 @@ describe( it("2. Create new datasource for user test_conn_user", () => { dataSources.NavigateToDSCreateNew(); dataSources.CreatePlugIn("PostgreSQL"); - agHelper.RenameWithInPane("Postgres_2_" + guid, false); + agHelper.RenameDatasource("Postgres_2_" + guid); const userName = "test_conn_user_" + guid; dataSources.FillPostgresDSForm("Production", false, userName, "password"); dataSources.TestSaveDatasource(); diff --git a/app/client/cypress/e2e/Regression/ServerSide/Params/ExecutionParams_spec.js b/app/client/cypress/e2e/Regression/ServerSide/Params/ExecutionParams_spec.js index 700bc2da2cf9..9a998c01ffb3 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Params/ExecutionParams_spec.js +++ b/app/client/cypress/e2e/Regression/ServerSide/Params/ExecutionParams_spec.js @@ -3,7 +3,6 @@ import EditorNavigation, { } from "../../../../support/Pages/EditorNavigation"; const publishPage = require("../../../../locators/publishWidgetspage.json"); -const queryLocators = require("../../../../locators/QueryEditor.json"); const datasource = require("../../../../locators/DatasourcesEditor.json"); import { agHelper, @@ -16,6 +15,7 @@ describe( { tags: ["@tag.Datasource", "@tag.Git", "@tag.AccessControl"] }, function () { let datasourceName; + before(() => { agHelper.AddDsl("executionParamsDsl"); }); @@ -36,9 +36,7 @@ describe( dataSources.CreateQueryAfterDSSaved( "select * from {{ this.params.tableName || 'users' }} limit 10", ); - cy.get(queryLocators.settings).click({ force: true }); dataSources.ToggleUsePreparedStatement(false); - cy.xpath(queryLocators.query).click({ force: true }); cy.runQuery(); }); diff --git a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Array_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Array_Spec.ts index 7def8bf3e6da..66973ddf98ef 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Array_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Array_Spec.ts @@ -67,7 +67,7 @@ describe( "public.arraytypes", "Select", ); - agHelper.RenameWithInPane("selectRecords"); + agHelper.RenameQuery("selectRecords"); dataSources.RunQuery(); agHelper .GetText(dataSources._noRecordFound) @@ -180,7 +180,7 @@ describe( AppSidebar.navigate(AppSidebarButton.Editor); PageLeftPane.switchSegment(PagePaneSegment.Queries); dataSources.CreateQueryForDS(dsName); - agHelper.RenameWithInPane("verifyArrayFunctions"); + agHelper.RenameQuery("verifyArrayFunctions"); query = `SELECT name FROM arraytypes WHERE pay_by_quarter[1] <> pay_by_quarter[2];`; dataSources.EnterQuery(query); diff --git a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Binary_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Binary_Spec.ts index d3b406336b59..5eb8e446b77b 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Binary_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Binary_Spec.ts @@ -50,7 +50,7 @@ describe( expect($noRecMsg).to.eq("No data records to show"), ); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("selectRecords"); + agHelper.RenameQuery("selectRecords"); }); it("2. Creating all queries- binarytype", () => { diff --git a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/BooleanEnum_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/BooleanEnum_Spec.ts index ed587c29a7ce..a18dea32488d 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/BooleanEnum_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/BooleanEnum_Spec.ts @@ -67,7 +67,7 @@ describe( "public.boolenumtypes", "Select", ); - agHelper.RenameWithInPane("selectRecords"); + agHelper.RenameQuery("selectRecords"); dataSources.RunQuery(); agHelper .GetText(dataSources._noRecordFound) @@ -169,7 +169,7 @@ describe( table.WaitUntilTableLoad(); query = `SELECT * FROM boolenumtypes WHERE workingday > 'Tuesday';`; entityExplorer.CreateNewDsQuery(dsName); - agHelper.RenameWithInPane("verifyEnumOrdering"); + agHelper.RenameQuery("verifyEnumOrdering"); dataSources.EnterQuery(query); dataSources.RunQuery(); dataSources.ReadQueryTableResponse(1).then(($cellData) => { diff --git a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Character_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Character_Spec.ts index a8ed6a0d73ff..ac525aca9bd6 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Character_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Character_Spec.ts @@ -51,7 +51,7 @@ describe( expect($noRecMsg).to.eq("No data records to show"), ); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("selectRecords"); + agHelper.RenameQuery("selectRecords"); }); it("3. Creating all queries - chartypes", () => { @@ -63,7 +63,7 @@ describe( "Insert", ); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("insertRecord"); + agHelper.RenameQuery("insertRecord"); query = `UPDATE public."chartypes" SET "One(1)" = {{Updateone.text}}, @@ -77,7 +77,7 @@ describe( "Update", ); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("updateRecord"); + agHelper.RenameQuery("updateRecord"); query = `DELETE FROM public."chartypes"`; dataSources.createQueryWithDatasourceSchemaTemplate( @@ -86,7 +86,7 @@ describe( "Delete", ); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("deleteAllRecords"); + agHelper.RenameQuery("deleteAllRecords"); query = `drop table public."chartypes"`; dataSources.createQueryWithDatasourceSchemaTemplate( @@ -95,7 +95,7 @@ describe( "Delete", ); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("dropTable"); + agHelper.RenameQuery("dropTable"); query = `DELETE FROM public."chartypes" WHERE serialId = {{Table1.selectedRow.serialid}};`; dataSources.createQueryWithDatasourceSchemaTemplate( @@ -104,7 +104,7 @@ describe( "Delete", ); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("deleteRecord"); + agHelper.RenameQuery("deleteRecord"); }); it("4. Inserting record (null values) - chartypes", () => { diff --git a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/DateTime_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/DateTime_Spec.ts index d63bcee9d3c3..51274eba5f29 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/DateTime_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/DateTime_Spec.ts @@ -59,7 +59,7 @@ describe( expect($noRecMsg).to.eq("No data records to show"), ); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("selectRecords"); + agHelper.RenameQuery("selectRecords"); }); it("3. Creating all queries - datetimetypes", () => { @@ -71,7 +71,7 @@ describe( "Insert", ); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("insertRecord"); + agHelper.RenameQuery("insertRecord"); dataSources.ToggleUsePreparedStatement(false); query = `UPDATE public."datetimetypes" SET @@ -83,7 +83,7 @@ describe( "Update", ); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("updateRecord"); + agHelper.RenameQuery("updateRecord"); dataSources.ToggleUsePreparedStatement(false); query = `DELETE FROM public."datetimetypes"`; @@ -93,7 +93,7 @@ describe( "Delete", ); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("deleteAllRecords"); + agHelper.RenameQuery("deleteAllRecords"); query = `drop table public."datetimetypes"`; dataSources.createQueryWithDatasourceSchemaTemplate( @@ -102,7 +102,7 @@ describe( "Delete", ); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("dropTable"); + agHelper.RenameQuery("dropTable"); query = `DELETE FROM public."datetimetypes" WHERE serialId = {{Table1.selectedRow.serialid}};`; @@ -112,7 +112,7 @@ describe( "Delete", ); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("deleteRecord"); + agHelper.RenameQuery("deleteRecord"); }); it("4. Validating interval methods", () => { @@ -127,7 +127,7 @@ describe( "Select", ); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("intervalRecords"); + agHelper.RenameQuery("intervalRecords"); dataSources.RunQuery(); dataSources.ReadQueryTableResponse(0).then(($cellData) => { expect($cellData).to.eq( diff --git a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Json_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Json_Spec.ts index 03371dcfb95e..ff4a6cc7500c 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Json_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Json_Spec.ts @@ -55,7 +55,7 @@ describe( "public.jsonbooks", "Select", ); - agHelper.RenameWithInPane("selectRecords"); + agHelper.RenameQuery("selectRecords"); dataSources.RunQuery(); agHelper .GetText(dataSources._noRecordFound) @@ -68,29 +68,29 @@ describe( query = `INSERT INTO jsonbooks(details) VALUES('{"customer": "{{InsertJSONForm.formData.customer}}", "title": "{{InsertJSONForm.formData.title}}", "type": {{InsertJSONForm.formData.type}}, "info": {"published": {{InsertJSONForm.formData.info.published}}, "price": {{InsertJSONForm.formData.info.price}}}}');`; entityExplorer.CreateNewDsQuery(dsName); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("insertRecord"); + agHelper.RenameQuery("insertRecord"); dataSources.ToggleUsePreparedStatement(false); query = `UPDATE public."jsonbooks" SET "details" = '{"customer": "{{UpdateJSONForm.formData.customer}}", "title": "{{UpdateJSONForm.formData.title}}", "type": {{UpdateJSONForm.formData.type}}, "info": {"published": {{UpdateJSONForm.formData.info.published}}, "price": {{UpdateJSONForm.formData.info.price}}}}' WHERE serialid = {{Table1.selectedRow.serialid}};`; entityExplorer.CreateNewDsQuery(dsName); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("updateRecord"); + agHelper.RenameQuery("updateRecord"); dataSources.ToggleUsePreparedStatement(false); query = `DELETE FROM public."jsonbooks" WHERE serialId ={{Table1.selectedRow.serialid}}`; entityExplorer.CreateNewDsQuery(dsName); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("deleteRecord"); + agHelper.RenameQuery("deleteRecord"); query = `DELETE FROM public."jsonbooks"`; entityExplorer.CreateNewDsQuery(dsName); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("deleteAllRecords"); + agHelper.RenameQuery("deleteAllRecords"); query = `drop table public."jsonbooks"`; entityExplorer.CreateNewDsQuery(dsName); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("dropTable"); + agHelper.RenameQuery("dropTable"); }); it("4. Inserting record - jsonbooks", () => { @@ -356,7 +356,7 @@ describe( query = `CREATE TABLE "jsonBbooks" (serialId SERIAL PRIMARY KEY, details JSONB)`; entityExplorer.CreateNewDsQuery(dsName); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("createTable"); + agHelper.RenameQuery("createTable"); dataSources.RunQuery(); }); @@ -366,7 +366,7 @@ describe( "public.jsonBbooks", "Select", ); - agHelper.RenameWithInPane("selectRecords"); + agHelper.RenameQuery("selectRecords"); dataSources.RunQuery(); agHelper .GetText(dataSources._noRecordFound) @@ -379,39 +379,39 @@ describe( query = `INSERT INTO "jsonBbooks"(details) VALUES('{"title": "{{InsertJSONForm.formData.title}}", "genres": {{InsertJSONForm.formData.genres}}, "info": {"published": {{InsertJSONForm.formData.info.published}}, "publishedDate": "{{InsertJSONForm.formData.info.publishedDate}}"}}');`; entityExplorer.CreateNewDsQuery(dsName); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("insertRecord"); + agHelper.RenameQuery("insertRecord"); dataSources.ToggleUsePreparedStatement(false); query = `UPDATE public."jsonBbooks" SET "details" = '{"title": "{{UpdateJSONForm.formData.title}}", "genres": {{UpdateJSONForm.formData.genres}}, "info": {"published": {{UpdateJSONForm.formData.info.published}}, "publishedDate": "{{UpdateJSONForm.formData.info.publishedDate}}"}}' WHERE serialid = {{Table1.selectedRow.serialid}};`; entityExplorer.CreateNewDsQuery(dsName); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("updateRecord"); + agHelper.RenameQuery("updateRecord"); dataSources.ToggleUsePreparedStatement(false); query = `SELECT * from enum_range(NULL::genres)`; entityExplorer.CreateNewDsQuery(dsName); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("getEnum"); + agHelper.RenameQuery("getEnum"); query = `DELETE FROM public."jsonBbooks" WHERE serialId ={{Table1.selectedRow.serialid}}`; entityExplorer.CreateNewDsQuery(dsName); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("deleteRecord"); + agHelper.RenameQuery("deleteRecord"); query = `DELETE FROM public."jsonBbooks"`; entityExplorer.CreateNewDsQuery(dsName); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("deleteAllRecords"); + agHelper.RenameQuery("deleteAllRecords"); query = `drop table public."jsonBbooks"`; entityExplorer.CreateNewDsQuery(dsName); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("dropTable"); + agHelper.RenameQuery("dropTable"); query = `drop type genres`; entityExplorer.CreateNewDsQuery(dsName); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("dropEnum"); + agHelper.RenameQuery("dropEnum"); }); it("18. Inserting record - jsonbooks", () => { diff --git a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Numeric_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Numeric_Spec.ts index db11106b543c..2f991aea82fe 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Numeric_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Numeric_Spec.ts @@ -47,7 +47,7 @@ describe( .then(($noRecMsg) => expect($noRecMsg).to.eq("No data records to show"), ); - agHelper.RenameWithInPane("selectRecords"); + agHelper.RenameQuery("selectRecords"); }); it("3. Creating all queries - numerictypes", () => { @@ -59,7 +59,7 @@ describe( "Insert", ); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("insertRecord"); + agHelper.RenameQuery("insertRecord"); query = `UPDATE public."numerictypes" SET "bigintid" = {{Updatebigint.text}}, @@ -72,7 +72,7 @@ describe( "Update", ); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("updateRecord"); + agHelper.RenameQuery("updateRecord"); query = `DELETE FROM public."numerictypes"`; dataSources.createQueryWithDatasourceSchemaTemplate( @@ -81,7 +81,7 @@ describe( "Delete", ); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("deleteAllRecords"); + agHelper.RenameQuery("deleteAllRecords"); query = `drop table public."numerictypes"`; dataSources.createQueryWithDatasourceSchemaTemplate( @@ -90,7 +90,7 @@ describe( "Delete", ); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("dropTable"); + agHelper.RenameQuery("dropTable"); query = `DELETE FROM public."numerictypes" WHERE serialId ={{Table1.selectedRow.serialid}}`; @@ -100,7 +100,7 @@ describe( "Delete", ); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("deleteRecord"); + agHelper.RenameQuery("deleteRecord"); }); it("4. Inserting record (+ve limit) - numerictypes + Bug 14516", () => { diff --git a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/UUID_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/UUID_Spec.ts index 94425b929e34..546959c8749e 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/UUID_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/UUID_Spec.ts @@ -62,34 +62,34 @@ describe( .then(($noRecMsg) => expect($noRecMsg).to.eq("No data records to show"), ); - agHelper.RenameWithInPane("selectRecords"); + agHelper.RenameQuery("selectRecords"); }); it("4. Creating all queries - uuidtype", () => { query = `INSERT INTO public."uuidtype" ("v1", "v4", "nil") VALUES ('{{version1.data}}', '{{version4.data}}', '{{nill.data}}');`; entityExplorer.CreateNewDsQuery(dsName); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("insertRecord"); + agHelper.RenameQuery("insertRecord"); query = `UPDATE public."uuidtype" SET "v1" ='{{version1.data ? version1.data : Table1.selectedRow.v1}}', "v4" ='{{version4.data ? version4.data : Table1.selectedRow.v4}}', "nil" ='{{nill.data ? nill.data : Table1.selectedRow.nil}}' WHERE serialid = {{Table1.selectedRow.serialid}};`; entityExplorer.CreateNewDsQuery(dsName); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("updateRecord"); + agHelper.RenameQuery("updateRecord"); query = `DELETE FROM public."uuidtype"`; entityExplorer.CreateNewDsQuery(dsName); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("deleteAllRecords"); + agHelper.RenameQuery("deleteAllRecords"); query = `drop table public."uuidtype"`; entityExplorer.CreateNewDsQuery(dsName); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("dropTable"); + agHelper.RenameQuery("dropTable"); query = `DELETE FROM public."uuidtype" WHERE serialId = {{Table1.selectedRow.serialid}}`; entityExplorer.CreateNewDsQuery(dsName); dataSources.EnterQuery(query); - agHelper.RenameWithInPane("deleteRecord"); + agHelper.RenameQuery("deleteRecord"); }); it("5. Inserting record - uuidtype", () => { diff --git a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/AddWidgetTableAndBind_spec.js b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/AddWidgetTableAndBind_spec.js index ff85dae304f3..40816f451266 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/AddWidgetTableAndBind_spec.js +++ b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/AddWidgetTableAndBind_spec.js @@ -7,7 +7,6 @@ const widgetsPage = require("../../../../locators/Widgets.json"); const publish = require("../../../../locators/publishWidgetspage.json"); const testdata = require("../../../../fixtures/testdata.json"); import { - entityExplorer, agHelper, dataSources, table, diff --git a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/DSDocs_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/DSDocs_Spec.ts index 96ea6018a64c..e438f1b1952a 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/DSDocs_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/DSDocs_Spec.ts @@ -7,8 +7,10 @@ import { dataManager, } from "../../../../support/Objects/ObjectsCore"; import { DataSourceKVP } from "../../../../support/Pages/DataSources"; +import { PluginActionForm } from "../../../../support/Pages/PluginActionForm"; let dsName: any; +let pluginActionForm = new PluginActionForm(); describe( "Check datasource doc links", @@ -19,6 +21,7 @@ describe( cy.get("@dsName").then(($dsName) => { dsName = $dsName; dataSources.CreateQueryAfterDSSaved(); + pluginActionForm.toolbar.openContextMenu(); deployMode.StubWindowNAssert( dataSources._queryDoc, "querying-postgres#create-crud-queries", @@ -32,6 +35,7 @@ describe( cy.get("@dsName").then(($dsName) => { dsName = $dsName; dataSources.CreateQueryAfterDSSaved(); + pluginActionForm.toolbar.openContextMenu(); deployMode.StubWindowNAssert( dataSources._queryDoc, "querying-mongodb#create-queries", @@ -45,6 +49,7 @@ describe( cy.get("@dsName").then(($dsName) => { dsName = $dsName; dataSources.CreateQueryAfterDSSaved(); + pluginActionForm.toolbar.openContextMenu(); deployMode.StubWindowNAssert( dataSources._queryDoc, "querying-mysql#create-queries", @@ -58,6 +63,7 @@ describe( cy.get("@dsName").then(($dsName) => { dsName = $dsName; dataSources.CreateQueryAfterDSSaved(); + pluginActionForm.toolbar.openContextMenu(); deployMode.StubWindowNAssert( dataSources._queryDoc, "querying-arango-db#using-queries-in-applications", @@ -71,6 +77,7 @@ describe( cy.get("@dsName").then(($dsName) => { dsName = $dsName; dataSources.CreateQueryAfterDSSaved(); + pluginActionForm.toolbar.openContextMenu(); deployMode.StubWindowNAssert( dataSources._queryDoc, "querying-amazon-s3#list-files", @@ -84,6 +91,7 @@ describe( cy.get("@dsName").then(($dsName) => { dsName = $dsName; dataSources.CreateQueryAfterDSSaved(); + pluginActionForm.toolbar.openContextMenu(); deployMode.StubWindowNAssert( dataSources._queryDoc, "connect-data/reference/using-smtp", @@ -100,6 +108,7 @@ describe( cy.get("@dsName").then(($dsName) => { dsName = $dsName; dataSources.CreateQueryAfterDSSaved(); + pluginActionForm.toolbar.openContextMenu(); deployMode.StubWindowNAssert( dataSources._queryDoc, "airtable#create-queries", @@ -119,6 +128,7 @@ describe( cy.get("@dsName").then(($dsName) => { dsName = $dsName; dataSources.CreateQueryAfterDSSaved(); + pluginActionForm.toolbar.openContextMenu(); deployMode.StubWindowNAssert( dataSources._queryDoc, "querying-oracle#create-queries", @@ -137,6 +147,7 @@ describe( cy.get("@dsName").then(($dsName) => { dsName = $dsName; dataSources.CreateQueryAfterDSSaved(); + pluginActionForm.toolbar.openContextMenu(); deployMode.StubWindowNAssert( dataSources._queryDoc, "querying-firestore#understanding-commands", @@ -165,7 +176,7 @@ describe( cy.get("@guid").then((uid) => { dataSources.NavigateToDSCreateNew(); dataSources.CreatePlugIn(pluginName); - agHelper.RenameWithInPane(pluginName + " " + uid, false); + agHelper.RenameDatasource(pluginName + " " + uid); dataSources.SaveDatasource(); cy.wrap(pluginName + " " + uid).as("dsName"); }); diff --git a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/Mongo1_spec.ts b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/Mongo1_spec.ts index 6583c23c8477..69a0950338d2 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/Mongo1_spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/Mongo1_spec.ts @@ -800,8 +800,7 @@ describe( dataSources.CreateQueryForDS(dsName); dataSources.ValidateNSelectDropdown("Command", "Find document(s)", "Raw"); - agHelper.RenameWithInPane("DropAuthorNAwards"); //Due to template appearing after renaming - agHelper.GetNClick(dataSources._templateMenu); + agHelper.RenameQuery("DropAuthorNAwards"); dataSources.EnterQuery(dropCollection); agHelper.FocusElement(locators._codeMirrorTextArea); //agHelper.VerifyEvaluatedValue(tableCreateQuery); @@ -819,8 +818,7 @@ describe( const dropCollection = `{ "drop": "AuthorNAwards" }`; dataSources.CreateQueryForDS(dsName); dataSources.ValidateNSelectDropdown("Command", "Find document(s)", "Raw"); - agHelper.GetNClick(dataSources._templateMenu); - agHelper.RenameWithInPane("DropAuthorNAwards"); + agHelper.RenameQuery("DropAuthorNAwards"); dataSources.EnterQuery(dropCollection); agHelper.FocusElement(locators._codeMirrorTextArea); //agHelper.VerifyEvaluatedValue(tableCreateQuery); @@ -886,7 +884,7 @@ describe( "Insert document(s)", ); - agHelper.RenameWithInPane("InsertBirthNDeath"); + agHelper.RenameQuery("InsertBirthNDeath"); dataSources.EnterJSContext({ fieldLabel: "Collection", fieldValue: "BirthNDeath", @@ -936,7 +934,7 @@ describe( dataSources.CreateQueryForDS(dsName); dataSources.ValidateNSelectDropdown("Command", "Find document(s)", "Raw"); agHelper.GetNClick(dataSources._templateMenu); - agHelper.RenameWithInPane("DropBirthNDeath"); + agHelper.RenameQuery("DropBirthNDeath"); dataSources.EnterQuery(dropCollection); agHelper.FocusElement(locators._codeMirrorTextArea); dataSources.RunQuery(); diff --git a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/Querypane_Mongo_Spec.js b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/Querypane_Mongo_Spec.js index dcbd88e431d7..1d68f21220b5 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/Querypane_Mongo_Spec.js +++ b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/Querypane_Mongo_Spec.js @@ -2,7 +2,6 @@ import EditorNavigation, { EntityType, } from "../../../../support/Pages/EditorNavigation"; -const queryLocators = require("../../../../locators/QueryEditor.json"); const generatePage = require("../../../../locators/GeneratePage.json"); const formControls = require("../../../../locators/FormControl.json"); @@ -17,7 +16,7 @@ import { apiPage, } from "../../../../support/Objects/ObjectsCore"; import { Widgets } from "../../../../support/Pages/DataSources"; -import BottomPane from "../../../../support/Pages/IDE/BottomPane"; +import BottomTabs from "../../../../support/Pages/IDE/BottomTabs"; let datasourceName; @@ -71,7 +70,7 @@ describe( dataSources.EnterQuery(`{"find": "listingAndReviews","limit": 10}`); agHelper.FocusElement(locators._codeMirrorTextArea); dataSources.RunQuery(); - BottomPane.response.validateRecordCount({ count: 10, operator: "lte" }); + BottomTabs.response.validateRecordCount({ count: 10, operator: "lte" }); cy.deleteQueryUsingContext(); }); @@ -93,7 +92,7 @@ describe( fieldValue: "listingAndReviews", }); dataSources.RunQuery(); - BottomPane.response.validateRecordCount({ count: 10, operator: "lte" }); + BottomTabs.response.validateRecordCount({ count: 10, operator: "lte" }); agHelper.EnterValue("{beds : {$lte: 2}}", { propFieldName: "", @@ -101,7 +100,7 @@ describe( inputFieldName: "Query", }); dataSources.RunQuery(); - BottomPane.response.validateRecordCount({ count: 10, operator: "lte" }); + BottomTabs.response.validateRecordCount({ count: 10, operator: "lte" }); agHelper.EnterValue("{number_of_reviews: -1}", { propFieldName: "", @@ -109,7 +108,7 @@ describe( inputFieldName: "Sort", }); //sort descending dataSources.RunQuery(); - BottomPane.response.validateRecordCount({ count: 10, operator: "lte" }); + BottomTabs.response.validateRecordCount({ count: 10, operator: "lte" }); agHelper.EnterValue("{house_rules: 1, description:1}", { propFieldName: "", @@ -131,7 +130,7 @@ describe( "Response is not as expected for Find commmand with multiple conditions", ); }); - BottomPane.response.validateRecordCount({ count: 5, operator: "lte" }); + BottomTabs.response.validateRecordCount({ count: 5, operator: "lte" }); agHelper.EnterValue("2", { propFieldName: "", @@ -145,7 +144,7 @@ describe( "Response is not as expected for Find commmand with multiple conditions", ); }); - BottomPane.response.validateRecordCount({ count: 5, operator: "lte" }); + BottomTabs.response.validateRecordCount({ count: 5, operator: "lte" }); cy.deleteQueryUsingContext(); }); @@ -433,7 +432,7 @@ describe( ); dataSources.RunQuery(); - BottomPane.response.validateRecordCount({ count: 10, operator: "lte" }); + BottomTabs.response.validateRecordCount({ count: 10, operator: "lte" }); dataSources.AssertTableInVirtuosoList(datasourceName, "NonAsciiTest"); diff --git a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/S3_1_spec.js b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/S3_1_spec.js index 4cd40d69e785..794c194195fe 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/S3_1_spec.js +++ b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/S3_1_spec.js @@ -1,6 +1,6 @@ /// -import BottomPane from "../../../../support/Pages/IDE/BottomPane"; +import BottomTabs from "../../../../support/Pages/IDE/BottomTabs"; const queryLocators = require("../../../../locators/QueryEditor.json"); const generatePage = require("../../../../locators/GeneratePage.json"); @@ -195,7 +195,7 @@ describe( cy.typeValueNValidate(fileName, formControls.s3ListPrefix); dataSources.RunQuery({ toValidateResponse: false }); - BottomPane.response.selectResponseResponseTypeFromMenu("JSON"); + BottomTabs.response.selectResponseResponseTypeFromMenu("JSON"); cy.wait("@postExecute").then(({ response }) => { expect(response.body.data.isExecutionSuccess).to.eq(true); diff --git a/app/client/cypress/e2e/Sanity/Datasources/ArangoDataSourceStub_spec.js b/app/client/cypress/e2e/Sanity/Datasources/ArangoDataSourceStub_spec.js index 7dfa7ff1396c..67d46fc3e56f 100644 --- a/app/client/cypress/e2e/Sanity/Datasources/ArangoDataSourceStub_spec.js +++ b/app/client/cypress/e2e/Sanity/Datasources/ArangoDataSourceStub_spec.js @@ -9,7 +9,7 @@ describe( it("1. Create, test, save then delete a Arango datasource", function () { dataSources.NavigateToDSCreateNew(); dataSources.CreatePlugIn("ArangoDB"); - agHelper.RenameWithInPane("ArangoWithnoTrailing", false); + agHelper.RenameDatasource("ArangoWithnoTrailing"); cy.fillArangoDBDatasourceForm(); cy.intercept("POST", "/api/v1/datasources/test", { fixture: "testAction.json", @@ -21,7 +21,7 @@ describe( it("2. Create with trailing white spaces in host address and database name, test, save then delete a Arango datasource", function () { dataSources.NavigateToDSCreateNew(); dataSources.CreatePlugIn("ArangoDB"); - agHelper.RenameWithInPane("ArangoWithTrailing", false); + agHelper.RenameDatasource("ArangoWithTrailing"); cy.fillArangoDBDatasourceForm(true); cy.intercept("POST", "/api/v1/datasources/test", { fixture: "testAction.json", diff --git a/app/client/cypress/e2e/Sanity/Datasources/DSAutosaveImprovements_spec.ts b/app/client/cypress/e2e/Sanity/Datasources/DSAutosaveImprovements_spec.ts index a1bb173a62b2..4d3618109319 100644 --- a/app/client/cypress/e2e/Sanity/Datasources/DSAutosaveImprovements_spec.ts +++ b/app/client/cypress/e2e/Sanity/Datasources/DSAutosaveImprovements_spec.ts @@ -40,7 +40,7 @@ describe( dataSources.CreatePlugIn("PostgreSQL"); dsName = "Postgres" + uid; - agHelper.RenameWithInPane(dsName, false); + agHelper.RenameDatasource(dsName); dataSources.FillPostgresDSForm(); dataSources.SaveDSFromDialog(true); diff --git a/app/client/cypress/e2e/Sanity/Datasources/MongoDatasourceURI_spec.ts b/app/client/cypress/e2e/Sanity/Datasources/MongoDatasourceURI_spec.ts index cf5836077056..d1343d0b2909 100644 --- a/app/client/cypress/e2e/Sanity/Datasources/MongoDatasourceURI_spec.ts +++ b/app/client/cypress/e2e/Sanity/Datasources/MongoDatasourceURI_spec.ts @@ -22,7 +22,7 @@ describe( // because I do not need to fill the datasource form and use the same default data dataSources.CreatePlugIn("MongoDB"); dsName = "Mongo" + uid; - agHelper.RenameWithInPane(dsName, false); + agHelper.RenameDatasource(dsName); dataSources.FillMongoDatasourceFormWithURI(); dataSources.TestSaveDatasource(true); @@ -38,7 +38,7 @@ describe( // because I do not need to fill the datasource form and use the same default data dataSources.CreatePlugIn("MongoDB"); dsName = "Mongo" + uid; - agHelper.RenameWithInPane(dsName, false); + agHelper.RenameDatasource(dsName); dataSources.FillMongoDSForm(dataManager.defaultEnviorment, true); dataSources.TestSaveDatasource(); diff --git a/app/client/cypress/e2e/Sanity/Datasources/MsSQL_Basic_Spec.ts b/app/client/cypress/e2e/Sanity/Datasources/MsSQL_Basic_Spec.ts index 1b595f35bb32..aa515c69abfc 100644 --- a/app/client/cypress/e2e/Sanity/Datasources/MsSQL_Basic_Spec.ts +++ b/app/client/cypress/e2e/Sanity/Datasources/MsSQL_Basic_Spec.ts @@ -252,7 +252,7 @@ describe( cy.get("@guid").then((uid) => { dataSources.CreatePlugIn("Microsoft SQL Server"); dataSourceName = "MsSQL" + " " + uid; - agHelper.RenameWithInPane(dataSourceName, false); + agHelper.RenameDatasource(dataSourceName); dataSources.TestDatasource(false); agHelper.ValidateToastMessage("Missing endpoint."); diff --git a/app/client/cypress/e2e/Sanity/Datasources/SMTPDatasource_spec.js b/app/client/cypress/e2e/Sanity/Datasources/SMTPDatasource_spec.js index 4274883a09a4..db75f0796392 100644 --- a/app/client/cypress/e2e/Sanity/Datasources/SMTPDatasource_spec.js +++ b/app/client/cypress/e2e/Sanity/Datasources/SMTPDatasource_spec.js @@ -36,7 +36,7 @@ describe( dataSources.CreateQueryAfterDSSaved(); }); // create new query and bind fields with widgets - cy.get(queryLocators.queryNameField).type("smtpquery"); + agHelper.RenameQuery("smtpquery"); cy.get(queryLocators.queryFromEmail) .first() .type("{{From.text}}", { parseSpecialCharSequences: false }); diff --git a/app/client/cypress/locators/ApiEditor.js b/app/client/cypress/locators/ApiEditor.js index 9340b355d441..a9a3c86f90b7 100644 --- a/app/client/cypress/locators/ApiEditor.js +++ b/app/client/cypress/locators/ApiEditor.js @@ -3,11 +3,10 @@ export default { createBlankApiCard: ".t--createBlankApiCard", eachProviderCard: ".t--eachProviderCard", nameOfApi: ".t--nameOfApi", - ApiNameField: ".t--action-name-edit-field", addToPageBtn: ".t--addToPageBtn", - ApiActionMenu: "[data-testid=\"more-action-trigger\"]", + ApiActionMenu: "[data-testid=\"t--more-action-trigger\"]", ApiDeleteBtn: ".t--apiFormDeleteBtn", - ApiRunBtn: ".t--apiFormRunBtn", + ApiRunBtn: "[data-testid=\"t--run-action\"]", addToPageBtnsId: ".t--addToPageButtons", ApiHomePage: ".t--apiHomePage", formActionButtons: ".t--formActionButtons", diff --git a/app/client/cypress/locators/JSEditor.json b/app/client/cypress/locators/JSEditor.json index 2b7d95cf697b..4551e6ec8fe4 100644 --- a/app/client/cypress/locators/JSEditor.json +++ b/app/client/cypress/locators/JSEditor.json @@ -1,8 +1,7 @@ { - "runButton": ".run-js-action", + "runButton": "[data-testid='t--run-js-action']", "editNameField": ".bp3-editable-text-input", "outputConsole": ".CodeEditorTarget", - "jsObjectName": ".t--action-name-edit-field", "jsPage": ".form-row-header", "jsPageProperty": ".entity-context-menu", "propertyList": ".t--entity-property", diff --git a/app/client/cypress/locators/QueryEditor.json b/app/client/cypress/locators/QueryEditor.json index a168e7d48917..5bdc0186a1c4 100644 --- a/app/client/cypress/locators/QueryEditor.json +++ b/app/client/cypress/locators/QueryEditor.json @@ -4,13 +4,10 @@ "runQuery": "//span[text()='Run']/ancestor::button", "saveQuery": ".t--save-query", "deleteQuery": ".t--delete-query", - "queryMoreAction": "[data-testid=more-action-trigger]", + "queryMoreAction": "[data-testid=t--more-action-trigger]", "deleteUsingContext": ".t--apiFormDeleteBtn", "addDatasource": ".t--add-datasource", "editDatasourceButton": ".t--edit-datasource", - "queryNameField": ".t--action-name-edit-field input", - "settings": "span:contains('Settings')", - "query": "//span[text()='Query']/parent::button[@role='tab']", "switch": ".t--form-control-SWITCH input", "queryResponse": "(//div[@class='table']//div[@class='tr'])[3]//div[@class='td']", "querySelect": "//div[contains(@class, 't--template-menu')]//div[text()='Select']", @@ -23,6 +20,5 @@ "copyURLicon": "//button/span[@icon='link']", "snipeableTable": "//input[@type='search']", "suggestedWidgetChart": ".t--suggested-widget-CHART_WIDGET", - "queryTimeout": "//input[@name='actionConfiguration.timeoutInMillisecond']", - "querySettingsTab": "//span[contains(text(), 'Settings')]/parent::button" + "queryTimeout": "//input[@name='actionConfiguration.timeoutInMillisecond']" } diff --git a/app/client/cypress/locators/apiWidgetslocator.json b/app/client/cypress/locators/apiWidgetslocator.json index e5ac10df9a5c..5263f33991b6 100644 --- a/app/client/cypress/locators/apiWidgetslocator.json +++ b/app/client/cypress/locators/apiWidgetslocator.json @@ -4,7 +4,6 @@ "searchApi": ".t--sidebar input[type=text]", "createapi": ".t--createBlankApiCard", "createAuthApiDatasource": ".t--createAuthApiDatasource", - "apiTxt": ".t--action-name-edit-field input", "popover": "//button[contains(@class, 'entity-context-menu')]", "moveTo": ".single-select >div:contains('Move to')", "copyTo": ".single-select >div:contains('Copy to page')", @@ -12,7 +11,6 @@ "delete": ".t--entity-context-menu > div.ads-v2-menu__menu-item.error-menuitem", "deleteConfirm": ".single-select >div:contains('Are you sure?')", "path": ".t--path >div textarea", - "editResourceUrl": ".t--dataSourceField", "autoSuggest": "//div[contains(@id,'react-select')]", "headerKey": ".t--actionConfiguration\\.headers\\[0\\]\\.key\\.0", "headerValue": ".t--actionConfiguration\\.headers\\[0\\]\\.value\\.0", @@ -38,7 +36,6 @@ "TestNextUrl": ".t--apiFormPaginationNextTest", "TestPreUrl": ".t--apiFormPaginationPrevTest", "EditApiName": "img[alt='Edit pen']", - "ApiName": ".t--action-name-edit-field span", "Request": "//li//span[text()='Request']", "RequestURL": "(//span[@class='bp3-tree-node-label']/span)[1]", "RequestMethod": "(//span[@class='bp3-tree-node-label']/span)[2]", @@ -60,5 +57,5 @@ "paramValue": ".t--actionConfiguration\\.queryParameters\\[0\\]\\.value\\.0", "multipartTypeDropdown": "button:contains('Type')", "confirmBeforeExecute": "[name=confirmBeforeExecute]", - "runQueryButton": ".t--apiFormRunBtn" + "runQueryButton": "[data-testid=\"t--run-action\"]" } diff --git a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorComment_spec.js/jsObjAfterCommenting1.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorComment_spec.js/jsObjAfterCommenting1.snap.png index 18fd0e21a8ce..e4ef6ce440a3 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorComment_spec.js/jsObjAfterCommenting1.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorComment_spec.js/jsObjAfterCommenting1.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorComment_spec.js/jsObjBeforeCommenting1.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorComment_spec.js/jsObjBeforeCommenting1.snap.png index 681fa19dddd3..b61d94f1abc6 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorComment_spec.js/jsObjBeforeCommenting1.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorComment_spec.js/jsObjBeforeCommenting1.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/formattedJSONBodyAfterSave.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/formattedJSONBodyAfterSave.snap.png index 1a2d1f29be65..98487c154a1a 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/formattedJSONBodyAfterSave.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/formattedJSONBodyAfterSave.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjAfterGoLineStartSmart5.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjAfterGoLineStartSmart5.snap.png index 2f41c0c7bc88..c06b341e72b0 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjAfterGoLineStartSmart5.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjAfterGoLineStartSmart5.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjAfterPrettify1.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjAfterPrettify1.snap.png index b44855e6ec1b..96646373b7ca 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjAfterPrettify1.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjAfterPrettify1.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjAfterPrettify3.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjAfterPrettify3.snap.png index 83b57a605209..56f388391ef8 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjAfterPrettify3.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjAfterPrettify3.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjAfterPrettify4.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjAfterPrettify4.snap.png index 31a0b5f3aa75..a0b3f910d326 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjAfterPrettify4.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjAfterPrettify4.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforeGoLineStartSmart5.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforeGoLineStartSmart5.snap.png index 6920c5aba492..aafb4bf0a0c8 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforeGoLineStartSmart5.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforeGoLineStartSmart5.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforePrettify1.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforePrettify1.snap.png index 74077f7389ee..12de03a73003 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforePrettify1.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforePrettify1.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforePrettify3.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforePrettify3.snap.png index e6fedaa8626d..b285d83bde4d 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforePrettify3.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforePrettify3.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforePrettify4.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforePrettify4.snap.png index 61b330fcd0c3..b5f081faff31 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforePrettify4.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforePrettify4.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforePrettify6.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforePrettify6.snap.png index f321f76db33e..2f7abdbb42b4 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforePrettify6.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforePrettify6.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforePrettify7.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforePrettify7.snap.png index c53f61612fd4..9c74b5d4d479 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforePrettify7.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js/jsObjBeforePrettify7.snap.png differ diff --git a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorSaveAndAutoIndent_spec.js/jsObjBeforeSaveAndPrettify.snap.png b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorSaveAndAutoIndent_spec.js/jsObjBeforeSaveAndPrettify.snap.png index f321f76db33e..2f7abdbb42b4 100644 Binary files a/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorSaveAndAutoIndent_spec.js/jsObjBeforeSaveAndPrettify.snap.png and b/app/client/cypress/snapshots/Regression/ClientSide/VisualTests/JSEditorSaveAndAutoIndent_spec.js/jsObjBeforeSaveAndPrettify.snap.png differ diff --git a/app/client/cypress/support/ApiCommands.js b/app/client/cypress/support/ApiCommands.js index d0d52ec712b9..855f9ee45110 100644 --- a/app/client/cypress/support/ApiCommands.js +++ b/app/client/cypress/support/ApiCommands.js @@ -7,10 +7,13 @@ import ApiEditor from "../locators/ApiEditor"; const apiwidget = require("../locators/apiWidgetslocator.json"); const explorer = require("../locators/explorerlocators.json"); import { ObjectsRegistry } from "./Objects/Registry"; +import { PluginActionForm } from "./Pages/PluginActionForm"; let agHelper = ObjectsRegistry.AggregateHelper; let dataSources = ObjectsRegistry.DataSources; let apiPage = ObjectsRegistry.ApiPage; +let locator = ObjectsRegistry.CommonLocators; +let pluginActionForm = new PluginActionForm(); export const initLocalstorage = () => { cy.window().then((window) => { @@ -111,18 +114,12 @@ Cypress.Commands.add("CreationOfUniqueAPIcheck", (apiname) => { cy.wait("@createNewApi"); // cy.wait("@getUser"); cy.get(apiwidget.resourceUrl).should("be.visible"); - cy.get(apiwidget.ApiName).click({ force: true }); - cy.get(apiwidget.apiTxt) - .clear() - .focus() - .type(apiname, { force: true, delay: 500 }) - .should("have.value", apiname); - cy.get(".t--action-name-edit-error").should(($x) => { + agHelper.RenameQuery(apiname); + cy.get(".ads-v2-tooltip .ads-v2-text").should(($x) => { expect($x).contain( apiname.concat(" is already being used or is a restricted keyword."), ); }); - cy.get(apiwidget.apiTxt).blur(); }); Cypress.Commands.add("RenameEntity", (value, selectFirst) => { @@ -141,12 +138,8 @@ Cypress.Commands.add("CreateApiAndValidateUniqueEntityName", (apiname) => { agHelper.GetNClick(apiwidget.createapi); cy.wait("@createNewApi"); cy.get(apiwidget.resourceUrl).should("be.visible"); - cy.get(apiwidget.ApiName).click({ force: true }); - cy.get(apiwidget.apiTxt) - .clear() - .type(apiname, { force: true }) - .should("have.value", apiname); - cy.get(".t--action-name-edit-error").should(($x) => { + agHelper.RenameQuery(apiname); + cy.get(".ads-v2-tooltip .ads-v2-text").should(($x) => { expect($x).contain( apiname.concat(" is already being used or is a restricted keyword."), ); @@ -191,10 +184,9 @@ Cypress.Commands.add("createAndFillApi", (url, parameters) => { dataSources.NavigateToDSCreateNew(); cy.testCreateApiButton(); cy.get("@createNewApi").then((response) => { - cy.get(ApiEditor.ApiNameField).should("be.visible"); + cy.get(locator._queryName).should("be.visible"); expect(response.response.body.responseMeta.success).to.eq(true); - cy.get(ApiEditor.ApiNameField) - .click() + cy.get(locator._queryName) .invoke("text") .then((text) => { const someText = text; @@ -203,17 +195,9 @@ Cypress.Commands.add("createAndFillApi", (url, parameters) => { }); cy.EnableAllCodeEditors(); - cy.get(apiwidget.editResourceUrl) - .first() - .click({ force: true }) - .type( - url + parameters, - { parseSpecialCharSequences: false }, - { force: true }, - ); + cy.updateCodeInput(ApiEditor.dataSourceField, url + parameters); cy.WaitAutoSave(); - cy.get(ApiEditor.formActionButtons).should("be.visible"); - cy.get(ApiEditor.ApiRunBtn).should("not.be.disabled"); + cy.get(pluginActionForm.locators.actionRunButton).should("not.be.disabled"); }); // Cypress.Commands.add("callApi", (apiname) => { diff --git a/app/client/cypress/support/Objects/CommonLocators.ts b/app/client/cypress/support/Objects/CommonLocators.ts index f46d2733ff11..e00151509433 100644 --- a/app/client/cypress/support/Objects/CommonLocators.ts +++ b/app/client/cypress/support/Objects/CommonLocators.ts @@ -9,8 +9,8 @@ export class CommonLocators { _animationSpnner = ".bp3-spinner-animation"; _btnSpinner = ".ads-v2-spinner"; _sidebar = ".t--sidebar"; - _queryName = ".t--action-name-edit-field span"; - _queryNameTxt = ".t--action-name-edit-field input"; + _queryName = ".editor-tab.active > .ads-v2-text"; + _queryNameTxt = ".editor-tab.active > .ads-v2-text input"; _editIcon = ".t--action-name-edit-icon"; _emptyCanvasCta = "[data-testid='canvas-ctas']"; _dsName = ".t--edit-datasource-name span"; @@ -70,7 +70,7 @@ export class CommonLocators { this._toastMsg + ":contains('" + toastText + "')"; //_specificToast = (toastText: string | RegExp) => this._toastMsg + ":contains("+ (typeof toastText == 'string' ? "'"+ toastText+"'" : toastText)+ ")"//not working! _empty = "span[name='no-response']"; - _contextMenuInPane = "[data-testid='more-action-trigger']"; + _contextMenuInPane = "[data-testid='t--more-action-trigger']"; _contextMenuItem = (item: string) => "//span[text()='" + item + diff --git a/app/client/cypress/support/Objects/FeatureFlags.ts b/app/client/cypress/support/Objects/FeatureFlags.ts index 7fdc78d1d580..c860ff3ea10c 100644 --- a/app/client/cypress/support/Objects/FeatureFlags.ts +++ b/app/client/cypress/support/Objects/FeatureFlags.ts @@ -5,6 +5,7 @@ import produce from "immer"; const defaultFlags = { release_side_by_side_ide_enabled: true, rollout_remove_feature_walkthrough_enabled: false, // remove this flag from here when it's removed from code + release_actions_redesign_enabled: true, }; export const featureFlagIntercept = ( diff --git a/app/client/cypress/support/Pages/AggregateHelper.ts b/app/client/cypress/support/Pages/AggregateHelper.ts index ad5965191c25..35bae78fd98a 100644 --- a/app/client/cypress/support/Pages/AggregateHelper.ts +++ b/app/client/cypress/support/Pages/AggregateHelper.ts @@ -221,19 +221,49 @@ export class AggregateHelper { }); } - public RenameWithInPane(renameVal: string, IsQuery = true) { - const name = IsQuery ? this.locator._queryName : this.locator._dsName; - const text = IsQuery ? this.locator._queryNameTxt : this.locator._dsNameTxt; - this.Sleep(300); //for default query name to load - this.GetNClick(name, 0, true); - cy.get(text) + private rename(args: { + nameLocator: string; + textInputLocator: string; + renameVal: string; + dblClick?: boolean; + }) { + const { dblClick = false, nameLocator, renameVal, textInputLocator } = args; + + this.Sleep(300); + + if (dblClick) { + cy.get(nameLocator).dblclick({ force: true }); + } else { + this.GetNClick(nameLocator, 0, true); + } + + cy.get(textInputLocator) .clear({ force: true }) .type(renameVal, { force: true, delay: 0 }) .should("have.value", renameVal) .blur(); - this.PressEnter(); //allow lil more time for new name to settle + + this.PressEnter(); + + this.Sleep(); + } + + public RenameDatasource(renameVal: string) { + this.rename({ + nameLocator: this.locator._dsName, + textInputLocator: this.locator._dsNameTxt, + renameVal, + }); this.AssertElementVisibility(this.locator._editIcon); - this.Sleep(); // wait for url update + } + + public RenameQuery(renameVal: string) { + this.rename({ + nameLocator: this.locator._queryName, + textInputLocator: this.locator._queryNameTxt, + renameVal, + dblClick: true, + }); } public CheckForPageSaveError() { diff --git a/app/client/cypress/support/Pages/ApiPage.ts b/app/client/cypress/support/Pages/ApiPage.ts index 57b7d33abbb7..7af9d454d130 100644 --- a/app/client/cypress/support/Pages/ApiPage.ts +++ b/app/client/cypress/support/Pages/ApiPage.ts @@ -7,6 +7,7 @@ import { } from "./EditorNavigation"; import * as _ from "../Objects/ObjectsCore"; import ApiEditor from "../../locators/ApiEditor"; +import { PluginActionForm } from "./PluginActionForm"; type RightPaneTabs = "datasources" | "connections"; @@ -14,11 +15,11 @@ export class ApiPage { public agHelper = ObjectsRegistry.AggregateHelper; public locator = ObjectsRegistry.CommonLocators; private assertHelper = ObjectsRegistry.AssertHelper; + private pluginActionForm = new PluginActionForm(); // private datasources = ObjectsRegistry.DataSources; _createapi = ".t--createBlankApiCard"; - _resourceUrl = ".t--dataSourceField"; private _headerKey = (index: number) => ".t--actionConfiguration\\.headers\\[" + index + @@ -53,7 +54,7 @@ export class ApiPage { `.t--actionConfiguration\\.bodyFormData\\[${index}\\]\\.value\\.${index}`; _bodyTypeDropdown = "//span[text()='Type'][@class='rc-select-selection-placeholder']/ancestor::div"; - _apiRunBtn = ".t--apiFormRunBtn"; + _apiRunBtn = '[data-testid="t--run-action"]'; private _queryTimeout = "//input[@name='actionConfiguration.timeoutInMillisecond']"; _responseBody = ".CodeMirror-code span.cm-string.cm-property"; @@ -128,10 +129,10 @@ export class ApiPage { // }); // to check if Api1 = Api1 when Create Api invoked if (apiName) { - this.agHelper.RenameWithInPane(apiName); + this.agHelper.RenameQuery(apiName); this.agHelper.GetNAssertContains(this._entityName, apiName); } - this.agHelper.AssertElementVisibility(this._resourceUrl); + this.agHelper.AssertElementVisibility(ApiEditor.dataSourceField); if (apiVerb != "GET") this.SelectAPIVerb(apiVerb); } @@ -158,7 +159,7 @@ export class ApiPage { this.agHelper.EnterValue( url, { - propFieldName: this._resourceUrl, + propFieldName: ApiEditor.dataSourceField, directInput: true, inputFieldName: "", apiOrQuery: "api", @@ -258,20 +259,20 @@ export class ApiPage { } SetAPITimeout(timeout: number, toVerifySave = true) { - this.SelectPaneTab("Settings"); + this.pluginActionForm.toolbar.toggleSettings(); cy.xpath(this._queryTimeout).clear().type(timeout.toString(), { delay: 0 }); //Delay 0 to work like paste! toVerifySave && this.agHelper.AssertAutoSave(); this.SelectPaneTab("Headers"); } ToggleOnPageLoadRun(enable = true || false) { - this.SelectPaneTab("Settings"); + this.pluginActionForm.toolbar.toggleSettings(); if (enable) this.agHelper.CheckUncheck(this._onPageLoad, true); else this.agHelper.CheckUncheck(this._onPageLoad, false); } ToggleConfirmBeforeRunning(enable = true || false) { - this.SelectPaneTab("Settings"); + this.pluginActionForm.toolbar.toggleSettings(); if (enable) this.agHelper.CheckUncheck(this._confirmBeforeRunning, true); else this.agHelper.CheckUncheck(this._confirmBeforeRunning, false); } @@ -283,7 +284,6 @@ export class ApiPage { | "Body" | "Pagination" | "Authentication" - | "Settings" | "Response" | "Errors" | "Logs" @@ -461,8 +461,8 @@ export class ApiPage { this.agHelper.GetNClickByContains(".ads-v2-listitem", "GraphQL API"); this.assertHelper.AssertNetworkStatus("@createNewApi", 201); - if (apiName) this.agHelper.RenameWithInPane(apiName); - cy.get(this._resourceUrl).should("be.visible"); + if (apiName) this.agHelper.RenameQuery(apiName); + cy.get(ApiEditor.dataSourceField).should("be.visible"); } AssertEmptyHeaderKeyValuePairsPresent(index: number) { diff --git a/app/client/cypress/support/Pages/DataSources.ts b/app/client/cypress/support/Pages/DataSources.ts index 663e087fa786..58a3099f2b49 100644 --- a/app/client/cypress/support/Pages/DataSources.ts +++ b/app/client/cypress/support/Pages/DataSources.ts @@ -11,7 +11,9 @@ import EditorNavigation, { import datasource from "../../locators/DatasourcesEditor.json"; import PageList from "./PageList"; import { anvilLocators } from "./Anvil/Locators"; -import BottomPane from "./IDE/BottomPane"; +import { PluginActionForm } from "./PluginActionForm"; +import ApiEditor from "../../locators/ApiEditor"; +import BottomTabs from "./IDE/BottomTabs"; export const DataSourceKVP = { Postgres: "PostgreSQL", @@ -55,6 +57,7 @@ export class DataSources { private apiPage = ObjectsRegistry.ApiPage; private dataManager = ObjectsRegistry.DataManager; private assertHelper = ObjectsRegistry.AssertHelper; + private pluginActionForm = new PluginActionForm(); public ContainerKVP = (containerName: string) => { return { @@ -119,7 +122,7 @@ export class DataSources { "']"; _activeDSListReconnectModal = (dbName: string) => "//div[contains(@class, 't--ds-list')]//span[text()='" + dbName + "']"; - _runQueryBtn = ".t--run-query"; + _runQueryBtn = "[data-testid='t--run-action']"; _newDatabases = "#new-datasources"; _newDatasourceContainer = "#new-integrations-wrapper"; _selectDatasourceDropdown = "[data-testid=t--datasource-dropdown]"; @@ -160,6 +163,7 @@ export class DataSources { "//div[@data-testid='t--response-tab-segmented-control']//span[text()='" + responseType + "']"; + // TODO: remove this when response UI is ready _queryRecordResult = (recordCount: number) => `//div/span[text()='Result:']/span[number(substring-before(normalize-space(text()), ' Record')) >= ${recordCount}]`; _noRecordFound = "span[data-testid='no-data-table-message']"; @@ -725,22 +729,28 @@ export class DataSources { environment = this.dataManager.defaultEnviorment, enterOrSelectUrl: "enter" | "select" = "enter", dsNameToSelect = "", + renameCallback?: (queryName: string) => void, ) { this.agHelper.GetNClick(this._createBlankGraphQL); cy.get("@guid").then((uid) => { - this.agHelper.RenameWithInPane("GraphQL_API" + "_" + uid, true); + const queryName = "GraphQL_API" + "_" + uid; + if (typeof renameCallback === "function") { + renameCallback(queryName); + } else { + this.agHelper.RenameQuery(queryName); + } if (enterOrSelectUrl == "enter") this.apiPage.EnterURL( this.dataManager.dsValues[environment].GraphqlApiUrl_TED, ); else if (enterOrSelectUrl == "select") { - this.agHelper.GetNClick(this.apiPage._resourceUrl); + this.agHelper.GetNClick(ApiEditor.dataSourceField); this.agHelper.GetNClick(this._graphQlDsHintOption(dsNameToSelect)); } this.assertHelper.AssertNetworkStatus("@createNewApi", 201); - cy.wrap("GraphQL_API" + "_" + uid).as("dsName"); + cy.wrap(queryName).as("dsName"); }); } @@ -765,7 +775,7 @@ export class DataSources { this.agHelper.ClearNType(this._graphQLHeaderValue, hValue); cy.get("@guid").then((uid: any) => { dataSourceName = dataSourceName + " " + uid; - this.agHelper.RenameWithInPane(dataSourceName, false); + this.agHelper.RenameDatasource(dataSourceName); this.SaveDatasource(); cy.wrap(dataSourceName).as("dsName"); }); @@ -907,7 +917,7 @@ export class DataSources { }); //this.assertHelper.AssertNetworkStatus("@createNewApi", 201); this.AssertRunButtonVisibility(); - if (queryName) this.agHelper.RenameWithInPane(queryName); + if (queryName) this.agHelper.RenameQuery(queryName); if (query) { this.EnterQuery(query); this.AssertRunButtonDisability(false); @@ -1116,10 +1126,9 @@ export class DataSources { } ToggleUsePreparedStatement(enable = true || false) { - this.apiPage.SelectPaneTab("Settings"); + this.pluginActionForm.toolbar.toggleSettings(); if (enable) this.agHelper.CheckUncheck(this._usePreparedStatement, true); else this.agHelper.CheckUncheck(this._usePreparedStatement, false); - this.apiPage.SelectPaneTab("Query"); } public EnterQuery(query: string, sleep = 500, toVerifySave = true) { @@ -1141,13 +1150,13 @@ export class DataSources { this.RunQuery(); if (tableCheck) { this.agHelper.AssertElementVisibility( - BottomPane.response.getResponseTypeSelector("TABLE"), + BottomTabs.response.getResponseTypeSelector("TABLE"), ); this.agHelper.AssertElementVisibility( - BottomPane.response.getResponseTypeSelector("JSON"), + BottomTabs.response.getResponseTypeSelector("JSON"), ); this.agHelper.AssertElementVisibility( - BottomPane.response.getResponseTypeSelector("RAW"), + BottomTabs.response.getResponseTypeSelector("RAW"), ); } } @@ -1159,23 +1168,23 @@ export class DataSources { }: { count?: number; operator?: Parameters< - typeof BottomPane.response.validateRecordCount + typeof BottomTabs.response.validateRecordCount >[0]["operator"]; responseTypes?: ("TABLE" | "JSON" | "RAW")[]; } = {}) { this.RunQuery(); - BottomPane.response.openResponseTypeMenu(); + BottomTabs.response.openResponseTypeMenu(); responseTypes.forEach((responseType) => { this.agHelper.AssertElementVisibility( - BottomPane.response.locators.responseTypeMenuItem(responseType), + BottomTabs.response.locators.responseTypeMenuItem(responseType), ); }); - BottomPane.response.closeResponseTypeMenu(); + BottomTabs.response.closeResponseTypeMenu(); - BottomPane.response.validateRecordCount({ + BottomTabs.response.validateRecordCount({ count, operator, }); @@ -1214,7 +1223,7 @@ export class DataSources { this.CreatePlugIn(DataSourceKVP[dsType]); guid = uid; dataSourceName = dsType + " " + guid; - this.agHelper.RenameWithInPane(dataSourceName, false); + this.agHelper.RenameDatasource(dataSourceName); // Execute the preDSConfigAction if it is defined if (!!preDSConfigAction) { preDSConfigAction.bind(this)(environment); @@ -1272,7 +1281,7 @@ export class DataSources { if (query) { this.EnterQuery(query, sleep); } - if (queryName) this.agHelper.RenameWithInPane(queryName); + if (queryName) this.agHelper.RenameQuery(queryName); } public UpdateGraphqlQueryAndVariable(options?: { @@ -1343,15 +1352,14 @@ export class DataSources { queryTimeout = 20000, action: "QUERY" | "API" = "QUERY", ) { - this.agHelper.GetNClick(this._queryEditorTabs("Settings")); + // open the settings + this.pluginActionForm.toolbar.toggleSettings(); cy.xpath(this._queryTimeout) .clear() .type(queryTimeout.toString(), { delay: 0 }); //Delay 0 to work like paste! this.agHelper.AssertAutoSave(); - - if (action === "QUERY") { - this.agHelper.GetNClick(this._queryEditorTabs("Query")); - } + // close the settings + this.pluginActionForm.toolbar.toggleSettings(); } //Update with new password in the datasource conf page @@ -1604,7 +1612,7 @@ export class DataSources { clientSecret: string, environment = this.dataManager.defaultEnviorment, ) { - if (dsName) this.agHelper.RenameWithInPane(dsName, false); + if (dsName) this.agHelper.RenameDatasource(dsName); // Fill Auth Form this.agHelper.TypeText( this.locator._inputFieldByName("URL") + "//" + this.locator._inputField, diff --git a/app/client/cypress/support/Pages/DebuggerHelper.ts b/app/client/cypress/support/Pages/DebuggerHelper.ts index 979b8f2d842b..728a082d5020 100644 --- a/app/client/cypress/support/Pages/DebuggerHelper.ts +++ b/app/client/cypress/support/Pages/DebuggerHelper.ts @@ -28,12 +28,7 @@ export class DebuggerHelper { _contextMenuIcon: ".t--debugger-contextual-error-menu ", _contextMenuItem: ".t--debugger-contextual-menuitem", _debuggerLabel: "span.debugger-label", - _bottomPaneContainer: { - [PageType.API]: ".t--api-bottom-pane-container", - [PageType.Query]: ".t--query-bottom-pane-container", - [PageType.JsEditor]: ".t--js-editor-bottom-pane-container", - [PageType.DataSources]: ".t--datasource-bottom-pane-container", - }, + _bottomPaneContainer: ".t--ide-bottom-view", _ideBottomViewContainer: ".t--ide-bottom-view", _debuggerList: ".debugger-list", _debuggerFilter: "input[data-testid=t--debugger-search]", @@ -103,7 +98,7 @@ export class DebuggerHelper { case PageType.Query: case PageType.DataSources: this.agHelper.AssertElementVisibility( - this.locators._bottomPaneContainer[pageType], + this.locators._bottomPaneContainer, ); break; default: diff --git a/app/client/cypress/support/Pages/GSheetHelper.ts b/app/client/cypress/support/Pages/GSheetHelper.ts index d355dd1f8931..3cfad8281edb 100644 --- a/app/client/cypress/support/Pages/GSheetHelper.ts +++ b/app/client/cypress/support/Pages/GSheetHelper.ts @@ -36,7 +36,7 @@ export class GsheetHelper { directInput: false, inputFieldName: "Spreadsheet Name", }); - this.agHelper.RenameWithInPane("insert_spreadsheet"); + this.agHelper.RenameQuery("insert_spreadsheet"); this.agHelper.EnterValue(rowData, { propFieldName: "", directInput: false, @@ -58,7 +58,7 @@ export class GsheetHelper { "Spreadsheet", ); this.dataSources.ValidateNSelectDropdown("Spreadsheet", "", spreadsheet); - this.agHelper.RenameWithInPane("delete_spreadsheet"); + this.agHelper.RenameQuery("delete_spreadsheet"); this.dataSources.RunQuery(); } @@ -125,7 +125,7 @@ export class GsheetHelper { }); } if (renameQuery) { - this.agHelper.RenameWithInPane( + this.agHelper.RenameQuery( operation.toLowerCase().replace(" ", "_") + "_query", ); } diff --git a/app/client/cypress/support/Pages/IDE/BottomPane/Response.ts b/app/client/cypress/support/Pages/IDE/BottomTabs/Response.ts similarity index 100% rename from app/client/cypress/support/Pages/IDE/BottomPane/Response.ts rename to app/client/cypress/support/Pages/IDE/BottomTabs/Response.ts diff --git a/app/client/cypress/support/Pages/IDE/BottomPane/index.ts b/app/client/cypress/support/Pages/IDE/BottomTabs/index.ts similarity index 72% rename from app/client/cypress/support/Pages/IDE/BottomPane/index.ts rename to app/client/cypress/support/Pages/IDE/BottomTabs/index.ts index 055d7812dd5b..fdaabaae66e1 100644 --- a/app/client/cypress/support/Pages/IDE/BottomPane/index.ts +++ b/app/client/cypress/support/Pages/IDE/BottomTabs/index.ts @@ -1,6 +1,6 @@ import { Response } from "./Response"; -class BottomPane { +class BottomTabs { public readonly response: Response; constructor() { @@ -8,4 +8,4 @@ class BottomPane { } } -export default new BottomPane(); +export default new BottomTabs(); diff --git a/app/client/cypress/support/Pages/IDE/PluginEditorToolbar.ts b/app/client/cypress/support/Pages/IDE/PluginEditorToolbar.ts new file mode 100644 index 000000000000..49dae481b07f --- /dev/null +++ b/app/client/cypress/support/Pages/IDE/PluginEditorToolbar.ts @@ -0,0 +1,38 @@ +export class PluginEditorToolbar { + private dropdownTrigger: string | undefined; + private runButton: string; + private settingsButton: string; + private contextMenuTrigger: string; + + constructor( + runButton: string, + settingsButton: string, + contextMenuTrigger: string, + dropdownTrigger?: string, + ) { + this.dropdownTrigger = dropdownTrigger; + this.runButton = runButton; + this.settingsButton = settingsButton; + this.contextMenuTrigger = contextMenuTrigger; + } + + public openDropdownTrigger() { + if (!this.dropdownTrigger) { + throw new Error("Dropdown trigger not defined"); + } + + cy.get(this.dropdownTrigger).click({ force: true }); + } + + public clickRunButton() { + cy.get(this.runButton).click({ force: true }); + } + + public toggleSettings() { + cy.get(this.settingsButton).click({ force: true }); + } + + public openContextMenu() { + cy.get(this.contextMenuTrigger).click({ force: true }); + } +} diff --git a/app/client/cypress/support/Pages/JSEditor.ts b/app/client/cypress/support/Pages/JSEditor.ts index 832c83048d97..738c3405700f 100644 --- a/app/client/cypress/support/Pages/JSEditor.ts +++ b/app/client/cypress/support/Pages/JSEditor.ts @@ -5,6 +5,7 @@ import { PageLeftPane, PagePaneSegment, } from "./EditorNavigation"; +import { PluginEditorToolbar } from "./IDE/PluginEditorToolbar"; export interface ICreateJSObjectOptions { paste: boolean; @@ -13,6 +14,7 @@ export interface ICreateJSObjectOptions { shouldCreateNewJSObj: boolean; lineNumber?: number; prettify?: boolean; + isPackages?: boolean; } const DEFAULT_CREATE_JS_OBJECT_OPTIONS = { paste: true, @@ -29,10 +31,18 @@ export class JSEditor { public ee = ObjectsRegistry.EntityExplorer; public propPane = ObjectsRegistry.PropertyPane; private assertHelper = ObjectsRegistry.AssertHelper; + public runButtonLocator = "[data-testid='t--run-js-action']"; + public settingsTriggerLocator = "[data-testid='t--js-settings-trigger']"; + public contextMenuTriggerLocator = "[data-testid='t--more-action-trigger']"; + public runFunctionSelectLocator = "[data-testid='t--js-function-run']"; + + public toolbar = new PluginEditorToolbar( + this.runButtonLocator, + this.settingsTriggerLocator, + this.contextMenuTriggerLocator, + this.runFunctionSelectLocator, + ); - //#region Element locators - _runButton = "button.run-js-action"; - _settingsTab = "//span[text()='Settings']/parent::button"; _codeTab = "//span[text()='Code']/parent::button"; private _jsObjectParseErrorCallout = "div.t--js-response-parse-error-call-out"; @@ -43,8 +53,8 @@ export class JSEditor { private _onPageLoadSwitchStatus = (functionName: string) => `//div[contains(@class, '${functionName}-on-page-load-setting')]//label/input`; - private _jsObjName = ".t--js-action-name-edit-field span"; - public _jsObjTxt = ".t--js-action-name-edit-field input"; + private _jsObjName = ".editor-tab.active > .ads-v2-text"; + public _jsObjTxt = ".editor-tab.active > .ads-v2-text input"; public _newJSobj = "span:contains('New JS object')"; private _bindingsClose = ".t--entity-property-close"; public _propertyList = ".binding"; @@ -60,9 +70,9 @@ export class JSEditor { "//div[@role='dialog']//*[contains(text(), '" + Cypress.env("MESSAGES")?.QUERY_CONFIRMATION_MODAL_MESSAGE() + "')]"; - _funcDropdown = ".t--formActionButtons .function-select-dropdown"; - _funcDropdownValue = `${this._funcDropdown} p`; - _funcDropdownOptions = ".rc-virtual-list .rc-select-item-option p"; + _funcDropdownValue = `${this.runFunctionSelectLocator} .ads-v2-button__content-children`; + _funcDropdownOptions = + "[data-testid='t--js-functions-menu'] [role='menuitem'] > span > span"; _getJSFunctionSettingsId = (JSFunctionName: string) => `${JSFunctionName}-settings`; _asyncJSFunctionSettings = `.t--async-js-function-settings`; @@ -113,12 +123,6 @@ export class JSEditor { ); //Checking JS object was created successfully this.assertHelper.AssertNetworkStatus("@createNewJSCollection", 201); - cy.get(this._jsObjName).click({ force: true }); - this.agHelper.AssertElementVisibility(this._jsObjTxt); - // Assert that the name of the JS Object is focused when newly created - this.agHelper.PressEnter(); - this.agHelper.PressEnter(); - // Assert that the name of the JS Object is no longer in the editable form after pressing "enter" this.agHelper.AssertElementAbsence(this._jsObjTxt); this.agHelper.Sleep(); @@ -130,6 +134,7 @@ export class JSEditor { ) { const { completeReplace, + isPackages, lineNumber, paste, prettify, @@ -168,12 +173,14 @@ export class JSEditor { this.agHelper.Sleep(2000); //clicking 1 times & waits for 2 second for result to be populated! Cypress._.times(1, () => { - this.agHelper.GetNClick(this._runButton, 0, true); + this.toolbar.clickRunButton(); this.agHelper.Sleep(2000); }); cy.get(this.locator._empty).should("not.exist"); } - this.GetJSObjectName(); + if (!isPackages) { + this.GetJSObjectName(); + } } //Edit the name of a JSObject's property (variable or function) @@ -206,14 +213,14 @@ export class JSEditor { } public RunJSObj() { - this.agHelper.GetNClick(this._runButton); + this.toolbar.clickRunButton(); this.agHelper.Sleep(); //for function to run this.agHelper.AssertElementAbsence(this.locator._btnSpinner, 15000); this.agHelper.AssertElementAbsence(this.locator._empty, 5000); } public RenameJSObjFromPane(renameVal: string) { - cy.get(this._jsObjName).click({ force: true }); + cy.get(this._jsObjName).dblclick({ force: true }); cy.get(this._jsObjTxt) .clear() .type(renameVal, { force: true }) @@ -270,20 +277,21 @@ export class JSEditor { } public VerifyAsyncFuncSettings(funName: string, onLoad = true) { - this.agHelper.GetNClick(this._settingsTab); + this.toolbar.toggleSettings(); this.agHelper.AssertExistingCheckedState( this._onPageLoadSwitchStatus(funName), onLoad.toString(), ); + this.toolbar.toggleSettings(); } public EnableDisableAsyncFuncSettings(funName: string, onLoad = true) { // Navigate to Settings tab - this.agHelper.GetNClick(this._settingsTab); + this.toolbar.toggleSettings(); // Set onPageLoad this.agHelper.CheckUncheck(this._onPageLoadSwitch(funName), onLoad); // Return to code tab - this.agHelper.GetNClick(this._codeTab); + this.toolbar.toggleSettings(); } /** @@ -298,12 +306,12 @@ export class JSEditor { } public SelectFunctionDropdown(funName: string) { - cy.get(this._funcDropdown).click(); + cy.get(this.runFunctionSelectLocator).click(); this.agHelper.GetNClickByContains(this._funcDropdownOptions, funName); } public AssertSelectedFunction(funName: string) { - cy.get(this._funcDropdownValue).contains(funName).should("exist"); + cy.get(this.runFunctionSelectLocator).contains(funName).should("exist"); } public ConfirmationClick(type: "Yes" | "No") { diff --git a/app/client/cypress/support/Pages/PluginActionForm.ts b/app/client/cypress/support/Pages/PluginActionForm.ts new file mode 100644 index 000000000000..d17e72de6d22 --- /dev/null +++ b/app/client/cypress/support/Pages/PluginActionForm.ts @@ -0,0 +1,19 @@ +import { PluginEditorToolbar } from "./IDE/PluginEditorToolbar"; + +export class PluginActionForm { + public readonly locators = { + actionRunButton: "[data-testid='t--run-action']", + actionContextMenuTrigger: "[data-testid='t--more-action-trigger']", + actionSettingsTrigger: "[data-testid='t--action-settings-trigger']", + }; + + public readonly toolbar: PluginEditorToolbar; + + constructor() { + this.toolbar = new PluginEditorToolbar( + this.locators.actionRunButton, + this.locators.actionSettingsTrigger, + this.locators.actionContextMenuTrigger, + ); + } +} diff --git a/app/client/cypress/support/commands.js b/app/client/cypress/support/commands.js index 4a6887766900..4de96346ecd5 100644 --- a/app/client/cypress/support/commands.js +++ b/app/client/cypress/support/commands.js @@ -35,6 +35,7 @@ const welcomePage = require("../locators/welcomePage.json"); import { ObjectsRegistry } from "../support/Objects/Registry"; import RapidMode from "./RapidMode"; import { featureFlagIntercept } from "./Objects/FeatureFlags"; +import { PluginActionForm } from "./Pages/PluginActionForm"; const propPane = ObjectsRegistry.PropertyPane; const agHelper = ObjectsRegistry.AggregateHelper; @@ -47,6 +48,7 @@ const homePageTS = ObjectsRegistry.HomePage; const table = ObjectsRegistry.Table; const chainStart = Symbol(); +const pluginActionForm = new PluginActionForm(); export const initLocalstorage = () => { cy.window().then((window) => { @@ -1048,7 +1050,7 @@ cy.all = function (...commands) { }; Cypress.Commands.add("getEntityName", () => { - let entityName = cy.get(apiwidget.ApiName).invoke("text"); + let entityName = agHelper.GetObjectName(); return entityName; }); @@ -1071,9 +1073,9 @@ Cypress.Commands.add("VerifyErrorMsgPresence", (errorMsgToVerifyAbsence) => { }); Cypress.Commands.add("setQueryTimeout", (timeout) => { - cy.get(queryLocators.settings).click(); + pluginActionForm.toolbar.toggleSettings(); cy.xpath(queryLocators.queryTimeout).clear().type(timeout); - cy.xpath(queryLocators.query).click(); + pluginActionForm.toolbar.toggleSettings(); }); Cypress.Commands.add("isInViewport", (element) => { diff --git a/app/client/package.json b/app/client/package.json index f56c83dafbaa..2387afc4ee3e 100644 --- a/app/client/package.json +++ b/app/client/package.json @@ -87,6 +87,7 @@ "@react-types/shared": "^3.23.0", "@redux-saga/core": "1.1.3", "@redux-saga/types": "1.2.1", + "@reduxjs/toolkit": "^2.4.0", "@sentry/react": "^6.2.4", "@shared/ast": "workspace:^", "@shared/dsl": "workspace:^", diff --git a/app/client/packages/git/.eslintrc.json b/app/client/packages/git/.eslintrc.json deleted file mode 100644 index b6652ce70c78..000000000000 --- a/app/client/packages/git/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": ["../../.eslintrc.base.json"] -} diff --git a/app/client/packages/git/package.json b/app/client/packages/git/package.json deleted file mode 100644 index 9bfcf578a72f..000000000000 --- a/app/client/packages/git/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "@appsmith/git", - "description": "This package contains all the git related functionality for Appsmith UI", - "private": true, - "version": "1.0.0", - "main": "src/index.ts", - "scripts": { - "lint": "yarn g:lint", - "prettier": "yarn g:prettier", - "test:unit": "yarn g:jest --passWithNoTests" - }, - "dependencies": { - "@reduxjs/toolkit": "^2.3.0" - } -} diff --git a/app/client/packages/git/tsconfig.json b/app/client/packages/git/tsconfig.json deleted file mode 100644 index 752e48c03ef5..000000000000 --- a/app/client/packages/git/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "include": ["./src/**/*"] -} diff --git a/app/client/src/IDE/Components/EditableName/EditableName.test.tsx b/app/client/src/IDE/Components/EditableName/EditableName.test.tsx index 6dfadcebe2f6..eec5e6a26c10 100644 --- a/app/client/src/IDE/Components/EditableName/EditableName.test.tsx +++ b/app/client/src/IDE/Components/EditableName/EditableName.test.tsx @@ -151,7 +151,7 @@ describe("EditableName", () => { await userEvent.click(document.body); - expect(getByRole("tooltip").textContent).toEqual(validationError); + expect(getByRole("tooltip").textContent).toEqual(""); expect(exitEditing).toHaveBeenCalled(); expect(onNameSave).not.toHaveBeenCalledWith(invalidTitle); @@ -187,7 +187,7 @@ describe("EditableName", () => { }); fireEvent.focusOut(inputElement); - expect(getByRole("tooltip").textContent).toEqual(validationError); + expect(getByRole("tooltip").textContent).toEqual(""); expect(exitEditing).toHaveBeenCalled(); expect(onNameSave).not.toHaveBeenCalledWith(invalidTitle); }); diff --git a/app/client/src/IDE/Components/EditableName/EditableName.tsx b/app/client/src/IDE/Components/EditableName/EditableName.tsx index 1f91d827b801..0bc2829728cf 100644 --- a/app/client/src/IDE/Components/EditableName/EditableName.tsx +++ b/app/client/src/IDE/Components/EditableName/EditableName.tsx @@ -5,10 +5,11 @@ import React, { useRef, useState, } from "react"; -import { Spinner, Text, Tooltip } from "@appsmith/ads"; +import { Spinner, Text as ADSText, Tooltip } from "@appsmith/ads"; import { useEventCallback, useEventListener } from "usehooks-ts"; import { usePrevious } from "@mantine/hooks"; import { useNameEditor } from "./useNameEditor"; +import styled from "styled-components"; interface EditableTextProps { name: string; @@ -29,6 +30,10 @@ interface EditableTextProps { inputTestId?: string; } +export const Text = styled(ADSText)` + min-width: 3ch; +`; + export const EditableName = ({ exitEditing, icon, @@ -72,10 +77,15 @@ export const EditableName = ({ const nameError = validate(editableName); if (editableName === name) { + // No change detected exitWithoutSaving(); } else if (nameError === null) { + // Save the new name exitEditing(); onNameSave(editableName); + } else { + // Exit edit mode and revert name + exitWithoutSaving(); } }, [ editableName, @@ -119,7 +129,9 @@ export const EditableName = ({ useEventListener( "focusout", function handleFocusOut() { - if (isEditing) { + const input = inputRef.current; + + if (input) { attemptSave(); } }, diff --git a/app/client/src/PluginActionEditor/components/PluginActionForm/PluginActionForm.tsx b/app/client/src/PluginActionEditor/components/PluginActionForm/PluginActionForm.tsx index 922356f50590..e5be9eb367ec 100644 --- a/app/client/src/PluginActionEditor/components/PluginActionForm/PluginActionForm.tsx +++ b/app/client/src/PluginActionEditor/components/PluginActionForm/PluginActionForm.tsx @@ -1,27 +1,15 @@ import React from "react"; -import { Flex, Text } from "@appsmith/ads"; +import { Flex } from "@appsmith/ads"; import { useChangeActionCall } from "./hooks/useChangeActionCall"; import { usePluginActionContext } from "../../PluginActionContext"; import { UIComponentTypes } from "api/PluginApi"; import APIEditorForm from "./components/ApiEditor"; import GraphQLEditorForm from "./components/GraphQLEditor"; import UQIEditorForm from "./components/UQIEditor"; -import CenteredWrapper from "components/designSystems/appsmith/CenteredWrapper"; -import { createMessage, UNEXPECTED_ERROR } from "ee/constants/messages"; const PluginActionForm = () => { useChangeActionCall(); - const { editorConfig, plugin } = usePluginActionContext(); - - if (!editorConfig) { - return ( - - - {createMessage(UNEXPECTED_ERROR)} - - - ); - } + const { plugin } = usePluginActionContext(); return ( diff --git a/app/client/src/PluginActionEditor/components/PluginActionForm/components/ActionForm/Zone/styles.module.css b/app/client/src/PluginActionEditor/components/PluginActionForm/components/ActionForm/Zone/styles.module.css index 0af35a6d69c7..9f616da7c93b 100644 --- a/app/client/src/PluginActionEditor/components/PluginActionForm/components/ActionForm/Zone/styles.module.css +++ b/app/client/src/PluginActionEditor/components/PluginActionForm/components/ActionForm/Zone/styles.module.css @@ -67,5 +67,10 @@ & :global(.ads-v2-select > .rc-select-selector) { min-width: unset; } + + /* Remove this once the config in DB is updated to use Section and Zone (Twilio, Airtable) */ + & :global(.ar-form-info-text) { + max-width: unset; + } /* Removable section ends here */ } diff --git a/app/client/src/PluginActionEditor/components/PluginActionForm/components/ApiEditor/APIEditorForm.tsx b/app/client/src/PluginActionEditor/components/PluginActionForm/components/ApiEditor/APIEditorForm.tsx index f76893dc6f9c..eb54926f7ac6 100644 --- a/app/client/src/PluginActionEditor/components/PluginActionForm/components/ApiEditor/APIEditorForm.tsx +++ b/app/client/src/PluginActionEditor/components/PluginActionForm/components/ApiEditor/APIEditorForm.tsx @@ -41,6 +41,7 @@ const APIEditorForm = () => { theme={EditorTheme.LIGHT} /> } + dataTestId="t--api-editor-form" formName={API_EDITOR_FORM_NAME} httpMethodOptions={HTTP_METHOD_OPTIONS} isChangePermitted={isChangePermitted} diff --git a/app/client/src/PluginActionEditor/components/PluginActionForm/components/CommonEditorForm/CommonEditorForm.tsx b/app/client/src/PluginActionEditor/components/PluginActionForm/components/CommonEditorForm/CommonEditorForm.tsx index 802a5294572c..83478f013a7e 100644 --- a/app/client/src/PluginActionEditor/components/PluginActionForm/components/CommonEditorForm/CommonEditorForm.tsx +++ b/app/client/src/PluginActionEditor/components/PluginActionForm/components/CommonEditorForm/CommonEditorForm.tsx @@ -14,6 +14,7 @@ interface Props { isChangePermitted: boolean; bodyUIComponent: React.ReactNode; paginationUiComponent: React.ReactNode; + dataTestId?: string; } const CommonEditorForm = (props: Props) => { @@ -30,6 +31,7 @@ const CommonEditorForm = (props: Props) => { return ( } + dataTestId="t--graphql-editor-form" formName={API_EDITOR_FORM_NAME} httpMethodOptions={GRAPHQL_HTTP_METHOD_OPTIONS} isChangePermitted={isChangePermitted} diff --git a/app/client/src/PluginActionEditor/components/PluginActionForm/components/UQIEditor/UQIEditorForm.tsx b/app/client/src/PluginActionEditor/components/PluginActionForm/components/UQIEditor/UQIEditorForm.tsx index 99f303d95474..69b7a4d0ed27 100644 --- a/app/client/src/PluginActionEditor/components/PluginActionForm/components/UQIEditor/UQIEditorForm.tsx +++ b/app/client/src/PluginActionEditor/components/PluginActionForm/components/UQIEditor/UQIEditorForm.tsx @@ -19,7 +19,13 @@ const UQIEditorForm = () => { const { data, evaluationState } = useFormData(); return ( - + + {icon}} diff --git a/app/client/src/PluginActionEditor/components/PluginActionResponse/components/ApiResponse.tsx b/app/client/src/PluginActionEditor/components/PluginActionResponse/components/ApiResponse.tsx index a33f161f4775..f5be06f401d2 100644 --- a/app/client/src/PluginActionEditor/components/PluginActionResponse/components/ApiResponse.tsx +++ b/app/client/src/PluginActionEditor/components/PluginActionResponse/components/ApiResponse.tsx @@ -81,6 +81,14 @@ export function ApiResponse(props: { [name, id], ); + if (props.isRunning) { + return ( + + + + ); + } + if (!props.actionResponse) { return ( @@ -113,9 +121,6 @@ export function ApiResponse(props: { ))} )} - {props.isRunning && ( - - )} {runHasFailed && !props.isRunning ? ( diff --git a/app/client/src/PluginActionEditor/components/PluginActionSettings/SettingsPopover.tsx b/app/client/src/PluginActionEditor/components/PluginActionSettings/SettingsPopover.tsx index 0239936dabad..0c3da50abf16 100644 --- a/app/client/src/PluginActionEditor/components/PluginActionSettings/SettingsPopover.tsx +++ b/app/client/src/PluginActionEditor/components/PluginActionSettings/SettingsPopover.tsx @@ -20,6 +20,7 @@ import { ToolbarSettingsPopover } from "IDE"; export interface SettingsProps { formName: string; docsLink?: DocsLink; + dataTestId?: string; } /* TODO: Remove this after removing custom width from server side (Ankita) */ @@ -75,6 +76,7 @@ const PluginActionSettingsPopover = (props: SettingsProps) => { return ( { const { plugin } = usePluginActionContext(); return API_FORM_COMPONENTS.includes(plugin.uiComponent) ? ( - + ) : ( diff --git a/app/client/src/PluginActionEditor/components/PluginActionToolbar.tsx b/app/client/src/PluginActionEditor/components/PluginActionToolbar.tsx index 43f3679e78c8..e200af92a632 100644 --- a/app/client/src/PluginActionEditor/components/PluginActionToolbar.tsx +++ b/app/client/src/PluginActionEditor/components/PluginActionToolbar.tsx @@ -43,6 +43,7 @@ const PluginActionToolbar = (props: PluginActionToolbarProps) => { showArrow={false} > + + + + + ); +} + +export default DisconnectModal; diff --git a/app/client/src/git/components/QuickActions/AutocommitStatusbar.test.tsx b/app/client/src/git/components/QuickActions/AutocommitStatusbar.test.tsx new file mode 100644 index 000000000000..69f0d44f263c --- /dev/null +++ b/app/client/src/git/components/QuickActions/AutocommitStatusbar.test.tsx @@ -0,0 +1,158 @@ +import React from "react"; +import { render, screen, act } from "@testing-library/react"; +import AutocommitStatusbar from "./AutocommitStatusbar"; +import "@testing-library/jest-dom"; + +// Mock timers using Jest +jest.useFakeTimers(); + +// Mock the Statusbar component from '@appsmith/ads-old' +jest.mock("@appsmith/ads-old", () => ({ + Statusbar: ({ percentage }: { percentage: number }) => ( +
{percentage}%
+ ), +})); + +const TOTAL_DURATION_MS = 4000; +const STEPS = 9; +const INTERVAL_MS = TOTAL_DURATION_MS / STEPS; + +describe("AutocommitStatusbar Component", () => { + afterEach(() => { + jest.clearAllTimers(); + }); + + it("should render with initial percentage 0 when completed is false", () => { + render(); + const statusbar = screen.getByTestId("statusbar"); + + expect(statusbar).toBeInTheDocument(); + expect(statusbar).toHaveTextContent("0%"); + }); + + it("should increment percentage over time when completed is false", () => { + render(); + const statusbar = screen.getByTestId("statusbar"); + + // Initial percentage + expect(statusbar).toHaveTextContent("0%"); + + // Advance timer by one interval + act(() => { + jest.advanceTimersByTime(INTERVAL_MS); + }); + expect(statusbar).toHaveTextContent("10%"); + + // Advance timer by another interval + act(() => { + jest.advanceTimersByTime(INTERVAL_MS); + }); + expect(statusbar).toHaveTextContent("20%"); + + // Continue until percentage reaches 90% + act(() => { + jest.advanceTimersByTime((4 * 1000 * 7) / 9); + }); + expect(statusbar).toHaveTextContent("90%"); + }); + + it("should not increment percentage beyond 90 when completed is false", () => { + render(); + const statusbar = screen.getByTestId("statusbar"); + + // Advance time beyond the total interval duration + act(() => { + jest.advanceTimersByTime(5000); + }); + expect(statusbar).toHaveTextContent("90%"); + + // Advance time further to ensure percentage doesn't exceed 90% + act(() => { + jest.advanceTimersByTime(5000); + }); + expect(statusbar).toHaveTextContent("90%"); + }); + + it("should set percentage to 100 when completed is true", () => { + render(); + const statusbar = screen.getByTestId("statusbar"); + + expect(statusbar).toHaveTextContent("100%"); + }); + + it("should call onHide after 1 second when completed is true", () => { + const onHide = jest.fn(); + + render(); + expect(onHide).not.toHaveBeenCalled(); + + // Advance timer by 1 second + act(() => { + jest.advanceTimersByTime(1000); + }); + expect(onHide).toHaveBeenCalledTimes(1); + }); + + it("should clean up intervals and timeouts on unmount", () => { + const onHide = jest.fn(); + + const { unmount } = render( + , + ); + + // Start the interval + act(() => { + jest.advanceTimersByTime(INTERVAL_MS); + }); + + // Unmount the component + unmount(); + + // Advance time to see if any timers are still running + act(() => { + jest.advanceTimersByTime(10000); + }); + expect(onHide).not.toHaveBeenCalled(); + }); + + it("should handle transition from false to true for completed prop", () => { + const onHide = jest.fn(); + const { rerender } = render( + , + ); + const statusbar = screen.getByTestId("statusbar"); + + // Advance timer to increase percentage + act(() => { + jest.advanceTimersByTime(INTERVAL_MS); + }); + expect(statusbar).toHaveTextContent("10%"); + + // Update the completed prop to true + rerender(); + expect(statusbar).toHaveTextContent("100%"); + + // Ensure onHide is called after 1 second + act(() => { + jest.advanceTimersByTime(1000); + }); + expect(onHide).toHaveBeenCalledTimes(1); + }); + + it("should not reset percentage when completed changes from true to false", () => { + const { rerender } = render(); + const statusbar = screen.getByTestId("statusbar"); + + expect(statusbar).toHaveTextContent("100%"); + + // Change completed to false + rerender(); + expect(statusbar).toHaveTextContent("100%"); + + // Advance timer to check if percentage increments beyond 100% + act(() => { + jest.advanceTimersByTime(INTERVAL_MS); + }); + expect(statusbar).toHaveTextContent("100%"); + }); +}); diff --git a/app/client/src/git/components/QuickActions/AutocommitStatusbar.tsx b/app/client/src/git/components/QuickActions/AutocommitStatusbar.tsx new file mode 100644 index 000000000000..88a3eb460734 --- /dev/null +++ b/app/client/src/git/components/QuickActions/AutocommitStatusbar.tsx @@ -0,0 +1,118 @@ +import React, { useEffect, useRef, useState } from "react"; +import { Statusbar } from "@appsmith/ads-old"; +import styled from "styled-components"; +import { + AUTOCOMMIT_IN_PROGRESS_MESSAGE, + createMessage, +} from "ee/constants/messages"; + +interface AutocommitStatusbarProps { + completed: boolean; + onHide?: () => void; +} + +const PROGRESSBAR_WIDTH = 150; +const TOTAL_DURATION_MS = 4000; // in ms +const MAX_PROGRESS_PERCENTAGE = 90; +const PROGRESS_INCREMENT = 10; +const STEPS = 9; +const INTERVAL_MS = TOTAL_DURATION_MS / STEPS; + +const StatusbarWrapper = styled.div` + > div { + display: flex; + height: initial; + align-items: center; + } + + > div > div { + margin-top: 0px; + width: ${PROGRESSBAR_WIDTH}px; + margin-right: var(--ads-v2-spaces-4); + } + + > div > p { + margin-top: 0; + } +`; + +export default function AutocommitStatusbar({ + completed, + onHide, +}: AutocommitStatusbarProps) { + const intervalRef = useRef(null); + const timeoutRef = useRef(null); + const [percentage, setPercentage] = useState(0); + + // Effect for incrementing percentage when not completed + useEffect( + function incrementPercentage() { + if (!completed) { + intervalRef.current = setInterval(() => { + setPercentage((prevPercentage) => { + if (prevPercentage < MAX_PROGRESS_PERCENTAGE) { + return prevPercentage + PROGRESS_INCREMENT; + } else { + // Clear the interval when percentage reaches 90% + if (intervalRef.current !== null) { + clearInterval(intervalRef.current); + intervalRef.current = null; + } + + return prevPercentage; + } + }); + }, INTERVAL_MS); + } + + // Cleanup function to clear the interval + return () => { + if (intervalRef.current !== null) { + clearInterval(intervalRef.current); + intervalRef.current = null; + } + }; + }, + [completed], + ); // Removed 'percentage' from dependencies + + // Effect for setting percentage to 100% when completed + useEffect( + function finishPercentage() { + if (completed) { + setPercentage(100); + } + }, + [completed], + ); + + // Effect for calling onHide after 1 second when completed + useEffect( + function onCompleteCallback() { + if (completed && onHide) { + timeoutRef.current = setTimeout(() => { + onHide(); + }, 1000); + } + + return () => { + if (timeoutRef.current !== null) { + clearTimeout(timeoutRef.current); + timeoutRef.current = null; + } + }; + }, + [completed, onHide], + ); + + return ( + + + + ); +} diff --git a/app/client/src/git/components/QuickActions/ConnectButton.test.tsx b/app/client/src/git/components/QuickActions/ConnectButton.test.tsx new file mode 100644 index 000000000000..3b017c0c018f --- /dev/null +++ b/app/client/src/git/components/QuickActions/ConnectButton.test.tsx @@ -0,0 +1,154 @@ +import React from "react"; +import { render, screen, fireEvent } from "@testing-library/react"; +import ConnectButton from "./ConnectButton"; +import AnalyticsUtil from "ee/utils/AnalyticsUtil"; +import { GitSyncModalTab } from "entities/GitSync"; +import "@testing-library/jest-dom"; +import { theme } from "constants/DefaultTheme"; +import { ThemeProvider } from "styled-components"; + +// Mock the AnalyticsUtil +jest.mock("ee/utils/AnalyticsUtil", () => ({ + logEvent: jest.fn(), +})); + +// Mock the components from '@appsmith/ads' +jest.mock("@appsmith/ads", () => ({ + ...jest.requireActual("@appsmith/ads"), + Icon: ({ name }: Record) => ( +
{name}
+ ), + Tooltip: ({ children, content, isDisabled }: Record) => ( +
+ {children} + {!isDisabled &&
{content}
} +
+ ), +})); + +describe("ConnectButton Component", () => { + const openGitSyncModalMock = jest.fn(); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it("should render correctly when isConnectPermitted is true", () => { + render( + + + , + ); + + // Check that the button is rendered and enabled + const button = screen.getByRole("button"); + + expect(button).toBeInTheDocument(); + expect(button).toBeEnabled(); + + // Tooltip should be disabled + const tooltipContent = screen.queryByTestId("tooltip-content"); + + expect(tooltipContent).not.toBeInTheDocument(); + + // Icon should be rendered + const icon = screen.getByTestId("icon"); + + expect(icon).toBeInTheDocument(); + expect(icon).toHaveTextContent("git-commit"); + }); + + it("should handle click when isConnectPermitted is true", () => { + render( + + + , + ); + + const button = screen.getByRole("button", { name: "Connect Git (Beta)" }); + + fireEvent.click(button); + + expect(AnalyticsUtil.logEvent).toHaveBeenCalledWith( + "GS_CONNECT_GIT_CLICK", + { + source: "BOTTOM_BAR_GIT_CONNECT_BUTTON", + }, + ); + + expect(openGitSyncModalMock).toHaveBeenCalledWith({ + tab: GitSyncModalTab.GIT_CONNECTION, + }); + }); + + it("should render correctly when isConnectPermitted is false", () => { + render( + + + , + ); + + // Check that the button is rendered and disabled + const button = screen.getByRole("button", { name: "Connect Git (Beta)" }); + + expect(button).toBeInTheDocument(); + expect(button).toBeDisabled(); + + // Tooltip should be enabled and display correct content + const tooltipContent = screen.getByTestId("tooltip-content"); + + expect(tooltipContent).toBeInTheDocument(); + expect(tooltipContent).toHaveTextContent( + "Please contact your workspace admin to connect your app to a git repo", + ); + + // Icon should be rendered + const icon = screen.getByTestId("icon"); + + expect(icon).toBeInTheDocument(); + expect(icon).toHaveTextContent("git-commit"); + }); + + it("should not handle click when isConnectPermitted is false", () => { + render( + + + , + ); + + const button = screen.getByRole("button", { name: "Connect Git (Beta)" }); + + fireEvent.click(button); + + expect(AnalyticsUtil.logEvent).not.toHaveBeenCalled(); + expect(openGitSyncModalMock).not.toHaveBeenCalled(); + }); + + it("should display correct tooltip content when isConnectPermitted is true", () => { + render( + + + , + ); + + // Tooltip should be disabled, so content should not be visible + const tooltipContent = screen.queryByTestId("tooltip-content"); + + expect(tooltipContent).not.toBeInTheDocument(); + }); +}); diff --git a/app/client/src/git/components/QuickActions/ConnectButton.tsx b/app/client/src/git/components/QuickActions/ConnectButton.tsx new file mode 100644 index 000000000000..426b2a05ec85 --- /dev/null +++ b/app/client/src/git/components/QuickActions/ConnectButton.tsx @@ -0,0 +1,93 @@ +import React, { useCallback, useMemo } from "react"; +import { GitSyncModalTab } from "entities/GitSync"; +import styled from "styled-components"; +import { + COMING_SOON, + CONNECT_GIT_BETA, + CONTACT_ADMIN_FOR_GIT, + createMessage, + NOT_LIVE_FOR_YOU_YET, +} from "ee/constants/messages"; +import AnalyticsUtil from "ee/utils/AnalyticsUtil"; +import { Button, Icon, Tooltip } from "@appsmith/ads"; + +interface ConnectButtonProps { + isConnectPermitted: boolean; + openGitSyncModal: (options: { tab: GitSyncModalTab }) => void; +} + +const CenterDiv = styled.div` + text-align: center; +`; + +const Container = styled.div` + height: 100%; + display: flex; + align-items: center; + margin-left: 0; + cursor: pointer; +`; + +const StyledIcon = styled(Icon)` + cursor: default; + margin-right: ${(props) => props.theme.spaces[3]}px; +`; + +const OuterContainer = styled.div` + padding: 4px 16px; + height: 100%; +`; + +function ConnectButton({ + isConnectPermitted, + openGitSyncModal, +}: ConnectButtonProps) { + const isTooltipEnabled = !isConnectPermitted; + const tooltipContent = useMemo(() => { + if (!isConnectPermitted) { + return {createMessage(CONTACT_ADMIN_FOR_GIT)}; + } + + return ( + <> +
{createMessage(NOT_LIVE_FOR_YOU_YET)}
+
{createMessage(COMING_SOON)}
+ + ); + }, [isConnectPermitted]); + + const handleClickOnGitConnect = useCallback(() => { + AnalyticsUtil.logEvent("GS_CONNECT_GIT_CLICK", { + source: "BOTTOM_BAR_GIT_CONNECT_BUTTON", + }); + + openGitSyncModal({ + tab: GitSyncModalTab.GIT_CONNECTION, + }); + }, [openGitSyncModal]); + + return ( + + + + + + + + + ); +} + +export default ConnectButton; diff --git a/app/client/src/git/components/QuickActions/QuickActionButton.test.tsx b/app/client/src/git/components/QuickActions/QuickActionButton.test.tsx new file mode 100644 index 000000000000..6bd94a586f56 --- /dev/null +++ b/app/client/src/git/components/QuickActions/QuickActionButton.test.tsx @@ -0,0 +1,109 @@ +import React from "react"; +import { render, screen, fireEvent } from "@testing-library/react"; +import QuickActionButton from "./QuickActionButton"; +import "@testing-library/jest-dom"; +import { theme } from "constants/DefaultTheme"; +import { ThemeProvider } from "styled-components"; + +jest.mock("pages/common/SpinnerLoader", () => { + return function SpinnerLoader() { + return
Loading...
; + }; +}); + +jest.mock("@appsmith/ads", () => ({ + ...jest.requireActual("@appsmith/ads"), + Tooltip: ({ children, content }: Record) => ( +
+
{content}
+ {children} +
+ ), +})); + +describe("QuickActionButton", () => { + const defaultProps = { + icon: "plus", + onClick: jest.fn(), + tooltipText: "default action", + className: "t--test-btn", + }; + + afterEach(() => { + jest.clearAllMocks(); + }); + + it("should render without crashing", () => { + const { container } = render( + + + , + ); + const btn = container.getElementsByClassName("t--test-btn")[0]; + + expect(btn).toBeInTheDocument(); + }); + + it("should call onClick when button is clicked", () => { + const { container } = render( + + + , + ); + const btn = container.getElementsByClassName("t--test-btn")[0]; + + fireEvent.click(btn); + expect(defaultProps.onClick).toHaveBeenCalledTimes(1); + }); + + it("should not call onClick when button is disabled", () => { + const { container } = render( + + + , + ); + const btn = container.getElementsByClassName("t--test-btn")[0]; + + fireEvent.click(btn); + expect(defaultProps.onClick).not.toHaveBeenCalled(); + }); + + it("should display the tooltip with capitalized text", () => { + render( + + + , + ); + expect(screen.getByTestId("tooltip-content")).toHaveTextContent( + "Default action", + ); + }); + + it("should display the spinner when loading is true", () => { + render( + + + , + ); + expect(screen.getByTestId("spinner-loader")).toBeInTheDocument(); + expect(screen.queryByTestId("t--test-btn")).not.toBeInTheDocument(); + }); + + it("should display the count badge when count is greater than 0", () => { + render( + + + , + ); + expect(screen.getByText("5")).toBeInTheDocument(); + }); + + it("should not display the count badge when count is 0", () => { + render( + + + , + ); + expect(screen.queryByText("0")).not.toBeInTheDocument(); + }); +}); diff --git a/app/client/src/git/components/QuickActions/QuickActionButton.tsx b/app/client/src/git/components/QuickActions/QuickActionButton.tsx new file mode 100644 index 000000000000..42d7721ab297 --- /dev/null +++ b/app/client/src/git/components/QuickActions/QuickActionButton.tsx @@ -0,0 +1,91 @@ +import React from "react"; +import styled from "styled-components"; +import { capitalizeFirstLetter } from "./helpers"; +import SpinnerLoader from "pages/common/SpinnerLoader"; +import { Button, Tooltip, Text } from "@appsmith/ads"; +import { getTypographyByKey } from "@appsmith/ads-old"; + +interface QuickActionButtonProps { + className?: string; + count?: number; + disabled?: boolean; + icon: string; + loading?: boolean; + onClick: () => void; + tooltipText: string; +} + +const SpinnerContainer = styled.div` + padding: 0 10px; +`; + +const QuickActionButtonContainer = styled.button<{ disabled?: boolean }>` + margin: 0 ${(props) => props.theme.spaces[1]}px; + display: block; + position: relative; + overflow: visible; + cursor: ${({ disabled = false }) => (disabled ? "not-allowed" : "pointer")}; + opacity: ${({ disabled = false }) => (disabled ? 0.6 : 1)}; +`; + +const StyledCountText = styled(Text)` + align-items: center; + background-color: var(--ads-v2-color-bg-brand-secondary-emphasis-plus); + color: var(--ads-v2-color-white); + display: flex; + justify-content: center; + position: absolute; + height: var(--ads-v2-spaces-5); + top: ${(props) => -1 * props.theme.spaces[3]}px; + left: ${(props) => props.theme.spaces[10]}px; + border-radius: ${(props) => props.theme.spaces[3]}px; + ${getTypographyByKey("p3")}; + z-index: 1; + padding: ${(props) => props.theme.spaces[1]}px + ${(props) => props.theme.spaces[2]}px; +`; + +function QuickActionButton({ + className = "", + count = 0, + disabled = false, + icon, + loading = false, + onClick, + tooltipText, +}: QuickActionButtonProps) { + const content = capitalizeFirstLetter(tooltipText); + + return ( + + {loading ? ( + + + + ) : ( + +
+
+
+ )} +
+ ); +} + +export default QuickActionButton; diff --git a/app/client/src/git/components/QuickActions/helper.test.ts b/app/client/src/git/components/QuickActions/helper.test.ts new file mode 100644 index 000000000000..a7b3a6d30204 --- /dev/null +++ b/app/client/src/git/components/QuickActions/helper.test.ts @@ -0,0 +1,191 @@ +import { getPullBtnStatus, capitalizeFirstLetter } from "./helpers"; + +describe("getPullBtnStatus", () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should return disabled with message "No commits to pull" when behindCount is 0', () => { + const gitStatus: Record = { + behindCount: 0, + isClean: true, + }; + const pullFailed = false; + const isProtected = false; + + const result = getPullBtnStatus(gitStatus, pullFailed, isProtected); + + expect(result).toEqual({ + disabled: true, + message: + "No commits to pull. This branch is in sync with the remote repository", + }); + }); + + it('should return disabled with message "Cannot pull with local uncommitted changes" when isClean is false and isProtected is false', () => { + const gitStatus: Record = { + behindCount: 5, + isClean: false, + }; + const pullFailed = false; + const isProtected = false; + + const result = getPullBtnStatus(gitStatus, pullFailed, isProtected); + + expect(result).toEqual({ + disabled: true, + message: + "You have uncommitted changes. Please commit or discard before pulling the remote changes.", + }); + }); + + it('should return enabled with message "Pull changes" when isClean is false, isProtected is true, and behindCount > 0', () => { + const gitStatus: Record = { + behindCount: 3, + isClean: false, + }; + const pullFailed = false; + const isProtected = true; + + const result = getPullBtnStatus(gitStatus, pullFailed, isProtected); + + expect(result).toEqual({ + disabled: false, + message: "Pull changes", + }); + }); + + it('should return message "Conflicts found" when pullFailed is true', () => { + const gitStatus: Record = { + behindCount: 2, + isClean: true, + }; + const pullFailed = true; + const isProtected = false; + + const result = getPullBtnStatus(gitStatus, pullFailed, isProtected); + + expect(result).toEqual({ + disabled: false, + message: "Conflicts found. Please resolve them and pull again.", + }); + }); + + it('should return enabled with message "Pull changes" when behindCount > 0 and no other conditions met', () => { + const gitStatus: Record = { + behindCount: 1, + isClean: true, + }; + const pullFailed = false; + const isProtected = false; + + const result = getPullBtnStatus(gitStatus, pullFailed, isProtected); + + expect(result).toEqual({ + disabled: false, + message: "Pull changes", + }); + }); + + it('should return disabled with message "No commits to pull" when behindCount is 0 regardless of isClean and isProtected', () => { + const gitStatus: Record = { + behindCount: 0, + isClean: false, + }; + const pullFailed = false; + const isProtected = true; + + const result = getPullBtnStatus(gitStatus, pullFailed, isProtected); + + expect(result).toEqual({ + disabled: true, + message: + "No commits to pull. This branch is in sync with the remote repository", + }); + }); + + it("should prioritize pullFailed over other conditions", () => { + const gitStatus: Record = { + behindCount: 0, + isClean: true, + }; + const pullFailed = true; + const isProtected = false; + + const result = getPullBtnStatus(gitStatus, pullFailed, isProtected); + + expect(result).toEqual({ + disabled: true, + message: "Conflicts found. Please resolve them and pull again.", + }); + }); + + it("should handle edge case when isClean is false, isProtected is true, behindCount is 0", () => { + const gitStatus: Record = { + behindCount: 0, + isClean: false, + }; + const pullFailed = false; + const isProtected = true; + + const result = getPullBtnStatus(gitStatus, pullFailed, isProtected); + + expect(result).toEqual({ + disabled: true, + message: + "No commits to pull. This branch is in sync with the remote repository", + }); + }); +}); + +describe("capitalizeFirstLetter", () => { + it("should capitalize the first letter of a lowercase word", () => { + const result = capitalizeFirstLetter("hello"); + + expect(result).toBe("Hello"); + }); + + it("should capitalize the first letter of an uppercase word", () => { + const result = capitalizeFirstLetter("WORLD"); + + expect(result).toBe("World"); + }); + + it("should handle empty string", () => { + const result = capitalizeFirstLetter(""); + + expect(result).toBe(""); + }); + + it("should handle single character", () => { + const result = capitalizeFirstLetter("a"); + + expect(result).toBe("A"); + }); + + it("should handle strings with spaces", () => { + const result = capitalizeFirstLetter("multiple words here"); + + expect(result).toBe("Multiple words here"); + }); + + it("should handle undefined input", () => { + // The function provides a default value of " " when input is undefined + // So we expect the output to be a single space with capitalized first letter + const result = capitalizeFirstLetter(); + + expect(result).toBe(" "); + }); + + it("should handle strings with special characters", () => { + const result = capitalizeFirstLetter("123abc"); + + expect(result).toBe("123abc"); + }); + + it("should not modify strings where the first character is not a letter", () => { + const result = capitalizeFirstLetter("!test"); + + expect(result).toBe("!test"); + }); +}); diff --git a/app/client/src/git/components/QuickActions/helpers.ts b/app/client/src/git/components/QuickActions/helpers.ts new file mode 100644 index 000000000000..109197264899 --- /dev/null +++ b/app/client/src/git/components/QuickActions/helpers.ts @@ -0,0 +1,45 @@ +import { + CANNOT_PULL_WITH_LOCAL_UNCOMMITTED_CHANGES, + CONFLICTS_FOUND, + createMessage, + NO_COMMITS_TO_PULL, + PULL_CHANGES, +} from "ee/constants/messages"; +import type { GitStatus } from "../../types"; + +export const getPullBtnStatus = ( + gitStatus: GitStatus, + pullFailed: boolean, + isProtected: boolean, +) => { + const { behindCount, isClean } = gitStatus; + let message = createMessage(NO_COMMITS_TO_PULL); + let disabled = behindCount === 0; + + if (!isClean && !isProtected) { + disabled = true; + message = createMessage(CANNOT_PULL_WITH_LOCAL_UNCOMMITTED_CHANGES); + // TODO: Remove this when gitStatus typings are finalized + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + //@ts-ignore + } else if (!isClean && isProtected && behindCount > 0) { + disabled = false; + message = createMessage(PULL_CHANGES); + } else if (pullFailed) { + message = createMessage(CONFLICTS_FOUND); + // TODO: Remove this when gitStatus typings are finalized + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + //@ts-ignore + } else if (behindCount > 0) { + message = createMessage(PULL_CHANGES); + } + + return { + disabled, + message, + }; +}; + +export const capitalizeFirstLetter = (string = " ") => { + return string.charAt(0).toUpperCase() + string.toLowerCase().slice(1); +}; diff --git a/app/client/src/git/components/QuickActions/index.test.tsx b/app/client/src/git/components/QuickActions/index.test.tsx new file mode 100644 index 000000000000..b920e6b51fde --- /dev/null +++ b/app/client/src/git/components/QuickActions/index.test.tsx @@ -0,0 +1,334 @@ +import React from "react"; +import { render, screen, fireEvent } from "@testing-library/react"; +import AnalyticsUtil from "ee/utils/AnalyticsUtil"; +import QuickActions from "."; +import { GitSettingsTab } from "git/enums"; +import { GitSyncModalTab } from "entities/GitSync"; +import { theme } from "constants/DefaultTheme"; +import { ThemeProvider } from "styled-components"; +import "@testing-library/jest-dom/extend-expect"; + +jest.mock("ee/utils/AnalyticsUtil", () => ({ + logEvent: jest.fn(), +})); + +jest.mock("./ConnectButton", () => () => ( +
ConnectButton
+)); + +jest.mock("./AutocommitStatusbar", () => () => ( +
AutocommitStatusbar
+)); + +describe("QuickActions Component", () => { + const defaultProps = { + isGitConnected: false, + gitStatus: { + behindCount: 0, + isClean: true, + }, + pullFailed: false, + isProtectedMode: false, + isDiscardInProgress: false, + isPollingAutocommit: false, + isPullInProgress: false, + isFetchingGitStatus: false, + changesToCommit: 0, + gitMetadata: {}, + isAutocommitEnabled: false, + isConnectPermitted: true, + openGitSyncModal: jest.fn(), + openGitSettingsModal: jest.fn(), + discardChanges: jest.fn(), + pull: jest.fn(), + }; + + afterEach(() => { + jest.clearAllMocks(); + }); + + it("should render ConnectButton when isGitConnected is false", () => { + render( + + + , + ); + expect(screen.getByTestId("connect-button")).toBeInTheDocument(); + }); + + it("should render QuickActionButtons when isGitConnected is true", () => { + const props = { + ...defaultProps, + isGitConnected: true, + }; + + const { container } = render( + + + , + ); + + expect( + container.getElementsByClassName("t--bottom-bar-commit").length, + ).toBe(1); + expect(container.getElementsByClassName("t--bottom-bar-pull").length).toBe( + 1, + ); + expect(container.getElementsByClassName("t--bottom-bar-merge").length).toBe( + 1, + ); + expect( + container.getElementsByClassName("t--bottom-git-settings").length, + ).toBe(1); + }); + + it("should render AutocommitStatusbar when isAutocommitEnabled and isPollingAutocommit are true", () => { + const props = { + ...defaultProps, + isGitConnected: true, + gitMetadata: { + autoCommitConfig: { + enabled: true, + }, + }, + isPollingAutocommit: true, + }; + + const { container } = render( + + + , + ); + + expect(screen.getByTestId("autocommit-statusbar")).toBeInTheDocument(); + expect( + container.getElementsByClassName("t--bottom-bar-commit").length, + ).toBe(0); + }); + + it("should call onCommitClick when commit button is clicked", () => { + const props = { + ...defaultProps, + isGitConnected: true, + }; + + const { container } = render( + + + , + ); + const commitButton = container.getElementsByClassName( + "t--bottom-bar-commit", + )[0]; + + fireEvent.click(commitButton); + expect(props.openGitSyncModal).toHaveBeenCalledWith({ + tab: GitSyncModalTab.DEPLOY, + }); + expect(AnalyticsUtil.logEvent).toHaveBeenCalledWith( + "GS_DEPLOY_GIT_MODAL_TRIGGERED", + { + source: "BOTTOM_BAR_GIT_COMMIT_BUTTON", + }, + ); + }); + + it("should call onPullClick when pull button is clicked", () => { + const props = { + ...defaultProps, + isGitConnected: true, + isDiscardInProgress: false, + isPullInProgress: false, + isFetchingGitStatus: false, + pullDisabled: false, + gitStatus: { + behindCount: 1, + isClean: false, + }, + isProtectedMode: true, + }; + + const { container } = render( + + + , + ); + const pullButton = + container.getElementsByClassName("t--bottom-bar-pull")[0]; + + fireEvent.click(pullButton); + expect(AnalyticsUtil.logEvent).toHaveBeenCalledWith("GS_PULL_GIT_CLICK", { + source: "BOTTOM_BAR_GIT_PULL_BUTTON", + }); + }); + + it("should call onMerge when merge button is clicked", () => { + const props = { + ...defaultProps, + isGitConnected: true, + }; + + const { container } = render( + + + , + ); + const mergeButton = container.getElementsByClassName( + "t--bottom-bar-merge", + )[0]; + + fireEvent.click(mergeButton); + expect(AnalyticsUtil.logEvent).toHaveBeenCalledWith( + "GS_MERGE_GIT_MODAL_TRIGGERED", + { + source: "BOTTOM_BAR_GIT_MERGE_BUTTON", + }, + ); + expect(props.openGitSyncModal).toHaveBeenCalledWith({ + tab: GitSyncModalTab.MERGE, + isDeploying: true, + }); + }); + + it("should call onSettingsClick when settings button is clicked", () => { + const props = { + ...defaultProps, + isGitConnected: true, + }; + + const { container } = render( + + + , + ); + const settingsButton = container.getElementsByClassName( + "t--bottom-git-settings", + )[0]; + + fireEvent.click(settingsButton); + expect(AnalyticsUtil.logEvent).toHaveBeenCalledWith("GS_SETTING_CLICK", { + source: "BOTTOM_BAR_GIT_SETTING_BUTTON", + }); + expect(props.openGitSettingsModal).toHaveBeenCalledWith({ + tab: GitSettingsTab.General, + }); + }); + + it("should disable commit button when isProtectedMode is true", () => { + const props = { + ...defaultProps, + isGitConnected: true, + isProtectedMode: true, + }; + + const { container } = render( + + + , + ); + const commitButton = container.getElementsByClassName( + "t--bottom-bar-commit", + )[0]; + + expect(commitButton).toBeDisabled(); + }); + + it("should show loading state on pull button when showPullLoadingState is true", () => { + const props = { + ...defaultProps, + isGitConnected: true, + isPullInProgress: true, + }; + + const { container } = render( + + + , + ); + + const pullButton = + container.getElementsByClassName("t--bottom-bar-pull")[0]; + const pullLoading = pullButton.getElementsByClassName( + "t--loader-quick-git-action", + )[0]; + + expect(pullLoading).toBeInTheDocument(); + }); + + it("should display changesToCommit count on commit button", () => { + const props = { + ...defaultProps, + isGitConnected: true, + changesToCommit: 5, + }; + + render( + + + , + ); + const countElement = screen.getByTestId("t--bottom-bar-count"); + + expect(countElement).toHaveTextContent("5"); + }); + + it("should not display count on commit button when isProtectedMode is true", () => { + const props = { + ...defaultProps, + isGitConnected: true, + isProtectedMode: true, + changesToCommit: 5, + }; + + render( + + + , + ); + expect(screen.queryByTestId("t--bottom-bar-count")).not.toBeInTheDocument(); + }); + + it("should disable pull button when pullDisabled is true", () => { + const mockGetPullBtnStatus = jest.requireMock("./helpers").getPullBtnStatus; + + mockGetPullBtnStatus.mockReturnValue({ + disabled: true, + message: "Pull Disabled", + }); + + const props = { + ...defaultProps, + isGitConnected: true, + }; + + const { container } = render( + + + , + ); + const pullButton = + container.getElementsByClassName("t--bottom-bar-pull")[0]; + + expect(pullButton).toBeDisabled(); + }); + + it("should show behindCount on pull button", () => { + const props = { + ...defaultProps, + isGitConnected: true, + gitStatus: { + behindCount: 3, + isClean: true, + }, + }; + + render( + + + , + ); + const countElement = screen.getByTestId("t--bottom-bar-count"); + + expect(countElement).toHaveTextContent("3"); + }); +}); diff --git a/app/client/src/git/components/QuickActions/index.tsx b/app/client/src/git/components/QuickActions/index.tsx new file mode 100644 index 000000000000..cab336ca1e52 --- /dev/null +++ b/app/client/src/git/components/QuickActions/index.tsx @@ -0,0 +1,183 @@ +import React, { useCallback } from "react"; +import styled from "styled-components"; + +import { + COMMIT_CHANGES, + createMessage, + GIT_SETTINGS, + MERGE, +} from "ee/constants/messages"; + +import { GitSyncModalTab } from "entities/GitSync"; +import AnalyticsUtil from "ee/utils/AnalyticsUtil"; +import type { GitMetadata, GitStatus } from "../../types"; +import { getPullBtnStatus } from "./helpers"; +import { GitSettingsTab } from "../../enums"; +import ConnectButton from "./ConnectButton"; +import QuickActionButton from "./QuickActionButton"; +import AutocommitStatusbar from "./AutocommitStatusbar"; + +interface QuickActionsProps { + isGitConnected: boolean; + gitStatus: GitStatus; + pullFailed: boolean; + isProtectedMode: boolean; + isDiscardInProgress: boolean; + isPollingAutocommit: boolean; + isPullInProgress: boolean; + isFetchingGitStatus: boolean; + changesToCommit: number; + gitMetadata: GitMetadata; + isAutocommitEnabled: boolean; + isConnectPermitted: boolean; + openGitSyncModal: (options: { + tab: GitSyncModalTab; + isDeploying?: boolean; + }) => void; + openGitSettingsModal: (options: { tab: GitSettingsTab }) => void; + discardChanges: () => void; + pull: (options: { triggeredFromBottomBar: boolean }) => void; +} + +const Container = styled.div` + height: 100%; + display: flex; + align-items: center; +`; + +function QuickActions({ + changesToCommit, + discardChanges, + gitMetadata, + gitStatus, + isConnectPermitted, + isDiscardInProgress, + isFetchingGitStatus, + isGitConnected, + isPollingAutocommit, + isProtectedMode, + isPullInProgress, + openGitSettingsModal, + openGitSyncModal, + pull, + pullFailed, +}: QuickActionsProps) { + const { disabled: pullDisabled, message: pullTooltipMessage } = + getPullBtnStatus(gitStatus, !!pullFailed, isProtectedMode); + + const showPullLoadingState = + isDiscardInProgress || isPullInProgress || isFetchingGitStatus; + + // TODO - Update once the gitMetadata typing is added + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + const isAutocommitEnabled: boolean = gitMetadata?.autoCommitConfig?.enabled; + const onCommitClick = useCallback(() => { + if (!isFetchingGitStatus && !isProtectedMode) { + openGitSyncModal({ + tab: GitSyncModalTab.DEPLOY, + }); + + AnalyticsUtil.logEvent("GS_DEPLOY_GIT_MODAL_TRIGGERED", { + source: "BOTTOM_BAR_GIT_COMMIT_BUTTON", + }); + } + }, [isFetchingGitStatus, isProtectedMode, openGitSyncModal]); + + const onPullClick = useCallback(() => { + if (!showPullLoadingState && !pullDisabled) { + AnalyticsUtil.logEvent("GS_PULL_GIT_CLICK", { + source: "BOTTOM_BAR_GIT_PULL_BUTTON", + }); + + if (isProtectedMode) { + discardChanges(); + } else { + pull({ triggeredFromBottomBar: true }); + } + } + }, [ + discardChanges, + isProtectedMode, + pull, + pullDisabled, + showPullLoadingState, + ]); + + const onMerge = useCallback(() => { + AnalyticsUtil.logEvent("GS_MERGE_GIT_MODAL_TRIGGERED", { + source: "BOTTOM_BAR_GIT_MERGE_BUTTON", + }); + openGitSyncModal({ + tab: GitSyncModalTab.MERGE, + isDeploying: true, + }); + }, [openGitSyncModal]); + + const onSettingsClick = useCallback(() => { + openGitSettingsModal({ + tab: GitSettingsTab.General, + }); + AnalyticsUtil.logEvent("GS_SETTING_CLICK", { + source: "BOTTOM_BAR_GIT_SETTING_BUTTON", + }); + }, [openGitSettingsModal]); + + return isGitConnected ? ( + + {/* */} + {isAutocommitEnabled && isPollingAutocommit ? ( + + ) : ( + <> + + + + + + )} + + ) : ( + + ); +} + +export default QuickActions; diff --git a/app/client/packages/git/src/components/connect/GitTest.tsx b/app/client/src/git/components/connect/GitTest.tsx similarity index 100% rename from app/client/packages/git/src/components/connect/GitTest.tsx rename to app/client/src/git/components/connect/GitTest.tsx diff --git a/app/client/packages/git/src/enums.ts b/app/client/src/git/enums.ts similarity index 100% rename from app/client/packages/git/src/enums.ts rename to app/client/src/git/enums.ts diff --git a/app/client/packages/git/src/store/gitArtifactSlice.ts b/app/client/src/git/store/gitArtifactSlice.ts similarity index 100% rename from app/client/packages/git/src/store/gitArtifactSlice.ts rename to app/client/src/git/store/gitArtifactSlice.ts diff --git a/app/client/packages/git/src/store/index.ts b/app/client/src/git/store/index.ts similarity index 100% rename from app/client/packages/git/src/store/index.ts rename to app/client/src/git/store/index.ts diff --git a/app/client/packages/git/src/types.ts b/app/client/src/git/types.ts similarity index 100% rename from app/client/packages/git/src/types.ts rename to app/client/src/git/types.ts diff --git a/app/client/src/pages/Editor/JSEditor/JSEditorContextMenu.tsx b/app/client/src/pages/Editor/JSEditor/JSEditorContextMenu.tsx index 1341754a9cfb..801b41e6ab2a 100644 --- a/app/client/src/pages/Editor/JSEditor/JSEditorContextMenu.tsx +++ b/app/client/src/pages/Editor/JSEditor/JSEditorContextMenu.tsx @@ -56,7 +56,7 @@ export function JSEditorContextMenu({ > - + {props.options.map((option) => ( { >