diff --git a/.github/config.json b/.github/config.json index 28c550304b10..d5e17dc2d4ef 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":"Branch protection","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}],"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}],"requires":1},"Performance Pod":{"conditions":[{"label":"Performance","type":"hasLabel","value":true},{"label":"Performance infra","type":"hasLabel","value":true}],"requires":1},"Git Platform Pod":{"conditions":[{"label":"Environments Product","type":"hasLabel","value":true},{"label":"Git Product","type":"hasLabel","value":true},{"label":"Artifact Platform Product","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},{"label":"Packages Product","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}],"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}}},"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"},"Branch protection":{"name":"Branch protection","description":"Issues related to using a protected branch on git","color":"ab511a"},"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":"446925"},"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":"857f58"},"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":"48883f","name":"Git Product","description":"Issues related to version control product"},"Git Platform Pod":{"name":"Git Platform Pod","description":"Issues related to the git & the app platform ","color":"48883f"},"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"}},"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}],"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}],"requires":1},"Performance Pod":{"conditions":[{"label":"Performance","type":"hasLabel","value":true},{"label":"Performance infra","type":"hasLabel","value":true}],"requires":1},"Git Platform Pod":{"conditions":[{"label":"Environments Product","type":"hasLabel","value":true},{"label":"Git Product","type":"hasLabel","value":true},{"label":"Artifact Platform Product","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},{"label":"Packages Product","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}],"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}}},"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":"446925"},"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":"857f58"},"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":"48883f","name":"Git Product","description":"Issues related to version control product"},"Git Platform Pod":{"name":"Git Platform Pod","description":"Issues related to the git & the app platform ","color":"48883f"},"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"}},"success":true} \ No newline at end of file diff --git a/.github/workflows/build-client-server-count.yml b/.github/workflows/build-client-server-count.yml index b2ad99cac36e..7f2210f32063 100644 --- a/.github/workflows/build-client-server-count.yml +++ b/.github/workflows/build-client-server-count.yml @@ -16,6 +16,7 @@ jobs: runId: ${{steps.args.outputs.runId}} matrix_count: ${{steps.matrix.outputs.matrix_count}} run_count: ${{ steps.countArgs.outputs.run_count }} + is-pg-build: ${{steps.args.outputs.is-pg-build}} steps: - name: Checkout the head commit of the branch uses: actions/checkout@v4 @@ -29,6 +30,7 @@ jobs: id: args run: | echo "pr=${{ github.event.client_payload.pull_request.number }}" >> $GITHUB_OUTPUT + echo "is-pg-build=${{ github.event.client_payload.pull_request.base.ref == 'pg' }}" >> $GITHUB_OUTPUT checkArg=${{ github.event.client_payload.slash_command.args.named.runId }} if [[ -z "$checkArg" ]]; then echo "runId=0" >> $GITHUB_OUTPUT @@ -106,6 +108,7 @@ jobs: with: pr: ${{fromJson(needs.file-check.outputs.pr)}} skip-tests: "true" + is-pg-build: ${{fromJson(needs.file-check.outputs.is-pg-build)}} client-build: name: client-build @@ -252,6 +255,18 @@ jobs: echo "$new_failed_spec_env" >> $GITHUB_ENV echo "EOF" >> $GITHUB_ENV + - name: Download the client build artifact + uses: actions/download-artifact@v4 + with: + name: cypress-repeat-logs + path: app/client + + - name: Read and Set File Content as ENV Variable + id: set-summary-content + run: | + summary_content=$(cat app/client/cy-repeat-summary.txt | tr '\n' ' ') + echo "summary_content=$summary_content" >> $GITHUB_ENV + - name: Add a comment on the PR with new CI failures if: needs.ci-test-limited.result != 'success' && needs.file-check.outputs.pr != '0' uses: peter-evans/create-or-update-comment@v3 @@ -262,6 +277,9 @@ jobs: Cypress dashboard: Click here! The following are new failures, please fix them before merging the PR: ${{env.new_failed_spec_env}} To know the list of identified flaky tests - Refer here + ``` + ${{ env.summary_content }} + ``` - name: Add a comment on the PR when ci-test-limited is success if: needs.ci-test-limited.result == 'success' && needs.file-check.outputs.pr != '0' @@ -272,6 +290,9 @@ jobs: Workflow run: <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}>. Cypress dashboard url: Click here! All cypress tests have passed 🎉🎉🎉 + ``` + ${{ env.summary_content }} + ``` - name: Check ci-test-limited set status if: needs.ci-test-limited.result != 'success' @@ -369,6 +390,19 @@ jobs: echo "new_failed_spec_env<> $GITHUB_ENV echo "$new_failed_spec_env" >> $GITHUB_ENV echo "EOF" >> $GITHUB_ENV + + - name: Download the client build artifact + uses: actions/download-artifact@v4 + with: + name: cypress-repeat-logs + path: app/client + + - name: Read and Set File Content as ENV Variable + id: set-summary-content + run: | + summary_content=$(cat app/client/cy-repeat-summary.txt | tr '\n' ' ') + echo "summary_content=$summary_content" >> $GITHUB_ENV + - name: Add a comment on the PR with new CI failures if: needs.ci-test-limited-existing-docker-image.result != 'success' && needs.file-check.outputs.pr != '0' @@ -380,6 +414,9 @@ jobs: Cypress dashboard: Click here! The following are new failures, please fix them before merging the PR: ${{env.new_failed_spec_env}} To know the list of identified flaky tests - Refer here + ``` + ${{ env.summary_content }} + ``` - name: Add a comment on the PR when ci-test-limited-existing-docker-image is success if: needs.ci-test-limited-existing-docker-image.result == 'success' && needs.file-check.outputs.pr != '0' @@ -390,7 +427,10 @@ jobs: Workflow run: <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}>. Cypress dashboard url: Click here! All cypress tests have passed 🎉🎉🎉 - + ``` + ${{ env.summary_content }} + ``` + - name: Check ci-test-limited-existing-docker-image set status if: needs.ci-test-limited-existing-docker-image.result != 'success' run: exit 1 \ No newline at end of file diff --git a/.github/workflows/build-client-server.yml b/.github/workflows/build-client-server.yml index 550758e0fcbd..b3191415e7da 100644 --- a/.github/workflows/build-client-server.yml +++ b/.github/workflows/build-client-server.yml @@ -14,6 +14,7 @@ jobs: pr: ${{steps.args.outputs.pr}} runId: ${{steps.args.outputs.runId}} matrix_count: ${{steps.matrix.outputs.matrix_count}} + is-pg-build: ${{steps.args.outputs.is-pg-build}} steps: - name: Checkout the head commit of the branch uses: actions/checkout@v4 @@ -27,6 +28,7 @@ jobs: id: args run: | echo "pr=${{ github.event.client_payload.pull_request.number }}" >> $GITHUB_OUTPUT + echo "is-pg-build=${{ github.event.client_payload.pull_request.base.ref == 'pg' }}" >> $GITHUB_OUTPUT checkArg=`echo '${{toJSON(github.event.client_payload.slash_command.args.named)}}' | jq 'has("runId")'` if [[ $checkArg == 'true' ]]; then echo "runId=${{ github.event.client_payload.slash_command.args.named.runId }}" >> $GITHUB_OUTPUT @@ -92,6 +94,7 @@ jobs: with: pr: ${{fromJson(needs.file-check.outputs.pr)}} skip-tests: "true" + is-pg-build: ${{fromJson(needs.file-check.outputs.is-pg-build)}} client-build: name: client-build diff --git a/.github/workflows/ci-test-limited-with-count.yml b/.github/workflows/ci-test-limited-with-count.yml index 8790ca231881..3399eaddb703 100644 --- a/.github/workflows/ci-test-limited-with-count.yml +++ b/.github/workflows/ci-test-limited-with-count.yml @@ -346,15 +346,29 @@ jobs: NODE_ENV: development run: | cd app/client - npx cypress-repeat run -n ${{ inputs.run_count }} --force \ + npx cypress-repeat-pro run -n ${{ inputs.run_count }} --force \ --spec ${{ env.specs_to_run }} \ - --config-file "cypress_ci_custom.config.ts" + --config-file "cypress_ci_custom.config.ts" + cat cy-repeat-summary.txt + # Check if "Total Failed: 0" is present + if ! grep -q "Total Failed: 0" cy-repeat-summary.txt; then + echo "Tests failed, failing the GitHub Action." + exit 1 # Fails the step if tests failed + fi - name: Trim number of cypress log files if: failure() run: | find ${{ github.workspace }}/app/client/cypress/cypress-logs -name '*.json' -type f | tail -n +11 | xargs -I {} rm -- {} + - name: Upload repeat-pro logs artifact + if: always() + uses: actions/upload-artifact@v4 + with: + name: cypress-repeat-logs + path: ${{ github.workspace }}/app/client/cy-repeat-summary.txt + overwrite: true + - name: Upload failed test cypress logs artifact if: failure() uses: actions/upload-artifact@v4 diff --git a/.github/workflows/sync-release-to-pg.yml b/.github/workflows/sync-release-to-pg.yml index b3a9c6ab3991..2e50073a07b1 100644 --- a/.github/workflows/sync-release-to-pg.yml +++ b/.github/workflows/sync-release-to-pg.yml @@ -14,9 +14,13 @@ jobs: uses: actions/checkout@v3 with: ref: release # Checkout the release branch + fetch-depth: 0 - - name: Fetch all branches - run: git fetch origin pg + - name: Set Git config values + run: | + git config pull.rebase false + git config user.email "automated@github.com" + git config user.name "Automated Github Action" - name: Checkout pg branch run: git checkout pg @@ -24,16 +28,12 @@ jobs: - name: Merge release to pg id: merge_commits run: | - PG_HEAD=$(git rev-parse pg) RELEASE_HEAD=$(git rev-parse release) echo "PG_HEAD=$PG_HEAD" echo "RELEASE_HEAD=$RELEASE_HEAD" - # Checkout the pg branch - git checkout pg - # Attempt to merge release into pg if ! git merge release; then echo "Merge conflict detected during merge" @@ -42,7 +42,6 @@ jobs: CONFLICTING_COMMIT=$(git log -1 --pretty=format:"%H") echo "CONFLICTING_COMMIT=$CONFLICTING_COMMIT" >> $GITHUB_ENV - git merge --abort echo "MERGE_CONFLICT=true" >> $GITHUB_ENV else echo "MERGE_CONFLICT=false" >> $GITHUB_ENV @@ -68,6 +67,8 @@ jobs: # This unwieldy horror of a sed command, converts standard Markdown links to Slack's unwieldy link syntax. slack_message="$(echo "$message" | sed -E 's/\[([^]]+)\]\(([^)]+)\)/<\2|\1>/g')" + echo "$slack_message" + # This is the ChannelId of the proj postgres channel. body="$(jq -nc \ --arg channel C06Q3A97USE \ diff --git a/.github/workflows/test-build-docker-image.yml b/.github/workflows/test-build-docker-image.yml index 2a874e3e5167..9384df2101e2 100644 --- a/.github/workflows/test-build-docker-image.yml +++ b/.github/workflows/test-build-docker-image.yml @@ -21,9 +21,9 @@ on: type: string default: latest - # trigger for pushes to master + # trigger for pushes to master and pg push: - branches: [master] + branches: [master, pg] paths: - "app/client/**" - "app/server/**" @@ -100,7 +100,7 @@ jobs: ci-test: needs: [setup, build-docker-image] # Only run if the build step is successful - if: success() && ( github.event_name != 'push' || github.ref == 'refs/heads/master' ) + if: success() && ( github.event_name != 'push' || github.ref == 'refs/heads/master' || github.ref == 'refs/heads/pg' ) name: ci-test uses: ./.github/workflows/ci-test-custom-script.yml secrets: inherit @@ -113,7 +113,7 @@ jobs: server-unit-tests: name: server-unit-tests needs: [build-docker-image] - if: success() && ( github.event_name != 'push' || github.ref == 'refs/heads/master' ) + if: success() && ( github.event_name != 'push' || github.ref == 'refs/heads/master' || github.ref == 'refs/heads/pg' ) uses: ./.github/workflows/server-build.yml secrets: inherit with: @@ -123,7 +123,7 @@ jobs: client-unit-tests: name: client-unit-tests needs: [build-docker-image] - if: success() && ( github.event_name != 'push' || github.ref == 'refs/heads/master' ) + if: success() && ( github.event_name != 'push' || github.ref == 'refs/heads/master' || github.ref == 'refs/heads/pg' ) uses: ./.github/workflows/client-unit-tests.yml secrets: inherit with: @@ -341,6 +341,12 @@ jobs: scripts/generate_info_json.sh fi + - name: Place server artifacts-es + run: | + if [[ -f scripts/prepare_server_artifacts.sh ]]; then + scripts/prepare_server_artifacts.sh + fi + - name: Set up Depot CLI uses: depot/setup-action@v1 @@ -362,7 +368,7 @@ jobs: APPSMITH_CLOUD_SERVICES_BASE_URL=https://release-cs.appsmith.com BASE=${{ vars.DOCKER_HUB_ORGANIZATION }}/base-${{ vars.EDITION }}:release tags: | - ${{ vars.DOCKER_HUB_ORGANIZATION }}/appsmith-${{ vars.EDITION }}:release + ${{ vars.DOCKER_HUB_ORGANIZATION }}/appsmith-${{ vars.EDITION }}:${{ github.ref_name }} package-master: needs: [ci-test, client-unit-tests, server-unit-tests] diff --git a/app/client/cypress/e2e/GSheet/AllAccess_Spec.ts b/app/client/cypress/e2e/GSheet/AllAccess_Spec.ts index 0f4ac2f2d2a1..aca3a5ab40df 100644 --- a/app/client/cypress/e2e/GSheet/AllAccess_Spec.ts +++ b/app/client/cypress/e2e/GSheet/AllAccess_Spec.ts @@ -15,7 +15,7 @@ const workspaceName = "gsheet apps"; const dataSourceName = "gsheet-all"; let appName = "gsheet-app"; let spreadSheetName = "test-sheet"; -describe( +describe.skip( "GSheet-Functional Tests With All Access", { tags: ["@tag.Datasource", "@tag.GSheet"] }, function () { diff --git a/app/client/cypress/e2e/GSheet/GsheetMisc_Spec.ts b/app/client/cypress/e2e/GSheet/GsheetMisc_Spec.ts index 479c3b65b52e..b54a27b257c2 100644 --- a/app/client/cypress/e2e/GSheet/GsheetMisc_Spec.ts +++ b/app/client/cypress/e2e/GSheet/GsheetMisc_Spec.ts @@ -21,7 +21,7 @@ const workspaceName = "gsheet apps"; const dataSourceName = "gsheet-all"; let appName = "gsheet-app"; let spreadSheetName = "test-sheet"; -describe( +describe.skip( "GSheet Miscellaneous Tests", { tags: ["@tag.Datasource", "@tag.GSheet"] }, function () { diff --git a/app/client/cypress/e2e/GSheet/ReadNWrite_Access_Spec.ts b/app/client/cypress/e2e/GSheet/ReadNWrite_Access_Spec.ts index 38bfcc82f85e..8d5a72c78b33 100644 --- a/app/client/cypress/e2e/GSheet/ReadNWrite_Access_Spec.ts +++ b/app/client/cypress/e2e/GSheet/ReadNWrite_Access_Spec.ts @@ -11,7 +11,7 @@ import { appSettings, } from "../../support/Objects/ObjectsCore"; -describe( +describe.skip( "GSheet-Functional Tests With Read/Write Access", { tags: ["@tag.Datasource", "@tag.GSheet"] }, function () { diff --git a/app/client/cypress/e2e/GSheet/ReadOnly_Access_Spec.ts b/app/client/cypress/e2e/GSheet/ReadOnly_Access_Spec.ts index 95ad0629d440..e90840f7d3ca 100644 --- a/app/client/cypress/e2e/GSheet/ReadOnly_Access_Spec.ts +++ b/app/client/cypress/e2e/GSheet/ReadOnly_Access_Spec.ts @@ -11,7 +11,7 @@ import { appSettings, } from "../../support/Objects/ObjectsCore"; -describe( +describe.skip( "GSheet-Functional Tests With Read Access", { tags: ["@tag.Datasource", "@tag.GSheet"] }, function () { diff --git a/app/client/cypress/e2e/GSheet/WidgetBinding_AllAccess_Spec.ts b/app/client/cypress/e2e/GSheet/WidgetBinding_AllAccess_Spec.ts index 1bf593992248..a3afbd77610c 100644 --- a/app/client/cypress/e2e/GSheet/WidgetBinding_AllAccess_Spec.ts +++ b/app/client/cypress/e2e/GSheet/WidgetBinding_AllAccess_Spec.ts @@ -21,7 +21,7 @@ const workspaceName = "gsheet apps"; const dataSourceName = "gsheet-all"; let appName = "gsheet-app"; let spreadSheetName = "test-sheet"; -describe( +describe.skip( "GSheet-widget binding", { tags: ["@tag.Datasource", "@tag.GSheet"] }, function () { diff --git a/app/client/cypress/e2e/Regression/ClientSide/ActionExecution/StoreValue_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/ActionExecution/StoreValue_spec.ts index 8ce32c6a015e..e13c374025a3 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/ActionExecution/StoreValue_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/ActionExecution/StoreValue_spec.ts @@ -238,7 +238,7 @@ describe("storeValue Action test", { tags: ["@tag.JS"] }, () => { }); agHelper.ClickButton("Test store logs"); - debuggerHelper.ClickDebuggerIcon(); + debuggerHelper.OpenDebugger(); debuggerHelper.ClickLogsTab(); debuggerHelper.changeLogsGroup("System logs"); debuggerHelper.DoesConsoleLogExist("storeValue('xyz', '123', true)"); diff --git a/app/client/cypress/e2e/Regression/ClientSide/BugTests/Bug29566_Spec.ts b/app/client/cypress/e2e/Regression/ClientSide/BugTests/Bug29566_Spec.ts deleted file mode 100644 index e4e8d6d378cf..000000000000 --- a/app/client/cypress/e2e/Regression/ClientSide/BugTests/Bug29566_Spec.ts +++ /dev/null @@ -1,114 +0,0 @@ -import largeJSONData from "../../../../fixtures/largeJSONData.json"; -import { - agHelper, - deployMode, - jsEditor, -} from "../../../../support/Objects/ObjectsCore"; - -describe("JS Function execution data mutation", function () { - before(() => { - agHelper.AddDsl("listwidgetData"); - }); - - it("1. List widget gets populated on page load", function () { - const APIJS = `export default { - - async runFetch(dataRequest) { - return fetch(dataRequest.url, dataRequest.config) - .then(response => { - return response.json(); - }).catch(error => { - showAlert('API error') - }); - }, - - async getConditionGroups() { - const dataRequest = { - url: "https://api.jsonbin.io/v3/b/656ed15d54105e766fd9ca52", - config: { - method: 'GET', - }, - name: 'getConditionGroups' - }; - return await this.runFetch(dataRequest); - }, - - async getConditionListData() { - const dataRequest = { - url: "https://api.jsonbin.io/v3/b/656ed18454105e766fd9ca6c", - config: { - method: 'GET', - }, - name: 'getConditionGroups' - }; - return await this.runFetch(dataRequest); - }, - - }`; - const PAGE1JS = `export default { - - conditionGroups: [], - allConditionGroups: [], - maxItemsOnPageMachineConditionGroups: 6, - startIndex_MCG: 0, - conditionGroupsToShow: [], - splittingDataOf_MCG_ToShowIntoThreeColumns: [[],[],[]], - selectedMachineConditionGroups: [], - - async getAllConditionGroupsData() { - const conditionGroups = await ApiJS.getConditionGroups()|| []; - this.conditionGroups = conditionGroups.record - console.log("conditionGroups ====> ",conditionGroups); - this.conditionGroups.filter((item) => { - this.allConditionGroups.push(item.conditionGroup); - }); - this.allConditionGroupsSplitedIntoThreeColumns() - }, - - allConditionGroupsSplitedIntoThreeColumns() { - let tmpCounter_MCG = 0; - for(let i = 0; i < this.maxItemsOnPageMachineConditionGroups; i++) { - this.conditionGroupsToShow.push([this.allConditionGroups[this.startIndex_MCG]]); - this.splittingDataOf_MCG_ToShowIntoThreeColumns[tmpCounter_MCG].push(this.allConditionGroups[this.startIndex_MCG]); - this.startIndex_MCG++; - tmpCounter_MCG === 2 ? tmpCounter_MCG = 0 : tmpCounter_MCG++; - } - }, - - setBgSelected_MCG(id) { - return this.selectedMachineConditionGroups.includes(id) ? '#0d9be2' : '#383838'; - }, - test(){ - this.splittingDataOf_MCG_ToShowIntoThreeColumns = [[],[],[]] - return this.splittingDataOf_MCG_ToShowIntoThreeColumns - } - - }`; - jsEditor.CreateJSObject(APIJS, { - paste: true, - completeReplace: true, - toRun: false, - shouldCreateNewJSObj: true, - prettify: false, - }); - jsEditor.RenameJSObjFromPane("ApiJS"); - cy.wait(5000); - - jsEditor.CreateJSObject(PAGE1JS, { - paste: true, - completeReplace: true, - toRun: false, - shouldCreateNewJSObj: true, - prettify: false, - }); - jsEditor.RenameJSObjFromPane("Page1JS"); - cy.wait(5000); - jsEditor.EnableDisableAsyncFuncSettings( - "getAllConditionGroupsData", - true, - false, - ); - deployMode.DeployApp(); - agHelper.AssertContains("MK Condition"); - }); -}); diff --git a/app/client/cypress/e2e/Regression/ClientSide/BugTests/InputTruncateCheck_Spec.ts b/app/client/cypress/e2e/Regression/ClientSide/BugTests/InputTruncateCheck_Spec.ts index df67f114d67a..d3c7ca26b1d4 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/BugTests/InputTruncateCheck_Spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/BugTests/InputTruncateCheck_Spec.ts @@ -11,6 +11,7 @@ import { draggableWidgets, fakerHelper, dataManager, + debuggerHelper, } from "../../../../support/Objects/ObjectsCore"; const widgetsToTest = { @@ -180,8 +181,18 @@ Object.entries(widgetsToTest).forEach(([widgetSelector, testConfig], index) => { agHelper.GetNClick(locators._widgetInputSelector(widgetSelector)); agHelper.PressDelete(); + //Since widget is removed & Button is still holding its reference + debuggerHelper.AssertDebugError( + `'${testConfig.widgetPrefixName}1' is not defined.`, + "", + true, + false, + ); + debuggerHelper.CloseBottomBar(); agHelper.GetNClick(getWidgetSelector(draggableWidgets.BUTTON)); - agHelper.AssertContains("is not defined"); //Since widget is removed & Button is still holding its reference + agHelper.ValidateToastMessage( + `${testConfig.widgetPrefixName}1 is not defined`, + ); agHelper.PressDelete(); agHelper.GetNClick(getWidgetSelector(draggableWidgets.TEXT)).click(); diff --git a/app/client/cypress/e2e/Regression/ClientSide/BugTests/ListWidgetOnPageLoad_Spec.ts b/app/client/cypress/e2e/Regression/ClientSide/BugTests/ListWidgetOnPageLoad_Spec.ts new file mode 100644 index 000000000000..4826088ab6d7 --- /dev/null +++ b/app/client/cypress/e2e/Regression/ClientSide/BugTests/ListWidgetOnPageLoad_Spec.ts @@ -0,0 +1,59 @@ +import { + agHelper, + dataSources, + deployMode, + locators, + propPane, +} from "../../../../support/Objects/ObjectsCore"; +import EditorNavigation, { + AppSidebar, + AppSidebarButton, + EntityType, + PageLeftPane, + PagePaneSegment, +} from "../../../../support/Pages/EditorNavigation"; + +describe( + "JS Function execution data mutation", + { tags: ["@tag.Widget", "@tag.List"] }, + function () { + before(() => { + agHelper.AddDsl("Listv2/simpleList"); + }); + + it("1. List widget gets populated on page load. Bug: 29566", function () { + dataSources.CreateDataSource("Postgres"); + cy.get("@dsName").then(() => { + dataSources.CreateQueryAfterDSSaved( + "SELECT id,name FROM public.users LIMIT 10;", + ); + dataSources.ToggleUsePreparedStatement(false); + dataSources.RunQuery(); + }); + AppSidebar.navigate(AppSidebarButton.Editor); + PageLeftPane.switchSegment(PagePaneSegment.UI); + EditorNavigation.SelectEntityByName("List1", EntityType.Widget); + propPane.UpdatePropertyFieldValue("Items", "{{Query1.data}}"); + propPane.TogglePropertyState("Server side pagination", "Off"); + propPane.SelectPropertiesDropDown("Data Identifier", "id"); + agHelper + .GetText(locators._widgetInCanvas("textwidget") + " span") + .then((initialTexts: string[]) => { + deployMode.DeployApp(); + agHelper.AssertElementLength(locators._textWidgetInDeployed, 6); + agHelper + .GetText(locators._textWidgetInDeployed) + .then((deployedTexts: string[]) => { + expect(deployedTexts).to.deep.equal(initialTexts); + }); + agHelper.CypressReload(); + agHelper.AssertElementLength(locators._textWidgetInDeployed, 6); + agHelper + .GetText(locators._textWidgetInDeployed) + .then((deployedTexts: string[]) => { + expect(deployedTexts).to.deep.equal(initialTexts); + }); + }); + }); + }, +); diff --git a/app/client/cypress/e2e/Regression/ClientSide/BugTests/Moment_Spec.ts b/app/client/cypress/e2e/Regression/ClientSide/BugTests/Moment_Spec.ts index 9cb9c89457fe..a17f26f09537 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/BugTests/Moment_Spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/BugTests/Moment_Spec.ts @@ -122,7 +122,7 @@ describe( deployMode.NavigateBacktoEditor(); //verify runAstros triggered on PageLaoad of Edit page! - debuggerHelper.ClickDebuggerIcon(); + debuggerHelper.OpenDebugger(); debuggerHelper.ClickLogsTab(); debuggerHelper.DebuggerLogsFilter("JSObject1.runAstros"); debuggerHelper.DoesConsoleLogExist("JS Function executed successfully"); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Debugger/Api_pane_navigation_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Debugger/Api_pane_navigation_spec.ts index d8d690583351..5bacf30fa3d1 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Debugger/Api_pane_navigation_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Debugger/Api_pane_navigation_spec.ts @@ -27,7 +27,7 @@ describe( apiPage.EnterHeader("test", "test"); debuggerHelper.AssertErrorCount(1); EditorNavigation.ShowCanvas(); - debuggerHelper.ClickDebuggerIcon(); + debuggerHelper.OpenDebugger(); debuggerHelper.ClicklogEntityLink(); agHelper.AssertElementVisibility(apiPage._nextCursorValue); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Debugger/JSObjects_navigation_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Debugger/JSObjects_navigation_spec.ts index 0446d7cb696a..6d00f9aecd6d 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Debugger/JSObjects_navigation_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Debugger/JSObjects_navigation_spec.ts @@ -30,7 +30,7 @@ describe("JSObjects", () => { shouldCreateNewJSObj: true, }); - debuggerHelper.ClickDebuggerIcon(); + debuggerHelper.OpenDebugger(); debuggerHelper.ClicklogEntityLink(); agHelper.AssertCursorInput(".js-editor", { ch: 20, line: 6 }); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Debugger/Query_pane_navigation.ts b/app/client/cypress/e2e/Regression/ClientSide/Debugger/Query_pane_navigation.ts index 4dc7732fb30c..5ba9fa87bc5f 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Debugger/Query_pane_navigation.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Debugger/Query_pane_navigation.ts @@ -66,8 +66,7 @@ describe( ); debuggerHelper.AssertErrorCount(2); - debuggerHelper.ClickDebuggerIcon(); - debuggerHelper.ClicklogEntityLink(); + debuggerHelper.OpenDebugger(); agHelper.AssertElementVisibility( ".t--actionConfiguration\\.formData\\.limitDocuments\\.data", ); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Debugger/Widget_property_navigation_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Debugger/Widget_property_navigation_spec.ts index 1f9699579c2c..30a27209444a 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Debugger/Widget_property_navigation_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Debugger/Widget_property_navigation_spec.ts @@ -14,7 +14,7 @@ describe( _.debuggerHelper.AssertErrorCount(1); _.propPane.ToggleSection("general"); _.agHelper.AssertElementAbsence("animateloading"); - _.debuggerHelper.ClickDebuggerIcon(); + _.debuggerHelper.OpenDebugger(); _.debuggerHelper.ClicklogEntityLink(); _.propPane.AssertIfPropertyIsVisible("animateloading"); @@ -28,7 +28,7 @@ describe( _.propPane.EnterJSContext("visible", "{{test}}", true, false); _.debuggerHelper.AssertErrorCount(1); _.propPane.NavigateBackToPropertyPane(); - _.debuggerHelper.ClickDebuggerIcon(); + _.debuggerHelper.OpenDebugger(); _.debuggerHelper.ClicklogEntityLink(); _.agHelper.GetNAssertContains(_.propPane._paneTitle, "Tab 2"); _.propPane.AssertIfPropertyIsVisible("visible"); @@ -48,7 +48,7 @@ describe( _.debuggerHelper.AssertErrorCount(1); _.propPane.NavigateBackToPropertyPane(false); _.propPane.NavigateBackToPropertyPane(); - _.debuggerHelper.ClickDebuggerIcon(); + _.debuggerHelper.OpenDebugger(); _.debuggerHelper.ClicklogEntityLink(); _.agHelper.GetNAssertContains(_.propPane._paneTitle, "Menu Item"); _.propPane.AssertIfPropertyIsVisible("icon"); @@ -65,7 +65,7 @@ describe( _.propPane.MoveToTab("Style"); _.debuggerHelper.AssertErrorCount(1); _.propPane.NavigateBackToPropertyPane(); - _.debuggerHelper.ClickDebuggerIcon(); + _.debuggerHelper.OpenDebugger(); _.debuggerHelper.ClicklogEntityLink(); _.agHelper.GetNAssertContains(_.propPane._paneTitle, "Second Menu Item"); _.propPane.AssertIfPropertyIsVisible("disabled"); @@ -110,7 +110,7 @@ describe( _.propPane.NavigateBackToPropertyPane(false); _.propPane.NavigateBackToPropertyPane(); - _.debuggerHelper.ClickDebuggerIcon(); + _.debuggerHelper.OpenDebugger(); _.debuggerHelper.ClicklogEntityLink(); _.agHelper.GetNAssertContains(_.propPane._paneTitle, "Custom Field 2"); _.propPane.AssertIfPropertyIsVisible("borderradius"); @@ -133,7 +133,7 @@ describe( _.propPane.EnterJSContext("disabled", "{{test}}", true, false); _.debuggerHelper.AssertErrorCount(2); - _.debuggerHelper.ClickDebuggerIcon(); + _.debuggerHelper.OpenDebugger(); _.debuggerHelper.ClicklogEntityLink(true); _.agHelper.GetNAssertContains(_.propPane._paneTitle, "First Menu Item"); _.debuggerHelper.CloseBottomBar(); @@ -173,7 +173,7 @@ describe( _.propPane.ToggleSection("validation"); _.propPane.NavigateBackToPropertyPane(); - _.debuggerHelper.ClickDebuggerIcon(); + _.debuggerHelper.OpenDebugger(); _.debuggerHelper.ClicklogEntityLink(); _.agHelper.GetNAssertContains(_.propPane._paneTitle, "imdb_id"); _.debuggerHelper.CloseBottomBar(); diff --git a/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Pages_spec.js b/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Pages_spec.js index ed8b4056207f..cf1d77b9dd19 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Pages_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Pages_spec.js @@ -3,9 +3,6 @@ import EditorNavigation, { EntityType, } from "../../../../support/Pages/EditorNavigation"; import PageList from "../../../../support/Pages/PageList"; -const locators = { - errorPageTitle: ".t--error-page-title", -}; describe("Pages", { tags: ["@tag.IDE"] }, function () { let veryLongPageName = `abcdefghijklmnopqrstuvwxyz1234`; @@ -36,7 +33,7 @@ describe("Pages", { tags: ["@tag.IDE"] }, function () { EditorNavigation.SelectEntityByName("Page1 Copy", EntityType.Page); //Checks if 404 is showing correct route cy.visit("/route-that-does-not-exist"); - cy.get(locators.errorPageTitle).should(($x) => { + cy.get(_.locators.errorPageTitle).should(($x) => { expect($x).contain(Cypress.env("MESSAGES").PAGE_NOT_FOUND()); }); }); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Git/GitAutocommit_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Git/GitAutocommit_spec.ts new file mode 100644 index 000000000000..fbc7b921c5a3 --- /dev/null +++ b/app/client/cypress/e2e/Regression/ClientSide/Git/GitAutocommit_spec.ts @@ -0,0 +1,57 @@ +import ReconnectLocators from "../../../../locators/ReconnectLocators"; +import { featureFlagIntercept } from "../../../../support/Objects/FeatureFlags"; +import { + agHelper, + gitSync, + homePage, +} from "../../../../support/Objects/ObjectsCore"; + +let wsName: string; +let repoName: string = "TED-testrepo1"; + +describe( + "Git Autocommit", + { tags: ["@tag.Git", "@tag.GitAutocommit"] }, + function () { + it("Check if autocommit progress bar is visible and network requests are properly called", function () { + featureFlagIntercept({ + release_git_autocommit_feature_enabled: true, + }); + agHelper.GenerateUUID(); + cy.get("@guid").then((uid) => { + wsName = "GitAC-" + uid; + homePage.CreateNewWorkspace(wsName, true); + + cy.intercept({ + method: "POST", + url: "/api/v1/git/auto-commit/app/*", + }).as("gitAutocommitTriggerApi"); + + cy.intercept( + { + method: "GET", + url: "/api/v1/git/auto-commit/progress/app/*", + }, + (req) => { + req.on("response", (res) => { + res.setDelay(500); + }); + }, + ).as("gitAutocommitProgressApi"); + + gitSync.ImportAppFromGit(wsName, repoName); + agHelper.GetNClick(ReconnectLocators.SkipToAppBtn); + cy.wait("@gitAutocommitTriggerApi").then((interception) => { + expect(interception?.response?.statusCode).to.equal(200); + expect( + interception?.response?.body?.data?.autoCommitResponse, + ).to.equal("PUBLISHED"); + agHelper.WaitUntilEleAppear(gitSync._autocommitStatusbar); + }); + cy.wait("@gitAutocommitProgressApi").then((interceptions) => { + expect(interceptions?.response?.statusCode).to.equal(200); + }); + }); + }); + }, +); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Git/GitSync/GitBranchProtect_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Git/GitSync/GitBranchProtect_spec.ts index 92c3858ea3e2..6a27f57bb7b1 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Git/GitSync/GitBranchProtect_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Git/GitSync/GitBranchProtect_spec.ts @@ -36,10 +36,7 @@ describe("Git Branch Protection", { tags: ["@tag.Git"] }, function () { cy.wait("@gitProtectApi").then((res1) => { _.agHelper.GetNClick(_.gitSync._closeGitSettingsModal); expect(res1.response).to.have.property("statusCode", 200); - _.agHelper.AssertElementVisibility( - AppSidebar.locators.sidebar, - false, - ); + _.agHelper.AssertElementAbsence(AppSidebar.locators.sidebar); _.agHelper.AssertElementVisibility( PageLeftPane.locators.selector, false, diff --git a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/EntityBottomBar_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/EntityBottomBar_spec.ts index fae97f66f8e2..23d9464dffc1 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/EntityBottomBar_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/EntityBottomBar_spec.ts @@ -7,7 +7,7 @@ describe("Entity bottom bar", { tags: ["@tag.IDE"] }, () => { //Verify if bottom bar is closed. _.debuggerHelper.AssertClosed(); //verify if bottom bar is open on clicking debugger icon in canvas. - _.debuggerHelper.ClickDebuggerIcon(); + _.debuggerHelper.OpenDebugger(); _.debuggerHelper.AssertOpen(PageType.Canvas); //Verify if selected tab is errors in tab title. _.debuggerHelper.AssertSelectedTab( @@ -48,7 +48,7 @@ describe("Entity bottom bar", { tags: ["@tag.IDE"] }, () => { //Verify that the errors tab is still closed. _.debuggerHelper.AssertClosed(); //Verify if bottom bar opens on clicking debugger icon in api page. - _.debuggerHelper.ClickDebuggerIcon(); + _.debuggerHelper.OpenDebugger(); _.debuggerHelper.AssertOpen(PageType.API); //Verify if selected tab is errors in tab title. _.debuggerHelper.AssertSelectedTab( @@ -70,7 +70,7 @@ describe("Entity bottom bar", { tags: ["@tag.IDE"] }, () => { //Expecting errors tab to be closed as this is now a datasource _.debuggerHelper.AssertClosed(); //Verify if bottom bar opens on clicking debugger icon in datasource page. - _.debuggerHelper.ClickDebuggerIcon(); + _.debuggerHelper.OpenDebugger(); _.debuggerHelper.AssertOpen(PageType.DataSources); }); @@ -91,7 +91,7 @@ describe("Entity bottom bar", { tags: ["@tag.IDE"] }, () => { _.debuggerHelper.AssertClosed(); //Verify if bottom bar opens on clicking debugger icon in query page. _.dataSources.CreateQueryAfterDSSaved(); - _.debuggerHelper.ClickDebuggerIcon(); + _.debuggerHelper.OpenDebugger(); _.debuggerHelper.AssertOpen(PageType.Query); //Verify if bottom bar is closed on clicking close icon in query page. _.debuggerHelper.CloseBottomBar(); @@ -130,7 +130,7 @@ describe("Entity bottom bar", { tags: ["@tag.IDE"] }, () => { _.debuggerHelper.AssertClosed(); //Verify if bottom bar opens on clicking debugger icon in query page. _.dataSources.CreateQueryAfterDSSaved(); - _.debuggerHelper.ClickDebuggerIcon(); + _.debuggerHelper.OpenDebugger(); _.debuggerHelper.AssertOpen(PageType.Query); //Verify if bottom bar is closed on clicking close icon in query page. _.debuggerHelper.CloseBottomBar(); diff --git a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/ErrorMessages_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/ErrorMessages_spec.ts index c0e974e15a03..6bc10f52d431 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/ErrorMessages_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/ErrorMessages_spec.ts @@ -33,13 +33,21 @@ describe("Sanitise toast error messages", () => { EditorNavigation.SelectEntityByName("Button1", EntityType.Widget); _.propPane.EnterJSContext("onClick", "{{a.kjbfjdfbkds()}}"); _.agHelper.ClickButton("Submit"); - _.agHelper.WaitUntilToastDisappear("a is not defined"); + _.debuggerHelper.AssertDebugError("'a' is not defined.", "", true, false); }); it("2. Does not show type error label when js obj function does not exist", () => { EditorNavigation.SelectEntityByName("Button1", EntityType.Widget); _.propPane.EnterJSContext("onClick", "{{JSObject1.myFun1efef()}}"); + // Assert the lint error that shows up + _.debuggerHelper.AssertDebugError( + `"myFun1efef" doesn't exist in JSObject1`, + "", + false, + false, + ); _.agHelper.ClickButton("Submit"); + // Assert the execution error that shows up _.agHelper.WaitUntilToastDisappear("Object1.myFun1efef is not a function"); }); diff --git a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Inspect_Element_spec.js b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Inspect_Element_spec.js index ca9ba9a553fc..b4f51bc7282f 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Inspect_Element_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Inspect_Element_spec.js @@ -7,7 +7,7 @@ describe("Inspect Entity", function () { it("1. Check whether depedencies and references are shown correctly", function () { cy.openPropertyPane("inputwidgetv2"); cy.testJsontext("defaultvalue", "{{Button1.text}}"); - _.agHelper.GetNClick(".t--debugger-count"); + _.debuggerHelper.OpenDebugger(); cy.contains(".ads-v2-tabs__list-tab", "Inspect entity").click(); cy.contains(".t--dependencies-item", "Button1").click(); cy.contains(".t--dependencies-item", "Input1"); diff --git a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Logs1_spec.js b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Logs1_spec.js index a3e7ffa11e78..42b84b43474b 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Logs1_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Logs1_spec.js @@ -1,5 +1,3 @@ -import commonlocators from "../../../../locators/commonlocators.json"; -import { homePage } from "../../../../support/Objects/ObjectsCore"; import { ObjectsRegistry } from "../../../../support/Objects/Registry"; import EditorNavigation, { EntityType, @@ -26,18 +24,18 @@ describe("Debugger logs", function () { logString = generateTestLogString(); }); - it("3. Console log on button click with normal moustache binding", function () { + it("1. Console log on button click with normal moustache binding", function () { ee.DragDropWidgetNVerify("buttonwidget", 200, 200); // Testing with normal log in moustache binding propPane.EnterJSContext("onClick", `{{console.log("${logString}")}}`); agHelper.Sleep(2000); agHelper.ClickButton("Submit"); - debuggerHelper.ClickDebuggerIcon(); + debuggerHelper.OpenDebugger(); agHelper.GetNClick(jsEditor._logsTab); debuggerHelper.DoesConsoleLogExist(logString); }); - it("4. Console log on button click with arrow function IIFE", function () { + it("2. Console log on button click with arrow function IIFE", function () { debuggerHelper.ClearLogs(); EditorNavigation.SelectEntityByName("Button1", EntityType.Widget); // Testing with normal log in iifee @@ -51,7 +49,7 @@ describe("Debugger logs", function () { debuggerHelper.DoesConsoleLogExist(logString); }); - it("5. Console log on button click with function keyword IIFE", function () { + it("3. Console log on button click with function keyword IIFE", function () { debuggerHelper.ClearLogs(); EditorNavigation.SelectEntityByName("Button1", EntityType.Widget); // Testing with normal log in iifee @@ -65,7 +63,7 @@ describe("Debugger logs", function () { debuggerHelper.DoesConsoleLogExist(logString); }); - it("6. Console log on button click with async function IIFE", function () { + it("4. Console log on button click with async function IIFE", function () { debuggerHelper.ClearLogs(); // Testing with normal log in iifee EditorNavigation.SelectEntityByName("Button1", EntityType.Widget); @@ -79,7 +77,7 @@ describe("Debugger logs", function () { debuggerHelper.DoesConsoleLogExist(logString); }); - it("7. Console log on button click with mixed function IIFE", function () { + it("5. Console log on button click with mixed function IIFE", function () { debuggerHelper.ClearLogs(); // Testing with normal log in iifee EditorNavigation.SelectEntityByName("Button1", EntityType.Widget); @@ -96,7 +94,7 @@ describe("Debugger logs", function () { debuggerHelper.DoesConsoleLogExist(logStringChild); }); - it("8. Console log grouping on button click", function () { + it("6. Console log grouping on button click", function () { debuggerHelper.ClearLogs(); // Testing with normal log in iifee EditorNavigation.SelectEntityByName("Button1", EntityType.Widget); @@ -116,7 +114,7 @@ describe("Debugger logs", function () { debuggerHelper.AssertConsecutiveConsoleLogCount(5); }); - it("9. Console log grouping on button click with different log in between", function () { + it("7. Console log grouping on button click with different log in between", function () { debuggerHelper.ClearLogs(); // Testing with normal log in iifee EditorNavigation.SelectEntityByName("Button1", EntityType.Widget); @@ -135,7 +133,7 @@ describe("Debugger logs", function () { debuggerHelper.AssertConsecutiveConsoleLogCount(2); }); - it("10. Console log grouping on button click from different source", function () { + it("8. Console log grouping on button click from different source", function () { debuggerHelper.ClearLogs(); // Testing with normal log in iifee EditorNavigation.SelectEntityByName("Button1", EntityType.Widget); 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 84207474a4c8..fa3358209b5d 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Logs2_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Logs2_spec.js @@ -34,7 +34,7 @@ describe("Debugger logs", { tags: ["@tag.IDE"] }, function () { _.agHelper.RefreshPage(); // Wait for the debugger icon to be visible _.agHelper.AssertElementVisibility(".t--debugger-count"); - _.debuggerHelper.ClickDebuggerIcon(); + _.debuggerHelper.OpenDebugger(); _.agHelper.GetNClick(_.jsEditor._logsTab); _.debuggerHelper.DoesConsoleLogExist(logString); }); @@ -286,7 +286,7 @@ describe("Debugger logs", { tags: ["@tag.IDE"] }, function () { EditorNavigation.SelectEntityByName("Page1", EntityType.Page); _.agHelper.AssertElementVisibility(".t--debugger-count"); - _.debuggerHelper.ClickDebuggerIcon(); + _.debuggerHelper.OpenDebugger(); _.debuggerHelper.ClicklogEntityLink(); diff --git a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Widget_Error_spec.js b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Widget_Error_spec.js index ae53291a32a1..5b35f24d7960 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Widget_Error_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Widget_Error_spec.js @@ -23,7 +23,7 @@ describe("Widget error state", function () { //Check if the current value is shown in the debugger - _.debuggerHelper.ClickDebuggerIcon(); + _.debuggerHelper.OpenDebugger(); cy.get("[data-testid=t--tab-ERROR]").click(); //This feature is disabled in updated error log - epic 17720 // _.debuggerHelper.LogStateContains("Test"); @@ -44,8 +44,8 @@ describe("Widget error state", function () { ); // All errors should be expanded by default - //Updated count to 1 as the decision not to show triggerexecution/uncaughtpromise error in - epic 17720 - _.debuggerHelper.AssertVisibleErrorMessagesCount(1); + //Updated count to 2 as the decision to show the widget trigger lint errors to show in the debugger + _.debuggerHelper.AssertVisibleErrorMessagesCount(2); // Recent errors are shown at the top of the list cy.testJsontext("label", "{{[]}}"); @@ -63,7 +63,7 @@ describe("Widget error state", function () { cy.deleteWidget(); _.debuggerHelper.AssertVisibleErrorMessagesCount(0); cy.get("body").type(`{${modifierKey}}z`); - _.debuggerHelper.AssertVisibleErrorMessagesCount(2); + _.debuggerHelper.AssertVisibleErrorMessagesCount(3); //Bug-2760: Error log on a widget property not clearing out when the widget property is deleted _.entityExplorer.DragDropWidgetNVerify(WIDGET.TABLE, 150, 300); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Templates/Fork_Template_To_App_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Templates/Fork_Template_To_App_spec.ts index 2838e49a8674..46bd1a99a335 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Templates/Fork_Template_To_App_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Templates/Fork_Template_To_App_spec.ts @@ -15,17 +15,14 @@ describe( it("1. Fork a template to the current app + Bug 17477", () => { PageList.AddNewPage("Add page from template"); agHelper.AssertElementVisibility(template.templateDialogBox); - agHelper.GetNClick("//h1[text()='Applicant Tracker-test']"); + agHelper.GetNClick(template.templateCard, 0, true); agHelper.FailIfErrorToast("INTERNAL_SERVER_ERROR"); agHelper.GetNClick(template.templateViewForkButton); agHelper.WaitUntilToastDisappear("template added successfully"); assertHelper.AssertNetworkStatus("updateLayout"); - // [Bug]: Getting 'Resource not found' error on deploying template #17477 + PageList.AddNewPage("Generate page with data"); deployMode.DeployApp(); - agHelper.GetNClickByContains( - ".t--page-switch-tab", - "1 Track Applications", - ); + agHelper.GetNClick(locators._deployedPage, 0, true); deployMode.NavigateBacktoEditor(); homePage.NavigateToHome(); agHelper.WaitUntilAllToastsDisappear(); @@ -35,14 +32,13 @@ describe( homePage.CreateNewApplication(); PageList.AddNewPage("Add page from template"); agHelper.AssertElementVisibility(template.templateDialogBox); - agHelper.GetNClick("//h1[text()='Applicant Tracker-test']"); + agHelper.GetNClick(template.templateCard, 0, true); agHelper.FailIfErrorToast( "Internal server error while processing request", ); assertHelper.AssertNetworkStatus("getTemplatePages"); agHelper.CheckUncheck(template.selectAllPages, false); agHelper.GetNClick(template.selectCheckbox, 1); - // [Bug]: On forking selected pages from a template, resource not found error is shown #17270 agHelper.GetNClick(template.templateViewForkButton); agHelper.AssertElementAbsence( locators._visibleTextSpan("Setting up the template"), diff --git a/app/client/cypress/e2e/Regression/ClientSide/ThemingTests/Theme_MultiSelectWidget_spec.js b/app/client/cypress/e2e/Regression/ClientSide/ThemingTests/Theme_MultiSelectWidget_spec.js index ecf774670d18..0f149cf2179a 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/ThemingTests/Theme_MultiSelectWidget_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/ThemingTests/Theme_MultiSelectWidget_spec.js @@ -1,6 +1,7 @@ const commonlocators = require("../../../../locators/commonlocators.json"); const themelocator = require("../../../../locators/ThemeLocators.json"); +import { multiSelectWidgetLocators } from "../../../../locators/WidgetLocators"; import { agHelper, locators, @@ -26,49 +27,19 @@ describe( agHelper.GetNClick(locators._canvas); appSettings.OpenAppSettings(); appSettings.GoToThemeSettings(); - //Border validation - //cy.contains("Border").click({ force: true }); - cy.get(themelocator.border).should("have.length", "3"); - cy.borderMouseover(0, "none"); - cy.borderMouseover(1, "M"); - cy.borderMouseover(2, "L"); - cy.get(themelocator.border).eq(1).click({ force: true }); - cy.wait("@updateTheme").should( - "have.nested.property", - "response.body.responseMeta.status", - 200, - ); - cy.wait(1000); - cy.contains("Border").click({ force: true }); - - //Shadow validation - //cy.contains("Shadow").click({ force: true }); - cy.wait(2000); - cy.xpath(theme.locators._boxShadow("L")).click({ force: true }); - cy.wait("@updateTheme").should( - "have.nested.property", - "response.body.responseMeta.status", - 200, - ); - cy.wait(1000); - cy.contains("Shadow").click({ force: true }); - //Font cy.xpath( "//p[text()='App font']/following-sibling::section//div//input", ).then(($elem) => { - cy.get($elem).click({ force: true }); - cy.wait(250); - cy.fixture("fontData").then(function (testdata) { - this.testdata = testdata; - }); + agHelper.GetNClick($elem); - cy.get(themelocator.fontsSelected) - //.eq(10) + agHelper + .GetElement(themelocator.fontsSelected) .should("contain.text", "Nunito Sans"); - cy.get(".rc-virtual-list .rc-select-item-option") - .find(".leading-normal") + agHelper + .GetElement(themelocator.fontOption) + .find(themelocator.fontsSelected) .eq(3) .then(($childElem) => { cy.get($childElem).click({ force: true }); @@ -80,60 +51,46 @@ describe( themeFont = `Inter, sans-serif`; }); }); - cy.contains("Font").click({ force: true }); - //Color - Bug 23501 - hence skipping - // cy.wait(1000); - // theme.ChangeThemeColor("purple", "Primary"); - // cy.get(themelocator.inputColor).should("have.value", "purple"); - // cy.wait(1000); + cy.contains("Font").click({ force: true }); - // theme.ChangeThemeColor("brown", "Background"); - // cy.get(themelocator.inputColor).should("have.value", "brown"); - // cy.wait(1000); - // cy.contains("Color").click({ force: true }); appSettings.ClosePane(); }); - //Skipping due to mentioned bug - it.skip("2. Publish the App and validate Font across the app + Bug 15007", function () { + it("2. Publish the App and validate Font across the app", function () { deployMode.DeployApp(); - cy.get(".rc-select-selection-item > .rc-select-selection-item-content") + agHelper + .GetElement( + multiSelectWidgetLocators.multiSelectWidgetSelectedOptionContent, + ) .first() .should("have.css", "font-family", themeFont); - cy.get(".rc-select-selection-item > .rc-select-selection-item-content") + agHelper + .GetElement( + multiSelectWidgetLocators.multiSelectWidgetSelectedOptionContent, + ) .last() .should("have.css", "font-family", themeFont); deployMode.NavigateBacktoEditor(); }); - it.skip("3. Validate current theme feature", function () { - cy.get("#canvas-selection-0").click({ force: true }); + it("3. Apply theme and validate the color", function () { appSettings.OpenAppSettings(); appSettings.GoToThemeSettings(); - //Change the Theme - cy.get(commonlocators.changeThemeBtn).click({ force: true }); - cy.get(themelocator.currentTheme).click({ force: true }); - cy.get(".t--theme-card main > main") - .first() - .invoke("css", "background-color") - .then(() => { - cy.get(".t--draggable-multiselectwidgetv2:contains('more')") - .last() - .invoke("css", "background-color") - .then((selectedBackgroudColor) => { - expect("rgba(0, 0, 0, 0)").to.equal(selectedBackgroudColor); - appSettings.ClosePane(); - }); - }); + agHelper.GetNClick(commonlocators.changeThemeBtn, 0, true); + agHelper.GetNClick( + `${themelocator.featuredThemeSection} [data-testid='t--theme-card-Sunrise']`, + ); - //Publish the App and validate change of Theme across the app in publish mode deployMode.DeployApp(); - cy.xpath("//div[@id='root']//section/parent::div").should( - "have.css", - "background-color", - "rgb(165, 42, 42)", - ); + + agHelper.GetNClick(multiSelectWidgetLocators.multiSelectWidgetTrigger); + agHelper + .GetElement( + multiSelectWidgetLocators.multiSelectWidgetDropdownOptionCheckbox, + ) + .first() + .should("have.css", "background-color", "rgb(239, 68, 68)"); }); }, ); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/Button/ButtonLintErrorValidation_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Button/ButtonLintErrorValidation_spec.js index c65da1768296..93bcb3dbd81d 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/Button/ButtonLintErrorValidation_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Button/ButtonLintErrorValidation_spec.js @@ -43,13 +43,7 @@ describe( .should("be.visible") .contains("'lintError' is not defined."); - cy.get(commonlocators.debugger) - .should("be.visible") - .click({ force: true }); - - cy.get(commonlocators.errorTab) - .should("be.visible") - .click({ force: true }); + _.debuggerHelper.OpenDebugger(); cy.get(commonlocators.debugErrorMsg).should("have.length", 3); }); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/Checkbox/CheckboxGroup2_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Checkbox/CheckboxGroup2_spec.js index cbdab81e2ce3..10c00970efb8 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/Checkbox/CheckboxGroup2_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Checkbox/CheckboxGroup2_spec.js @@ -77,8 +77,6 @@ describe( it("3. handleSelectAllChange: unchecked", function () { const selectAllSelector = formWidgetsPage.selectAllCheckboxControl; const uncheckedOptionInputs = `${formWidgetsPage.checkboxGroupOptionInputs} input:not(:checked)`; - // Deselect all - cy.get(selectAllSelector).click(); // Should get 2 unchecked option inputs cy.get(uncheckedOptionInputs).should("have.length", 2); //handleSelectAllChange: checked", function () { diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/List/ListWidgetLintErrorValidation.js b/app/client/cypress/e2e/Regression/ClientSide/Widgets/List/ListWidgetLintErrorValidation.js index 60b164133a0a..87c5d382fdd9 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/List/ListWidgetLintErrorValidation.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/List/ListWidgetLintErrorValidation.js @@ -43,13 +43,7 @@ describe( .should("be.visible") .contains("'DATA' is not defined."); - cy.get(commonlocators.debugger) - .should("be.visible") - .click({ force: true }); - - cy.get(commonlocators.errorTab) - .should("be.visible") - .click({ force: true }); + _.debuggerHelper.OpenDebugger(); cy.get(commonlocators.debugErrorMsg).should("have.length", 6); }); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/Childwigets/List_Select_Widgets_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/Childwigets/List_Select_Widgets_spec.js index 88681abef13e..d734b16281c0 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/Childwigets/List_Select_Widgets_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/Childwigets/List_Select_Widgets_spec.js @@ -149,12 +149,7 @@ describe("Select Widgets", { tags: ["@tag.Widget", "@tag.List"] }, function () { .first() .should("have.text", `undefined_undefined_true_false`); - cy.get(`${widgetSelectorByType("selectwidget")} .cancel-icon`).click({ - force: true, - }); - cy.get(`${widgetSelector("Select_Widget")} ${commonlocators.bodyTextStyle}`) - .first() - .should("have.text", `__true_false`); + cy.get(_.locators._selectClearButton_dataTestId).should("not.exist"); }); it("3. Select Widgets onOptionChange", function () { diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/DataIdentifier_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/DataIdentifier_spec.ts index d0f15f8e521b..1d64e70592b6 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/DataIdentifier_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/DataIdentifier_spec.ts @@ -91,10 +91,11 @@ describe( 1, ); //Open debugger by clicking debugger icon in canvas. - debuggerHelper.ClickDebuggerIcon(); - agHelper.GetNAssertContains( - debuggerHelper.locators._debuggerList, + debuggerHelper.AssertDebugError( "This data identifier is evaluating to a duplicate value. Please use an identifier that evaluates to a unique value.", + "", + true, + false, ); }); }, diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/ListV2_NestedList_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/ListV2_NestedList_spec.ts index 2ce68154fbc8..594f05b44743 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/ListV2_NestedList_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/ListV2_NestedList_spec.ts @@ -9,6 +9,7 @@ import { import EditorNavigation, { EntityType, } from "../../../../../support/Pages/EditorNavigation"; +import * as _ from "../../../../../support/Objects/ObjectsCore"; describe( "Nested List widget V2 ", @@ -40,8 +41,11 @@ describe( "List3", ]); agHelper.GetElement("body").type(`{${agHelper._modifierKey}}{v}`); - agHelper.ValidateToastMessage( + _.debuggerHelper.OpenDebugger(); + _.debuggerHelper.ClickLogsTab(); + _.debuggerHelper.DoesConsoleLogExist( "Cannot have more than 3 levels of nesting in the list widget", + true, ); }); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/ListV2_nested_List_widget_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/ListV2_nested_List_widget_spec.js index 6c42b5af52d1..4d6a2525baa6 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/ListV2_nested_List_widget_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/ListV2_nested_List_widget_spec.js @@ -6,9 +6,11 @@ const commonlocators = require("../../../../../locators/commonlocators.json"); import { agHelper, assertHelper, + debuggerHelper, entityExplorer, propPane, } from "../../../../../support/Objects/ObjectsCore"; +import * as _ from "../../../../../support/Objects/ObjectsCore"; const widgetsPage = require("../../../../../locators/Widgets.json"); const widgetSelector = (name) => `[data-widgetname-cy="${name}"]`; @@ -72,7 +74,12 @@ describe( .type(`{${modifierKey}}{v}`); cy.wait(500); - cy.validateToastMessage("Cannot have more than 3 levels of nesting"); + _.debuggerHelper.OpenDebugger(); + _.debuggerHelper.ClickLogsTab(); + _.debuggerHelper.DoesConsoleLogExist( + "Cannot have more than 3 levels of nesting", + true, + ); cy.get(`${widgetSelector("List2Copy1")}`).should("not.exist"); }); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/Listv2_BasicClientSideData_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/Listv2_BasicClientSideData_spec.js index b35dc5683c7c..f6c14c63db3c 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/Listv2_BasicClientSideData_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/Listv2_BasicClientSideData_spec.js @@ -42,14 +42,19 @@ describe( _.debuggerHelper.AssertErrorCount(0); }); - it("2. shows correct number of items", () => { - _.agHelper.AddDsl("Listv2/simpleList"); + it("2. test delete of list widget without errors", () => { + cy.get(commonlocators.deleteWidget).click({ force: true }); + _.debuggerHelper.AssertErrorCount(0); + }); + + it("3. shows correct number of items", () => { + cy.dragAndDropToCanvas("listwidgetv2", { x: 200, y: 200 }); cy.get(publishLocators.containerWidget).should("have.length", 3); cy.get(publishLocators.imageWidget).should("have.length", 3); cy.get(publishLocators.textWidget).should("have.length", 6); }); - it("3. shows correct text from binding", () => { + it("4. shows correct text from binding", () => { cy.get(publishLocators.containerWidget).each(($containerEl, index) => { cy.wrap($containerEl) .find(publishLocators.textWidget) @@ -62,7 +67,7 @@ describe( }); }); - it("4. retains input values when pages are switched", () => { + it("5. retains input values when pages are switched", () => { _.agHelper.AddDsl("Listv2/simpleListWithInputAndButton"); cy.get(publishLocators.inputWidget).should("have.length", 2); @@ -125,7 +130,7 @@ describe( }); }); - it("5. Reset pageNo when serverside pagination is enabled", () => { + it("6. Reset pageNo when serverside pagination is enabled", () => { cy.get(`${widgetSelector("List1")} .rc-pagination-item-3`).click({ force: true, }); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/Select/Select2_Spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Select/Select2_Spec.ts index 426c5ca04afe..30f1a3f108df 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/Select/Select2_Spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Select/Select2_Spec.ts @@ -316,13 +316,7 @@ describe( agHelper.AssertExistingToggleState("Required", "false"); propPane.TogglePropertyState("Required", "On"); deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.FORM)); - agHelper.GetNClick(widgetLocators.selectWidgetClear, 1); - agHelper.AssertCSS( - widgetLocators.selectWidgetBtn, - "border-color", - "rgb(217, 25, 33)", - 1, - ); + cy.get(locators._selectClearButton_testId).should("not.exist"); }); it("10.Validate using function inside label key and value key returns correct label options", () => { diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/Inline_editing_3_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/Inline_editing_3_spec.js index 22b09155681a..40da3f138e35 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/Inline_editing_3_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/Inline_editing_3_spec.js @@ -3,7 +3,9 @@ const widgetsPage = require("../../../../../locators/Widgets.json"); import { agHelper, table as tableHelper, + propPane, } from "../../../../../support/Objects/ObjectsCore"; +import { PROPERTY_SELECTOR } from "../../../../../locators/WidgetLocators"; describe( "Table widget inline editing functionality", @@ -161,7 +163,12 @@ describe( it("6. should check that onsubmit event is available for the columns that are editable", () => { cy.openPropertyPane("tablewidgetv2"); cy.editColumn("step"); - cy.wait(500); + cy.get(commonlocators.changeColType).last().click(); + cy.get(tableHelper._dropdownText) + .children() + .contains("Plain text") + .click(); + propPane.TogglePropertyState("Editable", "Off", ""); [ { columnType: "URL", @@ -206,8 +213,7 @@ describe( .contains(data.columnType) .click(); cy.wait("@updateLayout"); - cy.wait(500); - cy.get(".t--property-control-onsubmit").should(data.expected); + cy.get(PROPERTY_SELECTOR.onSubmit).should(data.expected); }); cy.get(propPaneBack).click(); @@ -262,8 +268,7 @@ describe( .contains(data.columnType) .click(); cy.wait("@updateLayout"); - cy.wait(500); - cy.get(".t--property-control-onsubmit").should(data.expected); + cy.get(PROPERTY_SELECTOR.onSubmit).should(data.expected); }); }); 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 fafe2da10f90..f65933708669 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 @@ -162,6 +162,7 @@ describe( }); it("6. should check that on option select is working", () => { + _.agHelper.CheckForPageSaveError(); featureFlagIntercept({ release_table_cell_label_value_enabled: true }); cy.openPropertyPane("tablewidgetv2"); cy.editColumn("step"); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/Text/TextWidget_LintErrorValidation_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Text/TextWidget_LintErrorValidation_spec.js index 2a941b2004c2..b473a01b24d6 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/Text/TextWidget_LintErrorValidation_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Text/TextWidget_LintErrorValidation_spec.js @@ -44,15 +44,7 @@ describe( .should("be.visible") .contains("'lintErrror' is not defined."); - cy.get(commonlocators.debugger) - .should("be.visible") - .click({ force: true }); - - cy.get(commonlocators.errorTab) - .should("be.visible") - .click({ force: true }); - - cy.get(commonlocators.debugErrorMsg).should("have.length", 3); + _.debuggerHelper.AssertErrorCount(3); }); }, ); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/Video/Video2_Spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Video/Video2_Spec.ts index 6490f5c8af53..55ab1a650cd0 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/Video/Video2_Spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Video/Video2_Spec.ts @@ -49,34 +49,7 @@ describe( agHelper.AssertProperty(widgetLocators.video, "ended", true); }); - it("2. Verify Basic Functionality of Video Widget - muted", function () { - deployMode.NavigateBacktoEditor(); - EditorNavigation.SelectEntityByName("Video1", EntityType.Widget); - //Validate video for youtube url - propPane.TypeTextIntoField("URL", testdata.videoUrl); - deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.VIDEO)); - agHelper.GetNClick(locators._widgetInDeployed(draggableWidgets.VIDEO)); - agHelper.Sleep(2000); - agHelper.GetElement(widgetLocators.iFrame).then(($iframe) => { - const doc = $iframe.contents(); - const video = doc.find(widgetLocators.video); - //Check play, mute & unmute, volume buttons - cy.wrap( - doc.find(widgetLocators.videoWidgetYoutubeLargePlayBtn), - ).click(); - cy.wrap(video).click(); - agHelper.Sleep(1000); - cy.wrap(doc.find(widgetLocators.videoWidgetYoutubeMuteBtn)).click(); - agHelper.AssertProperty(video, "muted", true); - agHelper.AssertProperty(video, "paused", true); - cy.wrap(doc.find(widgetLocators.videoWidgetYoutubeVolumeBtn)).type( - "{rightarrow}{rightarrow}", - ); - agHelper.AssertProperty(video, "muted", false); - }); - }); - - it("3. Verify widget for invalid URL's", function () { + it("2. Verify widget for invalid URL's", function () { deployMode.NavigateBacktoEditor(); EditorNavigation.SelectEntityByName("Video1", EntityType.Widget); propPane.RemoveText("URL"); @@ -107,7 +80,7 @@ describe( }); }); - it("4. Verify auto play property", function () { + it("3. Verify auto play property", function () { deployMode.NavigateBacktoEditor(); EditorNavigation.SelectEntityByName("Video1", EntityType.Widget); agHelper.AssertExistingToggleState("Autoplay", "false"); @@ -128,7 +101,7 @@ describe( agHelper.AssertProperty(widgetLocators.video, "paused", true); }); - it("5. Verify visible property", function () { + it("4. Verify visible property", function () { deployMode.NavigateBacktoEditor(); EditorNavigation.SelectEntityByName("Video1", EntityType.Widget); agHelper.AssertExistingToggleState("Visible", "true"); @@ -154,7 +127,7 @@ describe( ); }); - it("6. Verify OnPlay, OnPause, OnEnd events are JS convertible", function () { + it("5. Verify OnPlay, OnPause, OnEnd events are JS convertible", function () { deployMode.NavigateBacktoEditor(); EditorNavigation.SelectEntityByName("Video1", EntityType.Widget); propPane.EnterJSContext( @@ -193,7 +166,7 @@ describe( }); }); - it("7. Verify video styles", function () { + it("6. Verify video styles", function () { deployMode.NavigateBacktoEditor(); EditorNavigation.SelectEntityByName("Video1", EntityType.Widget); propPane.MoveToTab("Style"); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Workspace/MemberRoles_Spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Workspace/MemberRoles_Spec.ts index b43881d53c75..5154a056401d 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Workspace/MemberRoles_Spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Workspace/MemberRoles_Spec.ts @@ -202,7 +202,6 @@ describe( ); if (CURRENT_REPO === REPO.EE) _.adminSettings.EnableGAC(false, true, "home"); - _.homePage.SelectWorkspace(workspaceId); _.homePage.LeaveWorkspace(workspaceId); }); }, diff --git a/app/client/cypress/e2e/Regression/ClientSide/Workspace/ShareAppTests_Spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Workspace/ShareAppTests_Spec.ts index 9dbc5a43a009..ee6b2466475f 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Workspace/ShareAppTests_Spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Workspace/ShareAppTests_Spec.ts @@ -124,7 +124,17 @@ describe( Cypress.env("TESTPASSWORD2"), ); agHelper.VisitNAssert(currentUrl); - agHelper.ValidateToastMessage("Resource Not Found"); //for 404 screen + cy.get(locators.errorPageTitle).should(($x) => { + //for 404 screen + expect($x).contain(Cypress.env("MESSAGES").PAGE_NOT_FOUND()); + }); + cy.get(locators.errorPageDescription).should(($x) => { + //for 404 screen + expect($x).contain( + "Either this page doesn't exist, or you don't have access to this page", + ); + }); + agHelper.ValidateToastMessage("Resource Not Found"); homePage.LogOutviaAPI(); // visit the app as anonymous user and validate redirection to login page agHelper.VisitNAssert(currentUrl); diff --git a/app/client/cypress/e2e/Regression/ServerSide/ApiTests/API_All_Verb_spec.js b/app/client/cypress/e2e/Regression/ServerSide/ApiTests/API_All_Verb_spec.js index e16c4acebbd9..d88c2c7ba3e8 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/ApiTests/API_All_Verb_spec.js +++ b/app/client/cypress/e2e/Regression/ServerSide/ApiTests/API_All_Verb_spec.js @@ -5,6 +5,7 @@ import { const testdata = require("../../../../fixtures/testdata.json"); const apiwidget = require("../../../../locators/apiWidgetslocator.json"); +import apiLocators from "../../../../locators/ApiEditor"; import { agHelper, @@ -17,6 +18,7 @@ describe( "API Panel Test Functionality", { tags: ["@tag.Datasource"] }, function () { + const successMsg = "Executed successfully from user request"; afterEach(function () { agHelper.ActionContextMenuWithInPane({ action: "Delete", @@ -39,12 +41,8 @@ describe( agHelper.AssertAutoSave(); apiPage.RunAPI(); apiPage.ResponseStatusCheck("200 OK"); - cy.validateRequest( - "Executed successfully", - testdata.baseUrl, - testdata.echoMethod, - testdata.Put, - ); + agHelper.GetNClickByContains(apiLocators.apiResponseTabsList, "Logs"); + agHelper.AssertContains(successMsg); }); cy.ResponseCheck("updatedAt"); }); @@ -63,12 +61,8 @@ describe( agHelper.AssertAutoSave(); apiPage.RunAPI(); apiPage.ResponseStatusCheck("200 OK"); - cy.validateRequest( - "Executed successfully", - testdata.baseUrl, - testdata.echoMethod, - testdata.Post, - ); + agHelper.GetNClickByContains(apiLocators.apiResponseTabsList, "Logs"); + agHelper.AssertContains(successMsg); }); cy.ResponseCheck("createdAt"); }); @@ -87,12 +81,8 @@ describe( agHelper.AssertAutoSave(); apiPage.RunAPI(); apiPage.ResponseStatusCheck("200 OK"); - cy.validateRequest( - "Executed successfully", - testdata.baseUrl, - testdata.echoMethod, - testdata.Patch, - ); + agHelper.GetNClickByContains(apiLocators.apiResponseTabsList, "Logs"); + agHelper.AssertContains(successMsg); }); cy.ResponseCheck("updatedAt"); }); @@ -111,12 +101,8 @@ describe( agHelper.AssertAutoSave(); apiPage.RunAPI(); apiPage.ResponseStatusCheck("200 OK"); - cy.validateRequest( - "Executed successfully", - testdata.baseUrl, - testdata.echoMethod, - testdata.Delete, - ); + agHelper.GetNClickByContains(apiLocators.apiResponseTabsList, "Logs"); + agHelper.AssertContains(successMsg); }); }); @@ -127,12 +113,8 @@ describe( apiPage.RunAPI(); apiPage.ResponseStatusCheck("200 OK"); cy.ResponseCheck(testdata.responsetext); - cy.validateRequest( - "Executed successfully", - testdata.baseUrl, - testdata.methods, - testdata.Get, - ); + agHelper.GetNClickByContains(apiLocators.apiResponseTabsList, "Logs"); + agHelper.AssertContains(successMsg); apiPage.SelectPaneTab("Pagination"); agHelper.GetNClick(apiwidget.paginationWithUrl); @@ -144,12 +126,8 @@ describe( cy.clickTest(apiwidget.TestNextUrl); apiPage.ResponseStatusCheck("200 OK"); cy.ResponseCheck("Josh M Krantz"); - cy.validateRequest( - "Executed successfully", - testdata.baseUrl, - testdata.next, - testdata.Get, - ); + agHelper.GetNClickByContains(apiLocators.apiResponseTabsList, "Logs"); + agHelper.AssertContains(successMsg); apiPage.SelectPaneTab("Pagination"); cy.enterUrl( @@ -160,12 +138,8 @@ describe( cy.clickTest(apiwidget.TestPreUrl); apiPage.ResponseStatusCheck("200 OK"); cy.ResponseCheck(testdata.responsetext); - cy.validateRequest( - "Executed successfully", - testdata.baseUrl, - testdata.prev, - testdata.Get, - ); + agHelper.GetNClickByContains(apiLocators.apiResponseTabsList, "Logs"); + agHelper.AssertContains(successMsg); }); it("6. API check with query params test API feature", function () { @@ -174,12 +148,8 @@ describe( apiPage.RunAPI(); apiPage.ResponseStatusCheck("200 OK"); cy.ResponseCheck(testdata.responsetext3); - cy.validateRequest( - "Executed successfully", - testdata.baseUrl, - testdata.queryAndValue, - testdata.Get, - ); + agHelper.GetNClickByContains(apiLocators.apiResponseTabsList, "Logs"); + agHelper.AssertContains(successMsg); }); it("7. API check with Invalid Header", function () { @@ -188,13 +158,8 @@ describe( agHelper.AssertAutoSave(); apiPage.RunAPI(false); apiPage.ResponseStatusCheck("5000"); - cy.validateRequest( - "Execution failed", - testdata.baseUrl, - testdata.methods, - testdata.Get, - true, - ); + agHelper.GetNClickByContains(apiLocators.apiResponseTabsList, "Logs"); + agHelper.AssertContains(successMsg); cy.ResponseCheck("Invalid value for Content-Type"); }); }, diff --git a/app/client/cypress/e2e/Regression/ServerSide/ApiTests/API_MultiPart_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/ApiTests/API_MultiPart_Spec.ts index ec7e2ab5801e..e2007f6b0c95 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/ApiTests/API_MultiPart_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/ApiTests/API_MultiPart_Spec.ts @@ -2,6 +2,7 @@ import { agHelper, apiPage, assertHelper, + dataManager, deployMode, entityItems, jsEditor, @@ -128,8 +129,8 @@ describe( agHelper.AddDsl("multiPartFormDataDsl"); apiPage.CreateAndFillApi( - "https://api.cloudinary.com/v1_1/appsmithautomationcloud/image/upload?upload_preset=fbbhg4xu", - "CloudinaryUploadApi", + dataManager.dsValues[dataManager.defaultEnviorment].multipartAPI, + "MultipartAPI", 30000, "POST", ); @@ -145,7 +146,7 @@ describe( myVar1: [], myVar2: {}, upload: async () => { - await CloudinaryUploadApi.run().then(()=> showAlert('Image uploaded to Cloudinary successfully', 'success')).catch(err => showAlert(err.message, 'error')); + await MultipartAPI.run().then(()=> showAlert('Image uploaded to multipart successfully', 'success')).catch(err => showAlert(err.message, 'error')); await resetWidget('FilePicker1', true); } }`, @@ -161,15 +162,9 @@ describe( propPane.EnterJSContext("onFilesSelected", `{{JSObject1.upload()}}`); EditorNavigation.SelectEntityByName("Image1", EntityType.Widget); - propPane.UpdatePropertyFieldValue( - "Image", - "{{CloudinaryUploadApi.data.url}}", - ); + propPane.UpdatePropertyFieldValue("Image", "{{MultipartAPI.data.url}}"); - EditorNavigation.SelectEntityByName( - "CloudinaryUploadApi", - EntityType.Api, - ); + EditorNavigation.SelectEntityByName("MultipartAPI", EntityType.Api); apiPage.ToggleOnPageLoadRun(false); //Bug 12476 EditorNavigation.SelectEntityByName("Page1", EntityType.Page); @@ -177,9 +172,7 @@ describe( agHelper.ClickButton("Select Files"); agHelper.UploadFile(imageNameToUpload); assertHelper.AssertNetworkExecutionSuccess("@postExecute"); //validating Cloudinary api call - agHelper.ValidateToastMessage( - "Image uploaded to Cloudinary successfully", - ); + agHelper.ValidateToastMessage("Image uploaded to multipart successfully"); agHelper.Sleep(); cy.xpath(apiPage._imageSrc) .find("img") @@ -192,31 +185,5 @@ describe( agHelper.AssertElementVisibility(locators._buttonByText("Select Files")); //verifying if reset! deployMode.NavigateBacktoEditor(); }); - - it("8. Checks MultiPart form data for a Array Type upload results in API error", () => { - const imageNameToUpload = "AAAFlowerVase.jpeg"; - EditorNavigation.SelectEntityByName( - "CloudinaryUploadApi", - EntityType.Api, - ); - apiPage.EnterBodyFormData( - "MULTIPART_FORM_DATA", - "file", - "{{FilePicker1.files[0]}}", - "Array", - true, - ); - EditorNavigation.SelectEntityByName("FilePicker1", EntityType.Widget); - agHelper.ClickButton("Select Files"); - agHelper.UploadFile(imageNameToUpload); - assertHelper.AssertNetworkExecutionSuccess("@postExecute", false); - - deployMode.DeployApp(locators._buttonByText("Select Files")); - agHelper.ClickButton("Select Files"); - agHelper.UploadFile(imageNameToUpload); - assertHelper.AssertNetworkExecutionSuccess("@postExecute", false); - agHelper.ValidateToastMessage("CloudinaryUploadApi failed to execute"); - agHelper.AssertElementVisibility(locators._buttonByText("Select Files")); //verifying if reset in case of failure! - }); }, ); 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 91db07482fb4..27933ddf85e2 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Datasources/ConnectionErrors_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Datasources/ConnectionErrors_Spec.ts @@ -51,10 +51,7 @@ describe( dataManager.dsValues[dataManager.defaultEnviorment].postgres_username, ); dataSources.TestDatasource(false); - agHelper.ValidateToastMessage( - "An exception occurred while creating connection pool. One or more arguments in the datasource configuration may be invalid.", - ); - agHelper.ValidateToastMessage("Failed to initialize pool:"); + agHelper.ValidateToastMessage("Missing password for authentication."); agHelper.GetNClick(locators._visibleTextSpan("Read only")); propPane.AssertPropertiesDropDownValues("SSL mode", [ "Default", diff --git a/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/Mongo_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/Mongo_Spec.ts index dfa1c2c48f6e..94cf82fc284e 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/Mongo_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/Mongo_Spec.ts @@ -41,6 +41,10 @@ describe( assertHelper.AssertNetworkStatus("@getDatasourceStructure"); //Making sure table dropdown is populated agHelper.GetNClick(dataSources._selectTableDropdown, 0, true); agHelper.GetNClickByContains(dataSources._dropdownOption, "pokemon"); + + agHelper.GetNClick(dataSources._selectTableDropdown, 1, true); + agHelper.GetNClickByContains(dataSources._dropdownOption, "img"); + GenerateCRUDNValidateDeployPage( "http://www.serebii.net/pokemongo/pokemon/150.png", "150", @@ -103,30 +107,68 @@ describe( assertHelper.AssertNetworkStatus("@postExecute", 200); agHelper.ClickButton("Got it"); assertHelper.AssertNetworkStatus("@updateLayout", 200); + deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); //Validating loaded table agHelper.AssertElementExist(dataSources._selectedRow); - table.ReadTableRowColumnData(0, 0, "v2", 2000).then(($cellData) => { - expect($cellData).to.eq(col1Text); - }); - table.ReadTableRowColumnData(0, 3, "v2", 200).then(($cellData) => { - expect($cellData).to.eq(col2Text); - }); - table.ReadTableRowColumnData(0, 6, "v2", 200).then(($cellData) => { - expect($cellData).to.eq(col3Text); - }); - //Validating loaded JSON form - cy.xpath(locators._buttonByText("Update")).then((selector) => { - cy.wrap(selector) - .invoke("attr", "class") - .then((classes) => { - //cy.log("classes are:" + classes); - expect(classes).not.contain("bp3-disabled"); + findTheDataRow(col1Text).then((rowIndex: number) => { + cy.log(`This is the rowIndex of ${col1Text} : ${rowIndex}`); + table + .ReadTableRowColumnData(rowIndex, 0, "v2", 2000) + .then(($cellData) => { + expect($cellData).to.eq(col1Text); }); + table + .ReadTableRowColumnData(rowIndex, 3, "v2", 200) + .then(($cellData) => { + expect($cellData).to.eq(col2Text); + }); + table + .ReadTableRowColumnData(rowIndex, 6, "v2", 200) + .then(($cellData) => { + expect($cellData).to.eq(col3Text); + }); + + //Validating loaded JSON form + cy.xpath(locators._buttonByText("Update")).then((selector) => { + cy.wrap(selector) + .invoke("attr", "class") + .then((classes) => { + //cy.log("classes are:" + classes); + expect(classes).not.contain("bp3-disabled"); + }); + }); + dataSources.AssertJSONFormHeader(0, idIndex, "Id", "", true); }); - dataSources.AssertJSONFormHeader(0, idIndex, "Id", "", true); + } + + function findTheDataRow(col1Text: string) { + if (col1Text.length === 0) { + return cy.wrap(0); + } + + return agHelper + .GetElement(table._tableColumnDataWithText(0, col1Text, "v2")) + .closest(".tr") + .then(($p1) => { + return cy + .wrap($p1) + .parent() + .children() + .then(($children) => { + let index = 0; + $children.each((i, el) => { + // Iterate through the children + if (Cypress.$(el).is($p1)) { + // Check if the current child is p1 + index = i; // Assign the index when found + } + }); + return index; + }); + }); } }, ); diff --git a/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/MySQL2_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/MySQL2_Spec.ts index aee98caa858b..3271e32094da 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/MySQL2_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/MySQL2_Spec.ts @@ -82,10 +82,11 @@ describe( dataSources.RunQueryNVerifyResponseViews(10); dataSources.AssertQueryTableResponse(5, "2112"); dataSources.AssertQueryTableResponse(6, "Mike's Liquors"); - agHelper.ActionContextMenuWithInPane({ - action: "Delete", - entityType: entityItems.Query, - }); + // Commenting this deletion of query to make the generate crud work on the new page instead of the current page + // agHelper.ActionContextMenuWithInPane({ + // action: "Delete", + // entityType: entityItems.Query, + // }); }); it("3. Verify Generate CRUD for the new table & Verify Deploy mode for table - Stores", () => { @@ -129,13 +130,13 @@ describe( updateNVerify(6, 4, newStoreSecret as string); }); - table.SelectTableRow(17, 0, true, "v2"); - dataSources.AssertJSONFormHeader(17, 0, "store_id"); - generateStoresSecretInfo(17); + table.SelectTableRow(12, 0, true, "v2"); + dataSources.AssertJSONFormHeader(12, 0, "store_id"); + generateStoresSecretInfo(12); cy.get("@secretInfo").then(($secretInfo) => { newStoreSecret = $secretInfo; cy.log("newStoreSecret is : " + newStoreSecret); - updateNVerify(17, 4, newStoreSecret as string); + updateNVerify(12, 4, newStoreSecret as string); }); //Hidden field bug - to add here aft secret codes are updated for some fields! 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 a77af1001a64..201b69d0e61b 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/JsFunctionExecution/JSFunctionExecution_spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/JsFunctionExecution/JSFunctionExecution_spec.ts @@ -126,7 +126,7 @@ describe("JS Function Execution", { tags: ["@tag.JS"] }, function () { //It should open only in case of execution error. debuggerHelper.AssertClosed(); //Verify there is no error shown in the response tab. - debuggerHelper.ClickDebuggerIcon(); + debuggerHelper.OpenDebugger(); debuggerHelper.ClickResponseTab(); jsEditor.AssertParseError(false); agHelper.ActionContextMenuWithInPane({ @@ -400,7 +400,6 @@ describe("JS Function Execution", { tags: ["@tag.JS"] }, function () { jsEditor.EnableDisableAsyncFuncSettings( functionSetting.name, functionSetting.onPageLoad, - functionSetting.confirmBeforeExecute, ); }, ); @@ -496,12 +495,12 @@ return "yes";`; // Switch to settings tab agHelper.GetNClick(jsEditor._settingsTab); // Enable all settings - jsEditor.EnableDisableAsyncFuncSettings("asyncToSync", true, false); + jsEditor.EnableDisableAsyncFuncSettings("asyncToSync", true); // Modify js object jsEditor.EditJSObj(syncJSCode, false); agHelper.RefreshPage(); - jsEditor.VerifyAsyncFuncSettings("asyncToSync", true, false); + jsEditor.VerifyAsyncFuncSettings("asyncToSync", true); agHelper.ActionContextMenuWithInPane({ action: "Delete", entityType: entityItems.JSObject, diff --git a/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/APIOnLoad_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/APIOnLoad_Spec.ts index dd100ab787c7..b89bc975b8bf 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/APIOnLoad_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/APIOnLoad_Spec.ts @@ -2,6 +2,7 @@ import { agHelper, apiPage, assertHelper, + debuggerHelper, entityExplorer, entityItems, propPane, @@ -58,7 +59,12 @@ describe( `{{PageLoadApi2.data.data}}`, ); agHelper.RefreshPage(); - agHelper.ValidateToastMessage(`The action "PageLoadApi2" has failed.`); + debuggerHelper.AssertDebugError( + 'The action "PageLoadApi2" has failed.', + "", + true, + false, + ); }); after(() => { diff --git a/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/ExecuteAction_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/ExecuteAction_Spec.ts index fbf4f7531519..c4653d3f430e 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/ExecuteAction_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/ExecuteAction_Spec.ts @@ -1,5 +1,6 @@ import { agHelper, + assertHelper, deployMode, homePage, locators, @@ -17,6 +18,8 @@ describe( agHelper.AssertElementVisibility(locators._widgetInCanvas("textwidget")); deployMode.DeployApp(); + assertHelper.AssertNetworkStatus("@postExecute", 200, true); + agHelper.GetNAssertContains( locators._widgetInDeployed("textwidget"), "User count :5", @@ -37,6 +40,9 @@ describe( agHelper.GetNClickByContains(locators._deployedPage, "Page2"); + assertHelper.AssertNetworkStatus("@getConsolidatedData", 200, true); + assertHelper.AssertNetworkStatus("@postExecute", 200, true); + agHelper.GetNAssertContains( locators._widgetInDeployed("textwidget"), "User count :10", @@ -55,6 +61,9 @@ describe( agHelper.GetNClickByContains(locators._deployedPage, "Page1"); + assertHelper.AssertNetworkStatus("@getConsolidatedData", 200, true); + assertHelper.AssertNetworkStatus("@postExecute", 200, true); + agHelper.GetNAssertContains( locators._widgetInDeployed("textwidget"), "User count :5", diff --git a/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/JSOnLoad2_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/JSOnLoad2_Spec.ts index 6d246804da3b..300d27e05787 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/JSOnLoad2_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/JSOnLoad2_Spec.ts @@ -91,7 +91,7 @@ describe( EditorNavigation.SelectEntityByName("Page1", EntityType.Page); agHelper.RefreshPage(); - debuggerHelper.ClickDebuggerIcon(); + debuggerHelper.OpenDebugger(); debuggerHelper.ClickLogsTab(); debuggerHelper.DebuggerLogsFilter("JSObject1.astros"); debuggerHelper.DoesConsoleLogExist("JS Function executed successfully"); 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 bd1f3d80f405..bb8ad38cb77b 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 @@ -8,7 +8,6 @@ import { locators, table, } from "../../../../support/Objects/ObjectsCore"; -import { featureFlagIntercept } from "../../../../support/Objects/FeatureFlags"; import EditorNavigation, { AppSidebar, AppSidebarButton, @@ -76,38 +75,7 @@ describe("Binary Datatype tests", { tags: ["@tag.Datasource"] }, function () { table.WaitForTableEmpty(); //asserting table is empty before inserting! }); - //Timing out a lot in CI, hence skipped, Insert verified also in next case - // it.skip("3. Inserting record - binarytype", () => { - // imageNameToUpload = "Datatypes/Bridge.jpg"; - // // entityExplorer.SelectEntityByName("Page1"); - // // deployMode.DeployApp(); - // // table.WaitForTableEmpty(); //asserting table is empty before inserting! - // agHelper.ClickButton("Run InsertQuery"); - // agHelper.AssertElementVisibility(locators._modal); - - // agHelper.ClickButton("Select New Image"); - // agHelper.UploadFile(imageNameToUpload); - - // agHelper.ClickButton("Insert"); - // agHelper.AssertElementAbsence(locators._toastMsg); //Assert that Insert did not fail - // agHelper.AssertElementVisibility(locators._buttonByText("Run InsertQuery")); - // agHelper.AssertElementAbsence(locators._btnSpinner, 10000); //for the update row to appear at last - // table.WaitUntilTableLoad(); - // agHelper.Sleep(3000); //some more time for all rows with images to be populated - // table.ReadTableRowColumnData(0, 0).then(($cellData) => { - // expect($cellData).to.eq("1"); //asserting serial column is inserting fine in sequence - // }); - // table.ReadTableRowColumnData(0, 1, "v1", 200).then(($cellData) => { - // expect($cellData).to.eq("Bridge.jpg"); - // }); - // table.AssertTableRowImageColumnIsLoaded(0, 2).then(($oldimage) => { - // table.AssertTableRowImageColumnIsLoaded(0, 3).then(($newimage) => { - // expect($oldimage).to.eq($newimage); - // }); - // }); - // }); - - it("4. Inserting another record - binarytype", () => { + it("3. Inserting another record - binarytype", () => { imageNameToUpload = "Datatypes/Georgia.jpeg"; agHelper.ClickButton("Run InsertQuery"); @@ -121,21 +89,21 @@ describe("Binary Datatype tests", { tags: ["@tag.Datasource"] }, function () { agHelper.AssertElementVisibility(locators._buttonByText("Run InsertQuery")); agHelper.AssertElementAbsence(locators._btnSpinner, 20000); //for the update row to appear at last table.WaitUntilTableLoad(); - agHelper.Sleep(2000); //some more time for all rows with images to be populated - table.ReadTableRowColumnData(1, 0).then(($cellData) => { - expect($cellData).to.eq("2"); //asserting serial column is inserting fine in sequence + const rowIndex = 0; + table.ReadTableRowColumnData(rowIndex, 0).then(($cellData) => { + expect($cellData).to.eq("1"); //asserting serial column is inserting fine in sequence }); - table.ReadTableRowColumnData(1, 1, "v1", 200).then(($cellData) => { + table.ReadTableRowColumnData(rowIndex, 1, "v1", 200).then(($cellData) => { expect($cellData).to.eq("Georgia.jpeg"); }); - table.AssertTableRowImageColumnIsLoaded(1, 2).then(($oldimage) => { - table.AssertTableRowImageColumnIsLoaded(1, 3).then(($newimage) => { + table.AssertTableRowImageColumnIsLoaded(rowIndex, 2).then(($oldimage) => { + table.AssertTableRowImageColumnIsLoaded(rowIndex, 3).then(($newimage) => { expect($oldimage).to.eq($newimage); }); }); }); - it("5. Inserting another record - binarytype", () => { + it("4. Inserting another record - binarytype", () => { imageNameToUpload = "Datatypes/Maine.jpeg"; agHelper.ClickButton("Run InsertQuery"); @@ -149,21 +117,21 @@ describe("Binary Datatype tests", { tags: ["@tag.Datasource"] }, function () { agHelper.AssertElementVisibility(locators._buttonByText("Run InsertQuery")); agHelper.AssertElementAbsence(locators._btnSpinner, 20000); //for the update row to appear at last table.WaitUntilTableLoad(); - agHelper.Sleep(2000); //some more time for all rows with images to be populated - table.ReadTableRowColumnData(2, 0).then(($cellData) => { - expect($cellData).to.eq("3"); //asserting serial column is inserting fine in sequence + const rowIndex = 1; + table.ReadTableRowColumnData(rowIndex, 0).then(($cellData) => { + expect($cellData).to.eq("2"); //asserting serial column is inserting fine in sequence }); - table.ReadTableRowColumnData(2, 1, "v1", 200).then(($cellData) => { + table.ReadTableRowColumnData(rowIndex, 1, "v1", 200).then(($cellData) => { expect($cellData).to.eq("Maine.jpeg"); }); - table.AssertTableRowImageColumnIsLoaded(2, 2).then(($oldimage) => { - table.AssertTableRowImageColumnIsLoaded(2, 3).then(($newimage) => { + table.AssertTableRowImageColumnIsLoaded(rowIndex, 2).then(($oldimage) => { + table.AssertTableRowImageColumnIsLoaded(rowIndex, 3).then(($newimage) => { expect($oldimage).to.eq($newimage); }); }); }); - it("6. Updating record - binarytype", () => { + it("5. Updating record - binarytype", () => { imageNameToUpload = "Datatypes/NewJersey.jpeg"; table.SelectTableRow(1); @@ -178,45 +146,38 @@ describe("Binary Datatype tests", { tags: ["@tag.Datasource"] }, function () { agHelper.AssertElementVisibility(locators._buttonByText("Run UpdateQuery")); agHelper.AssertElementAbsence(locators._btnSpinner, 20000); //for the update row to appear at last table.WaitUntilTableLoad(); - agHelper.Sleep(14000); //some more time for rows to rearrange! - table.ReadTableRowColumnData(2, 0, "v1", 2000).then(($cellData) => { + const rowIndex = 1; + table.ReadTableRowColumnData(rowIndex, 0, "v1", 2000).then(($cellData) => { expect($cellData).to.eq("2"); //asserting serial column is inserting fine in sequence }); - table.ReadTableRowColumnData(2, 1, "v1", 200).then(($cellData) => { + table.ReadTableRowColumnData(rowIndex, 1, "v1", 200).then(($cellData) => { expect($cellData).to.eq("NewJersey.jpeg"); }); - table.AssertTableRowImageColumnIsLoaded(2, 2).then(($oldimage) => { - table.AssertTableRowImageColumnIsLoaded(2, 3).then(($newimage) => { + table.AssertTableRowImageColumnIsLoaded(rowIndex, 2).then(($oldimage) => { + table.AssertTableRowImageColumnIsLoaded(rowIndex, 3).then(($newimage) => { expect($oldimage).to.not.eq($newimage); }); }); }); - it("7. Deleting records - binarytype", () => { - //entityExplorer.SelectEntityByName("Page1");//commenting 2 lines since case 6th is skipped! - //deployMode.DeployApp(); + it("6. Deleting records - binarytype", () => { table.WaitUntilTableLoad(); table.SelectTableRow(1); agHelper.ClickButton("DeleteQuery", 1); assertHelper.AssertNetworkStatus("@postExecute", 200); assertHelper.AssertNetworkStatus("@postExecute", 200); - agHelper.AssertElementAbsence(locators._btnSpinner, 20000); //Allowing time for delete to be success - agHelper.Sleep(6000); //Allwowing time for delete to be success - table.ReadTableRowColumnData(1, 0).then(($cellData) => { - expect($cellData).not.to.eq("3"); //asserting 2nd record is deleted - }); - table.ReadTableRowColumnData(1, 0, "v1", 200).then(($cellData) => { - expect($cellData).to.eq("2"); + agHelper.WaitUntilEleDisappear(locators._btnSpinner); //Allowing time for delete to be success + table.ReadTableRowColumnData(0, 0).then(($cellData) => { + expect($cellData).to.eq("1"); }); //Deleting all records from .table agHelper.GetNClick(locators._deleteIcon); agHelper.AssertElementVisibility(locators._buttonByText("Run InsertQuery")); - agHelper.Sleep(2000); table.WaitForTableEmpty(); }); - it("8. Inserting another record (to check serial column) - binarytype", () => { + it("7. Inserting another record (to check serial column) - binarytype", () => { imageNameToUpload = "Datatypes/Massachusetts.jpeg"; agHelper.ClickButton("Run InsertQuery"); @@ -230,9 +191,8 @@ describe("Binary Datatype tests", { tags: ["@tag.Datasource"] }, function () { agHelper.AssertElementAbsence(locators._toastMsg); //Assert that Insert did not fail agHelper.AssertElementVisibility(locators._buttonByText("Run InsertQuery")); table.WaitUntilTableLoad(); - agHelper.Sleep(2000); //for all rows with images to be populated table.ReadTableRowColumnData(0, 0, "v1", 2000).then(($cellData) => { - expect($cellData).to.eq("4"); //asserting serial column is inserting fine in sequence + expect($cellData).to.eq("3"); //asserting serial column is inserting fine in sequence }); table.ReadTableRowColumnData(0, 1, "v1", 200).then(($cellData) => { expect($cellData).to.eq("Massachusetts.jpeg"); @@ -244,7 +204,7 @@ describe("Binary Datatype tests", { tags: ["@tag.Datasource"] }, function () { }); }); - it("9. Validating Binary (bytea) - escape, hex, base64 functions", () => { + it("8. Validating Binary (bytea) - escape, hex, base64 functions", () => { deployMode.NavigateBacktoEditor(); table.WaitUntilTableLoad(); PageLeftPane.switchSegment(PagePaneSegment.Queries); @@ -291,7 +251,7 @@ describe("Binary Datatype tests", { tags: ["@tag.Datasource"] }, function () { }); }); - it("10. Validating Binary (bytea) - escape, hex, base64 functions, conts", () => { + it("9. Validating Binary (bytea) - escape, hex, base64 functions, conts", () => { //Validating backslash query = `select encode('\\\\'::bytea, 'escape') as "backslash Escape1", encode('\\134'::bytea, 'escape') as "backslash Escape2", encode('\\\\'::bytea, 'hex') as "backslash Hex1", encode('\\134'::bytea, 'hex') as "backslash Hex2", encode('\\\\'::bytea, 'base64') as "backslash Base64";`; dataSources.EnterQuery(query); @@ -375,8 +335,6 @@ describe("Binary Datatype tests", { tags: ["@tag.Datasource"] }, function () { }); AppSidebar.navigate(AppSidebarButton.Editor); }); - - //Since query delete & Postgress DS delete is covered in other specs, commenting below code // after( // "Validate Drop of the Newly Created - binarytype - Table & Verify Deletion of all created queries", // () => { diff --git a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/EmptyDataSource_spec.js b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/EmptyDataSource_spec.js index 8a3eb744ef75..5f24c8213b29 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/EmptyDataSource_spec.js +++ b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/EmptyDataSource_spec.js @@ -23,7 +23,7 @@ describe( dataSources.RunQuery({ toValidateResponse: false }); cy.wait(500); cy.get("[data-testid=t--query-error]").contains( - "[Missing username for authentication., Missing hostname.]", + "[Missing username for authentication., Missing hostname., Missing password for authentication.]", ); agHelper.ActionContextMenuWithInPane({ action: "Delete", diff --git a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/GoogleSheets_spec.ts b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/GoogleSheets_spec.ts index 345f3982e4cf..792f633cd865 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/GoogleSheets_spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/GoogleSheets_spec.ts @@ -20,9 +20,10 @@ describe( dataSources.CreatePlugIn("Google Sheets"); VerifyFunctionDropdown([ "Read / Write / Delete | Selected google sheets", - "Read / Write / Delete | All google sheets", - "Read / Write | All google sheets", - "Read | All google sheets", + // Hiding below methods as they are not authorized at this state + // "Read / Write / Delete | All google sheets", + // "Read / Write | All google sheets", + // "Read | All google sheets", ]); dataSources.SaveDSFromDialog(false); }); @@ -31,8 +32,6 @@ describe( agHelper.GetNClick(dataSources._gsScopeDropdown); cy.get(dataSources._gsScopeOptions).then(function ($ele) { expect($ele.eq(0).text()).to.be.oneOf(scopeOptions); - expect($ele.eq(1).text()).to.be.oneOf(scopeOptions); - expect($ele.eq(2).text()).to.be.oneOf(scopeOptions); }); agHelper.GetNClick(dataSources._gsScopeDropdown); } diff --git a/app/client/cypress/e2e/Sanity/Datasources/GraphQL_spec.ts b/app/client/cypress/e2e/Sanity/Datasources/GraphQL_spec.ts index 68b07e359a8e..22f5f17454cd 100644 --- a/app/client/cypress/e2e/Sanity/Datasources/GraphQL_spec.ts +++ b/app/client/cypress/e2e/Sanity/Datasources/GraphQL_spec.ts @@ -279,7 +279,7 @@ describe( }); apiPage.SelectPaneTab("Authentication"); - agHelper.ClickButton("Save as datasource"); + agHelper.GetNClick(locators._saveDatasource); agHelper.AssertText( locators._inputFieldByName("URL") + "//" + locators._inputField, @@ -296,16 +296,14 @@ describe( // }); dataSources.SaveDatasource(); agHelper.ValidateToastMessage("datasource created"); - agHelper.AssertElementVisibility( - locators._buttonByText("Edit datasource"), - ); + agHelper.AssertElementVisibility(locators._saveDatasource); apiPage.SelectPaneTab("Body"); dataSources.UpdateGraphqlQueryAndVariable({ query: GRAPHQL_QUERY, variable: GRAPHQL_VARIABLES, }); apiPage.RunAPI(); - agHelper.ClickButton("Edit datasource"); + agHelper.GetNClick(locators._saveDatasource); dataSources.AssertDataSourceInfo([ dataManager.dsValues[ dataManager.defaultEnviorment diff --git a/app/client/cypress/e2e/Sanity/Datasources/MockDBs_Spec.ts b/app/client/cypress/e2e/Sanity/Datasources/MockDBs_Spec.ts index e2cfb5c47e50..33f132d7aa93 100644 --- a/app/client/cypress/e2e/Sanity/Datasources/MockDBs_Spec.ts +++ b/app/client/cypress/e2e/Sanity/Datasources/MockDBs_Spec.ts @@ -74,49 +74,7 @@ describe( assertHelper.AssertNetworkStatus("@trigger"); dataSources.ValidateNSelectDropdown("Command", "Find document(s)"); - agHelper.Sleep(2000); //for movies collection to load & populate in dropdown - dataSources.ValidateNSelectDropdown("Collection", "movies"); - dataSources.RunQueryNVerifyResponseViews(1, false); - AppSidebar.navigate(AppSidebarButton.Data); - dataSources - .getDatasourceListItemDescription(mockDBName) - .then(($queryCount) => - expect($queryCount).to.eq("1 queries in this app"), - ); - - entityExplorer.CreateNewDsQuery(mockDBName); - dataSources.ValidateNSelectDropdown("Command", "Find document(s)"); - dataSources.ValidateNSelectDropdown("Collection", "movies"); - dataSources.RunQueryNVerifyResponseViews(1, false); - AppSidebar.navigate(AppSidebarButton.Data); - dataSources - .getDatasourceListItemDescription(mockDBName) - .then(($queryCount) => - expect($queryCount).to.eq("2 queries in this app"), - ); }); }); - - afterEach(() => { - AppSidebar.navigate(AppSidebarButton.Editor); - PageLeftPane.switchSegment(PagePaneSegment.Queries); - entityExplorer.ActionContextMenuByEntityName({ - entityNameinLeftSidebar: "Query1", - action: "Delete", - entityType: entityItems.Query, - }); - entityExplorer.ActionContextMenuByEntityName({ - entityNameinLeftSidebar: "Query2", - action: "Delete", - entityType: entityItems.Query, - }); - AppSidebar.navigate(AppSidebarButton.Data); - dataSources - .getDatasourceListItemDescription(dsName) - .then(($queryCount) => - expect($queryCount).to.eq("No queries in this app"), - ); - dataSources.DeleteDatasourceFromWithinDS(dsName); - }); }, ); diff --git a/app/client/cypress/e2e/Sanity/Datasources/MySQLNoiseTest_spec.js b/app/client/cypress/e2e/Sanity/Datasources/MySQLNoiseTest_spec.js index f1a4d43fb661..ecbc34e02481 100644 --- a/app/client/cypress/e2e/Sanity/Datasources/MySQLNoiseTest_spec.js +++ b/app/client/cypress/e2e/Sanity/Datasources/MySQLNoiseTest_spec.js @@ -4,7 +4,11 @@ import { } from "../../../support/Pages/EditorNavigation"; const datasourceEditor = require("../../../locators/DatasourcesEditor.json"); -import { agHelper, dataSources } from "../../../support/Objects/ObjectsCore"; +import { + agHelper, + dataSources, + debuggerHelper, +} from "../../../support/Objects/ObjectsCore"; const commonlocators = require("../../../locators/commonlocators.json"); describe( @@ -60,9 +64,15 @@ describe( force: true, }); cy.wait(2000); - cy.get(commonlocators.toastmsg).contains( - "NoiseTestQuery failed to execute", + + debuggerHelper.OpenDebugger(); + debuggerHelper.ClickLogsTab(); + debuggerHelper.DoesConsoleLogExist( + "Execution failed with status PE-STC-5000", + true, + "NoiseTestQuery", ); + cy.wait("@postExecute").then(({ response }) => { expect(response.body.data.statusCode).to.eq("200 OK"); }); diff --git a/app/client/cypress/locators/ApiEditor.js b/app/client/cypress/locators/ApiEditor.js index 1e852c6ad114..9340b355d441 100644 --- a/app/client/cypress/locators/ApiEditor.js +++ b/app/client/cypress/locators/ApiEditor.js @@ -34,4 +34,5 @@ export default { slashCommandButton: ".commands-button", apiResponseObject: ".object-key", apiDebuggerLink: ".debugger-entity-link", + apiResponseTabsList : ".ads-v2-tabs__list" }; diff --git a/app/client/cypress/locators/ThemeLocators.json b/app/client/cypress/locators/ThemeLocators.json index 6bf517400240..4f7b655bc925 100644 --- a/app/client/cypress/locators/ThemeLocators.json +++ b/app/client/cypress/locators/ThemeLocators.json @@ -9,5 +9,7 @@ "greenColor": "[style='background-color: rgb(21, 128, 61);']", "fontsSelected": ".leading-normal", "currentTheme": ".cursor-pointer:contains('Applied theme')", - "purpleColor": "[style='background-color: rgb(107,114,128);']" -} + "purpleColor": "[style='background-color: rgb(107,114,128);']", + "featuredThemeSection": "[data-testid='t--featured-themes']", + "fontOption": ".rc-virtual-list .rc-select-item-option" +} \ No newline at end of file diff --git a/app/client/cypress/locators/WidgetLocators.ts b/app/client/cypress/locators/WidgetLocators.ts index 8e2d368244c1..3f8418749874 100644 --- a/app/client/cypress/locators/WidgetLocators.ts +++ b/app/client/cypress/locators/WidgetLocators.ts @@ -175,3 +175,9 @@ export const buttongroupwidgetlocators = { `//*[contains(@class,'bp3-menu-item')]//*[text()='${text}']`, button: "//*[contains(@class,'t--widget-buttongroupwidget')]//button", }; + +export const multiSelectWidgetLocators = { + multiSelectWidgetTrigger: ".t--widget-multiselectwidgetv2 .rc-select-selector", + multiSelectWidgetSelectedOptionContent: ".rc-select-selection-item > .rc-select-selection-item-content", + multiSelectWidgetDropdownOptionCheckbox: ".multi-select-dropdown .rc-select-item-option-selected .bp3-control-indicator" +}; \ No newline at end of file diff --git a/app/client/cypress/support/Objects/CommonLocators.ts b/app/client/cypress/support/Objects/CommonLocators.ts index dd3b8744564d..3db2224e7c1f 100644 --- a/app/client/cypress/support/Objects/CommonLocators.ts +++ b/app/client/cypress/support/Objects/CommonLocators.ts @@ -334,4 +334,9 @@ export class CommonLocators { _menuItem = ".bp3-menu-item"; _slashCommandHintText = ".slash-command-hint-text"; _selectionItem = ".rc-select-selection-item"; + errorPageTitle = ".t--error-page-title"; + errorPageDescription = ".t--error-page-description"; + _selectClearButton_testId = "selectbutton.btn.cancel"; + _selectClearButton_dataTestId = `[data-testid="${this._selectClearButton_testId}"]`; + _saveDatasource = `[data-testid='t--store-as-datasource']`; } diff --git a/app/client/cypress/support/Objects/DataManager.ts b/app/client/cypress/support/Objects/DataManager.ts index 515b3f050327..a54e1162eb30 100644 --- a/app/client/cypress/support/Objects/DataManager.ts +++ b/app/client/cypress/support/Objects/DataManager.ts @@ -80,6 +80,8 @@ export class DataManager { "http://host.docker.internal:5001/v1/mock-api-object?records=10", echoApiUrl: "http://host.docker.internal:5001/v1/mock-api/echo", randomCatfactUrl: "http://host.docker.internal:5001/v1/catfact/random", + multipartAPI: + "http://host.docker.internal:5001/v1/mock-api/echo-multipart", randomTrumpApi: "http://host.docker.internal:5001/v1/whatdoestrumpthink/random", mockHttpCodeUrl: "http://host.docker.internal:5001/v1/mock-http-codes/", @@ -179,6 +181,8 @@ export class DataManager { mockApiUrl: "http://host.docker.internal:5001/v1/mock-api?records=10", echoApiUrl: "http://host.docker.internal:5001/v1/mock-api/echo", randomCatfactUrl: "http://host.docker.internal:5001/v1/catfact/random", + multipartAPI: + "http://host.docker.internal:5001/v1/mock-api/echo-multipart", mockHttpCodeUrl: "http://host.docker.internal:5001/v1/mock-http-codes/", AirtableBaseForME: "appubHrVbovcudwN6", AirtableTableForME: "tblsFCQSskVFf7xNd", diff --git a/app/client/cypress/support/Pages/AggregateHelper.ts b/app/client/cypress/support/Pages/AggregateHelper.ts index 4ddff74eb6cd..82fe2481fbdd 100644 --- a/app/client/cypress/support/Pages/AggregateHelper.ts +++ b/app/client/cypress/support/Pages/AggregateHelper.ts @@ -1552,6 +1552,25 @@ export class AggregateHelper { ) as Cypress.Chainable; } + /** + * Checks if the specified instance of the element is present with number and visible on the page. + * + * @param {ElementType} selector - The element selector. + * @param {number} [eq=0] - The index of the element to check (default is 0). + * @returns {Cypress.Chainable} - Returns a boolean wrapped in a Cypress Chainable indicating visibility. + */ + IsElementVisibleWithEq(selector: ElementType, eq: number = 0) { + return this.GetElement(selector) + .eq(eq) + .then(($element) => { + // Check if the element is present and visible + const isVisible = + Cypress.$($element).length > 0 && Cypress.$($element).is(":visible"); + console.log(`Element visibility: ${isVisible}`); + return isVisible; + }) as Cypress.Chainable; + } + public FailIfErrorToast(error: string) { cy.get("body").then(($ele) => { if ($ele.find(this.locator._toastMsg).length > 0) { diff --git a/app/client/cypress/support/Pages/ApiPage.ts b/app/client/cypress/support/Pages/ApiPage.ts index 793a6d03c102..8804ae793dde 100644 --- a/app/client/cypress/support/Pages/ApiPage.ts +++ b/app/client/cypress/support/Pages/ApiPage.ts @@ -303,7 +303,7 @@ export class ApiPage { | "RAW", ) { this.agHelper.GetNClick(this._bodyTypeSelect); - cy.xpath(this._bodyTypeToSelect(subTabName)).should("be.visible").click(); + this.agHelper.GetNClick(this._bodyTypeToSelect(subTabName)); } AssertRightPaneSelectedTab(tabName: RightPaneTabs) { diff --git a/app/client/cypress/support/Pages/DebuggerHelper.ts b/app/client/cypress/support/Pages/DebuggerHelper.ts index 2dabfb707112..979b8f2d842b 100644 --- a/app/client/cypress/support/Pages/DebuggerHelper.ts +++ b/app/client/cypress/support/Pages/DebuggerHelper.ts @@ -34,6 +34,7 @@ export class DebuggerHelper { [PageType.JsEditor]: ".t--js-editor-bottom-pane-container", [PageType.DataSources]: ".t--datasource-bottom-pane-container", }, + _ideBottomViewContainer: ".t--ide-bottom-view", _debuggerList: ".debugger-list", _debuggerFilter: "input[data-testid=t--debugger-search]", _debuggerSelectedTab: ".ads-v2-tabs__list-tab", @@ -49,17 +50,16 @@ export class DebuggerHelper { _downStreamLogMessage: ".t--debugger-log-downstream-message", }; - ClickDebuggerIcon( - index?: number, - force?: boolean, - waitTimeInterval?: number, - ) { - this.agHelper.GetNClick( - this.locators._debuggerIcon, - index, - force, - waitTimeInterval, - ); + OpenDebugger() { + // Open opens if it is not open yet + cy.get("body").then(($body) => { + if ($body.find(this.locators._ideBottomViewContainer).length === 0) { + this.agHelper.GetNClick(this.locators._debuggerIcon, 0, false); + } else { + this.agHelper.GetNClick(this.commonLocators._errorTab, 0, true, 0); + } + }); + this.AssertOpen(); } ClickDebuggerToggle(expand = true, index = 0) { @@ -93,7 +93,7 @@ export class DebuggerHelper { this.agHelper.GetNClick(this.locators._closeButton); } - AssertOpen(pageType: PageType) { + AssertOpen(pageType?: PageType) { switch (pageType) { case PageType.Canvas: this.agHelper.AssertElementExist(this.locators._tabsContainer); @@ -106,6 +106,10 @@ export class DebuggerHelper { this.locators._bottomPaneContainer[pageType], ); break; + default: + this.agHelper.AssertElementVisibility( + this.locators._ideBottomViewContainer, + ); } } @@ -118,12 +122,19 @@ export class DebuggerHelper { this.agHelper.AssertSelectedTab(this.locators._debuggerSelectedTab, "true"); } - DoesConsoleLogExist(text: string, exists = true) { + DoesConsoleLogExist(text: string, exists = true, entityName?: string) { this.agHelper.GetNAssertContains( this.locators._logMessage, text, exists ? "exist" : "not.exist", ); + if (entityName) { + this.agHelper + .GetElement(this.locators._logMessage) + .contains(text) + .closest(".error") + .contains(this.locators._logEntityLink, entityName); + } } DebuggerLogsFilter(text: string) { @@ -187,9 +198,10 @@ export class DebuggerHelper { message: string, shouldOpenDebugger = true, shouldToggleDebugger = true, + errorLabelIndex = 0, ) { if (shouldOpenDebugger) { - this.ClickDebuggerIcon(); + this.OpenDebugger(); } this.agHelper.GetNClick(this.commonLocators._errorTab, 0, true, 0); @@ -198,7 +210,7 @@ export class DebuggerHelper { } this.agHelper - .GetText(this.locators._debuggerLabel, "text", 0) + .GetText(this.locators._debuggerLabel, "text", errorLabelIndex) .then(($text) => { expect($text).to.eq(label); }); @@ -222,7 +234,7 @@ export class DebuggerHelper { AssertDownStreamLogError(message: string, shouldOpenDebugger = true) { if (shouldOpenDebugger) { - this.ClickDebuggerIcon(); + this.OpenDebugger(); } this.agHelper.GetNClick(this.commonLocators._responseTab, 0, true, 0); diff --git a/app/client/cypress/support/Pages/GitSync.ts b/app/client/cypress/support/Pages/GitSync.ts index 0bf9ffeb4cb7..2fbf3b139a64 100644 --- a/app/client/cypress/support/Pages/GitSync.ts +++ b/app/client/cypress/support/Pages/GitSync.ts @@ -65,6 +65,7 @@ export class GitSync { "[data-testid='t--git-protected-branches-select']"; public _branchProtectionUpdateBtn = "[data-testid='t--git-protected-branches-update-btn']"; + public _autocommitStatusbar = "[data-testid='t--autocommit-statusbar']"; public _disconnectGitBtn = "[data-testid='t--git-disconnect-btn']"; public _mergeLoader = "[data-testid='t--git-merge-loader']"; diff --git a/app/client/cypress/support/Pages/HomePage.ts b/app/client/cypress/support/Pages/HomePage.ts index 0d7569aa63d7..b482db49d58b 100644 --- a/app/client/cypress/support/Pages/HomePage.ts +++ b/app/client/cypress/support/Pages/HomePage.ts @@ -306,6 +306,7 @@ export class HomePage { this.agHelper.GetNClick(this._newButtonCreateApplication, 0, true); this.AssertApplicationCreated(); if (skipSignposting) { + this.agHelper.WaitUntilEleDisappear(this.locator._btnSpinner); AppSidebar.assertVisible(); this.agHelper.AssertElementVisibility(PageLeftPane.locators.selector); this.onboarding.skipSignposting(); diff --git a/app/client/cypress/support/Pages/Table.ts b/app/client/cypress/support/Pages/Table.ts index c82f7e9a0548..2f90efb052c7 100644 --- a/app/client/cypress/support/Pages/Table.ts +++ b/app/client/cypress/support/Pages/Table.ts @@ -59,6 +59,15 @@ export class Table { _tableRow = (rowNum: number, colNum: number, version: "v1" | "v2") => this._tableWidgetVersion(version) + ` .tbody .td[data-rowindex=${rowNum}][data-colindex=${colNum}]`; + _tableColumnDataWithText = ( + colNum: number, + columnText: string, + version: "v1" | "v2", + ) => + this._tableWidgetVersion(version) + + ` .tbody .td[data-colindex=${colNum}]` + + this._tableRowColumnDataVersion(version) + + ` div:contains("${columnText}")`; _editCellIconDiv = ".t--editable-cell-icon"; _editCellEditor = ".t--inlined-cell-editor"; _editCellEditorInput = this._editCellEditor + " input"; diff --git a/app/client/package.json b/app/client/package.json index 40afddb093fa..592cf597a377 100644 --- a/app/client/package.json +++ b/app/client/package.json @@ -120,7 +120,7 @@ "craco-babel-loader": "^1.0.4", "cssnano": "^6.0.1", "cypress-log-to-output": "^1.1.2", - "cypress-repeat-updated": "^1.0.1", + "cypress-repeat-pro": "^1.0.1", "d3-geo": "^3.1.0", "dayjs": "^1.10.6", "deep-diff": "^1.0.2", @@ -269,6 +269,7 @@ "@types/codemirror": "^0.0.96", "@types/deep-diff": "^1.0.0", "@types/dom-mediacapture-record": "^1.0.11", + "@types/dom-view-transitions": "^1.0.5", "@types/downloadjs": "^1.4.2", "@types/jest": "^27.4.1", "@types/js-beautify": "^1.13.2", diff --git a/app/client/packages/design-system/widgets/src/components/ComboBox/index.ts b/app/client/packages/design-system/widgets/src/components/ComboBox/index.ts new file mode 100644 index 000000000000..3bd16e178a03 --- /dev/null +++ b/app/client/packages/design-system/widgets/src/components/ComboBox/index.ts @@ -0,0 +1 @@ +export * from "./src"; diff --git a/app/client/packages/design-system/widgets/src/components/ComboBox/src/ComboBox.tsx b/app/client/packages/design-system/widgets/src/components/ComboBox/src/ComboBox.tsx new file mode 100644 index 000000000000..3e97b4720730 --- /dev/null +++ b/app/client/packages/design-system/widgets/src/components/ComboBox/src/ComboBox.tsx @@ -0,0 +1,83 @@ +import { Button, Icon, Label, Popover, Text } from "@appsmith/wds"; +import { getTypographyClassName } from "@appsmith/wds-theming"; +import clsx from "clsx"; +import React from "react"; +import { + FieldError, + ComboBox as HeadlessCombobox, + Input, + ListBox, +} from "react-aria-components"; +import { ListBoxItem } from "./ListBoxItem"; +import styles from "./styles.module.css"; +import type { ComboBoxProps } from "./types"; + +export const ComboBox = (props: ComboBoxProps) => { + const { + contextualHelp, + description, + errorMessage, + isLoading, + isRequired, + items, + label, + placeholder, + size = "medium", + ...rest + } = props; + + // place Popover in the root theme provider to get access to the CSS tokens + const root = document.body.querySelector( + "[data-theme-provider]", + ) as HTMLButtonElement; + + return ( + + {({ isInvalid }) => ( + <> + + ); +}; diff --git a/app/client/packages/design-system/widgets/src/components/ComboBox/src/ListBoxItem.tsx b/app/client/packages/design-system/widgets/src/components/ComboBox/src/ListBoxItem.tsx new file mode 100644 index 000000000000..663456933b35 --- /dev/null +++ b/app/client/packages/design-system/widgets/src/components/ComboBox/src/ListBoxItem.tsx @@ -0,0 +1,15 @@ +import React from "react"; +import { ListBoxItem as HeadlessListBoxItem } from "react-aria-components"; +import clsx from "clsx"; +import { getTypographyClassName } from "@appsmith/wds-theming"; +import { listItemStyles } from "@appsmith/wds"; +import type { ListBoxItemProps } from "react-aria-components"; + +export const ListBoxItem = (props: ListBoxItemProps) => { + return ( + + ); +}; diff --git a/app/client/packages/design-system/widgets/src/components/ComboBox/src/index.ts b/app/client/packages/design-system/widgets/src/components/ComboBox/src/index.ts new file mode 100644 index 000000000000..ec43be29e5e1 --- /dev/null +++ b/app/client/packages/design-system/widgets/src/components/ComboBox/src/index.ts @@ -0,0 +1 @@ +export * from "./ComboBox"; diff --git a/app/client/packages/design-system/widgets/src/components/ComboBox/src/styles.module.css b/app/client/packages/design-system/widgets/src/components/ComboBox/src/styles.module.css new file mode 100644 index 000000000000..097d68b00369 --- /dev/null +++ b/app/client/packages/design-system/widgets/src/components/ComboBox/src/styles.module.css @@ -0,0 +1,89 @@ +.formField { + display: flex; + flex-direction: column; + width: 100%; +} + +.inputWrapper { + display: flex; + flex-direction: row; + align-items: center; +} + +.input { + display: flex; + flex: 1; + position: relative; + padding: 0; + border: none; + align-items: center; + border-radius: var(--border-radius-elevation-3); + background-color: var(--color-bg-neutral-subtle); + max-inline-size: 100%; + padding-inline-start: var(--inner-spacing-2); + padding-inline-end: calc(var(--inner-spacing-3) + var(--icon-size-2)); + padding-block: var(--inner-spacing-3); + box-shadow: inset 0 0 0 var(--border-width-1) + var(--color-bd-on-neutral-subtle); + cursor: pointer; +} + +.formField[data-invalid] .textField { + box-shadow: 0 0 0 var(--border-width-1) var(--color-bd-negative); +} + +.formField[data-size="small"] .textField { + padding-block: var(--inner-spacing-2); +} + +.textField[data-focus-visible] { + box-shadow: + 0 0 0 2px var(--color-bg), + 0 0 0 4px var(--color-bd-focus); +} + +.textField[data-hovered] { + background-color: var(--color-bg-neutral-subtle-hover); + box-shadow: inset 0 0 0 var(--border-width-1) + var(--color-bd-on-neutral-subtle-hover); +} + +.textField [data-icon] { + position: absolute; + right: var(--inner-spacing-2); +} + +.necessityIndicator { + color: var(--color-fg-negative); + margin-inline-start: var(--inner-spacing-1); +} + +.errorText { + margin-block-start: var(--inner-spacing-3); + color: var(--color-fg-negative); +} + +.description { + margin-block-start: var(--inner-spacing-3); + color: var(--color-fg-neutral); +} + +.fieldValue { + text-align: left; + flex: 1; +} + +.fieldValue [data-icon] { + display: none; +} + +.listBox { + min-inline-size: var(--trigger-width); +} + +/** If at least one select item has an icon, we need to add extra padding for items that doesn't have an icon. */ +.listBox:has([data-icon]) [role="option"]:not(:has([data-icon])) { + padding-inline-start: calc( + var(--icon-size-2) + var(--inner-spacing-3) + var(--inner-spacing-2) + ); +} diff --git a/app/client/packages/design-system/widgets/src/components/ComboBox/src/types.ts b/app/client/packages/design-system/widgets/src/components/ComboBox/src/types.ts new file mode 100644 index 000000000000..ff643008a9ed --- /dev/null +++ b/app/client/packages/design-system/widgets/src/components/ComboBox/src/types.ts @@ -0,0 +1,35 @@ +import type { Key } from "@react-types/shared"; +import type { + ComboBoxProps as SpectrumComboBoxProps, + ValidationResult, +} from "react-aria-components"; +import type { IconProps, SIZES } from "@appsmith/wds"; + +export interface ComboBoxProps + extends Omit, "slot"> { + /** Item objects in the collection. */ + items: ComboBoxItem[]; + /** The content to display as the label. */ + label?: string; + /** The content to display as the description. */ + description?: string; + /** The content to display as the error message. */ + errorMessage?: string | ((validation: ValidationResult) => string); + /** size of the select + * + * @default medium + */ + size?: Omit; + /** loading state for the input */ + isLoading?: boolean; + /** A ContextualHelp element to place next to the label. */ + contextualHelp?: string; + /** The content to display as the placeholder. */ + placeholder?: string; +} + +export interface ComboBoxItem { + id: Key; + label: string; + icon?: IconProps["name"]; +} diff --git a/app/client/packages/design-system/widgets/src/components/ComboBox/stories/ComboBox.stories.tsx b/app/client/packages/design-system/widgets/src/components/ComboBox/stories/ComboBox.stories.tsx new file mode 100644 index 000000000000..b08d1836ba16 --- /dev/null +++ b/app/client/packages/design-system/widgets/src/components/ComboBox/stories/ComboBox.stories.tsx @@ -0,0 +1,86 @@ +import { Button, ComboBox, Flex, SIZES } from "@appsmith/wds"; +import type { Meta, StoryObj } from "@storybook/react"; +import React from "react"; +import { items, itemsWithIcons } from "./items"; + +/** + * A select displays a collapsible list of options and allows a user to select one of them. + */ +const meta: Meta = { + component: ComboBox, + title: "WDS/Widgets/ComboBox", +}; + +export default meta; +type Story = StoryObj; + +export const Main: Story = { + args: { + items: items, + }, + render: (args) => ( + + + + ), +}; + +/** + * The component supports two sizes `small` and `medium`. Default size is `medium`. + */ +export const Sizes: Story = { + render: () => ( + + {Object.keys(SIZES) + .filter((size) => !["large"].includes(size)) + .map((size) => ( + + ))} + + ), +}; + +export const Loading: Story = { + args: { + placeholder: "Loading", + isLoading: true, + items: items, + }, +}; + +export const Validation: Story = { + render: () => ( +
{ + e.preventDefault(); + alert("Form submitted"); + }} + > + + + + +
+ ), +}; + +export const ContextualHelp: Story = { + args: { + label: "Label", + placeholder: "Contextual Help Text", + contextualHelp: "This is a contextual help text", + items: items, + }, +}; + +export const WithIcons: Story = { + args: { + label: "With icons", + items: itemsWithIcons, + }, +}; diff --git a/app/client/packages/design-system/widgets/src/components/ComboBox/stories/items.ts b/app/client/packages/design-system/widgets/src/components/ComboBox/stories/items.ts new file mode 100644 index 000000000000..7319bf939cb0 --- /dev/null +++ b/app/client/packages/design-system/widgets/src/components/ComboBox/stories/items.ts @@ -0,0 +1,28 @@ +import type { ComboBoxItem } from "../src/types"; + +export const items: ComboBoxItem[] = [ + { id: 1, label: "Aerospace" }, + { + id: 2, + label: "Mechanical", + }, + { id: 3, label: "Civil" }, + { id: 4, label: "Biomedical" }, + { id: 5, label: "Nuclear" }, + { id: 6, label: "Industrial" }, + { id: 7, label: "Chemical" }, + { id: 8, label: "Agricultural" }, + { id: 9, label: "Electrical" }, +]; + +export const itemsWithIcons: ComboBoxItem[] = [ + { id: 1, label: "Aerospace", icon: "galaxy" }, + { + id: 2, + label: "Mechanical", + icon: "automatic-gearbox", + }, + { id: 3, label: "Civil", icon: "circuit-ground" }, + { id: 4, label: "Biomedical", icon: "biohazard" }, + { id: 5, label: "Nuclear", icon: "atom" }, +]; diff --git a/app/client/packages/design-system/widgets/src/components/Select/src/Select.tsx b/app/client/packages/design-system/widgets/src/components/Select/src/Select.tsx index 50171e79909f..4a7b3c7342c0 100644 --- a/app/client/packages/design-system/widgets/src/components/Select/src/Select.tsx +++ b/app/client/packages/design-system/widgets/src/components/Select/src/Select.tsx @@ -1,19 +1,19 @@ -import React, { useRef } from "react"; -import clsx from "clsx"; +import { Icon, Label, Popover, Spinner, Text } from "@appsmith/wds"; import { getTypographyClassName } from "@appsmith/wds-theming"; +import clsx from "clsx"; +import React, { useRef } from "react"; import { Button, - ListBox, + FieldError, Select as HeadlessSelect, + ListBox, SelectValue, - FieldError, } from "react-aria-components"; -import { Text, Icon, Spinner, Popover, Label } from "@appsmith/wds"; import { ListBoxItem } from "./ListBoxItem"; import styles from "./styles.module.css"; import type { SelectProps } from "./types"; -export const Select = (props: SelectProps) => { +export const Select = (props: SelectProps) => { const { contextualHelp, description, @@ -53,7 +53,15 @@ export const Select = (props: SelectProps) => { styles.fieldValue, getTypographyClassName("body"), )} - /> + > + {({ defaultChildren, isPlaceholder }) => { + if (isPlaceholder) { + return props.placeholder; + } + + return defaultChildren; + }} + {!Boolean(isLoading) && } {Boolean(isLoading) && } diff --git a/app/client/packages/design-system/widgets/src/components/Select/src/index.ts b/app/client/packages/design-system/widgets/src/components/Select/src/index.ts index b6e8a07c267f..b252bd3f677f 100644 --- a/app/client/packages/design-system/widgets/src/components/Select/src/index.ts +++ b/app/client/packages/design-system/widgets/src/components/Select/src/index.ts @@ -1 +1,2 @@ export * from "./Select"; +export type { SelectProps } from "./types"; diff --git a/app/client/packages/design-system/widgets/src/components/Select/src/styles.module.css b/app/client/packages/design-system/widgets/src/components/Select/src/styles.module.css index 75f563e2eb37..10412f1d14a5 100644 --- a/app/client/packages/design-system/widgets/src/components/Select/src/styles.module.css +++ b/app/client/packages/design-system/widgets/src/components/Select/src/styles.module.css @@ -8,6 +8,7 @@ display: flex; position: relative; padding: 0; + height: var(--sizing-9); border: none; align-items: center; border-radius: var(--border-radius-elevation-3); @@ -43,7 +44,7 @@ .textField [data-icon] { position: absolute; - right: var(--inner-spacing-2); + right: var(--inner-spacing-1); } .necessityIndicator { @@ -66,6 +67,10 @@ flex: 1; } +.fieldValue[data-placeholder] { + color: var(--color-fg-neutral-subtle); +} + .fieldValue [data-icon] { display: none; } diff --git a/app/client/packages/design-system/widgets/src/components/Select/src/types.ts b/app/client/packages/design-system/widgets/src/components/Select/src/types.ts index c3220aa5b057..4e88e56cac31 100644 --- a/app/client/packages/design-system/widgets/src/components/Select/src/types.ts +++ b/app/client/packages/design-system/widgets/src/components/Select/src/types.ts @@ -5,10 +5,10 @@ import type { } from "react-aria-components"; import type { IconProps, SIZES } from "@appsmith/wds"; -export interface SelectProps - extends Omit, "slot"> { +export interface SelectProps + extends Omit, "slot"> { /** Item objects in the collection. */ - items: Iterable; + items: SelectItem[]; /** The content to display as the label. */ label?: string; /** The content to display as the description. */ diff --git a/app/client/packages/design-system/widgets/src/index.ts b/app/client/packages/design-system/widgets/src/index.ts index deb079b73425..44d2c44100cd 100644 --- a/app/client/packages/design-system/widgets/src/index.ts +++ b/app/client/packages/design-system/widgets/src/index.ts @@ -3,6 +3,7 @@ export * from "./components/Icon"; export * from "./components/Button"; export * from "./components/IconButton"; export * from "./components/Checkbox"; +export * from "./components/ComboBox"; export * from "./components/Text"; export * from "./components/ToggleGroup"; export * from "./components/Tooltip"; diff --git a/app/client/packages/eslint-plugin/package.json b/app/client/packages/eslint-plugin/package.json index 46f1726ebec2..389406b120b1 100644 --- a/app/client/packages/eslint-plugin/package.json +++ b/app/client/packages/eslint-plugin/package.json @@ -11,4 +11,4 @@ "postinstall": "yarn build", "test:unit": "yarn g:jest" } -} \ No newline at end of file +} diff --git a/app/client/packages/icons/src/components/Icons/ComboboxSelectIcon.tsx b/app/client/packages/icons/src/components/Icons/ComboboxSelectIcon.tsx new file mode 100644 index 000000000000..97516278935e --- /dev/null +++ b/app/client/packages/icons/src/components/Icons/ComboboxSelectIcon.tsx @@ -0,0 +1,2 @@ +import React from "react"; +export const ComboboxSelectIcon = () => ; diff --git a/app/client/packages/icons/src/components/Thumbnails/ComboboxSelectThumbnail.tsx b/app/client/packages/icons/src/components/Thumbnails/ComboboxSelectThumbnail.tsx new file mode 100644 index 000000000000..fbf23f8b14d4 --- /dev/null +++ b/app/client/packages/icons/src/components/Thumbnails/ComboboxSelectThumbnail.tsx @@ -0,0 +1,2 @@ +import React from "react"; +export const ComboboxSelectThumbnail = () => ; diff --git a/app/client/packages/icons/src/icons/Icons/ComboboxSelect.svg b/app/client/packages/icons/src/icons/Icons/ComboboxSelect.svg new file mode 100644 index 000000000000..3c6cf838139c --- /dev/null +++ b/app/client/packages/icons/src/icons/Icons/ComboboxSelect.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/client/packages/icons/src/icons/Thumbnails/ComboboxSelect.svg b/app/client/packages/icons/src/icons/Thumbnails/ComboboxSelect.svg new file mode 100644 index 000000000000..b67b64f9d2af --- /dev/null +++ b/app/client/packages/icons/src/icons/Thumbnails/ComboboxSelect.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/client/packages/icons/src/index.ts b/app/client/packages/icons/src/index.ts index dba7f48ff6b1..cba21a55375a 100644 --- a/app/client/packages/icons/src/index.ts +++ b/app/client/packages/icons/src/index.ts @@ -1,6 +1,7 @@ export { ButtonThumbnail } from "./components/Thumbnails/ButtonThumbnail"; export { CheckboxGroupThumbnail } from "./components/Thumbnails/CheckboxGroupThumbnail"; export { CheckboxThumbnail } from "./components/Thumbnails/CheckboxThumbnail"; +export { ComboboxSelectThumbnail } from "./components/Thumbnails/ComboboxSelectThumbnail"; export { CurrencyInputThumbnail } from "./components/Thumbnails/CurrencyInputThumbnail"; export { EmailInputThumbnail } from "./components/Thumbnails/EmailInputThumbnail"; export { HeadingThumbnail } from "./components/Thumbnails/HeadingThumbnail"; @@ -27,6 +28,7 @@ export { ZoneThumbnail } from "./components/Thumbnails/ZoneThumbnail"; export { ButtonIcon } from "./components/Icons/ButtonIcon"; export { CheckboxGroupIcon } from "./components/Icons/CheckboxGroupIcon"; export { CheckboxIcon } from "./components/Icons/CheckboxIcon"; +export { ComboboxSelectIcon } from "./components/Icons/ComboboxSelectIcon"; export { CurrencyInputIcon } from "./components/Icons/CurrencyInputIcon"; export { EmailInputIcon } from "./components/Icons/EmailInputIcon"; export { HeadingIcon } from "./components/Icons/HeadingIcon"; diff --git a/app/client/packages/icons/src/stories/Icons.mdx b/app/client/packages/icons/src/stories/Icons.mdx index dba05e9f1ddc..4641a0ee4927 100644 --- a/app/client/packages/icons/src/stories/Icons.mdx +++ b/app/client/packages/icons/src/stories/Icons.mdx @@ -3,6 +3,7 @@ import { Flex } from "@appsmith/wds"; import { ButtonIcon } from "../components/Icons/ButtonIcon"; import { CheckboxGroupIcon } from "../components/Icons/CheckboxGroupIcon"; import { CheckboxIcon } from "../components/Icons/CheckboxIcon"; +import { ComboboxSelectIcon } from "../components/Icons/ComboboxSelectIcon"; import { CurrencyInputIcon } from "../components/Icons/CurrencyInputIcon"; import { EmailInputIcon } from "../components/Icons/EmailInputIcon"; import { HeadingIcon } from "../components/Icons/HeadingIcon"; @@ -38,6 +39,7 @@ export const Icons = () => { + diff --git a/app/client/packages/icons/src/stories/Thumbnails.mdx b/app/client/packages/icons/src/stories/Thumbnails.mdx index e3a7a1f92380..d05e30565d97 100644 --- a/app/client/packages/icons/src/stories/Thumbnails.mdx +++ b/app/client/packages/icons/src/stories/Thumbnails.mdx @@ -3,6 +3,7 @@ import { Flex } from "@appsmith/wds"; import { ButtonThumbnail } from "../components/Thumbnails/ButtonThumbnail"; import { CheckboxGroupThumbnail } from "../components/Thumbnails/CheckboxGroupThumbnail"; import { CheckboxThumbnail } from "../components/Thumbnails/CheckboxThumbnail"; +import { ComboboxSelectThumbnail } from "../components/Thumbnails/ComboboxSelectThumbnail"; import { CurrencyInputThumbnail } from "../components/Thumbnails/CurrencyInputThumbnail"; import { EmailInputThumbnail } from "../components/Thumbnails/EmailInputThumbnail"; import { HeadingThumbnail } from "../components/Thumbnails/HeadingThumbnail"; @@ -39,6 +40,7 @@ export const Icons = () => { + diff --git a/app/client/src/Datasource/components/ReconnectDatasourceForm.tsx b/app/client/src/Datasource/components/ReconnectDatasourceForm.tsx new file mode 100644 index 000000000000..fa047882d8d0 --- /dev/null +++ b/app/client/src/Datasource/components/ReconnectDatasourceForm.tsx @@ -0,0 +1,25 @@ +import React from "react"; +import DatasourceEditor from "pages/Editor/DataSourceEditor"; + +interface ReconnectDatasourceFormProps { + applicationId: string | null; + datasourceId: string | null; + pageId: string | null; +} + +function ReconnectDatasourceForm(props: ReconnectDatasourceFormProps) { + const { applicationId, datasourceId, pageId } = props; + + return ( + + ); +} + +export default ReconnectDatasourceForm; diff --git a/app/client/src/IDE/Components/BottomView.tsx b/app/client/src/IDE/Components/BottomView.tsx index 022a4fe89adc..89470b86130d 100644 --- a/app/client/src/IDE/Components/BottomView.tsx +++ b/app/client/src/IDE/Components/BottomView.tsx @@ -6,6 +6,7 @@ import Resizer, { import { CodeEditorWithGutterStyles } from "pages/Editor/JSEditor/styledComponents"; import { ViewDisplayMode, ViewHideBehaviour } from "IDE/Interfaces/View"; import { Button } from "@appsmith/ads"; +import classNames from "classnames"; const VIEW_MIN_HEIGHT = 38; @@ -112,6 +113,7 @@ const ViewHide = (props: ViewHideProps) => { const BottomView = (props: Props) => { const panelRef = useRef(null); + const { className = "" } = props; // Handle the height of the view when toggling the hidden state useEffect(() => { @@ -126,7 +128,10 @@ const BottomView = (props: Props) => { return ( diff --git a/app/client/src/IDE/Structure/Header.tsx b/app/client/src/IDE/Structure/Header.tsx index 53de646437b7..14e8917a9567 100644 --- a/app/client/src/IDE/Structure/Header.tsx +++ b/app/client/src/IDE/Structure/Header.tsx @@ -1,6 +1,7 @@ import React from "react"; import { Divider, Flex } from "@appsmith/ads"; import { AppsmithLink } from "pages/Editor/AppsmithLink"; +import { IDE_HEADER_HEIGHT } from "./constants"; interface ChildrenProps { children: React.ReactNode | React.ReactNode[]; @@ -59,7 +60,7 @@ const Header = (props: ChildrenProps) => { alignItems="center" border="1px solid var(--ads-v2-color-border)" className="t--editor-header" - height="40px" + height={IDE_HEADER_HEIGHT + "px"} overflow="hidden" width="100%" > diff --git a/app/client/src/IDE/Structure/constants.ts b/app/client/src/IDE/Structure/constants.ts new file mode 100644 index 000000000000..2690fc4609df --- /dev/null +++ b/app/client/src/IDE/Structure/constants.ts @@ -0,0 +1 @@ +export const IDE_HEADER_HEIGHT = 40; diff --git a/app/client/src/IDE/index.ts b/app/client/src/IDE/index.ts index 0b765da22cea..8a12a855b8ec 100644 --- a/app/client/src/IDE/index.ts +++ b/app/client/src/IDE/index.ts @@ -9,6 +9,7 @@ * These are composable components that you can use to spread the content of the header * It is possible to use the IDE Header without using these subsections */ +export { IDE_HEADER_HEIGHT } from "./Structure/constants"; export { default as IDEHeader } from "./Structure/Header"; /* ==================================================== diff --git a/app/client/src/PluginActionEditor/PluginActionContext.tsx b/app/client/src/PluginActionEditor/PluginActionContext.tsx new file mode 100644 index 000000000000..0b99f9dc363d --- /dev/null +++ b/app/client/src/PluginActionEditor/PluginActionContext.tsx @@ -0,0 +1,62 @@ +import React, { + type ReactNode, + createContext, + useContext, + useMemo, +} from "react"; +import type { Action } from "entities/Action"; +import type { Plugin } from "api/PluginApi"; +import type { Datasource } from "entities/Datasource"; + +interface PluginActionContextType { + action: Action; + editorConfig: unknown[]; + settingsConfig: unknown[]; + plugin: Plugin; + datasource?: Datasource; +} + +// No need to export this context to use it. Use the hook defined below instead +const PluginActionContext = createContext(null); + +interface ChildrenProps { + children: ReactNode[]; +} + +export const PluginActionContextProvider = ( + props: ChildrenProps & PluginActionContextType, +) => { + const { action, children, datasource, editorConfig, plugin, settingsConfig } = + props; + + // using useMemo to avoid unnecessary renders + const contextValue = useMemo( + () => ({ + action, + datasource, + editorConfig, + plugin, + settingsConfig, + }), + [action, datasource, editorConfig, plugin, settingsConfig], + ); + + return ( + + {children} + + ); +}; + +// By using this hook, you are guaranteed that the states are correctly +// typed and set. +// Without this, consumers of the context would need to keep doing a null check +export const usePluginActionContext = () => { + const context = useContext(PluginActionContext); + if (!context) { + throw new Error( + "usePluginActionContext must be used within usePluginActionContextProvider", + ); + } + return context; +}; diff --git a/app/client/src/PluginActionEditor/PluginActionEditor.tsx b/app/client/src/PluginActionEditor/PluginActionEditor.tsx new file mode 100644 index 000000000000..d8e480403064 --- /dev/null +++ b/app/client/src/PluginActionEditor/PluginActionEditor.tsx @@ -0,0 +1,89 @@ +import React from "react"; +import { useLocation } from "react-router"; +import { identifyEntityFromPath } from "../navigation/FocusEntity"; +import { useSelector } from "react-redux"; +import { + getActionByBaseId, + getDatasource, + getEditorConfig, + getPlugin, + getPluginSettingConfigs, +} from "ee/selectors/entitiesSelector"; +import { PluginActionContextProvider } from "./PluginActionContext"; +import { get } from "lodash"; +import EntityNotFoundPane from "pages/Editor/EntityNotFoundPane"; +import { getIsEditorInitialized } from "selectors/editorSelectors"; +import Spinner from "components/editorComponents/Spinner"; +import CenteredWrapper from "components/designSystems/appsmith/CenteredWrapper"; +import { Text } from "@appsmith/ads"; + +interface ChildrenProps { + children: React.ReactNode[]; +} + +const PluginActionEditor = (props: ChildrenProps) => { + const { pathname } = useLocation(); + + const isEditorInitialized = useSelector(getIsEditorInitialized); + + const entity = identifyEntityFromPath(pathname); + const action = useSelector((state) => getActionByBaseId(state, entity.id)); + + const pluginId = get(action, "pluginId", ""); + const plugin = useSelector((state) => getPlugin(state, pluginId)); + + const datasourceId = get(action, "datasource.id", ""); + const datasource = useSelector((state) => getDatasource(state, datasourceId)); + + const settingsConfig = useSelector((state) => + getPluginSettingConfigs(state, pluginId), + ); + + const editorConfig = useSelector((state) => getEditorConfig(state, pluginId)); + + if (!isEditorInitialized) { + return ( + + + + ); + } + + if (!action) { + return ; + } + + if (!plugin) { + return ( + + + Plugin not installed! + + + ); + } + + if (!settingsConfig || !editorConfig) { + return ( + + + Editor config not found! + + + ); + } + + return ( + + {props.children} + + ); +}; + +export default PluginActionEditor; diff --git a/app/client/src/PluginActionEditor/components/PluginActionForm/PluginActionForm.tsx b/app/client/src/PluginActionEditor/components/PluginActionForm/PluginActionForm.tsx new file mode 100644 index 000000000000..17db33e698a3 --- /dev/null +++ b/app/client/src/PluginActionEditor/components/PluginActionForm/PluginActionForm.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +const PluginActionForm = () => { + return
; +}; + +export default PluginActionForm; diff --git a/app/client/src/PluginActionEditor/components/PluginActionForm/index.ts b/app/client/src/PluginActionEditor/components/PluginActionForm/index.ts new file mode 100644 index 000000000000..bb106d466ee2 --- /dev/null +++ b/app/client/src/PluginActionEditor/components/PluginActionForm/index.ts @@ -0,0 +1 @@ +export { default } from "./PluginActionForm"; diff --git a/app/client/src/PluginActionEditor/components/PluginActionResponsePane.tsx b/app/client/src/PluginActionEditor/components/PluginActionResponsePane.tsx new file mode 100644 index 000000000000..5a0be861970c --- /dev/null +++ b/app/client/src/PluginActionEditor/components/PluginActionResponsePane.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +const PluginActionResponsePane = () => { + return
; +}; + +export default PluginActionResponsePane; diff --git a/app/client/src/PluginActionEditor/components/PluginActionToolbar.tsx b/app/client/src/PluginActionEditor/components/PluginActionToolbar.tsx new file mode 100644 index 000000000000..64542de3c66f --- /dev/null +++ b/app/client/src/PluginActionEditor/components/PluginActionToolbar.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +const PluginActionToolbar = () => { + return
; +}; + +export default PluginActionToolbar; diff --git a/app/client/src/PluginActionEditor/index.ts b/app/client/src/PluginActionEditor/index.ts new file mode 100644 index 000000000000..0a58d00bdaae --- /dev/null +++ b/app/client/src/PluginActionEditor/index.ts @@ -0,0 +1,8 @@ +export { default as PluginActionEditor } from "./PluginActionEditor"; +export { + PluginActionContextProvider, + usePluginActionContext, +} from "./PluginActionContext"; +export { default as PluginActionToolbar } from "./components/PluginActionToolbar"; +export { default as PluginActionForm } from "./components/PluginActionForm"; +export { default as PluginActionResponsePane } from "./components/PluginActionResponsePane"; diff --git a/app/client/src/actions/jsActionActions.ts b/app/client/src/actions/jsActionActions.ts index 00a11cd6189e..19caef697dd7 100644 --- a/app/client/src/actions/jsActionActions.ts +++ b/app/client/src/actions/jsActionActions.ts @@ -8,6 +8,7 @@ import type { JSCollection } from "entities/JSCollection"; import type { CreateJSCollectionRequest } from "ee/api/JSActionAPI"; import type { EventLocation } from "ee/utils/analyticsUtilTypes"; import type { ApiResponse } from "api/ApiResponses"; +import type { ErrorActionPayload } from "../sagas/ErrorSagas"; export interface FetchJSCollectionsPayload { applicationId: string; @@ -62,10 +63,12 @@ export const copyJSCollectionSuccess = (payload: JSCollection) => { }; }; -export const copyJSCollectionError = (payload: { - id: string; - destinationPageId: string; -}) => { +export const copyJSCollectionError = ( + payload: { + id: string; + destinationPageId: string; + } & ErrorActionPayload, +) => { return { type: ReduxActionErrorTypes.COPY_JS_ACTION_ERROR, payload, @@ -90,10 +93,12 @@ export const moveJSCollectionSuccess = (payload: JSCollection) => { }; }; -export const moveJSCollectionError = (payload: { - id: string; - originalPageId: string; -}) => { +export const moveJSCollectionError = ( + payload: { + id: string; + originalPageId: string; + } & ErrorActionPayload, +) => { return { type: ReduxActionErrorTypes.MOVE_JS_ACTION_ERROR, payload, diff --git a/app/client/src/actions/pageActions.tsx b/app/client/src/actions/pageActions.tsx index 003d0aa20a64..f4e1a78b71ae 100644 --- a/app/client/src/actions/pageActions.tsx +++ b/app/client/src/actions/pageActions.tsx @@ -72,6 +72,10 @@ export interface FetchPublishedPageActionPayload { pageWithMigratedDsl?: FetchPageResponse; } +export interface FetchPublishedPageResourcesPayload { + pageId: string; +} + export const fetchPublishedPageAction = ( pageId: string, bustCache = false, @@ -290,6 +294,17 @@ export const clonePageSuccess = ({ }; }; +// Fetches resources required for published page, currently only used for fetching actions +// In future we can reuse this for fetching other page level resources in published mode +export const fetchPublishedPageResourcesAction = ( + pageId: string, +): ReduxAction => ({ + type: ReduxActionTypes.FETCH_PUBLISHED_PAGE_RESOURCES_INIT, + payload: { + pageId, + }, +}); + // update a page export interface UpdatePageActionPayload { diff --git a/app/client/src/actions/pluginActionActions.ts b/app/client/src/actions/pluginActionActions.ts index 611beaaa4d01..81a0edf9d06e 100644 --- a/app/client/src/actions/pluginActionActions.ts +++ b/app/client/src/actions/pluginActionActions.ts @@ -15,6 +15,7 @@ import type { ModalInfo } from "reducers/uiReducers/modalActionReducer"; import type { OtlpSpan } from "UITelemetry/generateTraces"; import type { ApiResponse } from "api/ApiResponses"; import type { JSCollection } from "entities/JSCollection"; +import type { ErrorActionPayload } from "sagas/ErrorSagas"; export const createActionRequest = (payload: Partial) => { return { @@ -205,10 +206,12 @@ export const moveActionSuccess = (payload: Action) => { }; }; -export const moveActionError = (payload: { - id: string; - originalPageId: string; -}) => { +export const moveActionError = ( + payload: { + id: string; + originalPageId: string; + } & ErrorActionPayload, +) => { return { type: ReduxActionErrorTypes.MOVE_ACTION_ERROR, payload, @@ -233,10 +236,12 @@ export const copyActionSuccess = (payload: Action) => { }; }; -export const copyActionError = (payload: { - id: string; - destinationPageId: string; -}) => { +export const copyActionError = ( + payload: { + id: string; + destinationPageId: string; + } & ErrorActionPayload, +) => { return { type: ReduxActionErrorTypes.COPY_ACTION_ERROR, payload, diff --git a/app/client/src/ce/constants/ReduxActionConstants.tsx b/app/client/src/ce/constants/ReduxActionConstants.tsx index e3c5510381f8..0fc6287c4c4e 100644 --- a/app/client/src/ce/constants/ReduxActionConstants.tsx +++ b/app/client/src/ce/constants/ReduxActionConstants.tsx @@ -368,7 +368,6 @@ const UserAuthActionTypes = { SAAS_GET_OAUTH_ACCESS_TOKEN: "SAAS_GET_OAUTH_ACCESS_TOKEN", GET_OAUTH_ACCESS_TOKEN: "GET_OAUTH_ACCESS_TOKEN", GET_OAUTH_ACCESS_TOKEN_SUCCESS: "GET_OAUTH_ACCESS_TOKEN_SUCCESS", - GET_OAUTH_ACCESS_TOKEN_ERROR: "GET_OAUTH_ACCESS_TOKEN_ERROR", }; const UserAuthActionErrorTypes = { CREATE_USER_ERROR: "CREATE_USER_ERROR", @@ -379,6 +378,7 @@ const UserAuthActionErrorTypes = { LOGOUT_USER_ERROR: "LOGOUT_USER_ERROR", VERIFY_INVITE_ERROR: "VERIFY_INVITE_ERROR", INVITED_USER_SIGNUP_ERROR: "INVITED_USER_SIGNUP_ERROR", + GET_OAUTH_ACCESS_TOKEN_ERROR: "GET_OAUTH_ACCESS_TOKEN_ERROR", }; const UserProfileActionTypes = { @@ -980,6 +980,7 @@ const AppViewActionTypes = { FETCH_JS_ACTIONS_VIEW_MODE_SUCCESS: "FETCH_JS_ACTIONS_VIEW_MODE_SUCCESS", SET_APP_VIEWER_HEADER_HEIGHT: "SET_APP_VIEWER_HEADER_HEIGHT", SET_APP_SIDEBAR_PINNED: "SET_APP_SIDEBAR_PINNED", + FETCH_PUBLISHED_PAGE_RESOURCES_INIT: "FETCH_PUBLISHED_PAGE_RESOURCES_INIT", }; const AppViewActionErrorTypes = { @@ -988,6 +989,7 @@ const AppViewActionErrorTypes = { PUBLISH_APPLICATION_ERROR: "PUBLISH_APPLICATION_ERROR", FETCH_ACTIONS_VIEW_MODE_ERROR: "FETCH_ACTION_VIEW_MODE_ERROR", FETCH_JS_ACTIONS_VIEW_MODE_ERROR: "FETCH_JS_ACTIONS_VIEW_MODE_ERROR", + FETCH_PUBLISHED_PAGE_RESOURCES_ERROR: "FETCH_PUBLISHED_PAGE_RESOURCES_ERROR", }; const WorkspaceActionTypes = { @@ -1334,6 +1336,20 @@ export const ReduxActionErrorTypes = { ...WorkspaceActionErrorTypes, }; +export const toastMessageErrorTypes = { + ...AdminSettingsActionErrorTypes, + ...ApplicationActionErrorTypes, + ...AppViewActionErrorTypes, + ...DatasourceEditorActionErrorTypes, + ...GitActionErrorTypes, + ...ImportExportActionErrorTypes, + ...PlatformActionErrorTypes, + ...TenantActionErrorTypes, + ...UserAuthActionErrorTypes, + ...UserProfileActionErrorTypes, + ...WorkspaceActionErrorTypes, +}; + export type ReduxActionErrorType = (typeof ReduxActionErrorTypes)[keyof typeof ReduxActionErrorTypes]; diff --git a/app/client/src/ce/constants/messages.ts b/app/client/src/ce/constants/messages.ts index 7de903836a11..8407a185902a 100644 --- a/app/client/src/ce/constants/messages.ts +++ b/app/client/src/ce/constants/messages.ts @@ -364,8 +364,8 @@ export const DATASOURCE_UPDATE = (dsName: string) => `${dsName} datasource updated successfully`; export const DATASOURCE_VALID = (dsName: string) => `${dsName} datasource is valid`; -export const EDIT_DATASOURCE = () => "Edit datasource"; -export const SAVE_DATASOURCE = () => "Save as datasource"; +export const EDIT_DATASOURCE = () => "Edit"; +export const SAVE_DATASOURCE = () => "Save"; export const SAVE_DATASOURCE_MESSAGE = () => "Save the URL as a datasource to access authentication settings"; export const EDIT_DATASOURCE_MESSAGE = () => diff --git a/app/client/src/ce/entities/FeatureFlag.ts b/app/client/src/ce/entities/FeatureFlag.ts index 6deb49556d88..69ac4b7e9c60 100644 --- a/app/client/src/ce/entities/FeatureFlag.ts +++ b/app/client/src/ce/entities/FeatureFlag.ts @@ -45,6 +45,7 @@ export const FEATURE_FLAG = { "ab_learnability_discoverability_collapse_all_except_data_enabled", release_layout_conversion_enabled: "release_layout_conversion_enabled", release_anvil_toggle_enabled: "release_anvil_toggle_enabled", + release_ide_animations_enabled: "release_ide_animations_enabled", } as const; export type FeatureFlag = keyof typeof FEATURE_FLAG; @@ -82,6 +83,7 @@ export const DEFAULT_FEATURE_FLAG_VALUE: FeatureFlags = { ab_learnability_discoverability_collapse_all_except_data_enabled: true, release_layout_conversion_enabled: false, release_anvil_toggle_enabled: false, + release_ide_animations_enabled: false, }; export const AB_TESTING_EVENT_KEYS = { diff --git a/app/client/src/ce/pages/Editor/AppPluginActionEditor/AppPluginActionEditor.tsx b/app/client/src/ce/pages/Editor/AppPluginActionEditor/AppPluginActionEditor.tsx new file mode 100644 index 000000000000..6ed514390c08 --- /dev/null +++ b/app/client/src/ce/pages/Editor/AppPluginActionEditor/AppPluginActionEditor.tsx @@ -0,0 +1,19 @@ +import React from "react"; +import { + PluginActionEditor, + PluginActionToolbar, + PluginActionForm, + PluginActionResponsePane, +} from "PluginActionEditor"; + +const AppPluginActionEditor = () => { + return ( + + + + + + ); +}; + +export default AppPluginActionEditor; diff --git a/app/client/src/ce/pages/Editor/Explorer/helpers.tsx b/app/client/src/ce/pages/Editor/Explorer/helpers.tsx index 587f89bf6365..0a1baac42ea8 100644 --- a/app/client/src/ce/pages/Editor/Explorer/helpers.tsx +++ b/app/client/src/ce/pages/Editor/Explorer/helpers.tsx @@ -7,7 +7,9 @@ import { DATA_SOURCES_EDITOR_ID_PATH, matchBuilderPath, matchViewerPath, - BUILDER_VIEWER_PATH_PREFIX, + VIEWER_PATH, + VIEWER_CUSTOM_PATH, + VIEWER_PATH_DEPRECATED, } from "constants/routes"; import { @@ -80,11 +82,7 @@ export const getActionIdFromURL = () => { }; export function getAppViewerPageIdFromPath(path: string): string | null { - const regexes = [ - `${BUILDER_VIEWER_PATH_PREFIX}:applicationSlug/:pageSlug(.*\\-):basePageId`, // VIEWER_PATH - `${BUILDER_VIEWER_PATH_PREFIX}:customSlug(.*\\-):basePageId`, // VIEWER_CUSTOM_PATH - `/applications/:baseApplicationId/pages/:basePageId`, // VIEWER_PATH_DEPRECATED - ]; + const regexes = [VIEWER_PATH, VIEWER_CUSTOM_PATH, VIEWER_PATH_DEPRECATED]; for (const regex of regexes) { const match = matchPath<{ basePageId: string }>(path, { path: regex }); if (match?.params.basePageId) { diff --git a/app/client/src/ce/plugins/Linting/utils/getEntityUniqueIdForLogs.ts b/app/client/src/ce/plugins/Linting/utils/getEntityUniqueIdForLogs.ts index 414cb362e702..619de80cc864 100644 --- a/app/client/src/ce/plugins/Linting/utils/getEntityUniqueIdForLogs.ts +++ b/app/client/src/ce/plugins/Linting/utils/getEntityUniqueIdForLogs.ts @@ -1,4 +1,4 @@ -import type { JSActionEntity } from "ee/entities/DataTree/types"; +import type { JSActionEntity, WidgetEntity } from "ee/entities/DataTree/types"; import { ENTITY_TYPE } from "entities/DataTree/dataTreeFactory"; import type { DataTreeEntity } from "entities/DataTree/dataTreeTypes"; @@ -9,6 +9,9 @@ const entityUniqueIdGetterMap: Record< [ENTITY_TYPE.JSACTION]: (entity) => { return (entity as JSActionEntity).actionId; }, + [ENTITY_TYPE.WIDGET]: (entity) => { + return (entity as WidgetEntity).widgetId; + }, }; export default function getEntityUniqueIdForLogs(entity: DataTreeEntity) { diff --git a/app/client/src/ce/plugins/Linting/utils/isLintErrorLoggingEnabledForEntity.ts b/app/client/src/ce/plugins/Linting/utils/isLintErrorLoggingEnabledForEntity.ts index c5bad4b96ffc..15b205c76980 100644 --- a/app/client/src/ce/plugins/Linting/utils/isLintErrorLoggingEnabledForEntity.ts +++ b/app/client/src/ce/plugins/Linting/utils/isLintErrorLoggingEnabledForEntity.ts @@ -1,8 +1,16 @@ -import { isJSAction } from "ee/workers/Evaluation/evaluationUtils"; +import { isJSAction, isWidget } from "ee/workers/Evaluation/evaluationUtils"; import type { DataTreeEntity } from "entities/DataTree/dataTreeTypes"; +import type { DataTreeEntityConfig } from "ee/entities/DataTree/types"; export default function isLintErrorLoggingEnabledForEntity( entity: DataTreeEntity, + propertyPath: string, + config: DataTreeEntityConfig, ) { - return isJSAction(entity); + if (isJSAction(entity)) { + return true; + } + if (isWidget(entity)) { + return !(propertyPath in config.reactivePaths); + } } diff --git a/app/client/src/ce/sagas/ApplicationSagas.tsx b/app/client/src/ce/sagas/ApplicationSagas.tsx index e529199407b1..562c139376ef 100644 --- a/app/client/src/ce/sagas/ApplicationSagas.tsx +++ b/app/client/src/ce/sagas/ApplicationSagas.tsx @@ -234,11 +234,7 @@ export function* fetchAppAndPagesSaga( ) { try { const { pages, ...payload } = action.payload; - const request = { - applicationId: payload.applicationId, - pageId: payload.pageId, - mode: payload.mode, - }; + const request = { ...payload }; if (request.pageId && request.applicationId) { delete request.applicationId; } diff --git a/app/client/src/ce/sagas/JSActionSagas.ts b/app/client/src/ce/sagas/JSActionSagas.ts index a152a8acd29c..7c72f18b67c3 100644 --- a/app/client/src/ce/sagas/JSActionSagas.ts +++ b/app/client/src/ce/sagas/JSActionSagas.ts @@ -192,10 +192,15 @@ export function* copyJSCollectionSaga( } } catch (e) { const actionName = actionObject ? actionObject.name : ""; - toast.show(createMessage(ERROR_JS_ACTION_COPY_FAIL, actionName), { - kind: "error", - }); - yield put(copyJSCollectionError(action.payload)); + yield put( + copyJSCollectionError({ + ...action.payload, + show: true, + error: { + message: createMessage(ERROR_JS_ACTION_COPY_FAIL, actionName), + }, + }), + ); } } @@ -265,13 +270,14 @@ export function* moveJSCollectionSaga( // @ts-expect-error: response.data is of type unknown yield put(moveJSCollectionSuccess(response.data)); } catch (e) { - toast.show(createMessage(ERROR_JS_ACTION_MOVE_FAIL, actionObject.name), { - kind: "error", - }); yield put( moveJSCollectionError({ id: action.payload.id, originalPageId: actionObject.pageId, + show: true, + error: { + message: createMessage(ERROR_JS_ACTION_MOVE_FAIL, actionObject.name), + }, }), ); } @@ -375,15 +381,15 @@ export function* saveJSObjectName( payload: { actionId: action.payload.id, oldName: collection.config.name, + show: true, + error: { + message: createMessage( + ERROR_JS_COLLECTION_RENAME_FAIL, + action.payload.name, + ), + }, }, }); - toast.show( - createMessage(ERROR_JS_COLLECTION_RENAME_FAIL, action.payload.name), - { - kind: "error", - }, - ); - log.error(e); } } diff --git a/app/client/src/ce/sagas/PageSagas.tsx b/app/client/src/ce/sagas/PageSagas.tsx index c58237cc0156..decc911734cb 100644 --- a/app/client/src/ce/sagas/PageSagas.tsx +++ b/app/client/src/ce/sagas/PageSagas.tsx @@ -10,6 +10,7 @@ import type { DeletePageActionPayload, FetchPageActionPayload, FetchPublishedPageActionPayload, + FetchPublishedPageResourcesPayload, GenerateTemplatePageActionPayload, SetPageOrderActionPayload, SetupPageActionPayload, @@ -87,6 +88,7 @@ import { fetchActionsForPage, fetchActionsForPageError, fetchActionsForPageSuccess, + fetchActionsForView, setActionsToExecuteOnPageLoad, setJSActionsToExecuteOnPageLoad, } from "actions/pluginActionActions"; @@ -113,6 +115,7 @@ import { import WidgetFactory from "WidgetProvider/factory"; import { builderURL } from "ee/RouteBuilder"; import { failFastApiCalls, waitForWidgetConfigBuild } from "sagas/InitSagas"; +import { type InitConsolidatedApi } from "sagas/InitSagas"; import { resizePublishedMainCanvasToLowestWidget } from "sagas/WidgetOperationUtils"; import { checkAndLogErrorsIfCyclicDependency, @@ -146,6 +149,7 @@ import type { LayoutSystemTypes } from "layoutSystems/types"; import { getIsAnvilLayout } from "layoutSystems/anvil/integrations/selectors"; import { convertToBasePageIdSelector } from "selectors/pageListSelectors"; import type { Page } from "entities/Page"; +import ConsolidatedPageLoadApi from "api/ConsolidatedPageLoadApi"; export const checkIfMigrationIsNeeded = ( fetchPageResponse?: FetchPageResponse, @@ -378,6 +382,43 @@ export function* fetchPublishedPageSaga( } } +export function* fetchPublishedPageResourcesSaga( + action: ReduxAction, +) { + try { + const { pageId } = action.payload; + + const params = { defaultPageId: pageId }; + const initConsolidatedApiResponse: ApiResponse = + yield ConsolidatedPageLoadApi.getConsolidatedPageLoadDataView(params); + + const isValidResponse: boolean = yield validateResponse( + initConsolidatedApiResponse, + ); + const response: InitConsolidatedApi | undefined = + initConsolidatedApiResponse.data; + + if (isValidResponse) { + // We need to recall consolidated view API in order to fetch actions when page is switched + // As in the first call only actions of the current page are fetched + // In future, we can reuse this saga to fetch other resources of the page like actionCollections etc + const { publishedActions } = response; + + // Sending applicationId as empty as we have publishedActions present, + // it won't call the actions view api with applicationId + yield put(fetchActionsForView({ applicationId: "", publishedActions })); + yield put(fetchAllPageEntityCompletion([executePageLoadActions()])); + } + } catch (error) { + yield put({ + type: ReduxActionErrorTypes.FETCH_PUBLISHED_PAGE_RESOURCES_ERROR, + payload: { + error, + }, + }); + } +} + export function* fetchAllPublishedPagesSaga() { try { const pageIdentities: { pageId: string; basePageId: string }[] = diff --git a/app/client/src/ce/utils/workflowHelpers.ts b/app/client/src/ce/utils/workflowHelpers.ts index b7f05145a5e5..63cdcdf4d149 100644 --- a/app/client/src/ce/utils/workflowHelpers.ts +++ b/app/client/src/ce/utils/workflowHelpers.ts @@ -1,3 +1,10 @@ export const useWorkflowOptions = () => { return []; }; + +// We don't want to show the create new JS object option if the user is in the workflow editor +// this is done since worflows runner doesn't support multiple JS objects +// TODO: Remove this once workflows can support multiple JS objects +export const checkIfJSObjectCreationAllowed = () => { + return false; +}; diff --git a/app/client/src/components/AnimatedGridLayout/components/LayoutArea/LayoutArea.tsx b/app/client/src/components/AnimatedGridLayout/components/LayoutArea/LayoutArea.tsx index bbf8d0da44ed..f646eef03023 100644 --- a/app/client/src/components/AnimatedGridLayout/components/LayoutArea/LayoutArea.tsx +++ b/app/client/src/components/AnimatedGridLayout/components/LayoutArea/LayoutArea.tsx @@ -41,7 +41,7 @@ export function LayoutArea(props: LayoutAreaProps) { >
props.theme.bottomBarHeight}; + height: ${BOTTOM_BAR_HEIGHT}px; display: flex; position: fixed; justify-content: space-between; diff --git a/app/client/src/components/BottomBar/constants.ts b/app/client/src/components/BottomBar/constants.ts new file mode 100644 index 000000000000..9a46200fb9dd --- /dev/null +++ b/app/client/src/components/BottomBar/constants.ts @@ -0,0 +1 @@ +export const BOTTOM_BAR_HEIGHT = 37; diff --git a/app/client/src/components/BottomBar/index.tsx b/app/client/src/components/BottomBar/index.tsx index 1c358dc6ec87..c40dbca3fc34 100644 --- a/app/client/src/components/BottomBar/index.tsx +++ b/app/client/src/components/BottomBar/index.tsx @@ -7,14 +7,18 @@ import { Button } from "@appsmith/ads"; import SwitchEnvironment from "ee/components/SwitchEnvironment"; import { Container, Wrapper } from "./components"; import { useSelector } from "react-redux"; -import { getCurrentApplicationId } from "selectors/editorSelectors"; +import { + getCurrentApplicationId, + previewModeSelector, +} from "selectors/editorSelectors"; import { useDispatch } from "react-redux"; import { softRefreshActions } from "actions/pluginActionActions"; import { START_SWITCH_ENVIRONMENT } from "ee/constants/messages"; import { getIsAnvilEnabledInCurrentApplication } from "layoutSystems/anvil/integrations/selectors"; -export default function BottomBar({ viewMode }: { viewMode: boolean }) { +export default function BottomBar() { const appId = useSelector(getCurrentApplicationId) || ""; + const isPreviewMode = useSelector(previewModeSelector); const dispatch = useDispatch(); // We check if the current application is an Anvil application. // If it is an Anvil application, we remove the Git features from the bottomBar @@ -28,17 +32,17 @@ export default function BottomBar({ viewMode }: { viewMode: boolean }) { return ( - {!viewMode && ( + {!isPreviewMode && ( )} - {!viewMode && !isAnvilEnabled && } + {!isPreviewMode && !isAnvilEnabled && } - {!viewMode && ( + {!isPreviewMode && (