diff --git a/.github/config.json b/.github/config.json
index b0884ca915..c870a771f6 100644
--- a/.github/config.json
+++ b/.github/config.json
@@ -1 +1 @@
-{"runners":[{"versioning":{"source":"milestones","type":"SemVer"},"prereleaseName":"alpha","issue":{"labels":{"Widget design system":{"conditions":[{"label":"App Theming","type":"hasLabel","value":true},{"label":"Widget Styling","type":"hasLabel","value":true},{"label":"Checkbox Group widget","type":"hasLabel","value":true},{"label":"Checkbox Widget","type":"hasLabel","value":true},{"label":"Checkbox Component","type":"hasLabel","value":true},{"label":"WDS team","type":"hasLabel","value":true}],"requires":1},"Performance Pod":{"conditions":[{"label":"Performance","type":"hasLabel","value":true},{"label":"Performance infra","type":"hasLabel","value":true}],"requires":1},"Billing & Usage Pod":{"conditions":[{"label":"BE Instance","type":"hasLabel","value":true},{"label":"CE Instance","type":"hasLabel","value":true},{"label":"Customer Portal","type":"hasLabel","value":true},{"label":"Cloud Services","type":"hasLabel","value":true},{"label":"Billing Integrations","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":"In-app ramps","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":"1-click upgrade","type":"hasLabel","value":true},{"label":"Appsmith Business Cloud","type":"hasLabel","value":true}],"requires":1},"Mobile Pod":{"conditions":[],"requires":1},"Git Pod":{"conditions":[{"label":"Git Version Control","type":"hasLabel","value":true},{"label":"Import-Export-App","type":"hasLabel","value":true}],"requires":1},"Integrations Pod":{"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":"REST API plugin","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}],"requires":1},"Data Platform Pod":{"conditions":[{"label":"Datasource Environments","type":"hasLabel","value":true},{"label":"Datatype issue","type":"hasLabel","value":true},{"label":"Entity Refactor","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":"SmartSubstitution","type":"hasLabel","value":true},{"label":"Query Generation","type":"hasLabel","value":true},{"label":"Query performance","type":"hasLabel","value":true},{"label":"Suggested Widgets","type":"hasLabel","value":true},{"label":"Page load executions","type":"hasLabel","value":true},{"label":"DSL Update","type":"hasLabel","value":true},{"label":"AST-backend","type":"hasLabel","value":true},{"label":"Deploy App","type":"hasLabel","value":true},{"label":"File upload issues","type":"hasLabel","value":true},{"label":"Datasources","type":"hasLabel","value":true},{"label":"DocumentDB","type":"hasLabel","value":true},{"label":"Multiple Environments","type":"hasLabel","value":true},{"label":"Platformization","type":"hasLabel","value":true},{"label":"Custom environments","type":"hasLabel","value":true}],"requires":1},"Design System Pod":{"conditions":[{"label":"Design System Pod","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}],"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}],"requires":1},"Team Managers Pod":{"conditions":[{"label":"Settings","type":"hasLabel","value":true},{"label":"Home Page","type":"hasLabel","value":true},{"label":"Invite users","type":"hasLabel","value":true},{"label":"Realtime Commenting","type":"hasLabel","value":true},{"label":"SSO","type":"hasLabel","value":true},{"label":"Multi User Realtime","type":"hasLabel","value":true},{"label":"RBAC","type":"hasLabel","value":true},{"label":"ABAC","type":"hasLabel","value":true},{"label":"Audit Logs","type":"hasLabel","value":true},{"label":"Multitenancy","type":"hasLabel","value":true},{"label":"Airgap","type":"hasLabel","value":true},{"label":"Enterprise Edition","type":"hasLabel","value":true},{"label":"SCIM","type":"hasLabel","value":true}],"requires":1},"New Developers Pod":{"conditions":[{"label":"Fork App","type":"hasLabel","value":true},{"label":"Omnibar","type":"hasLabel","value":true},{"label":"Onboarding","type":"hasLabel","value":true},{"label":"Telemetry","type":"hasLabel","value":true},{"label":"Entity Explorer","type":"hasLabel","value":true},{"label":"Generate Page","type":"hasLabel","value":true},{"label":"IDE","type":"hasLabel","value":true},{"label":"Sniping Mode","type":"hasLabel","value":true},{"label":"Example Apps","type":"hasLabel","value":true},{"label":"i18n","type":"hasLabel","value":true},{"label":"Welcome Screen","type":"hasLabel","value":true},{"label":"IDE Navigation","type":"hasLabel","value":true},{"label":"Login / Signup","type":"hasLabel","value":true},{"label":"Clean URLs","type":"hasLabel","value":true},{"label":"Embedding Apps","type":"hasLabel","value":true},{"label":"Feature Flagging","type":"hasLabel","value":true},{"label":"In App Comms","type":"hasLabel","value":true},{"label":"In App Comms","type":"hasLabel","value":true},{"label":"App setting","type":"hasLabel","value":true}],"requires":1},"BE Coders Pod":{"conditions":[{"label":"SAAS Plugins","type":"hasLabel","value":true},{"label":"SAAS Manager App","type":"hasLabel","value":true},{"label":"Data Platform Pod","type":"hasLabel","value":true},{"label":"Integrations Pod","type":"hasLabel","value":true}],"requires":1},"FE Coders Pod":{"conditions":[{"label":"JS Linting & Errors","type":"hasLabel","value":true},{"label":"Debugger","type":"hasLabel","value":true},{"label":"JS Snippets","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 Promises","type":"hasLabel","value":true},{"label":"JS Usability","type":"hasLabel","value":true},{"label":"Code Refactoring","type":"hasLabel","value":true},{"label":"storeValue","type":"hasLabel","value":true},{"label":"OnPageLoad","type":"hasLabel","value":true},{"label":"Framework Functions","type":"hasLabel","value":true},{"label":"Code Editor","type":"hasLabel","value":true},{"label":"JS Objects","type":"hasLabel","value":true},{"label":"JS Evaluation","type":"hasLabel","value":true},{"label":"AST-frontend","type":"hasLabel","value":true},{"label":"Custom JS Libraries","type":"hasLabel","value":true},{"label":"Action Selector","type":"hasLabel","value":true},{"label":"JS Function execution","type":"hasLabel","value":true},{"label":"Widget setter method","type":"hasLabel","value":true},{"label":"Error Handling","type":"hasLabel","value":true},{"label":"AI","type":"hasLabel","value":true}],"requires":1},"App Viewers Pod":{"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":"reallabel","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":"App Navigation","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":"Branding","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":"Widget design system","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}],"requires":1},"UI Builders Pod":{"conditions":[{"label":"Property Pane","type":"hasLabel","value":true},{"label":"Pages","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":"Canvas Zooms","type":"hasLabel","value":true},{"label":"Frontend Libraries Upgrade","type":"hasLabel","value":true},{"label":"Auto Height","type":"hasLabel","value":true},{"label":"Responsive Canvas","type":"hasLabel","value":true},{"label":"Responsive Widget","type":"hasLabel","value":true},{"label":"Responsive Viewport","type":"hasLabel","value":true},{"label":"Conversion Algorithm","type":"hasLabel","value":true},{"label":"Spacing","type":"hasLabel","value":true},{"label":"Browser specific","type":"hasLabel","value":true},{"label":"widget vertical alignment","type":"hasLabel","value":true},{"label":"Auto Layout","type":"hasLabel","value":true}],"requires":1},"User Education Pod":{"conditions":[{"label":"Content","type":"hasLabel","value":true},{"label":"Documentation","type":"hasLabel","value":true}],"requires":1},"Templates pod":{"conditions":[{"label":"Templates","type":"hasLabel","value":true},{"label":"Community template","type":"hasLabel","value":true},{"label":"Partial-import-export","type":"hasLabel","value":true}],"requires":1},"Error Handling":{"conditions":[],"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":"88054d","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":"e2ca68","name":"QA","description":""},"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":"9c0c8e","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"},"Settings":{"color":"f7ff60","name":"Settings","description":"organization, team & user settings"},"Fork App":{"color":"5369db","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":""},"Onboarding":{"color":"d5794b","name":"Onboarding","description":"Issues related to onboarding new developers"},"Pages":{"color":"d7fd80","name":"Pages","description":"Issues related to configuring pages"},"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"},"Widget Styling":{"color":"905420","name":"Widget Styling","description":"all about widget styling"},"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"},"App Viewers Pod":{"color":"cd8ef9","name":"App Viewers Pod","description":"This label assigns issues to the app viewers pod"},"Checkbox Widget":{"color":"88054d","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":"d73a4a","name":"Bug","description":"Something isn't working"},"Widget Validation":{"color":"6990BC","name":"Widget Validation","description":"Issues related to widget property validation"},"Generate Page":{"color":"f14274","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":""},"Team Managers Pod":{"color":"bddb81","name":"Team Managers Pod","description":"Issues that team managers care about for the security and efficiency of their teams"},"Import-Export-App":{"color":"15076d","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":"10b5ce","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":"771e69","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"},"Critical":{"color":"9b1b28","name":"Critical","description":"This issue needs immediate attention. Drop everything else"},"IDE":{"color":"61b2ee","name":"IDE","description":"Issues related to the IDE"},"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":"f28253","name":"TestGap","description":"Issues identified for test plan improvement"},"keyboard shortcut":{"color":"0688B6","name":"keyboard shortcut","description":""},"Git Version Control":{"color":"858172","name":"Git Version Control","description":"Issues related to version control"},"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":"a2e2f9","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},"Debugger":{"color":"e79062","name":"Debugger","description":"Issues related to the debugger"},"Quick effort":{"color":"95ED65","name":"Quick effort","description":"Something that'll take a few hours to build"},"Text Widget":{"color":"d130d1","name":"Text Widget","description":""},"Video Widget":{"color":"23dd4b","name":"Video Widget","description":""},"Datasources":{"color":"5052f6","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"},"UI Builders Pod":{"color":"517fba","name":"UI Builders Pod","description":"Issues that UI Builders face using appsmith"},"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"},"In App Comms":{"name":"In App Comms","description":"Issues around communication with appsmith instances","color":"463cca"},"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"},"BE Coders Pod":{"color":"5d9848","name":"BE Coders Pod","description":"Issues related to users writing code to fetch and update data"},"FE Coders Pod":{"color":"a7effc","name":"FE Coders Pod","description":"Issues related to users writing javascript in appsmith"},"New Developers Pod":{"color":"6310da","name":"New Developers Pod","description":"Issues that new developers face while exploring the IDE"},"Sniping Mode":{"name":"Sniping Mode","description":"Issues related to sniping mode","color":"6310da"},"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":"12b715"},"Responsive Viewport":{"color":"d12d2e","name":"Responsive Viewport","description":"Issues seen on different viewports like mobile"},"Widgets Pane":{"name":"Widgets Pane","description":"Issues related to the discovery and organisation of widgets","color":"ad5d78"},"Invite users":{"color":"1799b0","name":"Invite users","description":"Invite users flow and any associated actions"},"View Mode":{"color":"1799b0","name":"View Mode","description":"Issues related to the view mode"},"User Education Pod":{"name":"User Education Pod","description":"Issues related to user education","color":"1799b0"},"Content":{"name":"Content","description":"For content related topics i.e blogs, templates, videos","color":"a8dff7"},"Embedding Apps":{"name":"Embedding Apps","description":"Issues related to embedding","color":"26ef4f"},"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"},"REST API plugin":{"name":"REST API plugin","description":"REST API plugin 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":"ef9c9d"},"JS Promises":{"name":"JS Promises","description":"Issues related to promises","color":"d7771f"},"OnPageLoad":{"name":"OnPageLoad","description":"OnPageLoad issues on functions and queries","color":"50559d"},"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":"3897be"},"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"},"App Theming":{"name":"App Theming","description":"Items that are related to the App level theming controls epic","color":"905420"},"SSO":{"name":"SSO","description":"Issues, requests and enhancements around Single sign-on.","color":"bf019b"},"Multi User Realtime":{"name":"Multi User Realtime","description":"Issues related to multiple users using or editing an application","color":"e7b6ce"},"Templates":{"name":"Templates","description":"Issues related to templates","color":"b7e568"},"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"},"RBAC":{"name":"RBAC","description":"Issues, requests and enhancements around RBAC.","color":"9211c3"},"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"},"Tests":{"name":"Tests","description":"test item","color":"1c6990"},"DynamoDB":{"name":"DynamoDB","description":"Issues that are related to DynamoDB should have this label","color":"60885f"},"Design System Pod":{"name":"Design System Pod","description":"Appsmith design system related issues","color":"706f03"},"ABAC":{"color":"e009a5","name":"ABAC","description":"User permissions and access controls"},"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":"60885f"},"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":"bc0cba"},"Query performance":{"name":"Query performance","description":"Issues that have to do with lack in performance of query execution","color":"e4d966"},"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":"418fa4"},"Branding":{"name":"Branding","description":"All issues under branding and whitelabelling appsmith ecosystem","color":"7aaaf1"},"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"},"Audit Logs":{"name":"Audit Logs","description":"Audit trails to ensure data security","color":"f3fd62"},"MsSQL":{"name":"MsSQL","description":"Issues related to MsSQL plugin","color":"8078b0"},"Data Platform Pod":{"name":"Data Platform Pod","description":"Issues related to the underlying data platform","color":"3f8c3a"},"Integrations Pod":{"name":"Integrations Pod","description":"Issues related to a specific integration","color":"5dbbb1"},"Datasource Environments":{"name":"Datasource Environments","description":"Issues related to datasource environments","color":"bb7a14"},"Elastic Search":{"name":"Elastic Search","description":"Issues related to the elastic search datasource","color":"8078b0"},"Core Query Execution":{"color":"418fa4","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":"6a5b42"},"Query Settings":{"name":"Query Settings","description":"Issues related to the settings of all queries","color":"c7da7a"},"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":"e4d966"},"Query Generation":{"name":"Query Generation","description":"Issues related to query generation","color":"e4d966"},"Suggested Widgets":{"name":"Suggested Widgets","description":"Issues related to suggesting widgets based on query response","color":"e4d966"},"Page load executions":{"name":"Page load executions","description":"Issues related to page load execution","color":"5696b2"},"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"},"Git Pod":{"name":"Git Pod","description":"Anything related to git sync","color":"2e5ba4"},"Mobile Pod":{"name":"Mobile Pod","description":"All issues related to mobile responsiveness","color":"6c97fd"},"Responsive Widget":{"name":"Responsive Widget","description":"All issues related to widget responsiveness","color":"d12d2e"},"Responsive Canvas":{"name":"Responsive Canvas","description":"All issues related to canvas responsiveness","color":"45a0a8"},"Conversion Algorithm":{"name":"Conversion Algorithm","description":"All issue related to converting app from fixed to flex mode & vice versa","color":"d12d2e"},"Spacing":{"name":"Spacing","description":"All issue related to spacing between widgets in auto layout","color":"d12d2e"},"Browser specific":{"name":"Browser specific","description":"All issue related to browser","color":"d12d2e"},"Error Handling":{"name":"Error Handling","description":"Issues related to error handling","color":"4e1872"},"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":"434a3a"},"AST-backend":{"name":"AST-backend","description":"Backend issues related to AST parsing","color":"c476eb"},"MariaDB":{"name":"MariaDB","description":"MariaDB datasource","color":"8428c3"},"Billing & Usage Pod":{"name":"Billing & Usage Pod","description":"Issues pertaining to licensing, billing, usage across self serve and enterprise customers","color":"256808"},"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":"8154df"},"Action Selector":{"name":"Action Selector","description":"Issues related to action selector on the property pane","color":"2f9e20"},"Widget design system":{"name":"Widget design system","description":"","color":"11cc90"},"Deploy App":{"name":"Deploy App","description":"Issues related to app deployment","color":"6f6152"},"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"},"BE Instance":{"name":"BE Instance","description":"For all issues relating to usage, licensing or billing on the BE instance","color":"d2bc40"},"CE Instance":{"name":"CE Instance","description":"For all issues relating to usage, licensing or billing on the CE instance","color":"d2bc40"},"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"},"Billing Integrations":{"name":"Billing Integrations","description":"For all issues relating to 3P integrations Appsmith is using for billing & usage","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"},"Appsmith Business Cloud":{"name":"Appsmith Business Cloud","description":"Issues related to our business cloud offering","color":"89bb6c"},"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"},"In-app ramps":{"name":"In-app ramps","description":"For all tasks/issues relating to adding in-app ramps in the community edition of the product","color":"8abae0"},"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"},"1-click upgrade":{"name":"1-click upgrade","description":"For all issues/tasks related to 1-click upgrade & downgrade project","color":"129082"},"Feature Flagging":{"name":"Feature Flagging","description":"Anything related feature flagging flagsmith","color":"728126"},"SCIM":{"name":"SCIM","description":"Label to collate our SCIM issues","color":"61a852"},"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"},"Templates pod":{"name":"Templates pod","description":"Issues related to Templates","color":"b7e568"},"Community template":{"name":"Community template","description":"Label for development of community templates and its integration to platform","color":"8a0510"},"DocumentDB":{"name":"DocumentDB","description":"Issues related to support DocumentDB in Appsmith Data layer","color":"2c8b56"},"Multiple Environments":{"name":"Multiple Environments","description":"Issues or tasks related to multiple environments","color":"4e972b"},"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":"1e439c"},"AI":{"name":"AI","description":"All tasks related to AI","color":"69c7ca"},"Custom environments":{"name":"Custom environments","description":"Issues with creating or working with custom environments","color":"2137d6"},"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":"144206"}},"success":true}
\ No newline at end of file
+{"runners":[{"versioning":{"source":"milestones","type":"SemVer"},"prereleaseName":"alpha","issue":{"labels":{"Widget design system":{"conditions":[{"label":"App Theming","type":"hasLabel","value":true},{"label":"Widget Styling","type":"hasLabel","value":true},{"label":"Checkbox Group widget","type":"hasLabel","value":true},{"label":"Checkbox Widget","type":"hasLabel","value":true},{"label":"Checkbox Component","type":"hasLabel","value":true},{"label":"WDS team","type":"hasLabel","value":true}],"requires":1},"Performance Pod":{"conditions":[{"label":"Performance","type":"hasLabel","value":true},{"label":"Performance infra","type":"hasLabel","value":true}],"requires":1},"Billing & Usage Pod":{"conditions":[{"label":"CE Instance","type":"hasLabel","value":true},{"label":"Customer Portal","type":"hasLabel","value":true},{"label":"Cloud Services","type":"hasLabel","value":true},{"label":"Billing Integrations","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":"In-app ramps","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":"1-click upgrade","type":"hasLabel","value":true},{"label":"Appsmith Business Cloud","type":"hasLabel","value":true},{"label":"BE instance","type":"hasLabel","value":true}],"requires":1},"Mobile Pod":{"conditions":[],"requires":1},"Git Pod":{"conditions":[{"label":"Git Version Control","type":"hasLabel","value":true},{"label":"Import-Export-App","type":"hasLabel","value":true}],"requires":1},"Integrations Pod":{"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":"REST API plugin","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}],"requires":1},"Data Platform Pod":{"conditions":[{"label":"Datasource Environments","type":"hasLabel","value":true},{"label":"Datatype issue","type":"hasLabel","value":true},{"label":"Entity Refactor","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":"SmartSubstitution","type":"hasLabel","value":true},{"label":"Query Generation","type":"hasLabel","value":true},{"label":"Query performance","type":"hasLabel","value":true},{"label":"Suggested Widgets","type":"hasLabel","value":true},{"label":"Page load executions","type":"hasLabel","value":true},{"label":"DSL Update","type":"hasLabel","value":true},{"label":"AST-backend","type":"hasLabel","value":true},{"label":"Deploy App","type":"hasLabel","value":true},{"label":"File upload issues","type":"hasLabel","value":true},{"label":"Datasources","type":"hasLabel","value":true},{"label":"DocumentDB","type":"hasLabel","value":true},{"label":"Multiple Environments","type":"hasLabel","value":true},{"label":"Platformization","type":"hasLabel","value":true},{"label":"Custom environments","type":"hasLabel","value":true}],"requires":1},"Design System Pod":{"conditions":[{"label":"Design System Pod","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}],"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}],"requires":1},"Team Managers Pod":{"conditions":[{"label":"Settings","type":"hasLabel","value":true},{"label":"Home Page","type":"hasLabel","value":true},{"label":"Invite users","type":"hasLabel","value":true},{"label":"Realtime Commenting","type":"hasLabel","value":true},{"label":"SSO","type":"hasLabel","value":true},{"label":"Multi User Realtime","type":"hasLabel","value":true},{"label":"RBAC","type":"hasLabel","value":true},{"label":"ABAC","type":"hasLabel","value":true},{"label":"Audit Logs","type":"hasLabel","value":true},{"label":"Multitenancy","type":"hasLabel","value":true},{"label":"Airgap","type":"hasLabel","value":true},{"label":"Enterprise Edition","type":"hasLabel","value":true},{"label":"SCIM","type":"hasLabel","value":true}],"requires":1},"New Developers Pod":{"conditions":[{"label":"Fork App","type":"hasLabel","value":true},{"label":"Omnibar","type":"hasLabel","value":true},{"label":"Onboarding","type":"hasLabel","value":true},{"label":"Telemetry","type":"hasLabel","value":true},{"label":"Entity Explorer","type":"hasLabel","value":true},{"label":"Generate Page","type":"hasLabel","value":true},{"label":"IDE","type":"hasLabel","value":true},{"label":"Sniping Mode","type":"hasLabel","value":true},{"label":"Example Apps","type":"hasLabel","value":true},{"label":"i18n","type":"hasLabel","value":true},{"label":"Welcome Screen","type":"hasLabel","value":true},{"label":"IDE Navigation","type":"hasLabel","value":true},{"label":"Login / Signup","type":"hasLabel","value":true},{"label":"Clean URLs","type":"hasLabel","value":true},{"label":"Embedding Apps","type":"hasLabel","value":true},{"label":"Feature Flagging","type":"hasLabel","value":true},{"label":"In App Comms","type":"hasLabel","value":true},{"label":"In App Comms","type":"hasLabel","value":true},{"label":"App setting","type":"hasLabel","value":true}],"requires":1},"BE Coders Pod":{"conditions":[{"label":"SAAS Plugins","type":"hasLabel","value":true},{"label":"SAAS Manager App","type":"hasLabel","value":true},{"label":"Data Platform Pod","type":"hasLabel","value":true},{"label":"Integrations Pod","type":"hasLabel","value":true}],"requires":1},"FE Coders Pod":{"conditions":[{"label":"JS Linting & Errors","type":"hasLabel","value":true},{"label":"Debugger","type":"hasLabel","value":true},{"label":"JS Snippets","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 Promises","type":"hasLabel","value":true},{"label":"JS Usability","type":"hasLabel","value":true},{"label":"Code Refactoring","type":"hasLabel","value":true},{"label":"storeValue","type":"hasLabel","value":true},{"label":"OnPageLoad","type":"hasLabel","value":true},{"label":"Framework Functions","type":"hasLabel","value":true},{"label":"Code Editor","type":"hasLabel","value":true},{"label":"JS Objects","type":"hasLabel","value":true},{"label":"JS Evaluation","type":"hasLabel","value":true},{"label":"AST-frontend","type":"hasLabel","value":true},{"label":"Custom JS Libraries","type":"hasLabel","value":true},{"label":"Action Selector","type":"hasLabel","value":true},{"label":"JS Function execution","type":"hasLabel","value":true},{"label":"Widget setter method","type":"hasLabel","value":true},{"label":"Error Handling","type":"hasLabel","value":true},{"label":"AI","type":"hasLabel","value":true}],"requires":1},"App Viewers Pod":{"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":"reallabel","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":"App Navigation","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":"Branding","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":"Widget design system","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}],"requires":1},"UI Builders Pod":{"conditions":[{"label":"Property Pane","type":"hasLabel","value":true},{"label":"Pages","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":"Canvas Zooms","type":"hasLabel","value":true},{"label":"Frontend Libraries Upgrade","type":"hasLabel","value":true},{"label":"Auto Height","type":"hasLabel","value":true},{"label":"Responsive Canvas","type":"hasLabel","value":true},{"label":"Responsive Widget","type":"hasLabel","value":true},{"label":"Responsive Viewport","type":"hasLabel","value":true},{"label":"Conversion Algorithm","type":"hasLabel","value":true},{"label":"Spacing","type":"hasLabel","value":true},{"label":"Browser specific","type":"hasLabel","value":true},{"label":"widget vertical alignment","type":"hasLabel","value":true},{"label":"Auto Layout","type":"hasLabel","value":true}],"requires":1},"User Education Pod":{"conditions":[{"label":"Content","type":"hasLabel","value":true},{"label":"Documentation","type":"hasLabel","value":true}],"requires":1},"Templates pod":{"conditions":[{"label":"Templates","type":"hasLabel","value":true},{"label":"Community template","type":"hasLabel","value":true},{"label":"Partial-import-export","type":"hasLabel","value":true}],"requires":1},"Error Handling":{"conditions":[],"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":"88054d","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":"e2ca68","name":"QA","description":""},"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":"9c0c8e","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"},"Settings":{"color":"f7ff60","name":"Settings","description":"organization, team & user settings"},"Fork App":{"color":"5369db","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":""},"Onboarding":{"color":"d5794b","name":"Onboarding","description":"Issues related to onboarding new developers"},"Pages":{"color":"d7fd80","name":"Pages","description":"Issues related to configuring pages"},"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"},"Widget Styling":{"color":"905420","name":"Widget Styling","description":"all about widget styling"},"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"},"App Viewers Pod":{"color":"cd8ef9","name":"App Viewers Pod","description":"This label assigns issues to the app viewers pod"},"Checkbox Widget":{"color":"88054d","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":"d73a4a","name":"Bug","description":"Something isn't working"},"Widget Validation":{"color":"6990BC","name":"Widget Validation","description":"Issues related to widget property validation"},"Generate Page":{"color":"f14274","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":""},"Team Managers Pod":{"color":"bddb81","name":"Team Managers Pod","description":"Issues that team managers care about for the security and efficiency of their teams"},"Import-Export-App":{"color":"15076d","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":"10b5ce","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":"771e69","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"},"Critical":{"color":"9b1b28","name":"Critical","description":"This issue needs immediate attention. Drop everything else"},"IDE":{"color":"61b2ee","name":"IDE","description":"Issues related to the IDE"},"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":"f28253","name":"TestGap","description":"Issues identified for test plan improvement"},"keyboard shortcut":{"color":"0688B6","name":"keyboard shortcut","description":""},"Git Version Control":{"color":"858172","name":"Git Version Control","description":"Issues related to version control"},"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":"a2e2f9","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},"Debugger":{"color":"e79062","name":"Debugger","description":"Issues related to the debugger"},"Quick effort":{"color":"95ED65","name":"Quick effort","description":"Something that'll take a few hours to build"},"Text Widget":{"color":"d130d1","name":"Text Widget","description":""},"Video Widget":{"color":"23dd4b","name":"Video Widget","description":""},"Datasources":{"color":"5052f6","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"},"UI Builders Pod":{"color":"517fba","name":"UI Builders Pod","description":"Issues that UI Builders face using appsmith"},"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"},"In App Comms":{"name":"In App Comms","description":"Issues around communication with appsmith instances","color":"463cca"},"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"},"BE Coders Pod":{"color":"5d9848","name":"BE Coders Pod","description":"Issues related to users writing code to fetch and update data"},"FE Coders Pod":{"color":"a7effc","name":"FE Coders Pod","description":"Issues related to users writing javascript in appsmith"},"New Developers Pod":{"color":"6310da","name":"New Developers Pod","description":"Issues that new developers face while exploring the IDE"},"Sniping Mode":{"name":"Sniping Mode","description":"Issues related to sniping mode","color":"6310da"},"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":"12b715"},"Responsive Viewport":{"color":"d12d2e","name":"Responsive Viewport","description":"Issues seen on different viewports like mobile"},"Widgets Pane":{"name":"Widgets Pane","description":"Issues related to the discovery and organisation of widgets","color":"ad5d78"},"Invite users":{"color":"1799b0","name":"Invite users","description":"Invite users flow and any associated actions"},"View Mode":{"color":"1799b0","name":"View Mode","description":"Issues related to the view mode"},"User Education Pod":{"name":"User Education Pod","description":"Issues related to user education","color":"1799b0"},"Content":{"name":"Content","description":"For content related topics i.e blogs, templates, videos","color":"a8dff7"},"Embedding Apps":{"name":"Embedding Apps","description":"Issues related to embedding","color":"26ef4f"},"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"},"REST API plugin":{"name":"REST API plugin","description":"REST API plugin 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":"ef9c9d"},"JS Promises":{"name":"JS Promises","description":"Issues related to promises","color":"d7771f"},"OnPageLoad":{"name":"OnPageLoad","description":"OnPageLoad issues on functions and queries","color":"50559d"},"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":"3897be"},"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"},"App Theming":{"name":"App Theming","description":"Items that are related to the App level theming controls epic","color":"905420"},"SSO":{"name":"SSO","description":"Issues, requests and enhancements around Single sign-on.","color":"bf019b"},"Multi User Realtime":{"name":"Multi User Realtime","description":"Issues related to multiple users using or editing an application","color":"e7b6ce"},"Templates":{"name":"Templates","description":"Issues related to templates","color":"b7e568"},"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"},"RBAC":{"name":"RBAC","description":"Issues, requests and enhancements around RBAC.","color":"9211c3"},"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"},"Tests":{"name":"Tests","description":"test item","color":"1c6990"},"DynamoDB":{"name":"DynamoDB","description":"Issues that are related to DynamoDB should have this label","color":"60885f"},"Design System Pod":{"name":"Design System Pod","description":"Appsmith design system related issues","color":"706f03"},"ABAC":{"color":"e009a5","name":"ABAC","description":"User permissions and access controls"},"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":"60885f"},"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":"bc0cba"},"Query performance":{"name":"Query performance","description":"Issues that have to do with lack in performance of query execution","color":"e4d966"},"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":"418fa4"},"Branding":{"name":"Branding","description":"All issues under branding and whitelabelling appsmith ecosystem","color":"7aaaf1"},"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"},"Audit Logs":{"name":"Audit Logs","description":"Audit trails to ensure data security","color":"f3fd62"},"MsSQL":{"name":"MsSQL","description":"Issues related to MsSQL plugin","color":"8078b0"},"Data Platform Pod":{"name":"Data Platform Pod","description":"Issues related to the underlying data platform","color":"3f8c3a"},"Integrations Pod":{"name":"Integrations Pod","description":"Issues related to a specific integration","color":"5dbbb1"},"Datasource Environments":{"name":"Datasource Environments","description":"Issues related to datasource environments","color":"bb7a14"},"Elastic Search":{"name":"Elastic Search","description":"Issues related to the elastic search datasource","color":"8078b0"},"Core Query Execution":{"color":"418fa4","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":"6a5b42"},"Query Settings":{"name":"Query Settings","description":"Issues related to the settings of all queries","color":"c7da7a"},"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":"e4d966"},"Query Generation":{"name":"Query Generation","description":"Issues related to query generation","color":"e4d966"},"Suggested Widgets":{"name":"Suggested Widgets","description":"Issues related to suggesting widgets based on query response","color":"e4d966"},"Page load executions":{"name":"Page load executions","description":"Issues related to page load execution","color":"5696b2"},"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"},"Git Pod":{"name":"Git Pod","description":"Anything related to git sync","color":"2e5ba4"},"Mobile Pod":{"name":"Mobile Pod","description":"All issues related to mobile responsiveness","color":"6c97fd"},"Responsive Widget":{"name":"Responsive Widget","description":"All issues related to widget responsiveness","color":"d12d2e"},"Responsive Canvas":{"name":"Responsive Canvas","description":"All issues related to canvas responsiveness","color":"45a0a8"},"Conversion Algorithm":{"name":"Conversion Algorithm","description":"All issue related to converting app from fixed to flex mode & vice versa","color":"d12d2e"},"Spacing":{"name":"Spacing","description":"All issue related to spacing between widgets in auto layout","color":"d12d2e"},"Browser specific":{"name":"Browser specific","description":"All issue related to browser","color":"d12d2e"},"Error Handling":{"name":"Error Handling","description":"Issues related to error handling","color":"4e1872"},"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":"434a3a"},"AST-backend":{"name":"AST-backend","description":"Backend issues related to AST parsing","color":"c476eb"},"MariaDB":{"name":"MariaDB","description":"MariaDB datasource","color":"8428c3"},"Billing & Usage Pod":{"name":"Billing & Usage Pod","description":"Issues pertaining to licensing, billing, usage across self serve and enterprise customers","color":"256808"},"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":"8154df"},"Action Selector":{"name":"Action Selector","description":"Issues related to action selector on the property pane","color":"2f9e20"},"Widget design system":{"name":"Widget design system","description":"","color":"11cc90"},"Deploy App":{"name":"Deploy App","description":"Issues related to app deployment","color":"6f6152"},"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"},"CE Instance":{"name":"CE Instance","description":"For all issues relating to usage, licensing or billing on the CE instance","color":"d2bc40"},"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"},"Billing Integrations":{"name":"Billing Integrations","description":"For all issues relating to 3P integrations Appsmith is using for billing & usage","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"},"Appsmith Business Cloud":{"name":"Appsmith Business Cloud","description":"Issues related to our business cloud offering","color":"89bb6c"},"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"},"In-app ramps":{"name":"In-app ramps","description":"For all tasks/issues relating to adding in-app ramps in the community edition of the product","color":"8abae0"},"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"},"1-click upgrade":{"name":"1-click upgrade","description":"For all issues/tasks related to 1-click upgrade & downgrade project","color":"129082"},"Feature Flagging":{"name":"Feature Flagging","description":"Anything related feature flagging flagsmith","color":"728126"},"SCIM":{"name":"SCIM","description":"Label to collate our SCIM issues","color":"61a852"},"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"},"Templates pod":{"name":"Templates pod","description":"Issues related to Templates","color":"b7e568"},"Community template":{"name":"Community template","description":"Label for development of community templates and its integration to platform","color":"8a0510"},"DocumentDB":{"name":"DocumentDB","description":"Issues related to support DocumentDB in Appsmith Data layer","color":"2c8b56"},"Multiple Environments":{"name":"Multiple Environments","description":"Issues or tasks related to multiple environments","color":"4e972b"},"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":"1e439c"},"AI":{"name":"AI","description":"All tasks related to AI","color":"69c7ca"},"Custom environments":{"name":"Custom environments","description":"Issues with creating or working with custom environments","color":"2137d6"},"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":"144206"},"BE instance":{"name":"BE instance","description":"For all issues related to license, billing on BE instance","color":"ae8f98"}},"success":true}
\ No newline at end of file
diff --git a/.github/workflows/ci-test-custom-script.yml b/.github/workflows/ci-test-custom-script.yml
index 38c70b80e4..65478c3ac2 100644
--- a/.github/workflows/ci-test-custom-script.yml
+++ b/.github/workflows/ci-test-custom-script.yml
@@ -168,6 +168,7 @@ jobs:
-e APPSMITH_DISABLE_TELEMETRY=true \
-e APPSMITH_INTERCOM_APP_ID=DUMMY_VALUE \
-e APPSMITH_CLOUD_SERVICES_BASE_URL=http://host.docker.internal:5001 \
+ -e APPSMITH_CLOUD_SERVICES_SIGNATURE_BASE_URL=http://host.docker.internal:8090 \
--add-host=host.docker.internal:host-gateway --add-host=api.segment.io:host-gateway --add-host=t.appsmith.com:host-gateway \
cicontainer
@@ -291,7 +292,7 @@ jobs:
if [[ ${{ inputs.pr }} -ne 0 ]]; then
echo "COMMIT_INFO_MESSAGE=${{ env.COMMIT_INFO_MESSAGE }}" >> $GITHUB_ENV
else
- if [[ '$eventCommit' == 'null' ]]; then
+ if [[ '$eventCommit' == 'null' ]]; then
echo "COMMIT_INFO_MESSAGE=$(echo ${{ github.event_name }} | perl -pe 's/(^|_)./uc($&)/ge;s/_//g')" >> $GITHUB_ENV
echo "COMMIT_INFO_MESSAGE=${{ env.COMMIT_INFO_MESSAGE}} by ${{ env.COMMIT_INFO_AUTHOR }}" >> $GITHUB_ENV
else
@@ -300,7 +301,7 @@ jobs:
fi
- name: Run the cypress test
- uses: cypress-io/github-action@v5
+ uses: cypress-io/github-action@v6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CYPRESS_USERNAME: ${{ secrets.CYPRESS_USERNAME }}
@@ -373,7 +374,7 @@ jobs:
if: failure()
run: |
find ${{ github.workspace }}/app/client/cypress/cypress-logs -name '*.json' -type f | tail -n +11 | xargs -I {} rm -- {}
-
+
- name: Upload failed test cypress logs artifact
if: failure()
uses: actions/upload-artifact@v3
diff --git a/.github/workflows/ci-test-hosted.yml b/.github/workflows/ci-test-hosted.yml
index 10e48a2fe4..0798744669 100644
--- a/.github/workflows/ci-test-hosted.yml
+++ b/.github/workflows/ci-test-hosted.yml
@@ -230,7 +230,7 @@ jobs:
fi
- name: Run the cypress test
- uses: cypress-io/github-action@v5
+ uses: cypress-io/github-action@v6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CYPRESS_USERNAME: ${{ secrets.CYPRESS_USERNAME }}
@@ -311,6 +311,13 @@ jobs:
name: results-${{github.run_attempt}}
path: ~/results
+ - name: Upload cypress snapshots
+ if: failure()
+ uses: actions/upload-artifact@v3
+ with:
+ name: snapshots
+ path: ${{ github.workspace }}/app/client/cypress/snapshots
+
# Set status = failedtest
- name: Set fail if there are test failures
id: test_status
diff --git a/.github/workflows/ci-test-limited.yml b/.github/workflows/ci-test-limited.yml
index fa13c35e94..6d36387c8a 100644
--- a/.github/workflows/ci-test-limited.yml
+++ b/.github/workflows/ci-test-limited.yml
@@ -336,7 +336,7 @@ jobs:
fi
- name: Run the cypress test
- uses: cypress-io/github-action@v5
+ uses: cypress-io/github-action@v6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CYPRESS_USERNAME: ${{ secrets.CYPRESS_USERNAME }}
diff --git a/.github/workflows/client-build.yml b/.github/workflows/client-build.yml
index 9c444f4191..d3b3b4554a 100644
--- a/.github/workflows/client-build.yml
+++ b/.github/workflows/client-build.yml
@@ -21,6 +21,11 @@ on:
description: "This is the branch to be used for the build."
required: false
type: string
+ ads-compliant-check:
+ description: "This is a boolean value in case the workflow is being called in build deploy-preview"
+ required: false
+ type: string
+ default: "true"
# Change the working directory for all the jobs in this workflow
@@ -93,7 +98,7 @@ jobs:
done
echo "non_ts_files=${non_ts_files[@]}" >> $GITHUB_OUTPUT
echo "non_ts_files_count=${#non_ts_files[@]}" >> $GITHUB_OUTPUT
-
+
# Comment in PR if test files are not written in ts and fail the workflow
- name: Comment in PR if test files are not written in ts
if: steps.check_files.outputs.non_ts_files_count != 0 && inputs.check-test-files == 'true' && inputs.pr != 0
@@ -106,6 +111,46 @@ jobs:
${{ steps.check_files.outputs.non_ts_files }}
- if: steps.check_files.outputs.non_ts_files_count != 0 && inputs.check-test-files == 'true' && inputs.pr != 0
run: exit 1
+
+ - name: Get all the added or changed files in client/src folder
+ if: inputs.ads-compliant-check == 'true' && inputs.pr != 0 && github.pull_request.base.ref == 'release'
+ id: client_files
+ uses: umani/changed-files@v4.0.0
+ with:
+ repo-token: ${{ secrets.APPSMITH_CI_TEST_PAT }}
+ pattern: 'app/client/src/.*'
+ pr-number: ${{ inputs.pr }}
+
+ # Check all the newly added files are in ts
+ - name: ADS compliant check
+ if: inputs.ads-compliant-check == 'true' && inputs.pr != 0 && github.pull_request.base.ref == 'release'
+ id: ads_check
+ run: |
+ comment_files=""
+ files=(${{steps.client_files.outputs.files_created}}${{steps.client_files.outputs.files_updated}})
+ for file in "${files[@]}"; do
+ while IFS= read -r line; do
+ if echo "$line" | grep -q -E '(color|Color).*#|border.*#|(color|Color).*"'; then
+ comment_files+=("$file")
+ break
+ fi
+ done < ${file#app/client/}
+ done
+ unique_files=$(echo "${comment_files[@]}" | sort -u | sed '/^[[:space:]]*$/d' | sed 's/ / /g')
+ echo "ads_non_compliant_files=$unique_files" >> $GITHUB_OUTPUT
+ echo "ads_non_compliant_count=${#unique_files[@]}" >> $GITHUB_OUTPUT
+
+ # Comment in PR if test files are not written in ts and fail the workflow
+ - name: Comment in PR if test files are not written in ts
+ if: steps.ads_check.outputs.ads_non_compliant_count != 0 && inputs.ads-compliant-check == 'true' && inputs.pr != 0 && github.pull_request.base.ref == 'release'
+ uses: peter-evans/create-or-update-comment@v1
+ with:
+ issue-number: ${{ inputs.pr }}
+ body: |
+ 🔴 Below files are not compliant with ADS. Please fix and re-trigger ok-to-test
+ ${{steps.ads_check.outputs.ads_non_compliant_files}}
+ - if: steps.ads_check.outputs.ads_non_compliant_count != 0 && inputs.ads-compliant-check == 'true' && inputs.pr != 0 && github.pull_request.base.ref == 'release'
+ run: exit 1
# Create a run record exactly at the time of merge to release to
# ensure we compare run details with code at this point
diff --git a/.github/workflows/perf-test-v2.yml b/.github/workflows/perf-test-v2.yml
index dc5155b511..dea2deac57 100644
--- a/.github/workflows/perf-test-v2.yml
+++ b/.github/workflows/perf-test-v2.yml
@@ -29,6 +29,11 @@ jobs:
run:
working-directory: app/client
shell: bash
+
+ strategy:
+ fail-fast: false
+ matrix:
+ job: [0, 1]
# Service containers to run with this job. Required for running tests
services:
@@ -222,6 +227,7 @@ jobs:
POSTGRES_PASSWORD: postgres
NODE_TLS_REJECT_UNAUTHORIZED: "0"
MACHINE: ubuntu-latest-4-cores
+ JOB: ${{ matrix.job }}
run: ./start-test.sh
diff --git a/Dockerfile b/Dockerfile
index cf0f664378..9b4a29f641 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -23,17 +23,14 @@ RUN apt-get update \
&& apt-get remove --yes git python3-pip python3-venv \
&& apt-get autoremove --yes
-# Install MongoDB v5.0.14, Redis, NodeJS - Service Layer, PostgreSQL v13
+# Install MongoDB v5.0.14, Redis, PostgreSQL v13
RUN curl --silent --show-error --location https://www.mongodb.org/static/pgp/server-5.0.asc | apt-key add - \
&& echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-5.0.list \
- && curl --silent --show-error --location https://deb.nodesource.com/setup_18.x | bash - \
- && echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | tee /etc/apt/sources.list.d/pgdg.list \
+ && echo "deb http://apt.postgresql.org/pub/repos/apt $(grep CODENAME /etc/lsb-release | cut -d= -f2)-pgdg main" | tee /etc/apt/sources.list.d/pgdg.list \
&& curl --silent --show-error --location https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \
&& apt update \
- && apt-get install --no-install-recommends --yes mongodb-org nodejs redis postgresql-13 \
- && apt-get clean \
- # This is to get semver 7.5.2, for a CVE fix, might be able to remove it with later versions on NodeJS.
- && npm install -g npm@9.7.2
+ && apt-get install --no-install-recommends --yes mongodb-org redis postgresql-13 \
+ && apt-get clean
# Install Java
RUN set -o xtrace \
@@ -43,6 +40,12 @@ RUN set -o xtrace \
&& curl --location --output /tmp/java.tar.gz "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-$version/OpenJDK17U-jdk_$(uname -m | sed s/x86_64/x64/)_linux_hotspot_$(echo $version | tr + _).tar.gz" \
&& tar -xzf /tmp/java.tar.gz -C /opt/java --strip-components 1
+# Install NodeJS
+RUN set -o xtrace \
+ && mkdir -p /opt/node \
+ && file="$(curl -sS 'https://nodejs.org/dist/latest-v18.x/' | awk -F\" '$2 ~ /linux-'"$(uname -m | sed 's/x86_64/x64/; s/aarch64/arm64/')"'.tar.gz/ {print $2}')" \
+ && curl "https://nodejs.org/dist/latest-v18.x/$file" | tar -xz -C /opt/node --strip-components 1
+
# Clean up cache file - Service layer
RUN rm -rf \
/root/.cache \
@@ -85,6 +88,8 @@ COPY ./app/client/build editor/
# Add RTS - Application Layer
COPY ./app/client/packages/rts/dist rts/
+ENV PATH /opt/appsmith/utils/node_modules/.bin:/opt/java/bin:/opt/node/bin:$PATH
+
RUN cd ./utils && npm install --only=prod && npm install --only=prod -g . && cd - \
&& chmod 0644 /etc/cron.d/* \
&& chmod +x entrypoint.sh renew-certificate.sh healthcheck.sh templates/nginx-app.conf.sh /watchtower-hooks/*.sh \
@@ -92,8 +97,6 @@ RUN cd ./utils && npm install --only=prod && npm install --only=prod -g . && cd
&& find / \( -path /proc -prune \) -o \( \( -perm -2000 -o -perm -4000 \) -print -exec chmod -s '{}' + \) || true \
&& node prepare-image.mjs
-ENV PATH /opt/appsmith/utils/node_modules/.bin:/opt/java/bin:$PATH
-
LABEL com.centurylinklabs.watchtower.lifecycle.pre-check=/watchtower-hooks/pre-check.sh
LABEL com.centurylinklabs.watchtower.lifecycle.pre-update=/watchtower-hooks/pre-update.sh
diff --git a/README.md b/README.md
index a34afce3ab..62c5a4723c 100644
--- a/README.md
+++ b/README.md
@@ -80,8 +80,8 @@ Let's build great software together.
[](https://github.com/AnaghHegde)
[](https://github.com/arunvjn)
[](https://github.com/NandanAnantharamu)
-[](https://github.com/nayan-rafiq)
[](https://github.com/abhvsn)
+[](https://github.com/nayan-rafiq)
[](https://github.com/ankitakinger)
[](https://github.com/jsartisan)
[](https://github.com/Rishabh-Rathod)
@@ -94,20 +94,19 @@ Let's build great software together.
[](https://github.com/ayushpahwa)
[](https://github.com/yatinappsmith)
[](https://github.com/Parthvi12)
-[](https://github.com/somangshu)
[](https://github.com/ApekshaBhosale)
+[](https://github.com/somangshu)
+[](https://github.com/pratapaprasanna)
[](https://github.com/pranavkanade)
[](https://github.com/sneha122)
-[](https://github.com/pratapaprasanna)
[](https://github.com/albinAppsmith)
-[](https://github.com/sum35h)
[](https://github.com/marks0351)
[](https://github.com/ashit-rath)
[](https://github.com/nsarupr)
[](https://github.com/rajatagrawal)
+[](https://github.com/sondermanish)
[](https://github.com/NilanshBansal)
[](https://github.com/dhruvikn)
-[](https://github.com/sondermanish)
[](https://github.com/KelvinOm)
[](https://github.com/areyabhishek)
[](https://github.com/Druthi)
@@ -121,11 +120,11 @@ Let's build great software together.
[](https://github.com/sharanya-appsmith)
[](https://github.com/brayn003)
[](https://github.com/shubham7saxena7)
-[](https://github.com/ramsaptami)
[](https://github.com/dvj1988)
+[](https://github.com/ramsaptami)
[](https://github.com/vivonk)
-[](https://github.com/gitstart-appsmith)
[](https://github.com/rohan-arthur)
+[](https://github.com/gitstart-appsmith)
[](https://github.com/danciaclara)
[](https://github.com/kocharrahul7)
[](https://github.com/riteshkew)
@@ -186,6 +185,7 @@ Let's build great software together.
[](https://github.com/Vijetha-Kaja)
[](https://github.com/haojin111)
[](https://github.com/berzerkeer)
+[](https://github.com/sum35h)
[](https://github.com/ChandanBalajiBP)
[](https://github.com/devrk96)
[](https://github.com/keyurparalkar)
diff --git a/app/client/.eslintrc.base.json b/app/client/.eslintrc.base.json
index c59e7e0ac4..b075c619bc 100644
--- a/app/client/.eslintrc.base.json
+++ b/app/client/.eslintrc.base.json
@@ -35,6 +35,7 @@
"project": "./tsconfig.json"
},
"rules": {
+ "@typescript-eslint/consistent-type-definitions": "error",
"@typescript-eslint/prefer-nullish-coalescing": "error",
"@typescript-eslint/promise-function-async": "error",
"@typescript-eslint/strict-boolean-expressions": "error",
diff --git a/app/client/.husky/check-staged-files.sh b/app/client/.husky/check-staged-files.sh
index 8bf3f3e2da..07076b46fc 100644
--- a/app/client/.husky/check-staged-files.sh
+++ b/app/client/.husky/check-staged-files.sh
@@ -7,7 +7,7 @@ is_merge_commit=$(git rev-parse -q --verify MERGE_HEAD)
if [ "$is_merge_commit" ]; then
echo "Skipping server and client checks for merge commit"
-else
+else
if [ "$is_server_change" -ge 1 ]; then
echo "Running Spotless check ..."
pushd app/server > /dev/null
@@ -23,7 +23,7 @@ else
if [ "$is_client_change" -ge 1 ]; then
echo "Running client check ..."
- npx lint-staged --cwd app/client && git-secrets --scan --untracked && git-secrets --scan -r
+ npx lint-staged --cwd app/client
else
echo "Skipping client side check..."
fi
diff --git a/app/client/.lintstagedrc b/app/client/.lintstagedrc
deleted file mode 100644
index 1f4e72ac35..0000000000
--- a/app/client/.lintstagedrc
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "src/**/*.{js,ts,tsx}": ["npx eslint --fix"],
- "src/**/*.{js,ts,tsx,css,md,json}": ["npx prettier --write"],
- "cypress/**/*.{js,ts}": ["cd ./cypress && npx eslint -c .eslintrc.json --fix"],
- "cypress/**/*.{js,ts,json}": ["npx prettier --write"],
- "packages/**/*.{js,ts,tsx}": ["npx eslint --fix"],
- "packages/**/*.{js,ts,tsx,css,mdx,json}": ["npx prettier --write"]
-}
diff --git a/app/client/.lintstagedrc.json b/app/client/.lintstagedrc.json
new file mode 100644
index 0000000000..53c60f061f
--- /dev/null
+++ b/app/client/.lintstagedrc.json
@@ -0,0 +1,11 @@
+{
+ "src/**/*.{js,ts,tsx}": ["eslint --fix --cache"],
+ "src/**/*.{css,md,json}": ["prettier --write --cache"],
+ "cypress/**/*.{js,ts}": [
+ "cd ./cypress && eslint -c .eslintrc.json --fix --cache"
+ ],
+ "cypress/**/*.json": ["prettier --write --cache"],
+ "packages/**/*.{js,ts,tsx}": ["eslint --fix --cache"],
+ "packages/**/*.{css,mdx,json}": ["prettier --write --cache"],
+ "*": ["git-secrets --scan --cached"]
+}
diff --git a/app/client/craco.common.config.js b/app/client/craco.common.config.js
index a2c3185f65..7d007ff2b3 100644
--- a/app/client/craco.common.config.js
+++ b/app/client/craco.common.config.js
@@ -49,8 +49,6 @@ module.exports = {
"postcss-nesting",
"postcss-import",
"postcss-at-rules-variables",
- "postcss-conditionals",
- "postcss-for",
"postcss-each",
"postcss-url",
"postcss-modules-values",
diff --git a/app/client/cypress/e2e/GSheet/AllAccess_Spec.ts b/app/client/cypress/e2e/GSheet/AllAccess_Spec.ts
index c8f98e60b0..2b9d832712 100644
--- a/app/client/cypress/e2e/GSheet/AllAccess_Spec.ts
+++ b/app/client/cypress/e2e/GSheet/AllAccess_Spec.ts
@@ -6,6 +6,9 @@ import {
dataSources,
agHelper,
entityExplorer,
+ table,
+ assertHelper,
+ appSettings,
} from "../../support/Objects/ObjectsCore";
const workspaceName = "gsheet apps";
@@ -22,8 +25,7 @@ describe("GSheet-Functional Tests With All Access", function () {
//Adding query to insert a new spreadsheet
homePage.NavigateToHome();
- homePage.CreateAppInWorkspace(workspaceName);
- homePage.RenameApplication(appName);
+ homePage.CreateAppInWorkspace(workspaceName, appName);
gsheetHelper.AddNewSpreadsheetQuery(
dataSourceName,
spreadSheetName,
@@ -285,8 +287,44 @@ describe("GSheet-Functional Tests With All Access", function () {
});
});
+ it("8. Import an app with all access sheet", function () {
+ homePage.NavigateToHome();
+ homePage.ImportApp("ImportAppAllAccess.json", workspaceName);
+ assertHelper.WaitForNetworkCall("importNewApplication").then(() => {
+ agHelper.Sleep();
+ //Validate table is not empty!
+ table.WaitUntilTableLoad(0, 0, "v2");
+ });
+ // Assert table data
+ table.ReadTableRowColumnData(0, 0, "v2").then((cellData) => {
+ expect(cellData).to.eq("eac7efa5dbd3d667f26eb3d3ab504464");
+ });
+ homePage.NavigateToHome();
+ homePage.DeleteApplication("ImportAppAllAccess");
+ });
+
+ it("9. App level import of app with all access gsheet", function () {
+ homePage.CreateAppInWorkspace(workspaceName, "AppLevelImport");
+ appSettings.OpenAppSettings();
+ appSettings.GoToImport();
+ agHelper.ClickButton("Import");
+ homePage.ImportApp("ImportAppAllAccess.json", "", true);
+ cy.wait("@importNewApplication").then(() => {
+ agHelper.Sleep();
+ agHelper.RefreshPage();
+ table.WaitUntilTableLoad(0, 0, "v2");
+ });
+ // Assert table data
+ table.ReadTableRowColumnData(0, 0, "v2").then((cellData) => {
+ expect(cellData).to.eq("eac7efa5dbd3d667f26eb3d3ab504464");
+ });
+ homePage.NavigateToHome();
+ homePage.DeleteApplication("AppLevelImport");
+ });
+
after("Delete spreadsheet and app", function () {
// Delete spreadsheet and app
+ homePage.SearchAndOpenApp(appName);
gsheetHelper.DeleteSpreadsheetQuery(dataSourceName, spreadSheetName);
cy.get("@postExecute").then((interception: any) => {
expect(interception.response.body.data.body.message).to.deep.equal(
diff --git a/app/client/cypress/e2e/GSheet/Misc_Spec.ts b/app/client/cypress/e2e/GSheet/Misc_Spec.ts
index d21821a4a4..647f84562f 100644
--- a/app/client/cypress/e2e/GSheet/Misc_Spec.ts
+++ b/app/client/cypress/e2e/GSheet/Misc_Spec.ts
@@ -11,6 +11,7 @@ import {
deployMode,
locators,
draggableWidgets,
+ appSettings,
} from "../../support/Objects/ObjectsCore";
const workspaceName = "gsheet apps";
@@ -45,6 +46,7 @@ describe("GSheet Miscellaneous Tests", function () {
JSON.stringify(GSHEET_DATA),
);
cy.get("@postExecute").then((interception: any) => {
+ agHelper.Sleep();
expect(
interception.response.body.data.body.properties.title,
).to.deep.equal(spreadSheetName);
@@ -212,8 +214,62 @@ describe("GSheet Miscellaneous Tests", function () {
table.WaitUntilTableLoad();
});
+ it("6. Bug: 16391 - Verify placeholder texts for insert one/many queries", function () {
+ // Verify place holder text for Insert one query
+ let placeholderText =
+ '{\n "name": {{nameInput.text}},\n "dob": {{dobPicker.formattedDate}},\n "gender": {{genderSelect.selectedOptionValue}} \n}';
+ gsheetHelper.EnterBasicQueryValues(
+ "Insert One",
+ dataSourceName,
+ spreadSheetName,
+ false,
+ );
+ agHelper.AssertText(
+ dataSources._gSheetQueryPlaceholder,
+ "text",
+ placeholderText,
+ );
+
+ // Verify place holder text for Insert many query
+ placeholderText =
+ '[{\n "name": {{nameInput.text}},\n "dob": {{dobPicker.formattedDate}},\n "gender": {{genderSelect.selectedOptionValue}} \n}]';
+
+ gsheetHelper.EnterBasicQueryValues(
+ "Insert Many",
+ dataSourceName,
+ spreadSheetName,
+ false,
+ );
+ agHelper.AssertText(
+ dataSources._gSheetQueryPlaceholder,
+ "text",
+ placeholderText,
+ );
+ });
+
+ // This test is commented since we can't use Cypress to go to the Google authorization screen. We will uncomment it whenever we figure out how to do it.
+ // it("7. Bug#26024 App level import of gsheet app", function () {
+ // homePage.NavigateToHome();
+ // homePage.CreateNewWorkspace("AppLevelImport");
+ // homePage.CreateAppInWorkspace("AppLevelImport", "AppLevelImportCheck");
+ // appSettings.OpenAppSettings();
+ // appSettings.GoToImport();
+ // agHelper.ClickButton("Import");
+ // homePage.ImportApp("ImportAppAllAccess.json", "", true);
+ // cy.wait("@importNewApplication").then(() => {
+ // agHelper.Sleep();
+ // agHelper.ClickButton("Save and authorize");
+ // });
+ // cy.url().should("contain", "accounts.google.com");
+ // homePage.NavigateToHome();
+ // homePage.DeleteApplication("AppLevelImportCheck");
+ // homePage.DeleteWorkspace("AppLevelImport");
+ // });
+
after("Delete spreadsheet and app", function () {
// Delete spreadsheet and app
+ homePage.NavigateToHome();
+ homePage.SearchAndOpenApp(appName);
gsheetHelper.DeleteSpreadsheetQuery(dataSourceName, spreadSheetName);
cy.get("@postExecute").then((interception: any) => {
expect(interception.response.body.data.body.message).to.deep.equal(
diff --git a/app/client/cypress/e2e/GSheet/ReadNWrite_Access_Spec.ts b/app/client/cypress/e2e/GSheet/ReadNWrite_Access_Spec.ts
index 11e4c9073c..8d423f1641 100644
--- a/app/client/cypress/e2e/GSheet/ReadNWrite_Access_Spec.ts
+++ b/app/client/cypress/e2e/GSheet/ReadNWrite_Access_Spec.ts
@@ -6,6 +6,9 @@ import {
dataSources,
agHelper,
entityExplorer,
+ assertHelper,
+ table,
+ appSettings,
} from "../../support/Objects/ObjectsCore";
describe("GSheet-Functional Tests With Read/Write Access", function () {
@@ -26,8 +29,7 @@ describe("GSheet-Functional Tests With Read/Write Access", function () {
//Adding query to insert a new spreadsheet
homePage.NavigateToHome();
- homePage.CreateAppInWorkspace(workspaceName);
- homePage.RenameApplication(appName);
+ homePage.CreateAppInWorkspace(workspaceName, appName);
gsheetHelper.AddNewSpreadsheetQuery(
dataSourceName.readNWrite,
spreadSheetName,
@@ -296,8 +298,44 @@ describe("GSheet-Functional Tests With Read/Write Access", function () {
});
});
+ it("9. Import an app with read write access sheet", function () {
+ homePage.NavigateToHome();
+ homePage.ImportApp("ImportAppReadWriteAccess.json", workspaceName);
+ assertHelper.WaitForNetworkCall("importNewApplication").then(() => {
+ agHelper.Sleep();
+ //Validate table is not empty!
+ table.WaitUntilTableLoad(0, 0, "v2");
+ });
+ // Assert table data
+ table.ReadTableRowColumnData(0, 0, "v2").then((cellData) => {
+ expect(cellData).to.eq("eac7efa5dbd3d667f26eb3d3ab504464");
+ });
+ homePage.NavigateToHome();
+ homePage.DeleteApplication("ImportAppReadWriteAccess");
+ });
+
+ it("10. App level import of app with read and write access gsheet", function () {
+ homePage.CreateAppInWorkspace(workspaceName, "AppLevelImportReadNWrite");
+ appSettings.OpenAppSettings();
+ appSettings.GoToImport();
+ agHelper.ClickButton("Import");
+ homePage.ImportApp("ImportAppReadWriteAccess.json", "", true);
+ cy.wait("@importNewApplication").then(() => {
+ agHelper.Sleep();
+ agHelper.RefreshPage();
+ table.WaitUntilTableLoad(0, 0, "v2");
+ });
+ // Assert table data
+ table.ReadTableRowColumnData(0, 0, "v2").then((cellData) => {
+ expect(cellData).to.eq("eac7efa5dbd3d667f26eb3d3ab504464");
+ });
+ homePage.NavigateToHome();
+ homePage.DeleteApplication("AppLevelImportReadNWrite");
+ });
+
after("Delete spreadsheet and app", function () {
// Delete spreadsheet and app
+ homePage.SearchAndOpenApp(appName);
gsheetHelper.DeleteSpreadsheetQuery(
dataSourceName.allAccess,
spreadSheetName,
diff --git a/app/client/cypress/e2e/GSheet/ReadOnly_Access_Spec.ts b/app/client/cypress/e2e/GSheet/ReadOnly_Access_Spec.ts
index 1561282ae9..7165c5ba1f 100644
--- a/app/client/cypress/e2e/GSheet/ReadOnly_Access_Spec.ts
+++ b/app/client/cypress/e2e/GSheet/ReadOnly_Access_Spec.ts
@@ -6,6 +6,9 @@ import {
dataSources,
agHelper,
entityExplorer,
+ assertHelper,
+ table,
+ appSettings,
} from "../../support/Objects/ObjectsCore";
describe("GSheet-Functional Tests With Read Access", function () {
@@ -26,8 +29,7 @@ describe("GSheet-Functional Tests With Read Access", function () {
//Adding query to insert a new spreadsheet
homePage.NavigateToHome();
- homePage.CreateAppInWorkspace(workspaceName);
- homePage.RenameApplication(appName);
+ homePage.CreateAppInWorkspace(workspaceName, appName);
gsheetHelper.AddNewSpreadsheetQuery(
dataSourceName.allAccess,
spreadSheetName,
@@ -278,8 +280,47 @@ describe("GSheet-Functional Tests With Read Access", function () {
});
});
+ it("8. Import an app with read only access sheet", function () {
+ homePage.NavigateToHome();
+ homePage.ImportApp("ImportAppReadAccess.json", workspaceName);
+ assertHelper.WaitForNetworkCall("importNewApplication").then(() => {
+ agHelper.Sleep();
+ //Validate table is not empty!
+ table.WaitUntilTableLoad(0, 0, "v2");
+ });
+ // Assert table data
+ table.ReadTableRowColumnData(0, 0, "v2").then((cellData) => {
+ expect(cellData).to.eq("eac7efa5dbd3d667f26eb3d3ab504464");
+ });
+ homePage.NavigateToHome();
+ homePage.DeleteApplication("ImportAppReadAccess");
+ });
+
+ it("9. App level import of app with read only access gsheet", function () {
+ homePage.CreateAppInWorkspace(
+ workspaceName,
+ "AppLevelImportReadOnlyAccess",
+ );
+ appSettings.OpenAppSettings();
+ appSettings.GoToImport();
+ agHelper.ClickButton("Import");
+ homePage.ImportApp("ImportAppReadAccess.json", "", true);
+ cy.wait("@importNewApplication").then(() => {
+ agHelper.Sleep();
+ agHelper.RefreshPage();
+ table.WaitUntilTableLoad(0, 0, "v2");
+ });
+ // Assert table data
+ table.ReadTableRowColumnData(0, 0, "v2").then((cellData) => {
+ expect(cellData).to.eq("eac7efa5dbd3d667f26eb3d3ab504464");
+ });
+ homePage.NavigateToHome();
+ homePage.DeleteApplication("AppLevelImportReadOnlyAccess");
+ });
+
after("Delete spreadsheet and app", function () {
// Delete spreadsheet and app
+ homePage.SearchAndOpenApp(appName);
gsheetHelper.DeleteSpreadsheetQuery(
dataSourceName.allAccess,
spreadSheetName,
diff --git a/app/client/cypress/e2e/GSheet/SelectedSheet_Access_Spec.ts b/app/client/cypress/e2e/GSheet/SelectedSheet_Access_Spec.ts
index 4415ae80f0..a2257078c1 100644
--- a/app/client/cypress/e2e/GSheet/SelectedSheet_Access_Spec.ts
+++ b/app/client/cypress/e2e/GSheet/SelectedSheet_Access_Spec.ts
@@ -6,6 +6,9 @@ import {
dataSources,
agHelper,
entityExplorer,
+ assertHelper,
+ table,
+ appSettings,
} from "../../support/Objects/ObjectsCore";
const workspaceName = "gsheet apps";
@@ -20,8 +23,7 @@ describe("GSheet-Functional Tests With Selected Access", function () {
//Adding app
homePage.NavigateToHome();
- homePage.CreateAppInWorkspace(workspaceName);
- homePage.RenameApplication(appName);
+ homePage.CreateAppInWorkspace(workspaceName, appName);
});
it("1. Add and verify fetch details query", () => {
@@ -290,9 +292,46 @@ describe("GSheet-Functional Tests With Selected Access", function () {
});
});
+ it("8. Import an app with selected access sheet", function () {
+ homePage.NavigateToHome();
+ homePage.ImportApp("ImportAppSelectedAccess.json", workspaceName);
+ assertHelper.WaitForNetworkCall("importNewApplication").then(() => {
+ agHelper.Sleep();
+ //Validate table is not empty!
+ table.WaitUntilTableLoad(0, 0, "v2");
+ });
+ // Assert table data
+ table.ReadTableRowColumnData(0, 0, "v2").then((cellData) => {
+ expect(cellData).to.eq("eac7efa5dbd3d667f26eb3d3ab504464");
+ });
+ homePage.NavigateToHome();
+ homePage.DeleteApplication("ImportAppSelectedAccess");
+ });
+
+ it("9. App level import of app with Selected sheet access gsheet", function () {
+ homePage.CreateAppInWorkspace(
+ workspaceName,
+ "AppLevelImportSelectedAccess",
+ );
+ appSettings.OpenAppSettings();
+ appSettings.GoToImport();
+ agHelper.ClickButton("Import");
+ homePage.ImportApp("ImportAppSelectedAccess.json", "", true);
+ cy.wait("@importNewApplication").then(() => {
+ agHelper.Sleep();
+ agHelper.RefreshPage();
+ table.WaitUntilTableLoad(0, 0, "v2");
+ });
+ // Assert table data
+ table.ReadTableRowColumnData(0, 0, "v2").then((cellData) => {
+ expect(cellData).to.eq("eac7efa5dbd3d667f26eb3d3ab504464");
+ });
+ homePage.NavigateToHome();
+ homePage.DeleteApplication("AppLevelImportSelectedAccess");
+ });
+
after("Delete app", function () {
// Delete app
- homePage.NavigateToHome();
homePage.DeleteApplication(appName);
});
});
diff --git a/app/client/cypress/e2e/GSheet/WidgetBinding_AllAccess_Spec.ts b/app/client/cypress/e2e/GSheet/WidgetBinding_AllAccess_Spec.ts
index ab06580b9f..efc7b798f3 100644
--- a/app/client/cypress/e2e/GSheet/WidgetBinding_AllAccess_Spec.ts
+++ b/app/client/cypress/e2e/GSheet/WidgetBinding_AllAccess_Spec.ts
@@ -51,6 +51,7 @@ describe("GSheet-widget binding", function () {
// Adding suggested widgets and verify
dataSources.AddSuggestedWidget(Widgets.Table);
+ agHelper.RefreshPage();
table.ReadTableRowColumnData(0, 0, "v2").then((cellData) => {
expect(cellData).to.eq("eac7efa5dbd3d667f26eb3d3ab504464");
});
diff --git a/app/client/cypress/e2e/GSheet/WidgetBinding_SelectedAccess_Spec.ts b/app/client/cypress/e2e/GSheet/WidgetBinding_SelectedAccess_Spec.ts
index 1d72dbfee3..2ae27712c2 100644
--- a/app/client/cypress/e2e/GSheet/WidgetBinding_SelectedAccess_Spec.ts
+++ b/app/client/cypress/e2e/GSheet/WidgetBinding_SelectedAccess_Spec.ts
@@ -51,6 +51,7 @@ describe("GSheet-widget binding for selected sheet access", function () {
// Adding suggested widgets and verify
dataSources.AddSuggestedWidget(Widgets.Table);
+ agHelper.RefreshPage();
table.ReadTableRowColumnData(0, 0, "v2").then((cellData) => {
expect(cellData).to.eq("eac7efa5dbd3d667f26eb3d3ab504464");
});
diff --git a/app/client/cypress/e2e/Regression/ClientSide/AdminSettings/Admin_settings_spec.js b/app/client/cypress/e2e/Regression/ClientSide/AdminSettings/Admin_settings_spec.js
index 640d6ffee6..dcc7cf26ec 100644
--- a/app/client/cypress/e2e/Regression/ClientSide/AdminSettings/Admin_settings_spec.js
+++ b/app/client/cypress/e2e/Regression/ClientSide/AdminSettings/Admin_settings_spec.js
@@ -62,8 +62,8 @@ describe("Admin settings page", function () {
cy.url().should("contain", "/settings/authentication");
cy.get(adminsSettings.emailTab).click();
cy.url().should("contain", "/settings/email");
- cy.get(adminsSettings.googleMapsTab).click();
- cy.url().should("contain", "/settings/google-maps");
+ cy.get(adminsSettings.developerSettingsTab).click();
+ cy.url().should("contain", "/settings/developer-settings");
cy.get(adminsSettings.versionTab).click();
cy.url().should("contain", "/settings/version");
},
@@ -90,7 +90,7 @@ describe("Admin settings page", function () {
cy.url().should("contain", "/settings/authentication");
cy.get(adminsSettings.emailTab).click();
cy.url().should("contain", "/settings/email");
- cy.get(adminsSettings.googleMapsTab).should("not.exist");
+ cy.get(adminsSettings.developerSettingsTab).should("not.exist");
cy.get(adminsSettings.versionTab).click();
cy.url().should("contain", "/settings/version");
},
diff --git a/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Admin_settings_1_spec.js b/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Admin_settings_1_spec.js
index 28e19fae75..2e5524d998 100644
--- a/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Admin_settings_1_spec.js
+++ b/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Admin_settings_1_spec.js
@@ -12,7 +12,7 @@ const routes = {
SETTINGS: "/settings",
GENERAL: "/settings/general",
EMAIL: "/settings/email",
- GOOGLE_MAPS: "/settings/google-maps",
+ DEVELOPER_SETTINGS: "/settings/developer-settings",
AUTHENTICATION: "/settings/authentication",
GOOGLEAUTH: "/settings/authentication/google-auth",
GITHUBAUTH: "/settings/authentication/github-auth",
@@ -45,8 +45,8 @@ describe("Admin settings page", function () {
it("2. should test that page header is visible", () => {
cy.get(adminsSettings.appsmithHeader).should("be.visible");
- cy.visit(routes.GOOGLE_MAPS, { timeout: 60000 });
- cy.url().should("contain", "/google-maps");
+ cy.visit(routes.DEVELOPER_SETTINGS, { timeout: 60000 });
+ cy.url().should("contain", "/developer-settings");
cy.wait(2000); //page to load properly
cy.get(adminsSettings.appsmithHeader).should("be.visible");
cy.visit(routes.GOOGLEAUTH, { timeout: 60000 });
@@ -84,8 +84,8 @@ describe("Admin settings page", function () {
cy.url().should("contain", routes.AUTHENTICATION);
cy.get(adminsSettings.emailTab).click();
cy.url().should("contain", routes.EMAIL);
- cy.get(adminsSettings.googleMapsTab).click();
- cy.url().should("contain", routes.GOOGLE_MAPS);
+ cy.get(adminsSettings.developerSettingsTab).click();
+ cy.url().should("contain", routes.DEVELOPER_SETTINGS);
cy.get(adminsSettings.versionTab).click();
cy.url().should("contain", routes.VERSION);
},
@@ -105,7 +105,7 @@ describe("Admin settings page", function () {
cy.get(adminsSettings.authenticationTab).click();
cy.url().should("contain", routes.AUTHENTICATION);
cy.get(adminsSettings.emailTab).click();
- cy.get(adminsSettings.googleMapsTab).should("not.exist");
+ cy.get(adminsSettings.developerSettingsTab).should("not.exist");
cy.url().should("contain", routes.EMAIL);
cy.get(adminsSettings.versionTab).click();
cy.url().should("contain", routes.VERSION);
diff --git a/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Admin_settings_2_spec.js b/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Admin_settings_2_spec.js
index 70020fe1e6..116f302685 100644
--- a/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Admin_settings_2_spec.js
+++ b/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Admin_settings_2_spec.js
@@ -12,7 +12,7 @@ const routes = {
SETTINGS: "/settings",
GENERAL: "/settings/general",
EMAIL: "/settings/email",
- GOOGLE_MAPS: "/settings/google-maps",
+ DEVELOPER_SETTINGS: "/settings/developer-settings",
AUTHENTICATION: "/settings/authentication",
GOOGLEAUTH: "/settings/authentication/google-auth",
GITHUBAUTH: "/settings/authentication/github-auth",
@@ -23,7 +23,7 @@ const routes = {
describe("Admin settings page", function () {
it("1. should test that configure link redirects to google maps setup doc", () => {
- cy.visit(routes.GOOGLE_MAPS, { timeout: 60000 });
+ cy.visit(routes.DEVELOPER_SETTINGS, { timeout: 60000 });
cy.get(adminsSettings.readMoreLink).within(() => {
cy.get("a")
.should("have.attr", "target", "_blank")
diff --git a/app/client/cypress/e2e/Regression/ClientSide/Git/GitSync/Connection_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Git/GitSync/Connection_spec.js
index f89bb177d9..0f77bed7e9 100644
--- a/app/client/cypress/e2e/Regression/ClientSide/Git/GitSync/Connection_spec.js
+++ b/app/client/cypress/e2e/Regression/ClientSide/Git/GitSync/Connection_spec.js
@@ -221,7 +221,7 @@ describe("Git sync modal: connect tab", function () {
});
cy.get(gitSyncLocators.connectSubmitBtn).scrollIntoView().click();
- cy.get(gitSyncLocators.connetStatusbar).should("exist");
+ // cy.get(gitSyncLocators.connetStatusbar).should("exist");
cy.wait("@connectGitLocalRepo").then((interception) => {
const status = interception.response.body.responseMeta.status;
expect(status).to.be.gte(400);
diff --git a/app/client/cypress/e2e/Regression/ClientSide/Git/GitSync/RepoLimitExceededErrorModal_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Git/GitSync/RepoLimitExceededErrorModal_spec.js
index f537cfe973..b42282c3e6 100644
--- a/app/client/cypress/e2e/Regression/ClientSide/Git/GitSync/RepoLimitExceededErrorModal_spec.js
+++ b/app/client/cypress/e2e/Regression/ClientSide/Git/GitSync/RepoLimitExceededErrorModal_spec.js
@@ -92,26 +92,10 @@ describe("Repo Limit Exceeded Error Modal", function () {
});
after(() => {
- cy.request({
- method: "DELETE",
- url: "api/v1/applications/" + repoName1,
- failOnStatusCode: false,
- });
- cy.request({
- method: "DELETE",
- url: "api/v1/applications/" + repoName2,
- failOnStatusCode: false,
- });
- cy.request({
- method: "DELETE",
- url: "api/v1/applications/" + repoName3,
- failOnStatusCode: false,
- });
- cy.request({
- method: "DELETE",
- url: "api/v1/applications/" + repoName4,
- failOnStatusCode: false,
- });
+ homePage.DeleteAppviaAPI(repoName1);
+ homePage.DeleteAppviaAPI(repoName2);
+ homePage.DeleteAppviaAPI(repoName3);
+ homePage.DeleteAppviaAPI(repoName4);
gitSync.DeleteTestGithubRepo(repoName1);
gitSync.DeleteTestGithubRepo(repoName2);
gitSync.DeleteTestGithubRepo(repoName3);
diff --git a/app/client/cypress/e2e/Regression/ClientSide/IDE/Canvas_Context_Selected_Widgets_spec.js b/app/client/cypress/e2e/Regression/ClientSide/IDE/Canvas_Context_Selected_Widgets_spec.js
index 01f5416bd7..afe47d3a16 100644
--- a/app/client/cypress/e2e/Regression/ClientSide/IDE/Canvas_Context_Selected_Widgets_spec.js
+++ b/app/client/cypress/e2e/Regression/ClientSide/IDE/Canvas_Context_Selected_Widgets_spec.js
@@ -272,4 +272,40 @@ describe("Canvas context widget selection", function () {
cy.get(".is-selected").should("contain", "Tab 2");
cy.get(".t--property-pane-title").should("contain", "Button4");
});
+
+ it("11. Widgets inside modal widget should open when loaded from the URL", function () {
+ //select widget in page1
+ _.entityExplorer.SelectEntityInModal("Modal1", "Widgets");
+
+ //verify the Modal1 is open and Text1 is selected in page1
+ cy.get(`div[data-testid='t--selected']`).should("have.length", 1);
+ cy.get(".t--modal-widget").should("have.length", 1);
+ cy.get(".t--property-pane-title").should("contain", "Text1");
+
+ // Get the current URL
+ cy.url().then((url) => {
+ //switch to page2
+ _.entityExplorer.SelectEntityByName(page2, "Pages");
+
+ //select widget in page2
+ _.entityExplorer.SelectEntityByName("Text1", "Widgets");
+
+ //verify the widget is selected in page2
+ cy.get(`div[data-testid='t--selected']`).should("have.length", 1);
+
+ // open the URL
+ cy.visit(url);
+
+ // wati for the page to load
+ cy.wait(4000);
+
+ //select widget in page1
+ _.entityExplorer.SelectEntityInModal("Modal1", "Widgets");
+
+ //verify the Modal1 is open and Text1 is selected in page1
+ cy.get(`div[data-testid='t--selected']`).should("have.length", 1);
+ cy.get(".t--modal-widget").should("have.length", 1);
+ cy.get(".t--property-pane-title").should("contain", "Text1");
+ });
+ });
});
diff --git a/app/client/cypress/e2e/Regression/ClientSide/Onboarding/FirstTimeUserOnboarding_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Onboarding/FirstTimeUserOnboarding_spec.js
index 2c1df3d10e..8e290495ac 100644
--- a/app/client/cypress/e2e/Regression/ClientSide/Onboarding/FirstTimeUserOnboarding_spec.js
+++ b/app/client/cypress/e2e/Regression/ClientSide/Onboarding/FirstTimeUserOnboarding_spec.js
@@ -217,7 +217,7 @@ describe("FirstTimeUserOnboarding", function () {
false,
);
agHelper.Sleep(500);
- agHelper.GetNClick(debuggerHelper.locators._helpButton);
+ agHelper.GetNClick(debuggerHelper.locators._helpButton, 0, true);
agHelper.AssertElementVisibility(OnboardingLocator.checklistDatasourceBtn);
});
diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/Others/MapWidget_Spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Others/MapWidget_Spec.ts
new file mode 100644
index 0000000000..db84eaccfa
--- /dev/null
+++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Others/MapWidget_Spec.ts
@@ -0,0 +1,164 @@
+///
+import {
+ agHelper,
+ entityExplorer,
+ propPane,
+ draggableWidgets,
+ deployMode,
+ locators,
+} from "../../../../../support/Objects/ObjectsCore";
+
+const location = [
+ {
+ lat: 28.7040592,
+ long: 77.10249019999999,
+ title: "Delhi, India",
+ },
+ {
+ lat: 28.4594965,
+ long: 77.0266383,
+ title: "Gurugram, Haryana, India",
+ },
+ {
+ lat: 40.7127753,
+ long: -74.0059728,
+ title: "New York, NY, USA",
+ },
+];
+
+describe("Map Widget", function () {
+ it("1.Drag Map Widget and Verify the Map Widget with Initial Location", () => {
+ //Add map and verify
+ entityExplorer.DragDropWidgetNVerify(draggableWidgets.MAP, 200, 200);
+ deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.MAP));
+ agHelper.VerifySnapshot(locators._root, "mapsimple");
+ deployMode.NavigateBacktoEditor();
+ entityExplorer.SelectEntityByName("Map1", "Widgets");
+
+ // Add Initial location and verify
+ propPane.TypeTextIntoField("Initial location", "New York, NY, USA");
+ agHelper.PressEnter();
+ deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.MAP));
+ agHelper.VerifySnapshot(locators._root, "mapWithInitalLocation");
+ deployMode.NavigateBacktoEditor();
+ entityExplorer.SelectEntityByName("Map1", "Widgets");
+
+ // convert Initial location to JS, update and verify
+ propPane.EnterJSContext("Initial location", JSON.stringify(location[0]));
+ deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.MAP));
+ agHelper.VerifySnapshot(locators._root, "mapWithinItalLocationAsJS");
+ deployMode.NavigateBacktoEditor();
+ entityExplorer.SelectEntityByName("Map1", "Widgets");
+ });
+
+ it("2.Verify the Map Widget with Default markers", () => {
+ // With single default marker
+ propPane.TypeTextIntoField(
+ "Default Markers",
+ JSON.stringify(location.slice(0, 1)),
+ );
+ deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.MAP));
+ agHelper.VerifySnapshot(locators._root, "mapWithDefaultMarker1");
+ deployMode.NavigateBacktoEditor();
+ entityExplorer.SelectEntityByName("Map1", "Widgets");
+
+ // With multiple default marker
+ propPane.TypeTextIntoField(
+ "Default Markers",
+ JSON.stringify(location.slice(0, 2)),
+ );
+ deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.MAP));
+ agHelper.VerifySnapshot(locators._root, "mapWithDefaultMarker2");
+ deployMode.NavigateBacktoEditor();
+ entityExplorer.SelectEntityByName("Map1", "Widgets");
+ });
+
+ it("3.Verify the Map Widget with zoom level", () => {
+ // With multiple default marker
+ propPane.SetZoomLevel(70);
+ deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.MAP));
+ agHelper.VerifySnapshot(locators._root, "mapWithDefaultZoomOut");
+ deployMode.NavigateBacktoEditor();
+ entityExplorer.SelectEntityByName("Map1", "Widgets");
+
+ // Zoom in and verify
+ propPane.SetZoomLevel(30);
+ deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.MAP));
+ agHelper.VerifySnapshot(locators._root, "mapWithDefaultZoomIn");
+ deployMode.NavigateBacktoEditor();
+ entityExplorer.SelectEntityByName("Map1", "Widgets");
+ });
+
+ it("4.1 Verify the Map Widget with different general settings", () => {
+ // With visibility off
+ propPane.TogglePropertyState("Visible", "Off");
+ deployMode.DeployApp();
+ agHelper.VerifySnapshot(locators._root, "mapWithVisibilityOff");
+ deployMode.NavigateBacktoEditor();
+ entityExplorer.SelectEntityByName("Map1", "Widgets");
+
+ // Convert visibility to JS and set the visibility "On" and verify
+ propPane.EnterJSContext("Visible", "true");
+ deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.MAP));
+ agHelper.VerifySnapshot(locators._root, "mapWithVisibilityOnWithJS");
+ deployMode.NavigateBacktoEditor();
+ entityExplorer.SelectEntityByName("Map1", "Widgets");
+
+ // Toggle off Enable pick location and verify
+ propPane.TogglePropertyState("Enable pick location", "Off");
+ deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.MAP));
+ agHelper.VerifySnapshot(locators._root, "mapWithPickLocationOff");
+ deployMode.NavigateBacktoEditor();
+ entityExplorer.SelectEntityByName("Map1", "Widgets");
+
+ // Toggle off Map & marker centering and verify
+ propPane.TogglePropertyState("Map & marker centering", "Off");
+ deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.MAP));
+ agHelper.VerifySnapshot(locators._root, "mapWithMapNMarkerCenteringOff");
+ deployMode.NavigateBacktoEditor();
+ entityExplorer.SelectEntityByName("Map1", "Widgets");
+ });
+
+ it("4.2 Verify the Map Widget with different general settings", () => {
+ // Toggle On Enabling clustering and verify
+ propPane.TogglePropertyState("Enable clustering", "On");
+ deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.MAP));
+ agHelper.VerifySnapshot(locators._root, "mapWithEnablingClusteringON");
+ deployMode.NavigateBacktoEditor();
+ entityExplorer.SelectEntityByName("Map1", "Widgets");
+
+ // Convert Enabling clustering and disable it and verify
+ propPane.EnterJSContext("Enable clustering", "false");
+ deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.MAP));
+ agHelper.VerifySnapshot(locators._root, "mapWithEnablingClusteringOff");
+ deployMode.NavigateBacktoEditor();
+ entityExplorer.SelectEntityByName("Map1", "Widgets");
+
+ // Toggle off Enable search location and verify
+ propPane.TogglePropertyState("Enable search location", "Off");
+ deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.MAP));
+ agHelper.VerifySnapshot(locators._root, "mapWithEnableSearchLocationOff");
+ deployMode.NavigateBacktoEditor();
+ entityExplorer.SelectEntityByName("Map1", "Widgets");
+ });
+
+ it("5 Verify the style changes", () => {
+ // Change border radius and verify
+ propPane.MoveToTab("Style");
+ propPane.EnterJSContext("Border radius", "1.5rem");
+ deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.MAP));
+ agHelper.VerifySnapshot(locators._root, "mapWithBorderRadius");
+ deployMode.NavigateBacktoEditor();
+ entityExplorer.SelectEntityByName("Map1", "Widgets");
+
+ // Change box shadow and verify
+ const boxShadow =
+ "0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)";
+ propPane.MoveToTab("Style");
+ propPane.EnterJSContext("Box shadow", boxShadow);
+ deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.MAP));
+ agHelper.VerifySnapshot(locators._root, "mapWithBoxShadow");
+ deployMode.NavigateBacktoEditor();
+ entityExplorer.SelectEntityByName("Map1", "Widgets");
+ });
+});
diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/TableV2_Widget_Copy_Paste_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/TableV2_Widget_Copy_Paste_spec.js
index e55b6d67cb..64ca8476a1 100644
--- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/TableV2_Widget_Copy_Paste_spec.js
+++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/TableV2_Widget_Copy_Paste_spec.js
@@ -1,6 +1,7 @@
const apiwidget = require("../../../../../locators/apiWidgetslocator.json");
const commonlocators = require("../../../../../locators/commonlocators.json");
const widgetsPage = require("../../../../../locators/Widgets.json");
+import { featureFlagIntercept } from "../../../../../support/Objects/FeatureFlags";
import {
agHelper,
entityExplorer,
@@ -42,9 +43,23 @@ describe("Test Suite to validate copy/paste table Widget V2", function () {
});
cy.wait(200);
cy.get(apiwidget.propertyList).then(function ($lis) {
- expect($lis).to.have.length(23);
+ expect($lis).to.have.length(22);
expect($lis.eq(0)).to.contain("{{Table1Copy.selectedRow}}");
expect($lis.eq(1)).to.contain("{{Table1Copy.selectedRows}}");
});
});
+
+ it("2. Should check that table binding list gets updated when .filters gets added to it", () => {
+ featureFlagIntercept({ release_table_serverside_filtering_enabled: true });
+ cy.CheckAndUnfoldWidgets();
+ entityExplorer.ActionContextMenuByEntityName({
+ entityNameinLeftSidebar: "Table1Copy",
+ action: "Show bindings",
+ });
+ cy.wait(200);
+ cy.get(apiwidget.propertyList).then(function ($lis) {
+ expect($lis).to.have.length(23);
+ expect($lis.last()).to.contain("{{Table1Copy.filters}}");
+ });
+ });
});
diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/server_side_filtering_spec_1.ts b/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/server_side_filtering_spec_1.ts
index 8c40a0fdc7..8c2addab72 100644
--- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/server_side_filtering_spec_1.ts
+++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/server_side_filtering_spec_1.ts
@@ -9,6 +9,7 @@ import {
} from "../../../../../support/Objects/ObjectsCore";
import oneClickBindingLocator from "../../../../../locators/OneClickBindingLocator";
import { expandLoadMoreOptions } from "../../OneClickBinding/spec_utility";
+import { featureFlagIntercept } from "../../../../../support/Objects/FeatureFlags";
const ALERT_SUCCESS_MSG = "Table data filtered";
@@ -22,6 +23,7 @@ describe("Table widget v2: test server side filtering", function () {
* 5. Bind it as a WHERE condition inside an SQL query
*/
before(() => {
+ featureFlagIntercept({ release_table_serverside_filtering_enabled: true });
entityExplorer.DragDropWidgetNVerify(draggableWidgets.TABLE, 300, 300);
// Create SQL data-source
@@ -110,3 +112,20 @@ describe("Table widget v2: test server side filtering", function () {
});
});
});
+
+describe("Table v2: Server side filtering hidden behind feature flag", () => {
+ before(() => {
+ featureFlagIntercept({ release_table_serverside_filtering_enabled: false });
+ entityExplorer.DragDropWidgetNVerify(draggableWidgets.TABLE, 700, 300);
+ });
+
+ it("1. should test that server side filtering option and dtable.filters autocomplete should not be visible", () => {
+ agHelper.AssertElementAbsence(
+ propPane._propertyControl("serversidefiltering"),
+ );
+ entityExplorer.DragDropWidgetNVerify(draggableWidgets.TEXT, 300, 700);
+ entityExplorer.SelectEntityByName("Text1");
+ propPane.TypeTextIntoField("Text", "{{Table1.filters");
+ agHelper.AssertElementAbsence(locators._hints);
+ });
+});
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 6e3f8803e8..d9ed33889b 100644
--- a/app/client/cypress/e2e/Regression/ServerSide/JsFunctionExecution/JSFunctionExecution_spec.ts
+++ b/app/client/cypress/e2e/Regression/ServerSide/JsFunctionExecution/JSFunctionExecution_spec.ts
@@ -366,13 +366,13 @@ describe("JS Function Execution", function () {
: i === functionsLength - 1
? `
${functionName}: ${
- isMarkedAsync ? "async" : ""
- } ()=>"${functionName}",
+ isMarkedAsync ? "async" : ""
+ } ()=>"${functionName}",
}`
: `
${functionName}: ${
- isMarkedAsync ? "async" : ""
- } ()=> "${functionName}",`;
+ isMarkedAsync ? "async" : ""
+ } ()=> "${functionName}",`;
}
return JS_OBJECT_BODY;
};
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 1b576e4e8c..ce17e6ab1a 100644
--- a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/GoogleSheets_spec.ts
+++ b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/GoogleSheets_spec.ts
@@ -11,47 +11,6 @@ describe(
"Google Sheets datasource row objects placeholder",
function () {
let pluginName = "Google Sheets";
- let placeholderText =
- '{\n "name": {{nameInput.text}},\n "dob": {{dobPicker.formattedDate}},\n "gender": {{genderSelect.selectedOptionValue}} \n}';
-
- //Skiiping due to open bug #18035: Should the Save button be renamed as "Save and Authorise" in case of Google sheets for datasource discard popup? -
- //Bug #18035: Bug is to be taken in ds experience activation phase
- it.skip("1. Bug: 16391 - Google Sheets DS, placeholder objects keys should have quotes", function () {
- // create new Google Sheets datasource
- dataSources.NavigateToDSCreateNew();
- dataSources.CreatePlugIn(pluginName);
-
- // navigate to create query tab and create a new query
- // cy.get("@saveDatasource").then((httpResponse) => {
- // datasourceName = httpResponse.body.data.name;
- // // clicking on new query to write a query
- // cy.NavigateToQueryEditor();
- // cy.get(explorer.createNew).click();
- // cy.get("div:contains('" + datasourceName + " Query')")
- // .last()
- // .click();
-
- // fill the create new api google sheets form
- // and check for rowobject placeholder text
- cy.get(datasource.gSheetsOperationDropdown).click();
- cy.get(datasource.gSheetsInsertOneOption).click();
-
- cy.get(datasource.gSheetsEntityDropdown).click();
- cy.get(datasource.gSheetsSheetRowsOption).click();
-
- cy.get(datasource.gSheetsCodeMirrorPlaceholder).should(
- "have.text",
- placeholderText,
- );
-
- // delete query and datasource after test is done
- // cy.get("@createNewApi").then((httpResponse) => {
- // queryName = httpResponse.response.body.data.name;
- // cy.deleteQueryUsingContext();
- // cy.deleteDatasource(datasourceName);
- // });
- //});
- });
it("1. Verify GSheets dropdown options", function () {
dataSources.NavigateToDSCreateNew();
diff --git a/app/client/cypress/fixtures/ImportAppAllAccess.json b/app/client/cypress/fixtures/ImportAppAllAccess.json
new file mode 100644
index 0000000000..c894182e4a
--- /dev/null
+++ b/app/client/cypress/fixtures/ImportAppAllAccess.json
@@ -0,0 +1 @@
+{"clientSchemaVersion":1.0,"serverSchemaVersion":6.0,"exportedApplication":{"name":"ImportAppAllAccess","isPublic":false,"pages":[{"id":"Page1","isDefault":true}],"publishedPages":[{"id":"Page1","isDefault":true}],"viewMode":false,"appIsExample":false,"unreadCommentThreads":0.0,"color":"#CCCCCC","icon":"call","slug":"importappallaccess","unpublishedCustomJSLibs":[],"publishedCustomJSLibs":[],"evaluationVersion":2.0,"applicationVersion":2.0,"collapseInvisibleWidgets":true,"isManualUpdate":false,"deleted":false},"datasourceList":[{"name":"gsheet","pluginId":"google-sheets-plugin","messages":[],"isAutoGenerated":false,"deleted":false,"gitSyncId":"6507db87f847163dfe7777c4_6507dbd7f847163dfe7777cd"}],"customJSLibList":[],"pageList":[{"unpublishedPage":{"name":"Page1","slug":"page1","layouts":[{"viewMode":false,"dsl":{"widgetName":"MainContainer","backgroundColor":"none","rightColumn":4896.0,"snapColumns":64.0,"detachFromLayout":true,"widgetId":"0","topRow":0.0,"bottomRow":380.0,"containerStyle":"none","snapRows":124.0,"parentRowSpace":1.0,"type":"CANVAS_WIDGET","canExtend":true,"version":86.0,"minHeight":1292.0,"dynamicTriggerPathList":[],"parentColumnSpace":1.0,"dynamicBindingPathList":[],"leftColumn":0.0,"children":[{"boxShadow":"{{appsmith.theme.boxShadow.appBoxShadow}}","borderColor":"#E0DEDE","isVisibleDownload":true,"iconSVG":"/static/media/icon.e6911f8bb94dc6c4a102a74740c41763.svg","topRow":0.0,"isSortable":true,"type":"TABLE_WIDGET_V2","inlineEditingSaveOption":"ROW_LEVEL","animateLoading":true,"dynamicBindingPathList":[{"key":"accentColor"},{"key":"borderRadius"},{"key":"boxShadow"},{"key":"tableData"},{"key":"primaryColumns.uniq_id.computedValue"},{"key":"primaryColumns.japanese_name.computedValue"},{"key":"primaryColumns.currencies.computedValue"},{"key":"primaryColumns.specialChars.computedValue"},{"key":"primaryColumns.product_name.computedValue"},{"key":"primaryColumns.manufacturer.computedValue"},{"key":"primaryColumns.price.computedValue"},{"key":"primaryColumns.number_available_in_stock.computedValue"},{"key":"primaryColumns.number_of_reviews.computedValue"},{"key":"primaryColumns.number_of_answered_questions.computedValue"},{"key":"primaryColumns.average_review_rating.computedValue"},{"key":"primaryColumns.amazon_category_and_sub_category.computedValue"},{"key":"primaryColumns.customers_who_bought_this_item_also_bought.computedValue"},{"key":"primaryColumns.rowIndex.computedValue"}],"needsHeightForContent":true,"leftColumn":0.0,"delimiter":",","defaultSelectedRowIndex":0.0,"accentColor":"{{appsmith.theme.colors.primaryColor}}","isVisibleFilters":true,"isVisible":true,"enableClientSideSearch":true,"version":2.0,"totalRecordsCount":0.0,"tags":["Suggested","Display"],"isLoading":false,"childStylesheet":{"button":{"buttonColor":"{{appsmith.theme.colors.primaryColor}}","borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","boxShadow":"none"},"menuButton":{"menuColor":"{{appsmith.theme.colors.primaryColor}}","borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","boxShadow":"none"},"iconButton":{"buttonColor":"{{appsmith.theme.colors.primaryColor}}","borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","boxShadow":"none"},"editActions":{"saveButtonColor":"{{appsmith.theme.colors.primaryColor}}","saveBorderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","discardButtonColor":"{{appsmith.theme.colors.primaryColor}}","discardBorderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}"}},"borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","columnUpdatedAt":1.695963199756E12,"defaultSelectedRowIndices":[0.0],"mobileBottomRow":29.0,"widgetName":"Table1","defaultPageSize":0.0,"columnOrder":["uniq_id","japanese_name","currencies","specialChars","product_name","manufacturer","price","number_available_in_stock","number_of_reviews","number_of_answered_questions","average_review_rating","amazon_category_and_sub_category","customers_who_bought_this_item_also_bought","rowIndex"],"dynamicPropertyPathList":[],"displayName":"Table","bottomRow":28.0,"columnWidthMap":{},"parentRowSpace":10.0,"hideCard":false,"mobileRightColumn":34.0,"parentColumnSpace":16.65625,"dynamicTriggerPathList":[],"borderWidth":"1","primaryColumns":{"uniq_id":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":0.0,"width":150.0,"originalId":"uniq_id","id":"uniq_id","alias":"uniq_id","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"uniq_id","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"uniq_id\"]))}}","sticky":"","validation":{}},"japanese_name":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":1.0,"width":150.0,"originalId":"japanese_name","id":"japanese_name","alias":"japanese_name","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"japanese_name","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"japanese_name\"]))}}","sticky":"","validation":{}},"currencies":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":2.0,"width":150.0,"originalId":"currencies","id":"currencies","alias":"currencies","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"currencies","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"currencies\"]))}}","sticky":"","validation":{}},"specialChars":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":3.0,"width":150.0,"originalId":"specialChars","id":"specialChars","alias":"specialChars","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"specialChars","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"specialChars\"]))}}","sticky":"","validation":{}},"product_name":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":4.0,"width":150.0,"originalId":"product_name","id":"product_name","alias":"product_name","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"product_name","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"product_name\"]))}}","sticky":"","validation":{}},"manufacturer":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":5.0,"width":150.0,"originalId":"manufacturer","id":"manufacturer","alias":"manufacturer","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"manufacturer","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"manufacturer\"]))}}","sticky":"","validation":{}},"price":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":6.0,"width":150.0,"originalId":"price","id":"price","alias":"price","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"number","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"price","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"price\"]))}}","sticky":"","validation":{}},"number_available_in_stock":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":7.0,"width":150.0,"originalId":"number_available_in_stock","id":"number_available_in_stock","alias":"number_available_in_stock","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"number_available_in_stock","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"number_available_in_stock\"]))}}","sticky":"","validation":{}},"number_of_reviews":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":8.0,"width":150.0,"originalId":"number_of_reviews","id":"number_of_reviews","alias":"number_of_reviews","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"number","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"number_of_reviews","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"number_of_reviews\"]))}}","sticky":"","validation":{}},"number_of_answered_questions":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":9.0,"width":150.0,"originalId":"number_of_answered_questions","id":"number_of_answered_questions","alias":"number_of_answered_questions","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"number","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"number_of_answered_questions","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"number_of_answered_questions\"]))}}","sticky":"","validation":{}},"average_review_rating":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":10.0,"width":150.0,"originalId":"average_review_rating","id":"average_review_rating","alias":"average_review_rating","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"average_review_rating","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"average_review_rating\"]))}}","sticky":"","validation":{}},"amazon_category_and_sub_category":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":11.0,"width":150.0,"originalId":"amazon_category_and_sub_category","id":"amazon_category_and_sub_category","alias":"amazon_category_and_sub_category","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"amazon_category_and_sub_category","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"amazon_category_and_sub_category\"]))}}","sticky":"","validation":{}},"customers_who_bought_this_item_also_bought":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":12.0,"width":150.0,"originalId":"customers_who_bought_this_item_also_bought","id":"customers_who_bought_this_item_also_bought","alias":"customers_who_bought_this_item_also_bought","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"customers_who_bought_this_item_also_bought","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"customers_who_bought_this_item_also_bought\"]))}}","sticky":"","validation":{}},"rowIndex":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":13.0,"width":150.0,"originalId":"rowIndex","id":"rowIndex","alias":"rowIndex","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"number","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"rowIndex","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"rowIndex\"]))}}","sticky":"","validation":{}}},"key":"y3e8fye419","canFreezeColumn":true,"isDeprecated":false,"rightColumn":34.0,"textSize":"0.875rem","widgetId":"5w278g8zo9","minWidth":450.0,"tableData":"{{fetch_many_query.data}}","label":"Data","searchKey":"","parentId":"0","renderMode":"CANVAS","mobileTopRow":1.0,"horizontalAlignment":"LEFT","isVisibleSearch":true,"responsiveBehavior":"fill","mobileLeftColumn":0.0,"isVisiblePagination":true,"verticalAlignment":"CENTER"}]},"layoutOnLoadActions":[[{"id":"Page1_fetch_many_query","name":"fetch_many_query","confirmBeforeExecute":false,"pluginType":"SAAS","jsonPathKeys":[],"timeoutInMillisecond":10000.0}]],"layoutOnLoadActionErrors":[],"validOnPageLoadActions":true,"id":"Page1","deleted":false,"policies":[],"userPermissions":[]}],"userPermissions":[],"policies":[]},"publishedPage":{"name":"Page1","slug":"page1","layouts":[{"viewMode":false,"dsl":{"widgetName":"MainContainer","backgroundColor":"none","rightColumn":1224.0,"snapColumns":16.0,"detachFromLayout":true,"widgetId":"0","topRow":0.0,"bottomRow":1250.0,"containerStyle":"none","snapRows":33.0,"parentRowSpace":1.0,"type":"CANVAS_WIDGET","canExtend":true,"version":4.0,"minHeight":1292.0,"dynamicTriggerPathList":[],"parentColumnSpace":1.0,"dynamicBindingPathList":[],"leftColumn":0.0,"children":[]},"validOnPageLoadActions":true,"id":"Page1","deleted":false,"policies":[],"userPermissions":[]}],"userPermissions":[],"policies":[]},"deleted":false,"gitSyncId":"65164f37b43d9217d781a524_65164f37b43d9217d781a526"}],"actionList":[{"pluginType":"SAAS","pluginId":"google-sheets-plugin","unpublishedAction":{"name":"fetch_many_query","datasource":{"name":"gsheet","pluginId":"google-sheets-plugin","messages":[],"isAutoGenerated":false,"id":"gsheet","deleted":false,"policies":[],"userPermissions":[]},"pageId":"Page1","actionConfiguration":{"timeoutInMillisecond":10000.0,"paginationType":"NONE","encodeParamsToggle":true,"selfReferencingDataPaths":[],"formData":{"command":{"data":"FETCH_MANY"},"entityType":{"data":"ROWS"},"tableHeaderIndex":{"data":"1"},"projection":{"data":[]},"queryFormat":{"data":"ROWS"},"range":{"data":""},"where":{"data":{"condition":"AND","children":[{"condition":"LT"}]}},"pagination":{"data":{"limit":"20","offset":"0"}},"smartSubstitution":{"data":true},"sheetUrl":{"data":"https://docs.google.com/spreadsheets/d/1rD1Bo4x-y9B7EqaVs8HuJViGSEVBeiLPuTdxMoC2uDw/edit"},"sheetName":{"data":"Sheet1"},"sortBy":{"data":[{"column":"","order":"Ascending"}]}}},"executeOnLoad":true,"dynamicBindingPathList":[],"isValid":true,"invalids":[],"messages":[],"jsonPathKeys":[],"userSetOnLoad":false,"confirmBeforeExecute":false,"policies":[],"userPermissions":[],"createdAt":"2023-09-29T04:15:25Z"},"publishedAction":{"datasource":{"messages":[],"isAutoGenerated":false,"deleted":false,"policies":[],"userPermissions":[]},"messages":[],"userSetOnLoad":false,"confirmBeforeExecute":false,"policies":[],"userPermissions":[]},"id":"Page1_fetch_many_query","deleted":false,"gitSyncId":"65164f37b43d9217d781a524_65164f5db43d9217d781a52b"}],"actionCollectionList":[],"updatedResources":{"customJSLibList":[],"actionList":["fetch_many_query##ENTITY_SEPARATOR##Page1"],"pageList":["Page1"],"actionCollectionList":[]},"editModeTheme":{"name":"Default-New","displayName":"Modern","isSystemTheme":true,"deleted":false},"publishedTheme":{"name":"Default-New","displayName":"Modern","isSystemTheme":true,"deleted":false}}
\ No newline at end of file
diff --git a/app/client/cypress/fixtures/ImportAppReadAccess.json b/app/client/cypress/fixtures/ImportAppReadAccess.json
new file mode 100644
index 0000000000..d26323d4e0
--- /dev/null
+++ b/app/client/cypress/fixtures/ImportAppReadAccess.json
@@ -0,0 +1 @@
+{"clientSchemaVersion":1.0,"serverSchemaVersion":6.0,"exportedApplication":{"name":"ImportAppReadAccess","isPublic":false,"pages":[{"id":"Page1","isDefault":true}],"publishedPages":[{"id":"Page1","isDefault":true}],"viewMode":false,"appIsExample":false,"unreadCommentThreads":0.0,"color":"#CCCCCC","icon":"call","slug":"importappreadaccess","unpublishedCustomJSLibs":[],"publishedCustomJSLibs":[],"evaluationVersion":2.0,"applicationVersion":2.0,"collapseInvisibleWidgets":true,"isManualUpdate":false,"deleted":false},"datasourceList":[{"name":"gsheet-read","pluginId":"google-sheets-plugin","messages":[],"isAutoGenerated":false,"deleted":false,"gitSyncId":"6507db87f847163dfe7777c4_6507dc86f847163dfe7777d5"}],"customJSLibList":[],"pageList":[{"unpublishedPage":{"name":"Page1","slug":"page1","layouts":[{"viewMode":false,"dsl":{"widgetName":"MainContainer","backgroundColor":"none","rightColumn":4896.0,"snapColumns":64.0,"detachFromLayout":true,"widgetId":"0","topRow":0.0,"bottomRow":380.0,"containerStyle":"none","snapRows":124.0,"parentRowSpace":1.0,"type":"CANVAS_WIDGET","canExtend":true,"version":86.0,"minHeight":1292.0,"dynamicTriggerPathList":[],"parentColumnSpace":1.0,"dynamicBindingPathList":[],"leftColumn":0.0,"children":[{"boxShadow":"{{appsmith.theme.boxShadow.appBoxShadow}}","borderColor":"#E0DEDE","isVisibleDownload":true,"iconSVG":"/static/media/icon.e6911f8bb94dc6c4a102a74740c41763.svg","topRow":0.0,"isSortable":true,"type":"TABLE_WIDGET_V2","inlineEditingSaveOption":"ROW_LEVEL","animateLoading":true,"dynamicBindingPathList":[{"key":"accentColor"},{"key":"borderRadius"},{"key":"boxShadow"},{"key":"tableData"},{"key":"primaryColumns.uniq_id.computedValue"},{"key":"primaryColumns.japanese_name.computedValue"},{"key":"primaryColumns.currencies.computedValue"},{"key":"primaryColumns.specialChars.computedValue"},{"key":"primaryColumns.product_name.computedValue"},{"key":"primaryColumns.manufacturer.computedValue"},{"key":"primaryColumns.price.computedValue"},{"key":"primaryColumns.number_available_in_stock.computedValue"},{"key":"primaryColumns.number_of_reviews.computedValue"},{"key":"primaryColumns.number_of_answered_questions.computedValue"},{"key":"primaryColumns.average_review_rating.computedValue"},{"key":"primaryColumns.amazon_category_and_sub_category.computedValue"},{"key":"primaryColumns.customers_who_bought_this_item_also_bought.computedValue"},{"key":"primaryColumns.rowIndex.computedValue"}],"needsHeightForContent":true,"leftColumn":0.0,"delimiter":",","defaultSelectedRowIndex":0.0,"accentColor":"{{appsmith.theme.colors.primaryColor}}","isVisibleFilters":true,"isVisible":true,"enableClientSideSearch":true,"version":2.0,"totalRecordsCount":0.0,"tags":["Suggested","Display"],"isLoading":false,"childStylesheet":{"button":{"buttonColor":"{{appsmith.theme.colors.primaryColor}}","borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","boxShadow":"none"},"menuButton":{"menuColor":"{{appsmith.theme.colors.primaryColor}}","borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","boxShadow":"none"},"iconButton":{"buttonColor":"{{appsmith.theme.colors.primaryColor}}","borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","boxShadow":"none"},"editActions":{"saveButtonColor":"{{appsmith.theme.colors.primaryColor}}","saveBorderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","discardButtonColor":"{{appsmith.theme.colors.primaryColor}}","discardBorderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}"}},"borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","columnUpdatedAt":1.695963199756E12,"defaultSelectedRowIndices":[0.0],"mobileBottomRow":29.0,"widgetName":"Table1","defaultPageSize":0.0,"columnOrder":["uniq_id","japanese_name","currencies","specialChars","product_name","manufacturer","price","number_available_in_stock","number_of_reviews","number_of_answered_questions","average_review_rating","amazon_category_and_sub_category","customers_who_bought_this_item_also_bought","rowIndex"],"dynamicPropertyPathList":[],"displayName":"Table","bottomRow":28.0,"columnWidthMap":{},"parentRowSpace":10.0,"hideCard":false,"mobileRightColumn":34.0,"parentColumnSpace":16.65625,"dynamicTriggerPathList":[],"borderWidth":"1","primaryColumns":{"uniq_id":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":0.0,"width":150.0,"originalId":"uniq_id","id":"uniq_id","alias":"uniq_id","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"uniq_id","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"uniq_id\"]))}}","sticky":"","validation":{}},"japanese_name":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":1.0,"width":150.0,"originalId":"japanese_name","id":"japanese_name","alias":"japanese_name","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"japanese_name","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"japanese_name\"]))}}","sticky":"","validation":{}},"currencies":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":2.0,"width":150.0,"originalId":"currencies","id":"currencies","alias":"currencies","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"currencies","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"currencies\"]))}}","sticky":"","validation":{}},"specialChars":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":3.0,"width":150.0,"originalId":"specialChars","id":"specialChars","alias":"specialChars","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"specialChars","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"specialChars\"]))}}","sticky":"","validation":{}},"product_name":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":4.0,"width":150.0,"originalId":"product_name","id":"product_name","alias":"product_name","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"product_name","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"product_name\"]))}}","sticky":"","validation":{}},"manufacturer":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":5.0,"width":150.0,"originalId":"manufacturer","id":"manufacturer","alias":"manufacturer","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"manufacturer","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"manufacturer\"]))}}","sticky":"","validation":{}},"price":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":6.0,"width":150.0,"originalId":"price","id":"price","alias":"price","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"number","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"price","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"price\"]))}}","sticky":"","validation":{}},"number_available_in_stock":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":7.0,"width":150.0,"originalId":"number_available_in_stock","id":"number_available_in_stock","alias":"number_available_in_stock","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"number_available_in_stock","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"number_available_in_stock\"]))}}","sticky":"","validation":{}},"number_of_reviews":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":8.0,"width":150.0,"originalId":"number_of_reviews","id":"number_of_reviews","alias":"number_of_reviews","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"number","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"number_of_reviews","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"number_of_reviews\"]))}}","sticky":"","validation":{}},"number_of_answered_questions":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":9.0,"width":150.0,"originalId":"number_of_answered_questions","id":"number_of_answered_questions","alias":"number_of_answered_questions","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"number","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"number_of_answered_questions","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"number_of_answered_questions\"]))}}","sticky":"","validation":{}},"average_review_rating":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":10.0,"width":150.0,"originalId":"average_review_rating","id":"average_review_rating","alias":"average_review_rating","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"average_review_rating","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"average_review_rating\"]))}}","sticky":"","validation":{}},"amazon_category_and_sub_category":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":11.0,"width":150.0,"originalId":"amazon_category_and_sub_category","id":"amazon_category_and_sub_category","alias":"amazon_category_and_sub_category","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"amazon_category_and_sub_category","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"amazon_category_and_sub_category\"]))}}","sticky":"","validation":{}},"customers_who_bought_this_item_also_bought":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":12.0,"width":150.0,"originalId":"customers_who_bought_this_item_also_bought","id":"customers_who_bought_this_item_also_bought","alias":"customers_who_bought_this_item_also_bought","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"customers_who_bought_this_item_also_bought","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"customers_who_bought_this_item_also_bought\"]))}}","sticky":"","validation":{}},"rowIndex":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":13.0,"width":150.0,"originalId":"rowIndex","id":"rowIndex","alias":"rowIndex","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"number","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"rowIndex","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"rowIndex\"]))}}","sticky":"","validation":{}}},"key":"y3e8fye419","canFreezeColumn":true,"isDeprecated":false,"rightColumn":34.0,"textSize":"0.875rem","widgetId":"5w278g8zo9","minWidth":450.0,"tableData":"{{fetch_many_query_read_only.data}}","label":"Data","searchKey":"","parentId":"0","renderMode":"CANVAS","mobileTopRow":1.0,"horizontalAlignment":"LEFT","isVisibleSearch":true,"responsiveBehavior":"fill","mobileLeftColumn":0.0,"isVisiblePagination":true,"verticalAlignment":"CENTER"}]},"layoutOnLoadActions":[[{"id":"Page1_fetch_many_query_read_only","name":"fetch_many_query_read_only","confirmBeforeExecute":false,"pluginType":"SAAS","jsonPathKeys":[],"timeoutInMillisecond":10000.0}]],"layoutOnLoadActionErrors":[],"validOnPageLoadActions":true,"id":"Page1","deleted":false,"policies":[],"userPermissions":[]}],"userPermissions":[],"policies":[]},"publishedPage":{"name":"Page1","slug":"page1","layouts":[{"viewMode":false,"dsl":{"widgetName":"MainContainer","backgroundColor":"none","rightColumn":1224.0,"snapColumns":16.0,"detachFromLayout":true,"widgetId":"0","topRow":0.0,"bottomRow":1250.0,"containerStyle":"none","snapRows":33.0,"parentRowSpace":1.0,"type":"CANVAS_WIDGET","canExtend":true,"version":4.0,"minHeight":1292.0,"dynamicTriggerPathList":[],"parentColumnSpace":1.0,"dynamicBindingPathList":[],"leftColumn":0.0,"children":[]},"validOnPageLoadActions":true,"id":"Page1","deleted":false,"policies":[],"userPermissions":[]}],"userPermissions":[],"policies":[]},"deleted":false,"gitSyncId":"65164f37b43d9217d781a524_65164f37b43d9217d781a526"}],"actionList":[{"pluginType":"SAAS","pluginId":"google-sheets-plugin","unpublishedAction":{"name":"fetch_many_query_read_only","datasource":{"name":"gsheet-read","pluginId":"google-sheets-plugin","messages":[],"isAutoGenerated":false,"id":"gsheet-read","deleted":false,"policies":[],"userPermissions":[]},"pageId":"Page1","actionConfiguration":{"timeoutInMillisecond":10000.0,"paginationType":"NONE","encodeParamsToggle":true,"selfReferencingDataPaths":[],"formData":{"command":{"data":"FETCH_MANY"},"entityType":{"data":"ROWS"},"tableHeaderIndex":{"data":"1"},"projection":{"data":[]},"queryFormat":{"data":"ROWS"},"range":{"data":""},"where":{"data":{"condition":"AND","children":[{"condition":"LT"}]}},"pagination":{"data":{"limit":"20","offset":"0"}},"smartSubstitution":{"data":true},"sheetUrl":{"data":"https://docs.google.com/spreadsheets/d/1rD1Bo4x-y9B7EqaVs8HuJViGSEVBeiLPuTdxMoC2uDw/edit"},"sheetName":{"data":"Sheet1"},"sortBy":{"data":[{"column":"","order":"Ascending"}]}}},"executeOnLoad":true,"dynamicBindingPathList":[],"isValid":true,"invalids":[],"messages":[],"jsonPathKeys":[],"userSetOnLoad":false,"confirmBeforeExecute":false,"policies":[],"userPermissions":[],"createdAt":"2023-09-29T04:53:53Z"},"publishedAction":{"datasource":{"messages":[],"isAutoGenerated":false,"deleted":false,"policies":[],"userPermissions":[]},"messages":[],"userSetOnLoad":false,"confirmBeforeExecute":false,"policies":[],"userPermissions":[]},"id":"Page1_fetch_many_query_read_only","deleted":false,"gitSyncId":"65164f37b43d9217d781a524_65164f5db43d9217d781a52b"}],"actionCollectionList":[],"updatedResources":{"customJSLibList":[],"actionList":["fetch_many_query_read_only##ENTITY_SEPARATOR##Page1"],"pageList":["Page1"],"actionCollectionList":[]},"editModeTheme":{"name":"Default-New","displayName":"Modern","isSystemTheme":true,"deleted":false},"publishedTheme":{"name":"Default-New","displayName":"Modern","isSystemTheme":true,"deleted":false}}
\ No newline at end of file
diff --git a/app/client/cypress/fixtures/ImportAppReadWriteAccess.json b/app/client/cypress/fixtures/ImportAppReadWriteAccess.json
new file mode 100644
index 0000000000..c30151c01a
--- /dev/null
+++ b/app/client/cypress/fixtures/ImportAppReadWriteAccess.json
@@ -0,0 +1 @@
+{"clientSchemaVersion":1.0,"serverSchemaVersion":6.0,"exportedApplication":{"name":"ImportAppReadWriteAccess","isPublic":false,"pages":[{"id":"Page1","isDefault":true}],"publishedPages":[{"id":"Page1","isDefault":true}],"viewMode":false,"appIsExample":false,"unreadCommentThreads":0.0,"color":"#CCCCCC","icon":"call","slug":"importappreadwriteaccess","unpublishedCustomJSLibs":[],"publishedCustomJSLibs":[],"evaluationVersion":2.0,"applicationVersion":2.0,"collapseInvisibleWidgets":true,"isManualUpdate":false,"deleted":false},"datasourceList":[{"name":"gsheet-read-write","pluginId":"google-sheets-plugin","messages":[],"isAutoGenerated":false,"deleted":false,"gitSyncId":"6507db87f847163dfe7777c4_6507dcb0f847163dfe7777d9"}],"customJSLibList":[],"pageList":[{"unpublishedPage":{"name":"Page1","slug":"page1","layouts":[{"viewMode":false,"dsl":{"widgetName":"MainContainer","backgroundColor":"none","rightColumn":4896.0,"snapColumns":64.0,"detachFromLayout":true,"widgetId":"0","topRow":0.0,"bottomRow":380.0,"containerStyle":"none","snapRows":124.0,"parentRowSpace":1.0,"type":"CANVAS_WIDGET","canExtend":true,"version":86.0,"minHeight":1292.0,"dynamicTriggerPathList":[],"parentColumnSpace":1.0,"dynamicBindingPathList":[],"leftColumn":0.0,"children":[{"boxShadow":"{{appsmith.theme.boxShadow.appBoxShadow}}","borderColor":"#E0DEDE","isVisibleDownload":true,"iconSVG":"/static/media/icon.e6911f8bb94dc6c4a102a74740c41763.svg","topRow":0.0,"isSortable":true,"type":"TABLE_WIDGET_V2","inlineEditingSaveOption":"ROW_LEVEL","animateLoading":true,"dynamicBindingPathList":[{"key":"accentColor"},{"key":"borderRadius"},{"key":"boxShadow"},{"key":"tableData"},{"key":"primaryColumns.uniq_id.computedValue"},{"key":"primaryColumns.japanese_name.computedValue"},{"key":"primaryColumns.currencies.computedValue"},{"key":"primaryColumns.specialChars.computedValue"},{"key":"primaryColumns.product_name.computedValue"},{"key":"primaryColumns.manufacturer.computedValue"},{"key":"primaryColumns.price.computedValue"},{"key":"primaryColumns.number_available_in_stock.computedValue"},{"key":"primaryColumns.number_of_reviews.computedValue"},{"key":"primaryColumns.number_of_answered_questions.computedValue"},{"key":"primaryColumns.average_review_rating.computedValue"},{"key":"primaryColumns.amazon_category_and_sub_category.computedValue"},{"key":"primaryColumns.customers_who_bought_this_item_also_bought.computedValue"},{"key":"primaryColumns.rowIndex.computedValue"}],"needsHeightForContent":true,"leftColumn":0.0,"delimiter":",","defaultSelectedRowIndex":0.0,"accentColor":"{{appsmith.theme.colors.primaryColor}}","isVisibleFilters":true,"isVisible":true,"enableClientSideSearch":true,"version":2.0,"totalRecordsCount":0.0,"tags":["Suggested","Display"],"isLoading":false,"childStylesheet":{"button":{"buttonColor":"{{appsmith.theme.colors.primaryColor}}","borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","boxShadow":"none"},"menuButton":{"menuColor":"{{appsmith.theme.colors.primaryColor}}","borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","boxShadow":"none"},"iconButton":{"buttonColor":"{{appsmith.theme.colors.primaryColor}}","borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","boxShadow":"none"},"editActions":{"saveButtonColor":"{{appsmith.theme.colors.primaryColor}}","saveBorderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","discardButtonColor":"{{appsmith.theme.colors.primaryColor}}","discardBorderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}"}},"borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","columnUpdatedAt":1.695963199756E12,"defaultSelectedRowIndices":[0.0],"mobileBottomRow":29.0,"widgetName":"Table1","defaultPageSize":0.0,"columnOrder":["uniq_id","japanese_name","currencies","specialChars","product_name","manufacturer","price","number_available_in_stock","number_of_reviews","number_of_answered_questions","average_review_rating","amazon_category_and_sub_category","customers_who_bought_this_item_also_bought","rowIndex"],"dynamicPropertyPathList":[],"displayName":"Table","bottomRow":28.0,"columnWidthMap":{},"parentRowSpace":10.0,"hideCard":false,"mobileRightColumn":34.0,"parentColumnSpace":16.65625,"dynamicTriggerPathList":[],"borderWidth":"1","primaryColumns":{"uniq_id":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":0.0,"width":150.0,"originalId":"uniq_id","id":"uniq_id","alias":"uniq_id","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"uniq_id","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"uniq_id\"]))}}","sticky":"","validation":{}},"japanese_name":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":1.0,"width":150.0,"originalId":"japanese_name","id":"japanese_name","alias":"japanese_name","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"japanese_name","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"japanese_name\"]))}}","sticky":"","validation":{}},"currencies":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":2.0,"width":150.0,"originalId":"currencies","id":"currencies","alias":"currencies","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"currencies","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"currencies\"]))}}","sticky":"","validation":{}},"specialChars":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":3.0,"width":150.0,"originalId":"specialChars","id":"specialChars","alias":"specialChars","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"specialChars","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"specialChars\"]))}}","sticky":"","validation":{}},"product_name":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":4.0,"width":150.0,"originalId":"product_name","id":"product_name","alias":"product_name","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"product_name","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"product_name\"]))}}","sticky":"","validation":{}},"manufacturer":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":5.0,"width":150.0,"originalId":"manufacturer","id":"manufacturer","alias":"manufacturer","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"manufacturer","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"manufacturer\"]))}}","sticky":"","validation":{}},"price":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":6.0,"width":150.0,"originalId":"price","id":"price","alias":"price","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"number","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"price","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"price\"]))}}","sticky":"","validation":{}},"number_available_in_stock":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":7.0,"width":150.0,"originalId":"number_available_in_stock","id":"number_available_in_stock","alias":"number_available_in_stock","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"number_available_in_stock","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"number_available_in_stock\"]))}}","sticky":"","validation":{}},"number_of_reviews":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":8.0,"width":150.0,"originalId":"number_of_reviews","id":"number_of_reviews","alias":"number_of_reviews","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"number","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"number_of_reviews","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"number_of_reviews\"]))}}","sticky":"","validation":{}},"number_of_answered_questions":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":9.0,"width":150.0,"originalId":"number_of_answered_questions","id":"number_of_answered_questions","alias":"number_of_answered_questions","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"number","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"number_of_answered_questions","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"number_of_answered_questions\"]))}}","sticky":"","validation":{}},"average_review_rating":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":10.0,"width":150.0,"originalId":"average_review_rating","id":"average_review_rating","alias":"average_review_rating","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"average_review_rating","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"average_review_rating\"]))}}","sticky":"","validation":{}},"amazon_category_and_sub_category":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":11.0,"width":150.0,"originalId":"amazon_category_and_sub_category","id":"amazon_category_and_sub_category","alias":"amazon_category_and_sub_category","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"amazon_category_and_sub_category","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"amazon_category_and_sub_category\"]))}}","sticky":"","validation":{}},"customers_who_bought_this_item_also_bought":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":12.0,"width":150.0,"originalId":"customers_who_bought_this_item_also_bought","id":"customers_who_bought_this_item_also_bought","alias":"customers_who_bought_this_item_also_bought","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"customers_who_bought_this_item_also_bought","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"customers_who_bought_this_item_also_bought\"]))}}","sticky":"","validation":{}},"rowIndex":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":13.0,"width":150.0,"originalId":"rowIndex","id":"rowIndex","alias":"rowIndex","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"number","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"rowIndex","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"rowIndex\"]))}}","sticky":"","validation":{}}},"key":"y3e8fye419","canFreezeColumn":true,"isDeprecated":false,"rightColumn":34.0,"textSize":"0.875rem","widgetId":"5w278g8zo9","minWidth":450.0,"tableData":"{{fetch_many_query_read_write.data}}","label":"Data","searchKey":"","parentId":"0","renderMode":"CANVAS","mobileTopRow":1.0,"horizontalAlignment":"LEFT","isVisibleSearch":true,"responsiveBehavior":"fill","mobileLeftColumn":0.0,"isVisiblePagination":true,"verticalAlignment":"CENTER"}]},"layoutOnLoadActions":[[{"id":"Page1_fetch_many_query_read_write","name":"fetch_many_query_read_write","confirmBeforeExecute":false,"pluginType":"SAAS","jsonPathKeys":[],"timeoutInMillisecond":10000.0}]],"layoutOnLoadActionErrors":[],"validOnPageLoadActions":true,"id":"Page1","deleted":false,"policies":[],"userPermissions":[]}],"userPermissions":[],"policies":[]},"publishedPage":{"name":"Page1","slug":"page1","layouts":[{"viewMode":false,"dsl":{"widgetName":"MainContainer","backgroundColor":"none","rightColumn":1224.0,"snapColumns":16.0,"detachFromLayout":true,"widgetId":"0","topRow":0.0,"bottomRow":1250.0,"containerStyle":"none","snapRows":33.0,"parentRowSpace":1.0,"type":"CANVAS_WIDGET","canExtend":true,"version":4.0,"minHeight":1292.0,"dynamicTriggerPathList":[],"parentColumnSpace":1.0,"dynamicBindingPathList":[],"leftColumn":0.0,"children":[]},"validOnPageLoadActions":true,"id":"Page1","deleted":false,"policies":[],"userPermissions":[]}],"userPermissions":[],"policies":[]},"deleted":false,"gitSyncId":"65164f37b43d9217d781a524_65164f37b43d9217d781a526"}],"actionList":[{"pluginType":"SAAS","pluginId":"google-sheets-plugin","unpublishedAction":{"name":"fetch_many_query_read_write","datasource":{"name":"gsheet-read-write","pluginId":"google-sheets-plugin","messages":[],"isAutoGenerated":false,"id":"gsheet-read-write","deleted":false,"policies":[],"userPermissions":[]},"pageId":"Page1","actionConfiguration":{"timeoutInMillisecond":10000.0,"paginationType":"NONE","encodeParamsToggle":true,"selfReferencingDataPaths":[],"formData":{"command":{"data":"FETCH_MANY"},"entityType":{"data":"ROWS"},"tableHeaderIndex":{"data":"1"},"projection":{"data":[]},"queryFormat":{"data":"ROWS"},"range":{"data":""},"where":{"data":{"condition":"AND","children":[{"condition":"LT"}]}},"pagination":{"data":{"limit":"20","offset":"0"}},"smartSubstitution":{"data":true},"sheetUrl":{"data":"https://docs.google.com/spreadsheets/d/1rD1Bo4x-y9B7EqaVs8HuJViGSEVBeiLPuTdxMoC2uDw/edit"},"sheetName":{"data":"Sheet1"},"sortBy":{"data":[{"column":"","order":"Ascending"}]}}},"executeOnLoad":true,"dynamicBindingPathList":[],"isValid":true,"invalids":[],"messages":[],"jsonPathKeys":[],"userSetOnLoad":false,"confirmBeforeExecute":false,"policies":[],"userPermissions":[],"createdAt":"2023-09-29T04:56:32Z"},"publishedAction":{"datasource":{"messages":[],"isAutoGenerated":false,"deleted":false,"policies":[],"userPermissions":[]},"messages":[],"userSetOnLoad":false,"confirmBeforeExecute":false,"policies":[],"userPermissions":[]},"id":"Page1_fetch_many_query_read_write","deleted":false,"gitSyncId":"65164f37b43d9217d781a524_65164f5db43d9217d781a52b"}],"actionCollectionList":[],"updatedResources":{"customJSLibList":[],"actionList":["fetch_many_query_read_write##ENTITY_SEPARATOR##Page1"],"pageList":["Page1"],"actionCollectionList":[]},"editModeTheme":{"name":"Default-New","displayName":"Modern","isSystemTheme":true,"deleted":false},"publishedTheme":{"name":"Default-New","displayName":"Modern","isSystemTheme":true,"deleted":false}}
\ No newline at end of file
diff --git a/app/client/cypress/fixtures/ImportAppSelectedAccess.json b/app/client/cypress/fixtures/ImportAppSelectedAccess.json
new file mode 100644
index 0000000000..8b2b6bdd0b
--- /dev/null
+++ b/app/client/cypress/fixtures/ImportAppSelectedAccess.json
@@ -0,0 +1 @@
+{"clientSchemaVersion":1.0,"serverSchemaVersion":6.0,"exportedApplication":{"name":"ImportAppSelectedAccess","isPublic":false,"pages":[{"id":"Page1","isDefault":true}],"publishedPages":[{"id":"Page1","isDefault":true}],"viewMode":false,"appIsExample":false,"unreadCommentThreads":0.0,"color":"#CCCCCC","icon":"call","slug":"importappselectedaccess","unpublishedCustomJSLibs":[],"publishedCustomJSLibs":[],"evaluationVersion":2.0,"applicationVersion":2.0,"collapseInvisibleWidgets":true,"isManualUpdate":false,"deleted":false},"datasourceList":[{"name":"gsheet-selected","pluginId":"google-sheets-plugin","messages":[],"isAutoGenerated":false,"deleted":false,"gitSyncId":"6507db87f847163dfe7777c4_6507dc29f847163dfe7777d1"}],"customJSLibList":[],"pageList":[{"unpublishedPage":{"name":"Page1","slug":"page1","layouts":[{"viewMode":false,"dsl":{"widgetName":"MainContainer","backgroundColor":"none","rightColumn":4896.0,"snapColumns":64.0,"detachFromLayout":true,"widgetId":"0","topRow":0.0,"bottomRow":380.0,"containerStyle":"none","snapRows":124.0,"parentRowSpace":1.0,"type":"CANVAS_WIDGET","canExtend":true,"version":86.0,"minHeight":1292.0,"dynamicTriggerPathList":[],"parentColumnSpace":1.0,"dynamicBindingPathList":[],"leftColumn":0.0,"children":[{"boxShadow":"{{appsmith.theme.boxShadow.appBoxShadow}}","borderColor":"#E0DEDE","isVisibleDownload":true,"iconSVG":"/static/media/icon.e6911f8bb94dc6c4a102a74740c41763.svg","topRow":0.0,"isSortable":true,"type":"TABLE_WIDGET_V2","inlineEditingSaveOption":"ROW_LEVEL","animateLoading":true,"dynamicBindingPathList":[{"key":"accentColor"},{"key":"borderRadius"},{"key":"boxShadow"},{"key":"tableData"},{"key":"primaryColumns.uniq_id.computedValue"},{"key":"primaryColumns.japanese_name.computedValue"},{"key":"primaryColumns.currencies.computedValue"},{"key":"primaryColumns.specialChars.computedValue"},{"key":"primaryColumns.product_name.computedValue"},{"key":"primaryColumns.manufacturer.computedValue"},{"key":"primaryColumns.price.computedValue"},{"key":"primaryColumns.number_available_in_stock.computedValue"},{"key":"primaryColumns.number_of_reviews.computedValue"},{"key":"primaryColumns.number_of_answered_questions.computedValue"},{"key":"primaryColumns.average_review_rating.computedValue"},{"key":"primaryColumns.amazon_category_and_sub_category.computedValue"},{"key":"primaryColumns.customers_who_bought_this_item_also_bought.computedValue"},{"key":"primaryColumns.rowIndex.computedValue"}],"needsHeightForContent":true,"leftColumn":0.0,"delimiter":",","defaultSelectedRowIndex":0.0,"accentColor":"{{appsmith.theme.colors.primaryColor}}","isVisibleFilters":true,"isVisible":true,"enableClientSideSearch":true,"version":2.0,"totalRecordsCount":0.0,"tags":["Suggested","Display"],"isLoading":false,"childStylesheet":{"button":{"buttonColor":"{{appsmith.theme.colors.primaryColor}}","borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","boxShadow":"none"},"menuButton":{"menuColor":"{{appsmith.theme.colors.primaryColor}}","borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","boxShadow":"none"},"iconButton":{"buttonColor":"{{appsmith.theme.colors.primaryColor}}","borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","boxShadow":"none"},"editActions":{"saveButtonColor":"{{appsmith.theme.colors.primaryColor}}","saveBorderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","discardButtonColor":"{{appsmith.theme.colors.primaryColor}}","discardBorderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}"}},"borderRadius":"{{appsmith.theme.borderRadius.appBorderRadius}}","columnUpdatedAt":1.695963199756E12,"defaultSelectedRowIndices":[0.0],"mobileBottomRow":29.0,"widgetName":"Table1","defaultPageSize":0.0,"columnOrder":["uniq_id","japanese_name","currencies","specialChars","product_name","manufacturer","price","number_available_in_stock","number_of_reviews","number_of_answered_questions","average_review_rating","amazon_category_and_sub_category","customers_who_bought_this_item_also_bought","rowIndex"],"dynamicPropertyPathList":[],"displayName":"Table","bottomRow":28.0,"columnWidthMap":{},"parentRowSpace":10.0,"hideCard":false,"mobileRightColumn":34.0,"parentColumnSpace":16.65625,"dynamicTriggerPathList":[],"borderWidth":"1","primaryColumns":{"uniq_id":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":0.0,"width":150.0,"originalId":"uniq_id","id":"uniq_id","alias":"uniq_id","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"uniq_id","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"uniq_id\"]))}}","sticky":"","validation":{}},"japanese_name":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":1.0,"width":150.0,"originalId":"japanese_name","id":"japanese_name","alias":"japanese_name","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"japanese_name","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"japanese_name\"]))}}","sticky":"","validation":{}},"currencies":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":2.0,"width":150.0,"originalId":"currencies","id":"currencies","alias":"currencies","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"currencies","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"currencies\"]))}}","sticky":"","validation":{}},"specialChars":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":3.0,"width":150.0,"originalId":"specialChars","id":"specialChars","alias":"specialChars","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"specialChars","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"specialChars\"]))}}","sticky":"","validation":{}},"product_name":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":4.0,"width":150.0,"originalId":"product_name","id":"product_name","alias":"product_name","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"product_name","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"product_name\"]))}}","sticky":"","validation":{}},"manufacturer":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":5.0,"width":150.0,"originalId":"manufacturer","id":"manufacturer","alias":"manufacturer","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"manufacturer","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"manufacturer\"]))}}","sticky":"","validation":{}},"price":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":6.0,"width":150.0,"originalId":"price","id":"price","alias":"price","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"number","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"price","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"price\"]))}}","sticky":"","validation":{}},"number_available_in_stock":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":7.0,"width":150.0,"originalId":"number_available_in_stock","id":"number_available_in_stock","alias":"number_available_in_stock","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"number_available_in_stock","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"number_available_in_stock\"]))}}","sticky":"","validation":{}},"number_of_reviews":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":8.0,"width":150.0,"originalId":"number_of_reviews","id":"number_of_reviews","alias":"number_of_reviews","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"number","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"number_of_reviews","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"number_of_reviews\"]))}}","sticky":"","validation":{}},"number_of_answered_questions":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":9.0,"width":150.0,"originalId":"number_of_answered_questions","id":"number_of_answered_questions","alias":"number_of_answered_questions","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"number","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"number_of_answered_questions","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"number_of_answered_questions\"]))}}","sticky":"","validation":{}},"average_review_rating":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":10.0,"width":150.0,"originalId":"average_review_rating","id":"average_review_rating","alias":"average_review_rating","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"average_review_rating","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"average_review_rating\"]))}}","sticky":"","validation":{}},"amazon_category_and_sub_category":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":11.0,"width":150.0,"originalId":"amazon_category_and_sub_category","id":"amazon_category_and_sub_category","alias":"amazon_category_and_sub_category","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"amazon_category_and_sub_category","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"amazon_category_and_sub_category\"]))}}","sticky":"","validation":{}},"customers_who_bought_this_item_also_bought":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":12.0,"width":150.0,"originalId":"customers_who_bought_this_item_also_bought","id":"customers_who_bought_this_item_also_bought","alias":"customers_who_bought_this_item_also_bought","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"text","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"customers_who_bought_this_item_also_bought","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"customers_who_bought_this_item_also_bought\"]))}}","sticky":"","validation":{}},"rowIndex":{"allowCellWrapping":false,"allowSameOptionsInNewRow":true,"index":13.0,"width":150.0,"originalId":"rowIndex","id":"rowIndex","alias":"rowIndex","horizontalAlignment":"LEFT","verticalAlignment":"CENTER","columnType":"number","textSize":"0.875rem","enableFilter":true,"enableSort":true,"isVisible":true,"isDisabled":false,"isCellEditable":false,"isEditable":false,"isCellVisible":true,"isDerived":false,"label":"rowIndex","isSaveVisible":true,"isDiscardVisible":true,"computedValue":"{{Table1.processedTableData.map((currentRow, currentIndex) => ( currentRow[\"rowIndex\"]))}}","sticky":"","validation":{}}},"key":"y3e8fye419","canFreezeColumn":true,"isDeprecated":false,"rightColumn":34.0,"textSize":"0.875rem","widgetId":"5w278g8zo9","minWidth":450.0,"tableData":"{{fetch_many_selected_access.data}}","label":"Data","searchKey":"","parentId":"0","renderMode":"CANVAS","mobileTopRow":1.0,"horizontalAlignment":"LEFT","isVisibleSearch":true,"responsiveBehavior":"fill","mobileLeftColumn":0.0,"isVisiblePagination":true,"verticalAlignment":"CENTER"}]},"layoutOnLoadActions":[[{"id":"Page1_fetch_many_selected_access","name":"fetch_many_selected_access","confirmBeforeExecute":false,"pluginType":"SAAS","jsonPathKeys":[],"timeoutInMillisecond":10000.0}]],"layoutOnLoadActionErrors":[],"validOnPageLoadActions":true,"id":"Page1","deleted":false,"policies":[],"userPermissions":[]}],"userPermissions":[],"policies":[]},"publishedPage":{"name":"Page1","slug":"page1","layouts":[{"viewMode":false,"dsl":{"widgetName":"MainContainer","backgroundColor":"none","rightColumn":1224.0,"snapColumns":16.0,"detachFromLayout":true,"widgetId":"0","topRow":0.0,"bottomRow":1250.0,"containerStyle":"none","snapRows":33.0,"parentRowSpace":1.0,"type":"CANVAS_WIDGET","canExtend":true,"version":4.0,"minHeight":1292.0,"dynamicTriggerPathList":[],"parentColumnSpace":1.0,"dynamicBindingPathList":[],"leftColumn":0.0,"children":[]},"validOnPageLoadActions":true,"id":"Page1","deleted":false,"policies":[],"userPermissions":[]}],"userPermissions":[],"policies":[]},"deleted":false,"gitSyncId":"65164f37b43d9217d781a524_65164f37b43d9217d781a526"}],"actionList":[{"pluginType":"SAAS","pluginId":"google-sheets-plugin","unpublishedAction":{"name":"fetch_many_selected_access","datasource":{"name":"gsheet-selected","pluginId":"google-sheets-plugin","messages":[],"isAutoGenerated":false,"id":"gsheet-selected","deleted":false,"policies":[],"userPermissions":[]},"pageId":"Page1","actionConfiguration":{"timeoutInMillisecond":10000.0,"paginationType":"NONE","encodeParamsToggle":true,"selfReferencingDataPaths":[],"formData":{"command":{"data":"FETCH_MANY"},"entityType":{"data":"ROWS"},"tableHeaderIndex":{"data":"1"},"projection":{"data":[]},"queryFormat":{"data":"ROWS"},"range":{"data":""},"where":{"data":{"condition":"AND","children":[{"condition":"LT"}]}},"pagination":{"data":{"limit":"20","offset":"0"}},"smartSubstitution":{"data":true},"sheetUrl":{"data":"https://docs.google.com/spreadsheets/d/1rD1Bo4x-y9B7EqaVs8HuJViGSEVBeiLPuTdxMoC2uDw/edit"},"sheetName":{"data":"Sheet1"},"sortBy":{"data":[{"column":"","order":"Ascending"}]}}},"executeOnLoad":true,"dynamicBindingPathList":[],"isValid":true,"invalids":[],"messages":[],"jsonPathKeys":[],"userSetOnLoad":false,"confirmBeforeExecute":false,"policies":[],"userPermissions":[],"createdAt":"2023-09-29T04:59:00Z"},"publishedAction":{"datasource":{"messages":[],"isAutoGenerated":false,"deleted":false,"policies":[],"userPermissions":[]},"messages":[],"userSetOnLoad":false,"confirmBeforeExecute":false,"policies":[],"userPermissions":[]},"id":"Page1_fetch_many_selected_access","deleted":false,"gitSyncId":"65164f37b43d9217d781a524_65164f5db43d9217d781a52b"}],"actionCollectionList":[],"updatedResources":{"customJSLibList":[],"actionList":["fetch_many_selected_access##ENTITY_SEPARATOR##Page1"],"pageList":["Page1"],"actionCollectionList":[]},"editModeTheme":{"name":"Default-New","displayName":"Modern","isSystemTheme":true,"deleted":false},"publishedTheme":{"name":"Default-New","displayName":"Modern","isSystemTheme":true,"deleted":false}}
\ No newline at end of file
diff --git a/app/client/cypress/locators/AdminsSettings.js b/app/client/cypress/locators/AdminsSettings.js
index 1fec88b0fb..ba9e74523b 100644
--- a/app/client/cypress/locators/AdminsSettings.js
+++ b/app/client/cypress/locators/AdminsSettings.js
@@ -4,7 +4,7 @@ export default {
advancedTab: ".t--settings-category-advanced",
authenticationTab: ".t--settings-category-authentication",
emailTab: ".t--settings-category-email",
- googleMapsTab: ".t--settings-category-google-maps",
+ developerSettingsTab: ".t--settings-category-developer-settings",
googleButton: ".t--settings-sub-category-google-auth",
githubButton: ".t--settings-sub-category-github-auth",
formloginButton: ".t--settings-sub-category-form-login",
diff --git a/app/client/cypress/locators/WidgetLocators.ts b/app/client/cypress/locators/WidgetLocators.ts
index 3e356fb068..ef362c8c76 100644
--- a/app/client/cypress/locators/WidgetLocators.ts
+++ b/app/client/cypress/locators/WidgetLocators.ts
@@ -45,6 +45,7 @@ export const WIDGET = {
JSONFORM: "jsonformwidget",
MENUBUTTON: "menubuttonwidget",
DATEPICKER: "datepickerwidget2",
+ MAP: "mapwidget",
} as const;
// property pane element selector are maintained here
diff --git a/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithBorderRadius.snap.png b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithBorderRadius.snap.png
new file mode 100644
index 0000000000..073ed59d28
Binary files /dev/null and b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithBorderRadius.snap.png differ
diff --git a/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithBoxShadow.snap.png b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithBoxShadow.snap.png
new file mode 100644
index 0000000000..9d02413822
Binary files /dev/null and b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithBoxShadow.snap.png differ
diff --git a/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithDefaultMarker1.snap.png b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithDefaultMarker1.snap.png
new file mode 100644
index 0000000000..79b48d2857
Binary files /dev/null and b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithDefaultMarker1.snap.png differ
diff --git a/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithDefaultMarker2.snap.png b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithDefaultMarker2.snap.png
new file mode 100644
index 0000000000..a27c00a799
Binary files /dev/null and b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithDefaultMarker2.snap.png differ
diff --git a/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithDefaultZoomIn.snap.png b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithDefaultZoomIn.snap.png
new file mode 100644
index 0000000000..af196e948d
Binary files /dev/null and b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithDefaultZoomIn.snap.png differ
diff --git a/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithDefaultZoomOut.snap.png b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithDefaultZoomOut.snap.png
new file mode 100644
index 0000000000..c30e60de62
Binary files /dev/null and b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithDefaultZoomOut.snap.png differ
diff --git a/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithEnableSearchLocationOff.snap.png b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithEnableSearchLocationOff.snap.png
new file mode 100644
index 0000000000..912836e846
Binary files /dev/null and b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithEnableSearchLocationOff.snap.png differ
diff --git a/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithEnablingClusteringON.snap.png b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithEnablingClusteringON.snap.png
new file mode 100644
index 0000000000..df9aa88996
Binary files /dev/null and b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithEnablingClusteringON.snap.png differ
diff --git a/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithEnablingClusteringOff.snap.png b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithEnablingClusteringOff.snap.png
new file mode 100644
index 0000000000..a61315a9e0
Binary files /dev/null and b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithEnablingClusteringOff.snap.png differ
diff --git a/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithInitalLocation.snap.png b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithInitalLocation.snap.png
new file mode 100644
index 0000000000..9734ba0ba3
Binary files /dev/null and b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithInitalLocation.snap.png differ
diff --git a/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithMapNMarkerCenteringOff.snap.png b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithMapNMarkerCenteringOff.snap.png
new file mode 100644
index 0000000000..7efb7e7d5c
Binary files /dev/null and b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithMapNMarkerCenteringOff.snap.png differ
diff --git a/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithPickLocationOff.snap.png b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithPickLocationOff.snap.png
new file mode 100644
index 0000000000..7efb7e7d5c
Binary files /dev/null and b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithPickLocationOff.snap.png differ
diff --git a/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithVisibilityOff.snap.png b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithVisibilityOff.snap.png
new file mode 100644
index 0000000000..3c8da7146c
Binary files /dev/null and b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithVisibilityOff.snap.png differ
diff --git a/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithVisibilityOnWithJS.snap.png b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithVisibilityOnWithJS.snap.png
new file mode 100644
index 0000000000..af196e948d
Binary files /dev/null and b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithVisibilityOnWithJS.snap.png differ
diff --git a/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithinItalLocationAsJS.snap.png b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithinItalLocationAsJS.snap.png
new file mode 100644
index 0000000000..f84ce5da5d
Binary files /dev/null and b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapWithinItalLocationAsJS.snap.png differ
diff --git a/app/client/cypress/snapshots/MapWidget_Spec.ts/mapsimple.snap.png b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapsimple.snap.png
new file mode 100644
index 0000000000..7e1c9ff5cb
Binary files /dev/null and b/app/client/cypress/snapshots/MapWidget_Spec.ts/mapsimple.snap.png differ
diff --git a/app/client/cypress/support/Objects/CommonLocators.ts b/app/client/cypress/support/Objects/CommonLocators.ts
index dd44be6e2f..60017c8745 100644
--- a/app/client/cypress/support/Objects/CommonLocators.ts
+++ b/app/client/cypress/support/Objects/CommonLocators.ts
@@ -319,4 +319,5 @@ export class CommonLocators {
_richText_line = "#tinymce p span";
_treeSelectedContent = ".rc-tree-select-selection-item-content";
_switcherIcon = ".switcher-icon";
+ _root = "#root";
}
diff --git a/app/client/cypress/support/Pages/AdminSettings.ts b/app/client/cypress/support/Pages/AdminSettings.ts
index 47f34be115..c4506bb040 100644
--- a/app/client/cypress/support/Pages/AdminSettings.ts
+++ b/app/client/cypress/support/Pages/AdminSettings.ts
@@ -4,6 +4,7 @@ export class AdminSettings {
public agHelper = ObjectsRegistry.AggregateHelper;
public locator = ObjectsRegistry.CommonLocators;
public homePage = ObjectsRegistry.HomePage;
+ public assertHelper = ObjectsRegistry.AssertHelper;
public _adminSettingsBtn = '[data-testid="t--admin-settings-menu-option"]';
private _settingsList = ".t--settings-category-list";
@@ -11,13 +12,13 @@ export class AdminSettings {
public _roles = (user: string) =>
"//span[contains(text(), '" +
user +
- "')]/parent::div/parent::a/parent::td/following-sibling::td[1]";
- public _instanceName =
- "//label[text()='Instance name']/following-sibling::div//input";
+ "')]/parent::div/parent::span/parent::a/parent::td/following-sibling::td[1]";
+ public _instanceName = '[name="instanceName"]';
public NavigateToAdminSettings() {
this.homePage.NavigateToHome();
this.agHelper.GetNClick(this._adminSettingsBtn);
+ this.assertHelper.AssertNetworkStatus("getEnvVariables");
this.agHelper.AssertElementVisibility(this._settingsList);
}
}
diff --git a/app/client/cypress/support/Pages/AggregateHelper.ts b/app/client/cypress/support/Pages/AggregateHelper.ts
index 0f4c85aee1..c1747ae00d 100644
--- a/app/client/cypress/support/Pages/AggregateHelper.ts
+++ b/app/client/cypress/support/Pages/AggregateHelper.ts
@@ -1043,8 +1043,8 @@ export class AggregateHelper extends ReusableHelper {
public ActionContextMenuWithInPane({
action = "Delete",
- subAction = "",
entityType = EntityItems.JSObject,
+ subAction = "",
toastToValidate = "",
}: DeleteParams) {
cy.get(this.locator._contextMenuInPane).click();
@@ -1663,6 +1663,10 @@ export class AggregateHelper extends ReusableHelper {
this.GetElement(selector).should("have.class", className);
}
+ public VerifySnapshot(selector: string, identifier: string) {
+ this.GetElement(selector).matchImageSnapshot(identifier);
+ }
+
//Not used:
// private xPathToCss(xpath: string) {
// return xpath
diff --git a/app/client/cypress/support/Pages/DataSources.ts b/app/client/cypress/support/Pages/DataSources.ts
index b131918b57..966d343ce0 100644
--- a/app/client/cypress/support/Pages/DataSources.ts
+++ b/app/client/cypress/support/Pages/DataSources.ts
@@ -295,6 +295,7 @@ export class DataSources {
`.t--datasource-tab-container ${this._entityExplorerID(tableName)}`;
_dsPageTableTriggermenuTarget = (tableName: string) =>
`${this._dsPageTabContainerTableName(tableName)} .t--template-menu-trigger`;
+ _gSheetQueryPlaceholder = ".CodeMirror-placeholder";
public AssertDSEditViewMode(mode: "Edit" | "View") {
if (mode == "Edit") this.agHelper.AssertElementAbsence(this._editButton);
diff --git a/app/client/cypress/support/Pages/EntityExplorer.ts b/app/client/cypress/support/Pages/EntityExplorer.ts
index 8e42bd557a..48a94a178a 100644
--- a/app/client/cypress/support/Pages/EntityExplorer.ts
+++ b/app/client/cypress/support/Pages/EntityExplorer.ts
@@ -28,6 +28,7 @@ interface EntityActionParams {
| "Refresh"
| "Set as home page";
subAction?: string;
+ //@ts-expect-error: type mismatch
entityType?: EntityItems;
toAssertAction?: boolean;
toastToValidate?: string;
@@ -232,10 +233,10 @@ export class EntityExplorer {
}
public ActionContextMenuByEntityName({
- entityNameinLeftSidebar,
action = "Delete",
- subAction = "",
+ entityNameinLeftSidebar,
entityType = EntityItems.Query,
+ subAction = "",
toAssertAction,
toastToValidate = "",
}: EntityActionParams) {
diff --git a/app/client/cypress/support/Pages/HomePage.ts b/app/client/cypress/support/Pages/HomePage.ts
index 9e3a03625f..846fb2e9c2 100644
--- a/app/client/cypress/support/Pages/HomePage.ts
+++ b/app/client/cypress/support/Pages/HomePage.ts
@@ -623,6 +623,17 @@ export class HomePage {
this.agHelper.WaitUntilToastDisappear("Deleting application...");
}
+ public DeleteAppviaAPI(appId: any) {
+ cy.request({
+ method: "DELETE",
+ url: "api/v1/applications/" + appId,
+ failOnStatusCode: false,
+ headers: {
+ "X-Requested-By": "Appsmith",
+ },
+ });
+ }
+
//Maps to leaveworkspace in command.js
public LeaveWorkspace(workspaceName: string) {
this.OpenWorkspaceOptions(workspaceName);
diff --git a/app/client/cypress/support/Pages/PropertyPane.ts b/app/client/cypress/support/Pages/PropertyPane.ts
index 9c88e1424b..ed91976e76 100644
--- a/app/client/cypress/support/Pages/PropertyPane.ts
+++ b/app/client/cypress/support/Pages/PropertyPane.ts
@@ -53,11 +53,11 @@ export class PropertyPane {
_mode = (modeName: string) =>
"//span[contains(text(),'" + modeName + "')]//parent::span";
_propertyToggle = (controlToToggle: string) =>
- ".t--property-control-" +
+ "//div[contains(@class,'t--property-control-" +
controlToToggle.replace(/ +/g, "").toLowerCase() +
- " input[type='checkbox'], label:contains('" +
+ "')]//input[@type='checkbox'] | //label[text()='" +
controlToToggle +
- "') input[type='checkbox']";
+ "']//input[@type='checkbox']";
_colorPickerV2Popover = ".t--colorpicker-v2-popover";
_colorPickerV2Color = ".t--colorpicker-v2-color";
_colorInput = (option: string) =>
@@ -163,6 +163,10 @@ export class PropertyPane {
_countryCodeChangeDropDown = ".t--input-country-code-change .remixicon-icon";
_searchCountryPlaceHolder = "[placeholder='Search by ISD code or country']";
_closeModal = "//*[contains(@class,'ads-v2-button t--close')]";
+ _zoomLevelInput = ".t--property-control-zoomlevel input";
+ _zoomLevelControl = (control: "start" | "end") =>
+ ".t--property-control-zoomlevel .ads-v2-input__input-section-icon-" +
+ control;
_dataIcon = (icon: string) => `[data-icon="${icon}"]`;
public OpenJsonFormFieldSettings(fieldName: string) {
@@ -636,4 +640,20 @@ export class PropertyPane {
);
});
}
+
+ public SetZoomLevel(zoom: number) {
+ this.agHelper.GetAttribute(this._zoomLevelInput, "value").then((value) => {
+ const currentValue = Number(value?.replace("%", ""));
+
+ if (currentValue === zoom || currentValue === 100 || currentValue === 0) {
+ return;
+ }
+ if (zoom > currentValue) {
+ this.agHelper.GetElement(this._zoomLevelControl("end")).click();
+ } else if (zoom < currentValue) {
+ this.agHelper.GetElement(this._zoomLevelControl("start")).click();
+ }
+ this.SetZoomLevel(zoom);
+ });
+ }
}
diff --git a/app/client/cypress/support/Pages/Table.ts b/app/client/cypress/support/Pages/Table.ts
index 94add0da1c..bf48613063 100644
--- a/app/client/cypress/support/Pages/Table.ts
+++ b/app/client/cypress/support/Pages/Table.ts
@@ -189,7 +189,7 @@ export class Table {
_divFirstChild = "div:first-child abbr";
_listPreviousPage = ".rc-pagination-prev";
_listNavigation = (move: string) =>
- "//button[@area-label='" + move + " page']";
+ "//button[@aria-label='" + move + " page']";
_listNextPage = ".rc-pagination-next";
_listActivePage = (version: "v1" | "v2") =>
`.t--widget-listwidget${
diff --git a/app/client/cypress_ci_hosted.config.ts b/app/client/cypress_ci_hosted.config.ts
index 33948c1aa5..fd3f80f2c0 100644
--- a/app/client/cypress_ci_hosted.config.ts
+++ b/app/client/cypress_ci_hosted.config.ts
@@ -52,8 +52,8 @@ export default defineConfig({
specPattern: [
"cypress/e2e/Sanity/Datasources/Airtable_Basic_Spec.ts",
"cypress/e2e/GSheet/**/**/*",
- "cypress/e2e/Regression/ServerSide/Datasources/ElasticSearch_Basic_Spec.ts",
"cypress/e2e/Regression/ServerSide/Datasources/Oracle_Spec.ts",
+ "cypress/e2e/Regression/ClientSide/Widgets/Others/MapWidget_Spec.ts",
],
testIsolation: false,
excludeSpecPattern: ["cypress/e2e/**/spec_utility.ts"],
diff --git a/app/client/jest.config.js b/app/client/jest.config.js
index 3fd4b33709..b40121f623 100644
--- a/app/client/jest.config.js
+++ b/app/client/jest.config.js
@@ -103,8 +103,6 @@ module.exports = {
},
intercomAppID: "APP_ID",
mailEnabled: parseConfig("__APPSMITH_MAIL_ENABLED__"),
-
- hideWatermark: parseConfig("__APPSMITH_HIDE_WATERMARK__"),
disableIframeWidgetSandbox: parseConfig(
"__APPSMITH_DISABLE_IFRAME_WIDGET_SANDBOX__",
),
diff --git a/app/client/package.json b/app/client/package.json
index 07f8cceb0f..2079505bdc 100644
--- a/app/client/package.json
+++ b/app/client/package.json
@@ -97,7 +97,7 @@
"cypress-log-to-output": "^1.1.2",
"dayjs": "^1.10.6",
"deep-diff": "^1.0.2",
- "design-system": "npm:@appsmithorg/design-system@2.1.21",
+ "design-system": "npm:@appsmithorg/design-system@2.1.23",
"design-system-old": "npm:@appsmithorg/design-system-old@1.1.12",
"downloadjs": "^1.4.7",
"echarts": "^5.4.2",
@@ -282,17 +282,18 @@
"@types/tinycolor2": "^1.4.2",
"@types/to-json-schema": "^0.2.1",
"@types/toposort": "^2.0.3",
+ "@types/uuid": "^9.0.5",
"@types/webfontloader": "1.6.33",
"@types/zipcelx": "^1.5.0",
- "@typescript-eslint/eslint-plugin": "^5.54.1",
- "@typescript-eslint/parser": "^5.54.1",
+ "@typescript-eslint/eslint-plugin": "^6.7.4",
+ "@typescript-eslint/parser": "^6.7.4",
"babel-plugin-lodash": "^3.3.4",
"babel-plugin-module-resolver": "^4.1.0",
"chalk": "^4.1.1",
"compression-webpack-plugin": "^10.0.0",
"cra-bundle-analyzer": "^0.1.0",
"cy-verify-downloads": "^0.0.5",
- "cypress": "13.2.0",
+ "cypress": "13.3.1",
"cypress-file-upload": "^4.1.1",
"cypress-image-snapshot": "^4.0.1",
"cypress-mochawesome-reporter": "^3.5.1",
@@ -306,17 +307,17 @@
"cypress-xpath": "^1.6.0",
"diff": "^5.0.0",
"dotenv": "^8.1.0",
- "eslint": "^8.42.0",
- "eslint-config-prettier": "^8.6.0",
- "eslint-import-resolver-babel-module": "^5.3.1",
- "eslint-plugin-cypress": "^2.11.2",
- "eslint-plugin-import": "^2.25.2",
- "eslint-plugin-jest": "^27.2.1",
- "eslint-plugin-prettier": "^4.2.1",
- "eslint-plugin-react": "^7.30.0",
- "eslint-plugin-react-hooks": "^2.3.0",
- "eslint-plugin-sort-destructure-keys": "^1.3.5",
- "eslint-plugin-storybook": "^0.6.11",
+ "eslint": "^8.51.0",
+ "eslint-config-prettier": "^9.0.0",
+ "eslint-import-resolver-babel-module": "^5.3.2",
+ "eslint-plugin-cypress": "^2.15.1",
+ "eslint-plugin-import": "^2.28.1",
+ "eslint-plugin-jest": "^27.4.2",
+ "eslint-plugin-prettier": "^5.0.0",
+ "eslint-plugin-react": "^7.33.2",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-sort-destructure-keys": "^1.5.0",
+ "eslint-plugin-storybook": "^0.6.15",
"esm": "^3.2.25",
"factory.ts": "^0.5.1",
"husky": "^8.0.0",
@@ -325,21 +326,19 @@
"jest-environment-jsdom": "^27.4.1",
"jest-styled-components": "^7.0.8",
"json5": "^2.2.3",
- "lint-staged": "^13.2.0",
+ "lint-staged": "^14.0.1",
"msw": "^0.28.0",
"pg": "^8.11.3",
"plop": "^3.1.1",
- "postcss": "^8.4.31",
+ "postcss": "8.4.31",
"postcss-at-rules-variables": "^0.3.0",
- "postcss-conditionals": "^2.1.0",
"postcss-each": "^1.1.0",
- "postcss-for": "^2.1.1",
"postcss-import": "^15.1.0",
"postcss-modules-values": "^4.0.0",
"postcss-nesting": "^12.0.1",
"postcss-url": "^10.1.3",
"postinstall-postinstall": "^2.1.0",
- "prettier": "^2.8.6",
+ "prettier": "^3.0.3",
"prop-types": "^15.8.1",
"raw-loader": "^4.0.2",
"react-is": "^16.12.0",
@@ -378,6 +377,7 @@
"@blueprintjs/core@^3.33.0": "patch:@blueprintjs/core@npm%3A3.47.0#./.yarn/patches/@blueprintjs-core-npm-3.47.0-a5bc1ea927.patch",
"@blueprintjs/core@^3.47.0": "patch:@blueprintjs/core@npm%3A3.47.0#./.yarn/patches/@blueprintjs-core-npm-3.47.0-a5bc1ea927.patch",
"@blueprintjs/icons": "3.22.0",
- "@types/react": "^17.0.2"
+ "@types/react": "^17.0.2",
+ "postcss": "8.4.31"
}
}
diff --git a/app/client/packages/ast/src/index.ts b/app/client/packages/ast/src/index.ts
index 78e19623d7..334d23de92 100644
--- a/app/client/packages/ast/src/index.ts
+++ b/app/client/packages/ast/src/index.ts
@@ -142,12 +142,12 @@ export interface BlockStatementNode extends Node {
body: [Node];
}
-type NodeList = {
+interface NodeList {
references: Set;
functionalParams: Set;
variableDeclarations: Set;
identifierList: Array;
-};
+}
// https://github.com/estree/estree/blob/master/es5.md#property
export interface PropertyNode extends Node {
@@ -185,10 +185,10 @@ export type NodeWithLocation = NodeType & {
type AstOptions = Omit;
-type EntityRefactorResponse = {
+interface EntityRefactorResponse {
isSuccess: boolean;
body: { script: string; refactorCount: number } | { error: string };
-};
+}
/* We need these functions to typescript casts the nodes with the correct types */
export const isIdentifierNode = (node: Node): node is IdentifierNode => {
@@ -507,7 +507,10 @@ export const entityRefactorFromCode = (
}
};
-export type functionParam = { paramName: string; defaultValue: unknown };
+export interface functionParam {
+ paramName: string;
+ defaultValue: unknown;
+}
export const getFunctionalParamsFromNode = (
node:
diff --git a/app/client/packages/ast/src/peekOverlay/index.ts b/app/client/packages/ast/src/peekOverlay/index.ts
index 646d2757e8..c9d0efec2c 100644
--- a/app/client/packages/ast/src/peekOverlay/index.ts
+++ b/app/client/packages/ast/src/peekOverlay/index.ts
@@ -77,7 +77,7 @@ export class PeekOverlayExpressionIdentifier {
}
}
-export type PeekOverlayExpressionIdentifierOptions = {
+export interface PeekOverlayExpressionIdentifierOptions {
sourceType: SourceType;
thisExpressionReplacement?: string;
-};
+}
diff --git a/app/client/packages/ast/src/utils.ts b/app/client/packages/ast/src/utils.ts
index f6bc2e2aa7..b82005cb8b 100644
--- a/app/client/packages/ast/src/utils.ts
+++ b/app/client/packages/ast/src/utils.ts
@@ -25,10 +25,10 @@ export const isTrueObject = (
export const getNameFromPropertyNode = (node: PropertyNode): string =>
isLiteralNode(node.key) ? String(node.key.value) : node.key.name;
-type Position = {
+interface Position {
line: number;
ch: number;
-};
+}
export const extractContentByPosition = (
content: string,
diff --git a/app/client/packages/design-system/headless/src/components/Checkbox/src/Checkbox.tsx b/app/client/packages/design-system/headless/src/components/Checkbox/src/Checkbox.tsx
index 06149c86bd..c303a59001 100644
--- a/app/client/packages/design-system/headless/src/components/Checkbox/src/Checkbox.tsx
+++ b/app/client/packages/design-system/headless/src/components/Checkbox/src/Checkbox.tsx
@@ -15,9 +15,9 @@ import { SubtractIcon } from "./icons/SubtractIcon";
import { Icon as HeadlessIcon } from "../../Icon";
import type { CheckboxGroupContextType } from "./context";
-export type InlineLabelProps = {
+export interface InlineLabelProps {
labelPosition?: "left" | "right";
-};
+}
export interface CheckboxProps
extends Omit,
@@ -36,8 +36,8 @@ const _Checkbox = (props: CheckboxProps, ref: CheckboxRef) => {
icon: Icon = CheckIcon,
isDisabled: isDisabledProp = false,
isIndeterminate = false,
- validationState,
labelPosition = "right",
+ validationState,
} = props;
const state = useToggleState(props);
const inputRef = useRef(null);
diff --git a/app/client/packages/design-system/headless/src/components/Checkbox/src/context.ts b/app/client/packages/design-system/headless/src/components/Checkbox/src/context.ts
index 56ee4d5f1a..72f25be0eb 100644
--- a/app/client/packages/design-system/headless/src/components/Checkbox/src/context.ts
+++ b/app/client/packages/design-system/headless/src/components/Checkbox/src/context.ts
@@ -2,10 +2,10 @@ import React from "react";
import type { CheckboxGroupState } from "@react-stately/checkbox";
-export type CheckboxGroupContextType = {
+export interface CheckboxGroupContextType {
state: CheckboxGroupState;
isDisabled?: boolean;
-};
+}
export const CheckboxGroupContext =
React.createContext(null);
diff --git a/app/client/packages/design-system/headless/src/components/Field/src/Field.tsx b/app/client/packages/design-system/headless/src/components/Field/src/Field.tsx
index 8a388d553c..ffb5e26604 100644
--- a/app/client/packages/design-system/headless/src/components/Field/src/Field.tsx
+++ b/app/client/packages/design-system/headless/src/components/Field/src/Field.tsx
@@ -24,19 +24,19 @@ export type FieldRef = Ref;
const _Field = (props: FieldProps, ref: FieldRef) => {
const {
children,
+ contextualHelp,
+ description,
+ descriptionProps,
elementType,
errorMessage,
errorMessageProps = {},
+ fieldType = "field",
isDisabled = false,
label,
labelProps,
validationState,
wrapperClassName,
- description,
- descriptionProps,
wrapperProps = {},
- contextualHelp,
- fieldType = "field",
} = props;
const hasHelpText =
Boolean(description) ||
diff --git a/app/client/packages/design-system/headless/src/components/Radio/src/context.ts b/app/client/packages/design-system/headless/src/components/Radio/src/context.ts
index b7c3e41994..eacc81f141 100644
--- a/app/client/packages/design-system/headless/src/components/Radio/src/context.ts
+++ b/app/client/packages/design-system/headless/src/components/Radio/src/context.ts
@@ -1,12 +1,12 @@
import React, { useContext } from "react";
import type { RadioGroupState } from "@react-stately/radio";
-export type RadioGroupContext = {
+export interface RadioGroupContext {
name?: string;
validationState?: "valid" | "invalid";
state: RadioGroupState;
isDisabled?: boolean;
-};
+}
export const RadioContext = React.createContext(null);
diff --git a/app/client/packages/design-system/headless/src/components/Tooltip/src/useTooltip.ts b/app/client/packages/design-system/headless/src/components/Tooltip/src/useTooltip.ts
index bd7ee2387b..94360530e6 100644
--- a/app/client/packages/design-system/headless/src/components/Tooltip/src/useTooltip.ts
+++ b/app/client/packages/design-system/headless/src/components/Tooltip/src/useTooltip.ts
@@ -35,14 +35,14 @@ export interface TooltipOptions {
export function useTooltip({
closeDelay = 0,
initialOpen = false,
+ interaction = "hover",
+ offset: offsetProp = DEFAULT_TOOLTIP_OFFSET,
onOpenChange: setControlledOpen,
open: controlledOpen,
openDelay = 0,
- placement = "top",
- interaction = "hover",
- offset: offsetProp = DEFAULT_TOOLTIP_OFFSET,
- shift: shiftProp = DEFAULT_TOOLTIP_SHIFT,
padding: paddingProp = DEFAULT_TOOLTIP_PADDING,
+ placement = "top",
+ shift: shiftProp = DEFAULT_TOOLTIP_SHIFT,
}: TooltipOptions = {}) {
const [uncontrolledOpen, setUncontrolledOpen] = React.useState(initialOpen);
diff --git a/app/client/packages/design-system/theming/src/theme/src/types.ts b/app/client/packages/design-system/theming/src/theme/src/types.ts
index 41f820bc81..342cef7d39 100644
--- a/app/client/packages/design-system/theming/src/theme/src/types.ts
+++ b/app/client/packages/design-system/theming/src/theme/src/types.ts
@@ -18,13 +18,13 @@ export interface ThemeProviderProps {
style?: CSSProperties;
}
-export type UseThemeProps = {
+export interface UseThemeProps {
seedColor?: string;
colorMode?: ColorMode;
borderRadius?: string;
fontFamily?: FontFamily;
rootUnitRatio?: number;
-};
+}
export const SHEET_TYPES = {
fontFace: "fontFace",
diff --git a/app/client/packages/design-system/theming/src/token/src/styles.module.css b/app/client/packages/design-system/theming/src/token/src/styles.module.css
index 94240e4ef2..525c30fcf1 100644
--- a/app/client/packages/design-system/theming/src/token/src/styles.module.css
+++ b/app/client/packages/design-system/theming/src/token/src/styles.module.css
@@ -1,4 +1,4 @@
-//THIS FILE IS CREATED AUTOMATICALLY. PLEASE DON'T EDIT IT.
+/* THIS FILE IS CREATED AUTOMATICALLY. PLEASE DON'T EDIT IT. */
:root {
--root-unit: clamp(4px, calc(0.06vw + 3.77px), 5px);
--spacing-0: 0;
@@ -159,7 +159,7 @@
--color-fg-on-warning: rgb(21.953% 9.0775% 0%);
--color-bd: rgb(72.54% 73.727% 82.602%);
--color-bd-accent: rgb(33.333% 23.922% 91.373%);
- --color-bd-focus: rgb(78.161% 34.431% 0%);
+ --color-bd-focus: rgb(33.333% 23.922% 91.373%);
--color-bd-neutral: rgb(37.869% 38.922% 47.553%);
--color-bd-neutral-hover: rgb(49.162% 50.308% 59.345%);
--color-bd-positive: rgb(6.7435% 63.436% 18.481%);
diff --git a/app/client/packages/design-system/theming/src/token/src/themeTokens.json b/app/client/packages/design-system/theming/src/token/src/themeTokens.json
index 3a500e1f6c..e69207cc5c 100644
--- a/app/client/packages/design-system/theming/src/token/src/themeTokens.json
+++ b/app/client/packages/design-system/theming/src/token/src/themeTokens.json
@@ -193,7 +193,7 @@
"type": "color"
},
"bd-focus": {
- "value": "rgb(78.161% 34.431% 0%)",
+ "value": "rgb(33.333% 23.922% 91.373%)",
"type": "color"
},
"bd-neutral": {
diff --git a/app/client/packages/design-system/theming/src/token/src/types.ts b/app/client/packages/design-system/theming/src/token/src/types.ts
index 57392027f2..26a1abe781 100644
--- a/app/client/packages/design-system/theming/src/token/src/types.ts
+++ b/app/client/packages/design-system/theming/src/token/src/types.ts
@@ -37,4 +37,6 @@ export interface TokenSource {
spacing?: TokenObj;
}
-export type TokenObj = { [key: string]: string | number };
+export interface TokenObj {
+ [key: string]: string | number;
+}
diff --git a/app/client/packages/design-system/theming/src/typography/src/types.ts b/app/client/packages/design-system/theming/src/typography/src/types.ts
index 5264d54122..c8f18bd5d0 100644
--- a/app/client/packages/design-system/theming/src/typography/src/types.ts
+++ b/app/client/packages/design-system/theming/src/typography/src/types.ts
@@ -52,11 +52,11 @@ export const TYPOGRAPHY_FONT_WEIGHTS = {
export type FontFamily = keyof typeof FONT_METRICS | "System Default";
-export type TypographyVariantMetric = {
+export interface TypographyVariantMetric {
capHeight: number;
lineGap: number;
fontFamily?: FontFamily;
-};
+}
export type Typography = {
[key in keyof typeof TYPOGRAPHY_VARIANTS]: TypographyVariantMetric;
diff --git a/app/client/packages/design-system/theming/src/utils/tokensToCss.ts b/app/client/packages/design-system/theming/src/utils/tokensToCss.ts
index 67de7e7058..3ab42ecc42 100644
--- a/app/client/packages/design-system/theming/src/utils/tokensToCss.ts
+++ b/app/client/packages/design-system/theming/src/utils/tokensToCss.ts
@@ -18,7 +18,7 @@ const allTokens = new TokensAccessor({
}).getAllTokens();
const ATTENTION_MESSAGE =
- "//THIS FILE IS CREATED AUTOMATICALLY. PLEASE DON'T EDIT IT.";
+ "/* THIS FILE IS CREATED AUTOMATICALLY. PLEASE DON'T EDIT IT. */";
const cssStyles = `:root {--root-unit: ${getFluidRootUnit(fluid)}; ${cssRule(
allTokens,
)}}`;
diff --git a/app/client/packages/design-system/widgets-old/src/Button/index.tsx b/app/client/packages/design-system/widgets-old/src/Button/index.tsx
index a0f6e04e5d..658a5e9853 100644
--- a/app/client/packages/design-system/widgets-old/src/Button/index.tsx
+++ b/app/client/packages/design-system/widgets-old/src/Button/index.tsx
@@ -44,7 +44,7 @@ export enum Size {
large = "large",
}
-type stateStyleType = {
+interface stateStyleType {
bgColorPrimary: string;
borderColorPrimary: string;
txtColorPrimary: string;
@@ -54,20 +54,20 @@ type stateStyleType = {
bgColorTertiary: string;
borderColorTertiary: string;
txtColorTertiary: string;
-};
+}
-type BtnColorType = {
+interface BtnColorType {
bgColor: string;
txtColor: string;
border: string;
outline: string;
-};
+}
-type BtnFontType = {
+interface BtnFontType {
buttonFont: any;
padding: string;
height: number;
-};
+}
export enum IconPositions {
left = "left",
@@ -103,17 +103,17 @@ const defaultProps = {
tag: "a",
};
-type buttonVariant = {
+interface buttonVariant {
main: string;
light: string;
dark: string;
darker: string;
darkest: string;
-};
+}
-type ButtonColorType = {
+interface ButtonColorType {
[index: string]: buttonVariant;
-};
+}
const ButtonColors: ButtonColorType = {
info: {
diff --git a/app/client/packages/design-system/widgets-old/src/Dropdown/index.tsx b/app/client/packages/design-system/widgets-old/src/Dropdown/index.tsx
index fb9557c44d..b05c7c33f2 100644
--- a/app/client/packages/design-system/widgets-old/src/Dropdown/index.tsx
+++ b/app/client/packages/design-system/widgets-old/src/Dropdown/index.tsx
@@ -29,7 +29,7 @@ export type DropdownOnSelect = (
isUpdatedViaKeyboard?: boolean,
) => void;
-export type DropdownOption = {
+export interface DropdownOption {
label?: string;
value?: string;
id?: string;
@@ -47,7 +47,7 @@ export type DropdownOption = {
disabledTooltipText?: string;
hasCustomBadge?: boolean;
link?: string;
-};
+}
export interface DropdownSearchProps {
enableSearch?: boolean;
@@ -346,7 +346,8 @@ export const DropdownWrapper = styled.div<{
border: 1px solid var(--ads-dropdown-default-menu-border-color);
overflow: hidden;
overflow-y: auto;
- box-shadow: 0px 12px 16px -4px rgba(0, 0, 0, 0.1),
+ box-shadow:
+ 0px 12px 16px -4px rgba(0, 0, 0, 0.1),
0px 4px 6px -2px rgba(0, 0, 0, 0.05);
display: ${(props) => (props.isOpen ? "inline-block" : "none")};
.dropdown-search {
@@ -1121,9 +1122,8 @@ export default function Dropdown(props: DropdownProps) {
const handleKeydown = useCallback(
(e: React.KeyboardEvent) => {
- const elementList = document.getElementById(
- "ds--dropdown-options",
- )?.children;
+ const elementList = document.getElementById("ds--dropdown-options")
+ ?.children;
if (!elementList || elementList?.length === 0) {
setHighlight(-1);
}
diff --git a/app/client/packages/design-system/widgets-old/src/Icon/index.tsx b/app/client/packages/design-system/widgets-old/src/Icon/index.tsx
index 0ebe120118..a6b5449dd8 100644
--- a/app/client/packages/design-system/widgets-old/src/Icon/index.tsx
+++ b/app/client/packages/design-system/widgets-old/src/Icon/index.tsx
@@ -916,7 +916,7 @@ export const IconCollection = Object.keys(ICON_LOOKUP);
export type IconName = (typeof IconCollection)[number];
-export type IconProps = {
+export interface IconProps {
size?: IconSize;
name?: IconName;
invisible?: boolean;
@@ -930,7 +930,7 @@ export type IconProps = {
disabled?: boolean;
withWrapper?: boolean;
wrapperColor?: string;
-};
+}
const Icon = forwardRef(
(
diff --git a/app/client/packages/design-system/widgets-old/src/ListSegmentHeader/index.tsx b/app/client/packages/design-system/widgets-old/src/ListSegmentHeader/index.tsx
index b67dced5b0..37883db317 100644
--- a/app/client/packages/design-system/widgets-old/src/ListSegmentHeader/index.tsx
+++ b/app/client/packages/design-system/widgets-old/src/ListSegmentHeader/index.tsx
@@ -22,11 +22,11 @@ const StyledHr = styled.div`
margin-left: var(--ads-spaces-3);
`;
-export type SegmentHeaderProps = {
+export interface SegmentHeaderProps {
title: string;
style?: CSSProperties;
hideStyledHr?: boolean;
-};
+}
export default function SegmentHeader(props: SegmentHeaderProps) {
return (
diff --git a/app/client/packages/design-system/widgets-old/src/Spinner/index.tsx b/app/client/packages/design-system/widgets-old/src/Spinner/index.tsx
index 727d660270..f99bf95bae 100644
--- a/app/client/packages/design-system/widgets-old/src/Spinner/index.tsx
+++ b/app/client/packages/design-system/widgets-old/src/Spinner/index.tsx
@@ -38,9 +38,9 @@ const SvgCircle = styled.circle`
stroke-width: var(--ads-spaces-1);
`;
-export type SpinnerProp = {
+export interface SpinnerProp {
size?: IconSize;
-};
+}
Spinner.defaultProp = {
size: "small",
diff --git a/app/client/packages/design-system/widgets-old/src/TableDropdown/index.tsx b/app/client/packages/design-system/widgets-old/src/TableDropdown/index.tsx
index 2d56b0aa47..bf7aab63c0 100644
--- a/app/client/packages/design-system/widgets-old/src/TableDropdown/index.tsx
+++ b/app/client/packages/design-system/widgets-old/src/TableDropdown/index.tsx
@@ -11,11 +11,11 @@ import Text, { TextType } from "../Text";
import type { CommonComponentProps } from "../types/common";
import { Classes } from "../constants/classes";
-export type TableDropdownOption = {
+export interface TableDropdownOption {
id: string;
name: string;
desc: string;
-};
+}
type DropdownProps = CommonComponentProps & {
options: TableDropdownOption[];
diff --git a/app/client/packages/design-system/widgets-old/src/constants/Icon.tsx b/app/client/packages/design-system/widgets-old/src/constants/Icon.tsx
index 27fe3f1bed..371602e997 100644
--- a/app/client/packages/design-system/widgets-old/src/constants/Icon.tsx
+++ b/app/client/packages/design-system/widgets-old/src/constants/Icon.tsx
@@ -1,6 +1,6 @@
import styled from "styled-components";
-export type IconProps = {
+export interface IconProps {
width?: number;
height?: number;
color?: string;
@@ -10,7 +10,7 @@ export type IconProps = {
keepColors?: boolean;
disabled?: boolean;
cursor?: "move" | "grab" | "default";
-};
+}
export const IconWrapper = styled.div`
&:focus {
diff --git a/app/client/packages/design-system/widgets-old/src/types/common.ts b/app/client/packages/design-system/widgets-old/src/types/common.ts
index 118084d823..593877d14e 100644
--- a/app/client/packages/design-system/widgets-old/src/types/common.ts
+++ b/app/client/packages/design-system/widgets-old/src/types/common.ts
@@ -19,11 +19,11 @@ export enum DSEventTypes {
KEYPRESS = "KEYPRESS",
}
-export type DSEventDetail = {
+export interface DSEventDetail {
component: string;
event: DSEventTypes;
meta: Record;
-};
+}
export function createDSEvent(detail: DSEventDetail) {
return new CustomEvent(DS_EVENT, {
diff --git a/app/client/packages/design-system/widgets/src/components/Button/src/styles.module.css b/app/client/packages/design-system/widgets/src/components/Button/src/styles.module.css
index 1a882211e2..99ec4a3435 100644
--- a/app/client/packages/design-system/widgets/src/components/Button/src/styles.module.css
+++ b/app/client/packages/design-system/widgets/src/components/Button/src/styles.module.css
@@ -108,7 +108,9 @@
*-----------------------------------------------------------------------------
*/
&[data-focused] {
- box-shadow: 0 0 0 2px var(--color-bg), 0 0 0 4px var(--color-bd-focus);
+ box-shadow:
+ 0 0 0 2px var(--color-bg),
+ 0 0 0 4px var(--color-bd-focus);
}
/**
diff --git a/app/client/packages/design-system/widgets/src/components/Checkbox/src/styles.module.css b/app/client/packages/design-system/widgets/src/components/Checkbox/src/styles.module.css
index 6cde08c23e..08c22fa5a9 100644
--- a/app/client/packages/design-system/widgets/src/components/Checkbox/src/styles.module.css
+++ b/app/client/packages/design-system/widgets/src/components/Checkbox/src/styles.module.css
@@ -50,7 +50,9 @@
*-----------------------------------------------------------------------------
*/
&[data-focused] [data-icon] {
- box-shadow: var(--checkbox-box-shadow), 0 0 0 2px var(--color-bg),
+ box-shadow:
+ var(--checkbox-box-shadow),
+ 0 0 0 2px var(--color-bg),
0 0 0 4px var(--color-bd-focus);
}
diff --git a/app/client/packages/design-system/widgets/src/components/Radio/src/styles.module.css b/app/client/packages/design-system/widgets/src/components/Radio/src/styles.module.css
index 79a92fa649..5da0dc267f 100644
--- a/app/client/packages/design-system/widgets/src/components/Radio/src/styles.module.css
+++ b/app/client/packages/design-system/widgets/src/components/Radio/src/styles.module.css
@@ -48,7 +48,9 @@
*-----------------------------------------------------------------------------
*/
&[data-focused] [data-icon] {
- box-shadow: var(--radio-box-shadow), 0 0 0 2px var(--color-bg),
+ box-shadow:
+ var(--radio-box-shadow),
+ 0 0 0 2px var(--color-bg),
0 0 0 4px var(--color-bd-focus);
}
diff --git a/app/client/packages/design-system/widgets/src/components/Switch/src/styles.module.css b/app/client/packages/design-system/widgets/src/components/Switch/src/styles.module.css
index e4f3ebdaa8..57332dfe0e 100644
--- a/app/client/packages/design-system/widgets/src/components/Switch/src/styles.module.css
+++ b/app/client/packages/design-system/widgets/src/components/Switch/src/styles.module.css
@@ -56,6 +56,8 @@
*-----------------------------------------------------------------------------
*/
&[data-focused] [data-icon] {
- box-shadow: 0 0 0 2px var(--color-bg), 0 0 0 4px var(--color-bd-focus);
+ box-shadow:
+ 0 0 0 2px var(--color-bg),
+ 0 0 0 4px var(--color-bd-focus);
}
}
diff --git a/app/client/packages/design-system/widgets/src/components/Text/src/styles.module.css b/app/client/packages/design-system/widgets/src/components/Text/src/styles.module.css
index 04770ed2c8..d4bfb953b2 100644
--- a/app/client/packages/design-system/widgets/src/components/Text/src/styles.module.css
+++ b/app/client/packages/design-system/widgets/src/components/Text/src/styles.module.css
@@ -4,6 +4,7 @@
/* using auto instead of 100% so that text doesnot push everything to the edge */
width: auto;
color: inherit;
+ overflow-wrap: anywhere;
@each $color in colors {
&[data-color="$(color)"] {
@@ -16,5 +17,4 @@
display: -webkit-box;
-webkit-box-orient: vertical;
overflow: hidden;
- overflow-wrap: break-word;
}
diff --git a/app/client/packages/design-system/widgets/src/components/testing/styles.module.css b/app/client/packages/design-system/widgets/src/components/testing/styles.module.css
index 5677dac88c..bc1c1cb604 100644
--- a/app/client/packages/design-system/widgets/src/components/testing/styles.module.css
+++ b/app/client/packages/design-system/widgets/src/components/testing/styles.module.css
@@ -59,7 +59,9 @@
&[data-focused],
&:focus-visible {
- box-shadow: 0 0 0 2px var(--color-bg), 0 0 0 4px var(--color-bd-focus);
+ box-shadow:
+ 0 0 0 2px var(--color-bg),
+ 0 0 0 4px var(--color-bd-focus);
}
&[data-disabled] {
diff --git a/app/client/packages/dsl/src/DSL.ts b/app/client/packages/dsl/src/DSL.ts
index bc9a41793d..e40579c8d9 100644
--- a/app/client/packages/dsl/src/DSL.ts
+++ b/app/client/packages/dsl/src/DSL.ts
@@ -6,9 +6,13 @@ export type NestedDSLWidget = W & { children?: NestedDSLWidget[] };
export type NestedDSL = NestedDSLWidget;
export type FlattenedDSLWidget = W & { children?: string[] };
-export type FlattenedDSL = { [widgetId: string]: FlattenedDSLWidget };
+export interface FlattenedDSL {
+ [widgetId: string]: FlattenedDSLWidget;
+}
-export type FlattenedDSLEntities = { canvasWidgets: FlattenedDSL };
+export interface FlattenedDSLEntities {
+ canvasWidgets: FlattenedDSL;
+}
// Schema by widgetId
const SCHEMA_BY_ID = new schema.Entity(
diff --git a/app/client/packages/rts/.lintstagedrc.json b/app/client/packages/rts/.lintstagedrc.json
new file mode 100644
index 0000000000..39a1b229ca
--- /dev/null
+++ b/app/client/packages/rts/.lintstagedrc.json
@@ -0,0 +1,4 @@
+{
+ "src/**/*.{js,ts,tsx}": ["npx eslint --fix"],
+ "src/**/*.{js,ts,tsx,css,md,json}": ["npx prettier --write"]
+}
diff --git a/app/client/packages/rts/src/controllers/Ast/AstController.ts b/app/client/packages/rts/src/controllers/Ast/AstController.ts
index 77f9bd0278..02348b3101 100644
--- a/app/client/packages/rts/src/controllers/Ast/AstController.ts
+++ b/app/client/packages/rts/src/controllers/Ast/AstController.ts
@@ -4,23 +4,23 @@ import { StatusCodes } from "http-status-codes";
import BaseController from "@controllers/BaseController";
import AstService from "@services/AstService";
-type ScriptToIdentifiersType = {
+interface ScriptToIdentifiersType {
script: string;
evalVersion?: number;
-};
+}
-type entityRefactorType = {
+interface entityRefactorType {
script: string;
oldName: string;
newName: string;
isJSObject: boolean;
evalVersion?: number;
-};
+}
-type MultipleScriptToIdentifiersType = {
+interface MultipleScriptToIdentifiersType {
scripts: string[];
evalVersion?: number;
-};
+}
export default class AstController extends BaseController {
constructor() {
super();
diff --git a/app/client/packages/rts/src/controllers/BaseController.ts b/app/client/packages/rts/src/controllers/BaseController.ts
index df3ec0c127..389cc243f3 100644
--- a/app/client/packages/rts/src/controllers/BaseController.ts
+++ b/app/client/packages/rts/src/controllers/BaseController.ts
@@ -3,22 +3,22 @@ import type { ValidationError } from "express-validator";
import { StatusCodes } from "http-status-codes";
import type { IdentifierInfo } from "@shared/ast";
-type ErrorData = {
+interface ErrorData {
error: string | string[];
validationErrors?: ValidationError[];
-};
+}
-type ErrorBag = {
+interface ErrorBag {
success: boolean;
message: string;
data?: ErrorData;
-};
+}
-type ResponseData = {
+interface ResponseData {
success: boolean;
message?: string;
data: IdentifierInfo;
-};
+}
export default class BaseController {
serverErrorMessaage = "Something went wrong";
diff --git a/app/client/packages/storybook/.storybook/main.ts b/app/client/packages/storybook/.storybook/main.ts
index a479bba93e..7081b4da4d 100644
--- a/app/client/packages/storybook/.storybook/main.ts
+++ b/app/client/packages/storybook/.storybook/main.ts
@@ -3,8 +3,6 @@ import svgr from "vite-plugin-svgr";
import postcssNesting from "postcss-nesting";
import postcssImport from "postcss-import";
import postcssAtRulesVariables from "postcss-at-rules-variables";
-import postcssConditionals from "postcss-conditionals";
-import postcssFor from "postcss-for";
import postcssEach from "postcss-each";
import postcssModulesValues from "postcss-modules-values";
import * as glob from "glob";
@@ -33,8 +31,6 @@ module.exports = {
postcssNesting,
postcssImport,
postcssAtRulesVariables,
- postcssConditionals,
- postcssFor,
postcssEach,
postcssModulesValues,
],
diff --git a/app/client/packages/storybook/package.json b/app/client/packages/storybook/package.json
index 54bdb065b1..1eeee0ddbe 100644
--- a/app/client/packages/storybook/package.json
+++ b/app/client/packages/storybook/package.json
@@ -29,9 +29,7 @@
"chromatic": "^6.20.0",
"postcss": "*",
"postcss-at-rules-variables": "*",
- "postcss-conditionals": "*",
"postcss-each": "*",
- "postcss-for": "*",
"postcss-import": "*",
"postcss-loader": "*",
"postcss-modules-values": "*",
diff --git a/app/client/src/LandingScreen.tsx b/app/client/src/LandingScreen.tsx
index 066d1c945f..ec07d7882e 100755
--- a/app/client/src/LandingScreen.tsx
+++ b/app/client/src/LandingScreen.tsx
@@ -9,10 +9,10 @@ import { APPLICATIONS_URL, AUTH_LOGIN_URL, BASE_URL } from "constants/routes";
import PageLoadingBar from "pages/common/PageLoadingBar";
import ServerUnavailable from "pages/common/ErrorPages/ServerUnavailable";
-type Props = {
+interface Props {
user?: User;
authError: string;
-};
+}
function LandingScreen(props: Props) {
if (props.user && window.location.pathname === BASE_URL) {
diff --git a/app/client/src/RouteBuilder.test.ts b/app/client/src/RouteBuilder.test.ts
deleted file mode 100644
index 7dcd8591e5..0000000000
--- a/app/client/src/RouteBuilder.test.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { getQueryStringfromObject } from "./RouteBuilder";
-
-describe("Route builder", () => {
- describe("tests getQueryStringfromObject", () => {
- const cases = [
- {
- index: 0,
- input: { id: 0, a: "b&c ltd" },
- expected: "?id=0&a=b%26c%20ltd",
- },
- { index: 1, input: {}, expected: "" },
- {
- index: 2,
- input: { rando: "রিমিল" },
- expected: "?rando=%E0%A6%B0%E0%A6%BF%E0%A6%AE%E0%A6%BF%E0%A6%B2",
- },
- {
- index: 3,
- input: { a1: "1234*&^%~`<>:';,./?" },
- expected: "?a1=1234*%26%5E%25~%60%3C%3E%3A'%3B%2C.%2F%3F",
- },
- { index: 4, input: { isSignedIn: false }, expected: "?isSignedIn=false" },
- ];
-
- test.each(cases.map((x) => [x.index, x.input, x.expected]))(
- "test case %d",
- (_, input, expected) => {
- const result = getQueryStringfromObject(input as any);
- expect(result).toStrictEqual(expected);
- },
- );
- });
-});
diff --git a/app/client/src/RouteParamsMiddleware.ts b/app/client/src/RouteParamsMiddleware.ts
index 2481533348..3eba48065b 100644
--- a/app/client/src/RouteParamsMiddleware.ts
+++ b/app/client/src/RouteParamsMiddleware.ts
@@ -8,8 +8,8 @@ import type { UpdatePageResponse } from "api/PageApi";
import type {
ApplicationURLParams,
PageURLParams,
-} from "entities/URLRedirect/URLAssembly";
-import urlBuilder from "entities/URLRedirect/URLAssembly";
+} from "@appsmith/entities/URLRedirect/URLAssembly";
+import urlBuilder from "@appsmith/entities/URLRedirect/URLAssembly";
import type { Middleware } from "redux";
const routeParamsMiddleware: Middleware =
diff --git a/app/client/src/WidgetProvider/constants.ts b/app/client/src/WidgetProvider/constants.ts
index b503d205b7..7b4818268c 100644
--- a/app/client/src/WidgetProvider/constants.ts
+++ b/app/client/src/WidgetProvider/constants.ts
@@ -25,19 +25,25 @@ import type {
ResponsiveBehavior,
} from "layoutSystems/common/utils/constants";
-export type WidgetSizeConfig = {
+export interface WidgetSizeConfig {
viewportMinWidth: number;
configuration: (props: any) => Record;
-};
+}
-type ResizableValues = { vertical?: boolean; horizontal?: boolean };
+interface ResizableValues {
+ vertical?: boolean;
+ horizontal?: boolean;
+}
type ResizableOptions = ResizableValues | ((props: any) => ResizableValues);
-export type AutoDimensionValues = { width?: boolean; height?: boolean };
+export interface AutoDimensionValues {
+ width?: boolean;
+ height?: boolean;
+}
export type AutoDimensionOptions =
| AutoDimensionValues
| ((props: any) => AutoDimensionValues);
-export type AutoLayoutConfig = {
+export interface AutoLayoutConfig {
// Indicates if a widgets dimensions should be auto adjusted according to content inside it
autoDimension?: AutoDimensionOptions;
// min/max sizes for the widget
@@ -48,7 +54,7 @@ export type AutoLayoutConfig = {
defaults?: Partial;
// default values for the properties that are hidden/disabled in auto-layout
disabledPropsDefaults?: Partial;
-};
+}
export interface WidgetBaseConfiguration {
name: string;
@@ -85,25 +91,25 @@ export interface WidgetConfiguration extends WidgetBaseConfiguration {
methods?: Record;
}
-export type PropertyUpdates = {
+export interface PropertyUpdates {
propertyPath: string;
propertyValue?: unknown;
isDynamicPropertyPath?: boolean; // Toggles the property mode to JS
shouldDeleteProperty?: boolean; // Deletes the property, propertyValue is ignored
-};
+}
-export type WidgetMethods = {
+export interface WidgetMethods {
getQueryGenerationConfig?: GetQueryGenerationConfig;
getPropertyUpdatesForQueryBinding?: GetPropertyUpdatesForQueryBinding;
getSnipingModeUpdates?: GetSnipingModeUpdates;
getCanvasHeightOffset?: GetCanvasHeightOffset;
getEditorCallouts?: GetEditorCallouts;
getOneClickBindingConnectableWidgetConfig?: GetOneClickBindingConnectableWidgetConfig;
-};
+}
type GetEditorCallouts = (props: WidgetProps) => WidgetCallout[];
-export type WidgetCallout = {
+export interface WidgetCallout {
message: string;
links: [
{
@@ -111,7 +117,7 @@ export type WidgetCallout = {
url: string;
},
];
-};
+}
export type GetQueryGenerationConfig = (
widgetProps: WidgetProps,
@@ -126,10 +132,10 @@ export type GetPropertyUpdatesForQueryBinding = (
type SnipingModeSupportedKeys = "data" | "run" | "isDynamicPropertyPath";
-type OneClickBindingConnectableWidgetConfig = {
+interface OneClickBindingConnectableWidgetConfig {
widgetBindPath: string;
message: string;
-};
+}
export type GetOneClickBindingConnectableWidgetConfig = (
widgetProps: WidgetProps,
@@ -410,9 +416,9 @@ export const dateFormatOptions = [
},
];
-export type ThemeProp = {
+export interface ThemeProp {
theme: Theme;
-};
+}
export type SnipingModeProperty = Record<
SnipingModeSupportedKeys,
@@ -424,7 +430,7 @@ export enum DefaultMobileCameraTypes {
BACK = "environment",
}
-export type WidgetBlueprint = {
+export interface WidgetBlueprint {
view?: Array<{
type: string;
size?: { rows: number; cols: number };
@@ -432,7 +438,7 @@ export type WidgetBlueprint = {
props: Record;
}>;
operations?: any;
-};
+}
export interface WidgetConfigProps {
rows: number;
diff --git a/app/client/src/WidgetQueryGenerators/GSheets/index.ts b/app/client/src/WidgetQueryGenerators/GSheets/index.ts
index b79a1ef3b4..fed3841500 100644
--- a/app/client/src/WidgetQueryGenerators/GSheets/index.ts
+++ b/app/client/src/WidgetQueryGenerators/GSheets/index.ts
@@ -15,6 +15,7 @@ enum COMMAND_TYPES {
"FIND" = "FETCH_MANY",
"INSERT" = "INSERT_ONE",
"UPDATE" = "UPDATE_ONE",
+ // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values
"COUNT" = "FETCH_MANY",
}
const COMMON_INITIAL_VALUE_KEYS = [
@@ -237,10 +238,13 @@ export default abstract class GSheets extends BaseQueryGenerator {
];
const scrubedOutInitialValues = allowedInitialValueKeys
.filter((key) => initialValues[key as keyof GSheetsFormData])
- .reduce((acc, key) => {
- acc[key] = initialValues[key as keyof GSheetsFormData];
- return acc;
- }, {} as Record);
+ .reduce(
+ (acc, key) => {
+ acc[key] = initialValues[key as keyof GSheetsFormData];
+ return acc;
+ },
+ {} as Record,
+ );
const { formData, ...rest } = builtValues;
diff --git a/app/client/src/WidgetQueryGenerators/MongoDB/index.ts b/app/client/src/WidgetQueryGenerators/MongoDB/index.ts
index cf6b3c1b45..eaf0b6d88d 100644
--- a/app/client/src/WidgetQueryGenerators/MongoDB/index.ts
+++ b/app/client/src/WidgetQueryGenerators/MongoDB/index.ts
@@ -191,10 +191,13 @@ export default abstract class MongoDB extends BaseQueryGenerator {
const scrubedOutInitalValues = [...ALLOWED_INITAL_VALUE_KEYS, commandKey]
.filter((key) => initialValues[key as keyof MongoDBFormData])
- .reduce((acc, key) => {
- acc[key] = initialValues[key as keyof MongoDBFormData];
- return acc;
- }, {} as Record);
+ .reduce(
+ (acc, key) => {
+ acc[key] = initialValues[key as keyof MongoDBFormData];
+ return acc;
+ },
+ {} as Record,
+ );
const { formData, ...rest } = builtValues;
diff --git a/app/client/src/WidgetQueryGenerators/types.ts b/app/client/src/WidgetQueryGenerators/types.ts
index 162fd3990b..29fa7a4318 100644
--- a/app/client/src/WidgetQueryGenerators/types.ts
+++ b/app/client/src/WidgetQueryGenerators/types.ts
@@ -1,15 +1,15 @@
import type { AlertMessage } from "components/editorComponents/WidgetQueryGeneratorForm/types";
-type Column = {
+export interface Column {
name: string;
type: string;
isSelected: boolean;
-};
+}
-type GsheetConfig = {
+interface GsheetConfig {
sheetName?: string;
tableHeaderIndex?: number;
-};
+}
export type WidgetQueryGenerationFormConfig = {
tableName: string;
datasourceId: string;
@@ -27,7 +27,7 @@ export type WidgetQueryGenerationFormConfig = {
dataIdentifier?: string;
} & GsheetConfig;
-export type WidgetQueryGenerationConfig = {
+export interface WidgetQueryGenerationConfig {
select?: {
limit?: string;
offset?: string;
@@ -43,7 +43,7 @@ export type WidgetQueryGenerationConfig = {
where?: string;
};
totalRecord?: boolean;
-};
+}
export enum QUERY_TYPE {
SELECT = "select",
@@ -60,23 +60,23 @@ export type WidgetQueryConfig = Record<
}
>;
-export type MongoDBFormData = {
+export interface MongoDBFormData {
aggregate: object;
smartSubstitution: object;
find: object;
updateMany: object;
insert: object;
count: object;
-};
-export type ActionConfigurationMongoDB = {
+}
+export interface ActionConfigurationMongoDB {
formData: MongoDBFormData;
-};
+}
-export type ActionConfigurationSQL = {
+export interface ActionConfigurationSQL {
pluginSpecifiedTemplates: Array;
-};
+}
-export type GSheetsFormData = {
+export interface GSheetsFormData {
entityType: object;
tableHeaderIndex: object;
projection: object;
@@ -85,7 +85,7 @@ export type GSheetsFormData = {
where: object;
pagination: object;
smartSubstitution: object;
-};
-export type ActionConfigurationGSheets = {
+}
+export interface ActionConfigurationGSheets {
formData: GSheetsFormData;
-};
+}
diff --git a/app/client/src/actions/appThemingActions.tsx b/app/client/src/actions/appThemingActions.tsx
index 22cfe60d2e..b0e211b651 100644
--- a/app/client/src/actions/appThemingActions.tsx
+++ b/app/client/src/actions/appThemingActions.tsx
@@ -8,39 +8,39 @@ import { ReduxActionTypes } from "@appsmith/constants/ReduxActionConstants";
* ----------------------------------------------------------------------------
*/
-export type FetchAppThemesAction = {
+export interface FetchAppThemesAction {
applicationId: string;
-};
+}
-export type FetchSelectedAppThemeAction = {
+export interface FetchSelectedAppThemeAction {
applicationId: string;
-};
+}
-export type UpdateSelectedAppThemeAction = {
+export interface UpdateSelectedAppThemeAction {
applicationId: string;
theme: AppTheme;
shouldReplay?: boolean;
-};
+}
-export type ChangeSelectedAppThemeAction = {
+export interface ChangeSelectedAppThemeAction {
applicationId: string;
theme: AppTheme;
shouldReplay?: boolean;
-};
+}
-export type HydrateSelectedAppThemeAction = {
+export interface HydrateSelectedAppThemeAction {
theme: AppTheme;
-};
+}
-export type SaveAppThemeAction = {
+export interface SaveAppThemeAction {
applicationId: string;
name: string;
-};
+}
-export type DeleteAppThemeAction = {
+export interface DeleteAppThemeAction {
themeId: string;
name: string;
-};
+}
/**
* ----------------------------------------------------------------------------
diff --git a/app/client/src/actions/communityTemplateActions.ts b/app/client/src/actions/communityTemplateActions.ts
index ab391e595e..ff681b40ae 100644
--- a/app/client/src/actions/communityTemplateActions.ts
+++ b/app/client/src/actions/communityTemplateActions.ts
@@ -1,6 +1,6 @@
import { ReduxActionTypes } from "@appsmith/constants/ReduxActionConstants";
-export type PublishCommunityTemplatePayload = {
+export interface PublishCommunityTemplatePayload {
title: string;
headline: string;
description: string;
@@ -11,7 +11,7 @@ export type PublishCommunityTemplatePayload = {
shouldUpdateName: boolean;
branchName: string;
appUrl: string;
-};
+}
export const publishCommunityTemplate = (
payload: PublishCommunityTemplatePayload,
) => ({
diff --git a/app/client/src/actions/crudInfoModalActions.ts b/app/client/src/actions/crudInfoModalActions.ts
index d13787a284..4fca805963 100644
--- a/app/client/src/actions/crudInfoModalActions.ts
+++ b/app/client/src/actions/crudInfoModalActions.ts
@@ -1,12 +1,12 @@
import { ReduxActionTypes } from "@appsmith/constants/ReduxActionConstants";
-export type SetCrudInfoModalOpenPayload = {
+export interface SetCrudInfoModalOpenPayload {
open: boolean;
generateCRUDSuccessInfo?: {
successImageUrl: string;
successMessage: string;
};
-};
+}
export const setCrudInfoModalData = (payload: SetCrudInfoModalOpenPayload) => {
return {
diff --git a/app/client/src/actions/datasourceActions.ts b/app/client/src/actions/datasourceActions.ts
index 6ce9c6a0c7..b678e728ba 100644
--- a/app/client/src/actions/datasourceActions.ts
+++ b/app/client/src/actions/datasourceActions.ts
@@ -60,19 +60,19 @@ export const updateDatasource = (
};
};
-export type UpdateDatasourceSuccessAction = {
+export interface UpdateDatasourceSuccessAction {
type: string;
payload: Datasource;
redirect: boolean;
queryParams?: Record;
-};
+}
-export type CreateDatasourceSuccessAction = {
+export interface CreateDatasourceSuccessAction {
type: string;
payload: Datasource;
isDBCreated: boolean;
redirect: boolean;
-};
+}
export const updateDatasourceSuccess = (
payload: Datasource,
@@ -336,7 +336,7 @@ export const getOAuthAccessToken = (datasourceId: string) => {
};
};
-export type executeDatasourceQuerySuccessPayload = {
+export interface executeDatasourceQuerySuccessPayload {
responseMeta: ResponseMeta;
data: {
body: T;
@@ -345,7 +345,7 @@ export type executeDatasourceQuerySuccessPayload = {
statusCode: string;
isExecutionSuccess: boolean;
};
-};
+}
type errorPayload = string;
export interface executeDatasourceReduxActionPayload {
diff --git a/app/client/src/actions/editorContextActions.ts b/app/client/src/actions/editorContextActions.ts
index 357d94a118..6cc64b1960 100644
--- a/app/client/src/actions/editorContextActions.ts
+++ b/app/client/src/actions/editorContextActions.ts
@@ -25,13 +25,13 @@ export const setCodeEditorCursorAction = (
};
};
-export type CodeEditorFocusState = {
+export interface CodeEditorFocusState {
key: string | undefined;
cursorPosition: {
ch: number;
line: number;
};
-};
+}
export const setEditorFieldFocusAction = (payload: CodeEditorFocusState) => {
return {
diff --git a/app/client/src/actions/focusHistoryActions.ts b/app/client/src/actions/focusHistoryActions.ts
index b9b46ee293..27d2c20b05 100644
--- a/app/client/src/actions/focusHistoryActions.ts
+++ b/app/client/src/actions/focusHistoryActions.ts
@@ -4,10 +4,10 @@ import { ReduxActionTypes } from "@appsmith/constants/ReduxActionConstants";
import type { Location } from "history";
import type { AppsmithLocationState } from "utils/history";
-export type RouteChangeActionPayload = {
+export interface RouteChangeActionPayload {
location: Location;
prevLocation: Location;
-};
+}
export const routeChanged = (
location: Location,
diff --git a/app/client/src/actions/gitSyncActions.ts b/app/client/src/actions/gitSyncActions.ts
index ce998114e4..c488e69fb6 100644
--- a/app/client/src/actions/gitSyncActions.ts
+++ b/app/client/src/actions/gitSyncActions.ts
@@ -16,9 +16,9 @@ import type {
import type { ResponseMeta } from "api/ApiResponses";
import { noop } from "lodash";
-export type GitStatusParams = {
+export interface GitStatusParams {
compareRemote?: boolean;
-};
+}
export const setIsGitSyncModalOpen = (payload: {
isOpen: boolean;
@@ -62,15 +62,15 @@ export const clearDiscardErrorState = () => ({
type: ReduxActionTypes.CLEAR_DISCARD_ERROR_STATE,
});
-export type ConnectToGitResponse = {
+export interface ConnectToGitResponse {
gitApplicationMetadata: GitApplicationMetadata;
-};
+}
-type ConnectToGitRequestParams = {
+interface ConnectToGitRequestParams {
payload: ConnectToGitPayload;
onSuccessCallback?: (payload: ConnectToGitResponse) => void;
onErrorCallback?: (error: any, response?: any) => void;
-};
+}
export interface ConnectToGitReduxAction
extends ReduxAction {
@@ -183,8 +183,8 @@ export const fetchGitStatusSuccess = (payload: GitStatusData) => ({
});
export const fetchGitRemoteStatusInit = ({
- onSuccessCallback = noop,
onErrorCallback = noop,
+ onSuccessCallback = noop,
} = {}) => ({
type: ReduxActionTypes.FETCH_GIT_REMOTE_STATUS_INIT,
onSuccessCallback,
@@ -215,7 +215,10 @@ export const updateBranchLocally = (payload: string) => ({
payload,
});
-type MergeBranchPayload = { sourceBranch: string; destinationBranch: string };
+interface MergeBranchPayload {
+ sourceBranch: string;
+ destinationBranch: string;
+}
export const mergeBranchInit = (params: {
payload: { sourceBranch: string; destinationBranch: string };
@@ -310,22 +313,22 @@ export const importAppFromGit = ({
type ErrorPayload = string;
-export type SSHKeyType = {
+export interface SSHKeyType {
keySize: number;
platFormSupported: string;
protocolName: string;
-};
+}
-export type GetSSHKeyResponseData = {
+export interface GetSSHKeyResponseData {
gitSupportedSSHKeyType: SSHKeyType[];
docUrl: string;
publicKey?: string;
-};
+}
-export type GenerateSSHKeyPairResponsePayload = {
+export interface GenerateSSHKeyPairResponsePayload {
responseMeta: ResponseMeta;
data: T;
-};
+}
export type GenerateSSHKeyPairReduxAction = ReduxActionWithCallbacks<
{ keyType?: string } | undefined,
@@ -333,13 +336,13 @@ export type GenerateSSHKeyPairReduxAction = ReduxActionWithCallbacks<
ErrorPayload
>;
-export type GenerateKeyParams = {
+export interface GenerateKeyParams {
onErrorCallback?: (payload: ErrorPayload) => void;
onSuccessCallback?: (
payload: GenerateSSHKeyPairResponsePayload,
) => void;
payload?: { keyType?: string };
-};
+}
export const generateSSHKeyPair = ({
onErrorCallback,
@@ -361,10 +364,10 @@ export const generateSSHKeyPairSuccess = (
};
};
-export type GetSSHKeyPairResponsePayload = {
+export interface GetSSHKeyPairResponsePayload {
responseMeta: ResponseMeta;
data: T;
-};
+}
export type GetSSHKeyPairReduxAction = ReduxActionWithCallbacks<
undefined,
@@ -372,13 +375,13 @@ export type GetSSHKeyPairReduxAction = ReduxActionWithCallbacks<
ErrorPayload
>;
-export type GetKeyParams = {
+export interface GetKeyParams {
onErrorCallback?: (payload: ErrorPayload) => void;
onSuccessCallback?: (
payload: GetSSHKeyPairResponsePayload,
) => void;
payload?: undefined;
-};
+}
export const getSSHKeyPair = ({
onErrorCallback,
diff --git a/app/client/src/actions/initActions.ts b/app/client/src/actions/initActions.ts
index 589d9a82e4..9f220f56f8 100644
--- a/app/client/src/actions/initActions.ts
+++ b/app/client/src/actions/initActions.ts
@@ -8,12 +8,12 @@ export const initCurrentPage = () => {
};
};
-export type InitializeEditorPayload = {
+export interface InitializeEditorPayload {
applicationId?: string;
pageId?: string;
branch?: string;
mode: APP_MODE;
-};
+}
export const initEditor = (
payload: InitializeEditorPayload,
@@ -22,12 +22,12 @@ export const initEditor = (
payload,
});
-export type InitAppViewerPayload = {
+export interface InitAppViewerPayload {
branch: string;
applicationId?: string;
pageId: string;
mode: APP_MODE;
-};
+}
export const initAppViewer = ({
applicationId,
diff --git a/app/client/src/actions/jsActionActions.ts b/app/client/src/actions/jsActionActions.ts
index 5a9a5b8fca..a0cb75fb63 100644
--- a/app/client/src/actions/jsActionActions.ts
+++ b/app/client/src/actions/jsActionActions.ts
@@ -10,9 +10,9 @@ import type { JSCollection } from "entities/JSCollection";
import type { CreateJSCollectionRequest } from "api/JSActionAPI";
import type { EventLocation } from "@appsmith/utils/analyticsUtilTypes";
-export type FetchJSCollectionsPayload = {
+export interface FetchJSCollectionsPayload {
applicationId: string;
-};
+}
export const fetchJSCollections = ({
applicationId,
diff --git a/app/client/src/actions/metaActions.ts b/app/client/src/actions/metaActions.ts
index 0a9ca1b50a..779002e734 100644
--- a/app/client/src/actions/metaActions.ts
+++ b/app/client/src/actions/metaActions.ts
@@ -33,11 +33,11 @@ export const updateWidgetMetaPropAndEval = (
});
};
-export type ResetWidgetMetaPayload = {
+export interface ResetWidgetMetaPayload {
widgetId: string;
evaluatedWidget: WidgetEntity | undefined;
evaluatedWidgetConfig: DataTreeEntityConfig | undefined;
-};
+}
export const resetWidgetMetaProperty = (
widgetId: string,
diff --git a/app/client/src/actions/pageActions.tsx b/app/client/src/actions/pageActions.tsx
index ac038b25ef..92eafb81d9 100644
--- a/app/client/src/actions/pageActions.tsx
+++ b/app/client/src/actions/pageActions.tsx
@@ -46,11 +46,11 @@ export interface CreatePageActionPayload {
blockNavigation?: boolean;
}
-export type updateLayoutOptions = {
+export interface updateLayoutOptions {
isRetry?: boolean;
shouldReplay?: boolean;
updatedWidgetIds?: string[];
-};
+}
export const fetchPage = (
pageId: string,
@@ -275,12 +275,12 @@ export const updatePageError = (payload: UpdatePageErrorPayload) => {
};
};
-export type UpdatePageErrorPayload = {
+export interface UpdatePageErrorPayload {
request: UpdatePageRequest;
error: unknown;
-};
+}
-export type WidgetAddChild = {
+export interface WidgetAddChild {
widgetId: string;
widgetName?: string;
type: WidgetType;
@@ -294,27 +294,27 @@ export type WidgetAddChild = {
tabId: string;
props?: Record;
dynamicBindingPathList?: DynamicPath[];
-};
+}
-export type WidgetRemoveChild = {
+export interface WidgetRemoveChild {
widgetId: string;
childWidgetId: string;
-};
+}
-export type WidgetDelete = {
+export interface WidgetDelete {
widgetId?: string;
parentId?: string;
disallowUndo?: boolean;
isShortcut?: boolean;
-};
+}
-export type MultipleWidgetDeletePayload = {
+export interface MultipleWidgetDeletePayload {
widgetIds: string[];
disallowUndo?: boolean;
isShortcut?: boolean;
-};
+}
-export type WidgetResize = {
+export interface WidgetResize {
widgetId: string;
parentId: string;
leftColumn?: number;
@@ -327,16 +327,16 @@ export type WidgetResize = {
mobileBottomRow?: number;
snapColumnSpace: number;
snapRowSpace: number;
-};
+}
-export type ModalWidgetResize = {
+export interface ModalWidgetResize {
height: number;
width: number;
widgetId: string;
canvasWidgetId: string;
-};
+}
-export type WidgetAddChildren = {
+export interface WidgetAddChildren {
widgetId: string;
children: Array<{
type: WidgetType;
@@ -350,13 +350,13 @@ export type WidgetAddChildren = {
bottomRow: number;
isLoading: boolean;
}>;
-};
+}
-export type WidgetUpdateProperty = {
+export interface WidgetUpdateProperty {
widgetId: string;
propertyPath: string;
propertyValue: any;
-};
+}
export const updateWidget = (
operation: WidgetOperation,
@@ -404,7 +404,7 @@ export interface ReduxActionWithExtraParams extends ReduxAction {
extraParams: Record;
}
-export type GenerateCRUDSuccess = {
+export interface GenerateCRUDSuccess {
page: {
layouts: Array;
id: string;
@@ -414,7 +414,7 @@ export type GenerateCRUDSuccess = {
description?: string;
};
isNewPage: boolean;
-};
+}
export const generateTemplateSuccess = (payload: GenerateCRUDSuccess) => {
return {
diff --git a/app/client/src/actions/pluginActionActions.ts b/app/client/src/actions/pluginActionActions.ts
index 57aab224e6..616d221f15 100644
--- a/app/client/src/actions/pluginActionActions.ts
+++ b/app/client/src/actions/pluginActionActions.ts
@@ -29,9 +29,9 @@ export const createActionSuccess = (payload: Action) => {
};
};
-export type FetchActionsPayload = {
+export interface FetchActionsPayload {
applicationId: string;
-};
+}
export const fetchActions = (
{ applicationId }: { applicationId: string },
@@ -258,12 +258,12 @@ export const saveActionName = (payload: { id: string; name: string }) => ({
payload: payload,
});
-export type SetActionPropertyPayload = {
+export interface SetActionPropertyPayload {
actionId: string;
propertyName: string;
value: any;
skipSave?: boolean;
-};
+}
export const setActionProperty = (
payload: SetActionPropertyPayload,
@@ -274,11 +274,11 @@ export const setActionProperty = (
postEvalActions,
});
-export type UpdateActionPropertyActionPayload = {
+export interface UpdateActionPropertyActionPayload {
id: string;
field: string;
value: any;
-};
+}
export const updateActionProperty = (
payload: UpdateActionPropertyActionPayload,
diff --git a/app/client/src/actions/pluginActions.ts b/app/client/src/actions/pluginActions.ts
index 1c0b2a574e..8955651211 100644
--- a/app/client/src/actions/pluginActions.ts
+++ b/app/client/src/actions/pluginActions.ts
@@ -20,13 +20,13 @@ export const fetchPluginFormConfigs = (): ReduxActionWithoutPayload => ({
type: ReduxActionTypes.FETCH_PLUGIN_FORM_CONFIGS_REQUEST,
});
-export type PluginFormsPayload = {
+export interface PluginFormsPayload {
formConfigs: Record;
editorConfigs: Record;
settingConfigs: Record;
dependencies: Record;
datasourceFormButtonConfigs: Record;
-};
+}
export const fetchPluginFormConfigsSuccess = (
payload: PluginFormsPayload,
diff --git a/app/client/src/actions/widgetSelectionActions.ts b/app/client/src/actions/widgetSelectionActions.ts
index 5f30ac1a8f..2f3f83a26b 100644
--- a/app/client/src/actions/widgetSelectionActions.ts
+++ b/app/client/src/actions/widgetSelectionActions.ts
@@ -3,12 +3,12 @@ import { ReduxActionTypes } from "@appsmith/constants/ReduxActionConstants";
import type { SelectionRequestType } from "sagas/WidgetSelectUtils";
import type { NavigationMethod } from "utils/history";
-export type WidgetSelectionRequestPayload = {
+export interface WidgetSelectionRequestPayload {
selectionRequestType: SelectionRequestType;
payload?: string[];
invokedBy?: NavigationMethod;
pageId?: string;
-};
+}
export type WidgetSelectionRequest = (
selectionRequestType: SelectionRequestType,
@@ -28,10 +28,10 @@ export const selectWidgetInitAction: WidgetSelectionRequest = (
payload: { selectionRequestType, payload, pageId, invokedBy },
});
-export type SetSelectedWidgetsPayload = {
+export interface SetSelectedWidgetsPayload {
widgetIds: string[];
invokedBy?: NavigationMethod;
-};
+}
// To be used to collect selected widget state from url and set on state
export const setSelectedWidgets = (
diff --git a/app/client/src/api/ApiResponses.tsx b/app/client/src/api/ApiResponses.tsx
index 65a85ea29c..c20272bca0 100644
--- a/app/client/src/api/ApiResponses.tsx
+++ b/app/client/src/api/ApiResponses.tsx
@@ -1,16 +1,16 @@
-export type APIResponseError = {
+export interface APIResponseError {
code: string | number;
message: string;
-};
+}
-export type ResponseMeta = {
+export interface ResponseMeta {
status: number;
success: boolean;
error?: APIResponseError;
-};
+}
-export type ApiResponse = {
+export interface ApiResponse {
responseMeta: ResponseMeta;
data: T;
code?: string;
-};
+}
diff --git a/app/client/src/api/GitSyncAPI.tsx b/app/client/src/api/GitSyncAPI.tsx
index 8369054b27..d7e130704c 100644
--- a/app/client/src/api/GitSyncAPI.tsx
+++ b/app/client/src/api/GitSyncAPI.tsx
@@ -4,44 +4,44 @@ import type { ApiResponse } from "./ApiResponses";
import type { GitConfig } from "entities/GitSync";
import ApplicationApi from "@appsmith/api/ApplicationApi";
-export type CommitPayload = {
+export interface CommitPayload {
applicationId: string;
commitMessage: string;
doPush: boolean;
branch: string;
-};
+}
-export type MergeBranchPayload = {
+export interface MergeBranchPayload {
applicationId: string;
sourceBranch: string;
destinationBranch: string;
-};
+}
-export type MergeStatusPayload = {
+export interface MergeStatusPayload {
applicationId: string;
sourceBranch: string;
destinationBranch: string;
-};
+}
-export type ConnectToGitPayload = {
+export interface ConnectToGitPayload {
remoteUrl: string;
gitProfile?: {
authorName: string;
authorEmail: string;
};
isDefaultProfile?: boolean;
-};
+}
-type GitStatusParam = {
+interface GitStatusParam {
applicationId: string;
branch: string;
compareRemote: "true" | "false";
-};
+}
-type GitRemoteStatusParam = {
+interface GitRemoteStatusParam {
applicationId: string;
branch: string;
-};
+}
class GitSyncAPI extends Api {
static baseURL = `/v1/git`;
diff --git a/app/client/src/api/JSActionAPI.tsx b/app/client/src/api/JSActionAPI.tsx
index c4396b3253..9aa8cec809 100644
--- a/app/client/src/api/JSActionAPI.tsx
+++ b/app/client/src/api/JSActionAPI.tsx
@@ -34,11 +34,11 @@ export interface CreateJSCollectionRequest {
pluginType: PluginType;
}
-export type SetFunctionPropertyPayload = {
+export interface SetFunctionPropertyPayload {
action: JSAction;
propertyName: string;
value: any;
-};
+}
export interface RefactorAction {
pageId: string;
actionId: string;
diff --git a/app/client/src/api/PageApi.tsx b/app/client/src/api/PageApi.tsx
index b53f8f0ae7..6161b343cb 100644
--- a/app/client/src/api/PageApi.tsx
+++ b/app/client/src/api/PageApi.tsx
@@ -13,31 +13,31 @@ import type {
} from "actions/pageActions";
import type { FetchApplicationResponse } from "@appsmith/api/ApplicationApi";
-export type FetchPageRequest = {
+export interface FetchPageRequest {
id: string;
isFirstLoad?: boolean;
handleResponseLater?: boolean;
-};
+}
-export type FetchPublishedPageRequest = {
+export interface FetchPublishedPageRequest {
pageId: string;
bustCache?: boolean;
-};
+}
-export type SavePageRequest = {
+export interface SavePageRequest {
dsl: DSLWidget;
layoutId: string;
pageId: string;
applicationId: string;
-};
+}
-export type PageLayout = {
+export interface PageLayout {
id: string;
dsl: Partial;
layoutOnLoadActions: PageAction[][];
layoutActions: PageAction[];
layoutOnLoadActionErrors?: LayoutOnLoadActionErrors[];
-};
+}
export interface PageLayoutsRequest {
layoutId: string;
@@ -47,7 +47,7 @@ export interface PageLayoutsRequest {
};
}
-export type FetchPageResponseData = {
+export interface FetchPageResponseData {
id: string;
name: string;
slug: string;
@@ -57,11 +57,11 @@ export type FetchPageResponseData = {
customSlug?: string;
userPermissions?: string[];
layoutOnLoadActionErrors?: LayoutOnLoadActionErrors[];
-};
+}
export type FetchPublishedPageResponseData = FetchPageResponseData;
-export type SavePageResponseData = {
+export interface SavePageResponseData {
id: string;
layoutOnLoadActions: PageAction[][];
dsl: Partial;
@@ -73,21 +73,21 @@ export type SavePageResponseData = {
collectionId?: string;
}>;
layoutOnLoadActionErrors?: Array;
-};
+}
export type CreatePageRequest = Omit<
CreatePageActionPayload,
"blockNavigation"
>;
-export type UpdatePageRequest = {
+export interface UpdatePageRequest {
id: string;
name?: string;
isHidden?: boolean;
customSlug?: string;
-};
+}
-export type UpdatePageResponse = {
+export interface UpdatePageResponse {
id: string;
name: string;
slug: string;
@@ -97,17 +97,17 @@ export type UpdatePageResponse = {
isHidden: boolean;
lastUpdatedTime: number;
defaultResources: unknown[];
-};
+}
-export type SetPageOrderRequest = {
+export interface SetPageOrderRequest {
order: number;
pageId: string;
applicationId: string;
-};
+}
export type CreatePageResponse = ApiResponse;
-export type FetchPageListResponseData = {
+export interface FetchPageListResponseData {
pages: Array<{
id: string;
name: string;
@@ -119,7 +119,7 @@ export type FetchPageListResponseData = {
description?: string;
}>;
workspaceId: string;
-};
+}
export interface DeletePageRequest {
id: string;
@@ -145,12 +145,12 @@ export interface GenerateTemplatePageRequest {
pluginSpecificParams?: Record;
}
-export type GenerateTemplatePageResponseData = {
+export interface GenerateTemplatePageResponseData {
id: string;
name: string;
applicationId: string;
layouts: Array;
-};
+}
export type SavePageResponse = ApiResponse;
diff --git a/app/client/src/api/TemplatesApi.ts b/app/client/src/api/TemplatesApi.ts
index 975586a922..4b6d8c2d0b 100644
--- a/app/client/src/api/TemplatesApi.ts
+++ b/app/client/src/api/TemplatesApi.ts
@@ -42,7 +42,7 @@ export interface TemplateFiltersResponse extends ApiResponse {
};
}
-export type PublishCommunityTemplateRequest = {
+export interface PublishCommunityTemplateRequest {
applicationId: string;
workspaceId: string;
branchName: string;
@@ -51,7 +51,7 @@ export type PublishCommunityTemplateRequest = {
description: string;
useCases: string[];
authorEmail: string;
-};
+}
export type PublishCommunityTemplateResponse = ApiResponse<{
isPublic: boolean;
diff --git a/app/client/src/ce/AppRouter.tsx b/app/client/src/ce/AppRouter.tsx
index 1d95ef88c6..71f68ef18f 100644
--- a/app/client/src/ce/AppRouter.tsx
+++ b/app/client/src/ce/AppRouter.tsx
@@ -1,6 +1,6 @@
import React, { Suspense, useEffect } from "react";
import history from "utils/history";
-import AppHeader from "pages/common/AppHeader";
+import AppHeader from "@appsmith/pages/common/AppHeader";
import { Redirect, Route, Router, Switch } from "react-router-dom";
import {
ADMIN_SETTINGS_CATEGORY_PATH,
diff --git a/app/client/src/RouteBuilder.ts b/app/client/src/ce/RouteBuilder.ts
similarity index 83%
rename from app/client/src/RouteBuilder.ts
rename to app/client/src/ce/RouteBuilder.ts
index 9a5e35ff8f..7f7e20a0b8 100644
--- a/app/client/src/RouteBuilder.ts
+++ b/app/client/src/ce/RouteBuilder.ts
@@ -7,21 +7,12 @@ import {
TEMPLATES_PATH,
} from "constants/routes";
import { APP_MODE } from "entities/App";
-import urlBuilder from "entities/URLRedirect/URLAssembly";
+import urlBuilder from "@appsmith/entities/URLRedirect/URLAssembly";
+import type { URLBuilderParams } from "@appsmith/entities/URLRedirect/URLAssembly";
import type {
ApplicationPayload,
Page,
} from "@appsmith/constants/ReduxActionConstants";
-import { isNil } from "lodash";
-
-export type URLBuilderParams = {
- suffix?: string;
- branch?: string;
- hash?: string;
- params?: Record;
- pageId: string;
- persistExistingParams?: boolean;
-};
export const fillPathname = (
pathname: string,
@@ -38,24 +29,6 @@ export const fillPathname = (
);
};
-export function getQueryStringfromObject(
- params: Record = {},
-): string {
- const paramKeys = Object.keys(params);
- const queryParams: string[] = [];
- if (paramKeys) {
- paramKeys.forEach((paramKey: string) => {
- if (!isNil(params[paramKey])) {
- const value = encodeURIComponent(params[paramKey]);
- if (paramKey && value) {
- queryParams.push(`${paramKey}=${value}`);
- }
- }
- });
- }
- return queryParams.length ? "?" + queryParams.join("&") : "";
-}
-
export const datasourcesEditorURL = (props: URLBuilderParams): string =>
urlBuilder.build({
...props,
diff --git a/app/client/src/ce/api/ApplicationApi.tsx b/app/client/src/ce/api/ApplicationApi.tsx
index 93ea233340..4b3786b132 100644
--- a/app/client/src/ce/api/ApplicationApi.tsx
+++ b/app/client/src/ce/api/ApplicationApi.tsx
@@ -105,7 +105,7 @@ export interface ForkApplicationRequest {
export type GetAllApplicationResponse = ApiResponse;
-export type UpdateApplicationPayload = {
+export interface UpdateApplicationPayload {
icon?: string;
color?: string;
name?: string;
@@ -118,7 +118,7 @@ export type UpdateApplicationPayload = {
appPositioning?: LayoutSystemTypeConfig;
};
forkingEnabled?: boolean;
-};
+}
export type UpdateApplicationRequest = UpdateApplicationPayload & {
id: string;
diff --git a/app/client/src/ce/api/TenantApi.ts b/app/client/src/ce/api/TenantApi.ts
index c3de1c0437..59e68d4a82 100644
--- a/app/client/src/ce/api/TenantApi.ts
+++ b/app/client/src/ce/api/TenantApi.ts
@@ -12,11 +12,11 @@ export type UpdateTenantConfigResponse = ApiResponse<{
tenantConfiguration: Record;
}>;
-export type UpdateTenantConfigRequest = {
+export interface UpdateTenantConfigRequest {
tenantConfiguration: Record;
needsRefresh?: boolean;
isOnlyTenantSettings?: boolean;
-};
+}
export class TenantApi extends Api {
static tenantsUrl = "v1/tenants";
diff --git a/app/client/src/ce/components/DSDataFilter/index.tsx b/app/client/src/ce/components/DSDataFilter/index.tsx
index 3b753b0832..9bc93d84ef 100644
--- a/app/client/src/ce/components/DSDataFilter/index.tsx
+++ b/app/client/src/ce/components/DSDataFilter/index.tsx
@@ -52,7 +52,7 @@ const TooltipLink = styled(Link)`
display: inline;
`;
-type DSDataFilterProps = {
+interface DSDataFilterProps {
updateFilter: (
id: string,
name: string,
@@ -63,14 +63,14 @@ type DSDataFilterProps = {
isInsideReconnectModal: boolean;
viewMode: boolean;
filterId: string; // id of the selected environment, used to keep the parent and child in sync
-};
+}
-type EnvironmentType = {
+interface EnvironmentType {
id: string;
name: string;
selected: boolean;
userPermissions: string[];
-};
+}
const environments: Array = [
{
diff --git a/app/client/src/ce/components/SwitchEnvironment/index.tsx b/app/client/src/ce/components/SwitchEnvironment/index.tsx
index 2c5c9ff31c..138c7df6c0 100644
--- a/app/client/src/ce/components/SwitchEnvironment/index.tsx
+++ b/app/client/src/ce/components/SwitchEnvironment/index.tsx
@@ -46,15 +46,15 @@ const StyledIcon = styled(Icon)`
margin-right: 8px;
`;
-type Props = {
+interface Props {
viewMode?: boolean;
-};
+}
-type EnvironmentType = {
+interface EnvironmentType {
id: string;
name: string;
selected: boolean;
-};
+}
const environmentList: Array = [
{
diff --git a/app/client/src/ce/components/editorComponents/EditorFormSignPosting.tsx b/app/client/src/ce/components/editorComponents/EditorFormSignPosting.tsx
index bc54978c45..82d9cc4a20 100644
--- a/app/client/src/ce/components/editorComponents/EditorFormSignPosting.tsx
+++ b/app/client/src/ce/components/editorComponents/EditorFormSignPosting.tsx
@@ -1,9 +1,9 @@
import type { TEditorModes } from "components/editorComponents/CodeEditor/EditorConfig";
-export type Props = {
+export interface Props {
isAIEnabled: boolean;
mode: TEditorModes;
-};
+}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
export function EditorFormSignPosting(props: Props) {
diff --git a/app/client/src/ce/components/editorComponents/GPT/AskAIButton.tsx b/app/client/src/ce/components/editorComponents/GPT/AskAIButton.tsx
index 1bc3a41200..e98cedd439 100644
--- a/app/client/src/ce/components/editorComponents/GPT/AskAIButton.tsx
+++ b/app/client/src/ce/components/editorComponents/GPT/AskAIButton.tsx
@@ -3,11 +3,11 @@ import type {
TEditorModes,
} from "components/editorComponents/CodeEditor/EditorConfig";
-type AskAIButtonProps = {
+interface AskAIButtonProps {
mode: TEditorModes;
onClick: () => void;
entity: FieldEntityInformation;
-};
+}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
export function AskAIButton(props: AskAIButtonProps) {
diff --git a/app/client/src/ce/components/editorComponents/GPT/index.tsx b/app/client/src/ce/components/editorComponents/GPT/index.tsx
index d613a38674..092dcfe265 100644
--- a/app/client/src/ce/components/editorComponents/GPT/index.tsx
+++ b/app/client/src/ce/components/editorComponents/GPT/index.tsx
@@ -5,12 +5,25 @@ import type {
} from "components/editorComponents/CodeEditor/EditorConfig";
import type { EntityNavigationData } from "selectors/navigationSelectors";
import React from "react";
+import type CodeMirror from "codemirror";
-export type TAIWrapperProps = {
+export type AIEditorContext = Partial<{
+ functionName: string;
+ cursorLineNumber: number;
+ functionString: string;
+ cursorPosition: CodeMirror.Position;
+ cursorCoordinates: {
+ left: number;
+ top: number;
+ bottom: number;
+ };
+ mode: string;
+}>;
+
+export interface TAIWrapperProps {
children?: React.ReactNode;
- isOpen?: boolean;
+ isOpen: boolean;
currentValue: string;
- close: () => void;
update?: (...args: any) => void;
triggerContext?: CodeEditorExpected;
enableAIAssistance: boolean;
@@ -18,7 +31,9 @@ export type TAIWrapperProps = {
mode: TEditorModes;
entity: FieldEntityInformation;
entitiesForNavigation: EntityNavigationData;
-};
+ editor: CodeMirror.Editor;
+ onOpenChanged: (isOpen: boolean) => void;
+}
export function AIWindow(props: TAIWrapperProps) {
const { children } = props;
diff --git a/app/client/src/ce/components/editorComponents/GPT/trigger.tsx b/app/client/src/ce/components/editorComponents/GPT/trigger.tsx
index 6e31801550..b2f735238f 100644
--- a/app/client/src/ce/components/editorComponents/GPT/trigger.tsx
+++ b/app/client/src/ce/components/editorComponents/GPT/trigger.tsx
@@ -1,8 +1,34 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
import type { TEditorModes } from "components/editorComponents/CodeEditor/EditorConfig";
-export const APPSMITH_AI = "Appsmith AI";
import type { FeatureFlags } from "@appsmith/entities/FeatureFlag";
+import type { ENTITY_TYPE } from "@appsmith/entities/DataTree/types";
+
+export const APPSMITH_AI = "Appsmith AI";
-/* eslint-disable-next-line */
export function isAIEnabled(ff: FeatureFlags, mode: TEditorModes) {
return false;
}
+
+export const isAISlashCommand = (editor: CodeMirror.Editor) => {
+ return false;
+};
+
+export const getAIContext = ({
+ cursorPosition,
+ editor,
+}: {
+ entityType?: ENTITY_TYPE;
+ slashIndex?: number;
+ currentLineValue?: string;
+ cursorPosition: CodeMirror.Position;
+ editor: CodeMirror.Editor;
+}) => {
+ return {
+ functionName: "",
+ cursorLineNumber: cursorPosition.line,
+ functionString: "",
+ mode: editor.getMode().name,
+ cursorPosition,
+ cursorCoordinates: editor.cursorCoords(true, "local"),
+ };
+};
diff --git a/app/client/src/ce/configs/index.ts b/app/client/src/ce/configs/index.ts
index c523207439..6e2a399c48 100644
--- a/app/client/src/ce/configs/index.ts
+++ b/app/client/src/ce/configs/index.ts
@@ -40,7 +40,6 @@ export interface INJECTED_CONFIGS {
cloudServicesBaseUrl: string;
googleRecaptchaSiteKey: string;
supportEmail: string;
- hideWatermark: boolean;
disableIframeWidgetSandbox: boolean;
pricingUrl: string;
customerPortalUrl: string;
@@ -107,9 +106,7 @@ export const getConfigsFromEnvVars = (): INJECTED_CONFIGS => {
googleRecaptchaSiteKey:
process.env.REACT_APP_GOOGLE_RECAPTCHA_SITE_KEY || "",
supportEmail: process.env.APPSMITH_SUPPORT_EMAIL || "support@appsmith.com",
- hideWatermark: process.env.APPSMITH_HIDE_WATERMARK
- ? process.env.APPSMITH_HIDE_WATERMARK.length > 0
- : false,
+
disableIframeWidgetSandbox: process.env
.APPSMITH_DISABLE_IFRAME_WIDGET_SANDBOX
? process.env.APPSMITH_DISABLE_IFRAME_WIDGET_SANDBOX.length > 0
@@ -261,10 +258,6 @@ export const getAppsmithConfigs = (): AppsmithUIConfigs => {
APPSMITH_FEATURE_CONFIGS?.cloudServicesBaseUrl ||
"",
appsmithSupportEmail: ENV_CONFIG.supportEmail,
- hideWatermark:
- ENV_CONFIG.hideWatermark ||
- APPSMITH_FEATURE_CONFIGS?.hideWatermark ||
- false,
disableIframeWidgetSandbox:
ENV_CONFIG.disableIframeWidgetSandbox ||
APPSMITH_FEATURE_CONFIGS?.disableIframeWidgetSandbox ||
diff --git a/app/client/src/ce/configs/types.ts b/app/client/src/ce/configs/types.ts
index cb35195994..5433dbb5a2 100644
--- a/app/client/src/ce/configs/types.ts
+++ b/app/client/src/ce/configs/types.ts
@@ -1,15 +1,15 @@
import type { LogLevelDesc } from "loglevel";
-export type SentryConfig = {
+export interface SentryConfig {
dsn: string;
environment: string;
-};
+}
-export type AppVersionData = {
+export interface AppVersionData {
id: string;
releaseDate: string;
edition: string;
-};
+}
export interface AppsmithUIConfigs {
sentry: {
@@ -60,7 +60,6 @@ export interface AppsmithUIConfigs {
apiKey: string;
};
appsmithSupportEmail: string;
- hideWatermark: boolean;
disableIframeWidgetSandbox: boolean;
pricingUrl: string;
customerPortalUrl: string;
diff --git a/app/client/src/ce/constants/PackageConstants.ts b/app/client/src/ce/constants/PackageConstants.ts
index cc94a15a79..653d2a3acc 100644
--- a/app/client/src/ce/constants/PackageConstants.ts
+++ b/app/client/src/ce/constants/PackageConstants.ts
@@ -1,6 +1,6 @@
type ID = string;
-export type Package = {
+export interface Package {
id: ID;
name: string; // Name of the package.
icon: string;
@@ -10,6 +10,6 @@ export type Package = {
modifiedBy: string;
modifiedAt: string;
userPermissions: string[];
-};
+}
export type PackageMetadata = Package;
diff --git a/app/client/src/ce/constants/ReduxActionConstants.tsx b/app/client/src/ce/constants/ReduxActionConstants.tsx
index 4056b04b74..8f3b498836 100644
--- a/app/client/src/ce/constants/ReduxActionConstants.tsx
+++ b/app/client/src/ce/constants/ReduxActionConstants.tsx
@@ -838,7 +838,7 @@ const ActionTypes = {
BIND_WIDGET_TO_DATASOURCE_SUCCESS: "BIND_WIDGET_TO_DATASOURCE_SUCCESS",
BIND_WIDGET_TO_DATASOURCE_ERROR: "BIND_WIDGET_TO_DATASOURCE_ERROR",
LOAD_FILE_PICKER_ACTION: "LOAD_FILE_PICKER_ACTION",
- TOGGLE_AI_WINDOW: "TOGGLE_AI_WINDOW",
+ UPDATE_AI_CONTEXT: "UPDATE_AI_CONTEXT",
UPDATE_AI_TRIGGERED: "UPDATE_AI_TRIGGERED",
UPDATE_DATASOURCE_AUTH_STATE: "UPDATE_DATASOURCE_AUTH_STATE",
UPDATE_POSITIONS_ON_TAB_CHANGE: "UPDATE_POSITIONS_ON_TAB_CHANGE",
@@ -1202,10 +1202,10 @@ export interface ApplicationPayload {
publishedAppToCommunityTemplate?: boolean;
}
-export type WorkspaceDetails = {
+export interface WorkspaceDetails {
workspace: Workspace;
applications: any[];
-};
+}
export interface LoadWidgetEditorPayload {
widgets: WidgetProps[];
diff --git a/app/client/src/ce/constants/SocialLogin.tsx b/app/client/src/ce/constants/SocialLogin.tsx
index 70aaf03313..2cb2c182c8 100644
--- a/app/client/src/ce/constants/SocialLogin.tsx
+++ b/app/client/src/ce/constants/SocialLogin.tsx
@@ -5,12 +5,12 @@ import {
import GithubLogo from "assets/images/Github.png";
import GoogleLogo from "assets/images/Google.png";
-export type SocialLoginButtonProps = {
+export interface SocialLoginButtonProps {
url: string;
name: string;
logo: string;
label?: string;
-};
+}
export const GoogleSocialLoginButtonProps: SocialLoginButtonProps = {
url: GoogleOAuthURL,
diff --git a/app/client/src/ce/constants/messages.ts b/app/client/src/ce/constants/messages.ts
index 85ebf0d6c9..48544eac1d 100644
--- a/app/client/src/ce/constants/messages.ts
+++ b/app/client/src/ce/constants/messages.ts
@@ -8,15 +8,10 @@ export function createMessage(
}
/*
- For self hosted, it displays the string "Appsmith Community v1.10.0" or "Appsmith Business v1.10.0".
- For cloud hosting, it displays "Appsmith v1.10.0".
- This is because Appsmith Cloud doesn't support business features yet.
+ For self hosted CE, it displays the string "Appsmith Community v1.10.0".
*/
-export const APPSMITH_DISPLAY_VERSION = (
- edition: string,
- version: string,
- cloudHosting: boolean,
-) => `Appsmith ${!cloudHosting ? edition : ""} ${version}`;
+export const APPSMITH_DISPLAY_VERSION = (edition: string, version: string) =>
+ `Appsmith ${edition} ${version}`;
export const INTERCOM_CONSENT_MESSAGE = () =>
`Can we have your email for better support?`;
export const YES = () => `Yes`;
@@ -269,6 +264,8 @@ export const WORKSPACES_HEADING = () => `Workspaces`;
export const WELCOME_TOUR = () => `Welcome tour`;
export const NO_APPS_FOUND = () =>
`Whale! Whale! This name doesn't ring a bell!`;
+export const APPLICATION_CARD_LIST_ZERO_STATE = () =>
+ `There are no apps in this workspace.`;
// Lightning menu
export const LIGHTNING_MENU_DATA_API = () => `Use data from an API`;
@@ -1650,6 +1647,7 @@ export const EMPTY_QUERY_JS_MAIN_TEXT = () => "No query/JS to display";
export const EMPTY_QUERY_JS_BUTTON_TEXT = () => "New query/JS";
export const EMPTY_DATASOURCE_MAIN_TEXT = () => "No datasource to display";
export const EMPTY_DATASOURCE_BUTTON_TEXT = () => "New datasource";
+export const SEARCH_DATASOURCES = () => "Search datasources";
// Templates
export const MORE = () => "More";
@@ -2075,7 +2073,7 @@ export const DATASOURCE_DROPDOWN_OPTIONS = {
};
export const COMMUNITY_TEMPLATES = {
- publish: () => "Publish",
+ tabTitle: () => "Showcase",
cancel: () => "Cancel",
publishSuccessPage: {
title: () => "Live on Appsmith community",
diff --git a/app/client/src/ce/constants/tenantConstants.ts b/app/client/src/ce/constants/tenantConstants.ts
index 19b4a43192..6f9cde1c44 100644
--- a/app/client/src/ce/constants/tenantConstants.ts
+++ b/app/client/src/ce/constants/tenantConstants.ts
@@ -4,6 +4,7 @@ export const tenantConfigConnection: string[] = [
"emailVerificationEnabled",
"singleSessionPerUserEnabled",
"showRolesAndGroups",
+ "hideWatermark",
];
export const RESTART_POLL_TIMEOUT = 2 * 150 * 1000;
diff --git a/app/client/src/ce/constants/workspaceConstants.ts b/app/client/src/ce/constants/workspaceConstants.ts
index b210dcc65c..9be786d478 100644
--- a/app/client/src/ce/constants/workspaceConstants.ts
+++ b/app/client/src/ce/constants/workspaceConstants.ts
@@ -1,13 +1,13 @@
import type { ApplicationPayload } from "@appsmith/constants/ReduxActionConstants";
-export type WorkspaceRole = {
+export interface WorkspaceRole {
id: string;
name: string;
displayName?: string;
isDefault?: boolean;
-};
+}
-export type Workspace = {
+export interface Workspace {
id: string;
name: string;
website?: string;
@@ -15,9 +15,9 @@ export type Workspace = {
logoUrl?: string;
uploadProgress?: number;
userPermissions?: string[];
-};
+}
-export type WorkspaceUserRoles = {
+export interface WorkspaceUserRoles {
id?: string;
name?: string;
description?: string;
@@ -25,9 +25,9 @@ export type WorkspaceUserRoles = {
entityName?: string;
entityId?: string;
autoCreated: boolean;
-};
+}
-export type WorkspaceUser = {
+export interface WorkspaceUser {
name: string;
username: string;
userId: string;
@@ -37,13 +37,13 @@ export type WorkspaceUser = {
isChangingRole: boolean;
photoId?: string;
roles: WorkspaceUserRoles[];
-};
+}
-export type Workspaces = {
+export interface Workspaces {
applications: ApplicationPayload[];
workspace: Workspace;
users: WorkspaceUser[];
-};
+}
export enum ENTITY_TYPE {
WORKSPACE = "Workspace",
diff --git a/app/client/src/ce/entities/DataTree/actionTriggers.ts b/app/client/src/ce/entities/DataTree/actionTriggers.ts
index 93321e8e4e..14e0ba7e15 100644
--- a/app/client/src/ce/entities/DataTree/actionTriggers.ts
+++ b/app/client/src/ce/entities/DataTree/actionTriggers.ts
@@ -163,17 +163,17 @@ export type ClearIntervalDescription = ActionDescriptionInterface<
"CLEAR_INTERVAL"
>;
-type GeolocationOptions = {
+interface GeolocationOptions {
maximumAge?: number;
timeout?: number;
enableHighAccuracy?: boolean;
-};
+}
-type GeolocationPayload = {
+interface GeolocationPayload {
onSuccess?: string;
onError?: string;
options?: GeolocationOptions;
-};
+}
export type GetCurrentLocationDescription = ActionDescriptionInterface<
GeolocationPayload,
diff --git a/app/client/src/ce/entities/DataTree/types.ts b/app/client/src/ce/entities/DataTree/types.ts
index f2daa0fed1..7d38fbbbfa 100644
--- a/app/client/src/ce/entities/DataTree/types.ts
+++ b/app/client/src/ce/entities/DataTree/types.ts
@@ -145,11 +145,6 @@ export type UnEvalTreeEntityObject =
| JSActionEntity
| WidgetEntity;
-export type UnEvalTreeEntity = UnEvalTreeEntityObject | AppsmithEntity | Page[];
-
-export type UnEvalTree = {
- [entityName: string]: UnEvalTreeEntity;
-};
export interface WidgetEntity extends WidgetProps {
meta: Record;
ENTITY_TYPE: ENTITY_TYPE.WIDGET;
@@ -160,12 +155,6 @@ export type DataTreeEntityObject =
| WidgetEntity
| AppsmithEntity;
-export type DataTreeEntity = DataTreeEntityObject | Page[] | ActionDispatcher;
-
-export type DataTree = {
- [entityName: string]: DataTreeEntity;
-};
-
export interface WidgetEntityConfig
extends Partial,
Omit,
@@ -181,7 +170,7 @@ export interface AppsmithEntity extends Omit {
theme: AppTheme["properties"];
}
-export type DataTreeSeed = {
+export interface DataTreeSeed {
actions: ActionDataState;
editorConfigs: Record;
pluginDependencyConfig: Record;
@@ -196,23 +185,14 @@ export type DataTreeSeed = {
moduleInputs: Record;
layoutSystemType: LayoutSystemTypes;
loadingEntities: LoadingEntitiesState;
-};
+}
-export type ModuleInput = {
+export interface ModuleInput {
name: string;
defaultValue: any;
-};
+}
export type DataTreeEntityConfig =
| WidgetEntityConfig
| ActionEntityConfig
| JSActionEntityConfig;
-
-export type ConfigTree = {
- [entityName: string]: DataTreeEntityConfig;
-};
-
-export type unEvalAndConfigTree = {
- unEvalTree: UnEvalTree;
- configTree: ConfigTree;
-};
diff --git a/app/client/src/ce/entities/DataTree/utils.ts b/app/client/src/ce/entities/DataTree/utils.ts
index 60cbcf622b..1fe133b8a4 100644
--- a/app/client/src/ce/entities/DataTree/utils.ts
+++ b/app/client/src/ce/entities/DataTree/utils.ts
@@ -2,14 +2,12 @@ import type {
PropertyOverrideDependency,
OverridingPropertyPaths,
ModuleInput,
- DataTreeEntity,
WidgetEntity,
ActionEntity,
JSActionEntity,
- ConfigTree,
- UnEvalTree,
DataTreeEntityConfig,
} from "@appsmith/entities/DataTree/types";
+import type { DataTreeEntity } from "entities/DataTree/dataTreeTypes";
import { OverridingPropertyType } from "@appsmith/entities/DataTree/types";
import {
isAction,
@@ -17,13 +15,13 @@ import {
isWidget,
} from "@appsmith/workers/Evaluation/evaluationUtils";
-type SetOverridingPropertyParams = {
+interface SetOverridingPropertyParams {
key: string;
value: string;
propertyOverrideDependency: PropertyOverrideDependency;
overridingPropertyPaths: OverridingPropertyPaths;
type: OverridingPropertyType;
-};
+}
export const setOverridingProperty = ({
key: propertyName,
@@ -70,14 +68,12 @@ export const setOverridingProperty = ({
};
export const generateDataTreeModuleInputs = (
- dataTree: UnEvalTree,
- configTree: ConfigTree,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
- moduleInputs: Record,
+ moduleInput: ModuleInput,
) => {
return {
- dataTree,
- configTree,
+ unEvalEntity: null,
+ configEntity: null,
};
};
diff --git a/app/client/src/ce/entities/FeatureFlag.ts b/app/client/src/ce/entities/FeatureFlag.ts
index 752d2498e0..97070a73f0 100644
--- a/app/client/src/ce/entities/FeatureFlag.ts
+++ b/app/client/src/ce/entities/FeatureFlag.ts
@@ -3,15 +3,14 @@ export const FEATURE_FLAG = {
TEST_FLAG: "TEST_FLAG",
release_datasource_environments_enabled:
"release_datasource_environments_enabled",
- ask_ai: "ask_ai",
release_appnavigationlogoupload_enabled:
"release_appnavigationlogoupload_enabled",
- ask_ai_sql: "ask_ai_sql",
- ask_ai_js: "ask_ai_js",
release_embed_hide_share_settings_enabled:
"release_embed_hide_share_settings_enabled",
ab_gsheet_schema_enabled: "ab_gsheet_schema_enabled",
ab_wds_enabled: "ab_wds_enabled",
+ release_table_serverside_filtering_enabled:
+ "release_table_serverside_filtering_enabled",
release_custom_echarts_enabled: "release_custom_echarts_enabled",
license_branding_enabled: "license_branding_enabled",
ab_gif_signposting_enabled: "ab_gif_signposting_enabled",
@@ -26,6 +25,7 @@ export const FEATURE_FLAG = {
release_show_publish_app_to_community_enabled:
"release_show_publish_app_to_community_enabled",
license_gac_enabled: "license_gac_enabled",
+ release_app_sidebar_enabled: "release_app_sidebar_enabled",
} as const;
export type FeatureFlag = keyof typeof FEATURE_FLAG;
@@ -35,13 +35,11 @@ export type FeatureFlags = Record;
export const DEFAULT_FEATURE_FLAG_VALUE: FeatureFlags = {
TEST_FLAG: true,
release_datasource_environments_enabled: false,
- ask_ai: false,
release_appnavigationlogoupload_enabled: false,
- ask_ai_js: false,
- ask_ai_sql: false,
release_embed_hide_share_settings_enabled: false,
ab_gsheet_schema_enabled: false,
ab_wds_enabled: false,
+ release_table_serverside_filtering_enabled: false,
release_custom_echarts_enabled: false,
license_branding_enabled: false,
ab_gif_signposting_enabled: false,
@@ -54,6 +52,7 @@ export const DEFAULT_FEATURE_FLAG_VALUE: FeatureFlags = {
license_private_embeds_enabled: false,
release_show_publish_app_to_community_enabled: false,
license_gac_enabled: false,
+ release_app_sidebar_enabled: false,
};
export const AB_TESTING_EVENT_KEYS = {
diff --git a/app/client/src/ce/entities/URLRedirect/URLAssembly.test.ts b/app/client/src/ce/entities/URLRedirect/URLAssembly.test.ts
new file mode 100644
index 0000000000..27fa5b3407
--- /dev/null
+++ b/app/client/src/ce/entities/URLRedirect/URLAssembly.test.ts
@@ -0,0 +1,142 @@
+import urlBuilder, {
+ URLBuilder,
+ getQueryStringfromObject,
+} from "./URLAssembly";
+import { APP_MODE } from "entities/App";
+
+describe("URLBuilder", () => {
+ beforeEach(() => {
+ // Reset the URLBuilder instance before each test
+ urlBuilder.resetURLParams();
+ });
+
+ it("should correctly set and use currentPageId in build function when currentPageId is set", () => {
+ const testPageId = "testPageId";
+ const testMode = APP_MODE.EDIT;
+
+ urlBuilder.setCurrentPageId(testPageId);
+
+ const builderParams = {
+ suffix: "testSuffix",
+ branch: "testBranch",
+ hash: "testHash",
+ params: { param1: "value1", param2: "value2" },
+ persistExistingParams: true,
+ };
+
+ URLBuilder.prototype.generateBasePath = jest.fn((pageId, mode) => {
+ expect(pageId).toBe(testPageId); // Ensure the current page id is used
+ expect(mode).toBe(testMode);
+ return `mockedBasePath/${pageId}/${mode}`;
+ });
+
+ const result = urlBuilder.build(builderParams, testMode);
+
+ expect(URLBuilder.prototype.generateBasePath).toHaveBeenCalledWith(
+ testPageId,
+ testMode,
+ );
+
+ expect(result).toEqual(
+ "mockedBasePath/testPageId/EDIT/testSuffix?param1=value1¶m2=value2&branch=testBranch#testHash",
+ );
+ });
+
+ it("should correctly set and use pageId in build function when currentPageId is set to null", () => {
+ const testPageId = "testPageId";
+ const testMode = APP_MODE.EDIT;
+
+ // Set currentPageId to null
+ urlBuilder.setCurrentPageId(null);
+
+ const builderParams = {
+ suffix: "testSuffix",
+ branch: "testBranch",
+ hash: "testHash",
+ params: { param1: "value1", param2: "value2" },
+ pageId: testPageId, // Set the pageId to be used
+ persistExistingParams: true,
+ };
+
+ URLBuilder.prototype.generateBasePath = jest.fn((pageId, mode) => {
+ expect(pageId).toBe(testPageId); // Ensure the passed pageId is used
+ expect(mode).toBe(testMode);
+ return `mockedBasePath/${pageId}/${mode}`;
+ });
+
+ const result = urlBuilder.build(builderParams, testMode);
+
+ expect(URLBuilder.prototype.generateBasePath).toHaveBeenCalledWith(
+ testPageId,
+ testMode,
+ );
+
+ expect(result).toEqual(
+ "mockedBasePath/testPageId/EDIT/testSuffix?param1=value1¶m2=value2&branch=testBranch#testHash",
+ );
+ });
+
+ it("should correctly set and use pageId in build function when currentPageId is set", () => {
+ const currentPageId = "currentPageId";
+ const testPageId = "testPageId";
+ const testMode = APP_MODE.EDIT;
+
+ urlBuilder.setCurrentPageId(currentPageId);
+
+ const builderParams = {
+ suffix: "testSuffix",
+ branch: "testBranch",
+ hash: "testHash",
+ params: { param1: "value1", param2: "value2" },
+ pageId: testPageId, // This should override the current page id
+ persistExistingParams: true,
+ };
+
+ URLBuilder.prototype.generateBasePath = jest.fn((pageId, mode) => {
+ expect(pageId).toBe(testPageId); // Ensure the overridden pageId is used
+ expect(mode).toBe(testMode);
+ return `mockedBasePath/${pageId}/${mode}`;
+ });
+
+ const result = urlBuilder.build(builderParams, testMode);
+
+ expect(URLBuilder.prototype.generateBasePath).toHaveBeenCalledWith(
+ testPageId,
+ testMode,
+ );
+
+ expect(result).toEqual(
+ "mockedBasePath/testPageId/EDIT/testSuffix?param1=value1¶m2=value2&branch=testBranch#testHash",
+ );
+ });
+});
+
+describe(".getQueryStringfromObject", () => {
+ const cases = [
+ {
+ index: 0,
+ input: { id: 0, a: "b&c ltd" },
+ expected: "?id=0&a=b%26c%20ltd",
+ },
+ { index: 1, input: {}, expected: "" },
+ {
+ index: 2,
+ input: { rando: "রিমিল" },
+ expected: "?rando=%E0%A6%B0%E0%A6%BF%E0%A6%AE%E0%A6%BF%E0%A6%B2",
+ },
+ {
+ index: 3,
+ input: { a1: "1234*&^%~`<>:';,./?" },
+ expected: "?a1=1234*%26%5E%25~%60%3C%3E%3A'%3B%2C.%2F%3F",
+ },
+ { index: 4, input: { isSignedIn: false }, expected: "?isSignedIn=false" },
+ ];
+
+ test.each(cases.map((x) => [x.index, x.input, x.expected]))(
+ "test case %d",
+ (_, input, expected) => {
+ const result = getQueryStringfromObject(input as any);
+ expect(result).toStrictEqual(expected);
+ },
+ );
+});
diff --git a/app/client/src/entities/URLRedirect/URLAssembly.ts b/app/client/src/ce/entities/URLRedirect/URLAssembly.ts
similarity index 67%
rename from app/client/src/entities/URLRedirect/URLAssembly.ts
rename to app/client/src/ce/entities/URLRedirect/URLAssembly.ts
index 45bbb79a98..ee54d04276 100644
--- a/app/client/src/entities/URLRedirect/URLAssembly.ts
+++ b/app/client/src/ce/entities/URLRedirect/URLAssembly.ts
@@ -11,17 +11,25 @@ import {
} from "constants/routes";
import { APP_MODE } from "entities/App";
import { generatePath } from "react-router";
-import type { URLBuilderParams } from "RouteBuilder";
-import { getQueryStringfromObject } from "RouteBuilder";
import getQueryParamsObject from "utils/getQueryParamsObject";
+import { isNil } from "lodash";
-enum URL_TYPE {
+export interface URLBuilderParams {
+ suffix?: string;
+ branch?: string;
+ hash?: string;
+ params?: Record;
+ pageId?: string | null;
+ persistExistingParams?: boolean;
+}
+
+export enum URL_TYPE {
DEFAULT,
SLUG,
CUSTOM_SLUG,
}
-const baseURLRegistry = {
+export const baseURLRegistry = {
[URL_TYPE.DEFAULT]: {
[APP_MODE.EDIT]: BUILDER_PATH_DEPRECATED,
[APP_MODE.PUBLISHED]: VIEWER_PATH_DEPRECATED,
@@ -36,17 +44,35 @@ const baseURLRegistry = {
},
};
-export type ApplicationURLParams = {
+export interface ApplicationURLParams {
applicationId?: string;
applicationSlug?: string;
applicationVersion?: ApplicationVersion;
-};
+}
-export type PageURLParams = {
+export interface PageURLParams {
pageId: string;
pageSlug: string;
customSlug?: string;
-};
+}
+
+export function getQueryStringfromObject(
+ params: Record = {},
+): string {
+ const paramKeys = Object.keys(params);
+ const queryParams: string[] = [];
+ if (paramKeys) {
+ paramKeys.forEach((paramKey: string) => {
+ if (!isNil(params[paramKey])) {
+ const value = encodeURIComponent(params[paramKey]);
+ if (paramKey && value) {
+ queryParams.push(`${paramKey}=${value}`);
+ }
+ }
+ });
+ }
+ return queryParams.length ? "?" + queryParams.join("&") : "";
+}
const fetchQueryParamsToPersist = (persistExistingParams: boolean) => {
const existingParams = getQueryParamsObject() || {};
@@ -65,18 +91,34 @@ const fetchQueryParamsToPersist = (persistExistingParams: boolean) => {
return params;
};
+/**
+ * NOTE TO ENGINEERS:
+ * This class has extended features in EE; please do check the EE implementation
+ * of it before modifying any functionality here.
+ *
+ * This class is inherited in EE and basePath generation is modified based on the type
+ * of editor the user is currently on. This is done to remove the dependency of current
+ * page as a required param to build any route. However if a pageId is provided while
+ * building a route, it will override the cache and use the passed pageId value.
+ *
+ * However the current implementation can be improved and a holistic solution can be
+ * devised to support all different types of routing pattern. The current solution acts as a stop-gap
+ * solution to help Package Editor feature in EE.
+ */
export class URLBuilder {
appParams: ApplicationURLParams;
pageParams: Record;
+ currentPageId?: string | null;
static _instance: URLBuilder;
- private constructor() {
+ constructor() {
this.appParams = {
applicationId: "",
applicationSlug: PLACEHOLDER_APP_SLUG,
};
this.pageParams = {};
+ this.currentPageId;
}
static getInstance() {
@@ -116,6 +158,10 @@ export class URLBuilder {
return { ...currentAppParams, ...currentPageParams };
}
+ setCurrentPageId(pageId?: string | null) {
+ this.currentPageId = pageId;
+ }
+
public updateURLParams(
appParams: ApplicationURLParams | null,
pageParams?: PageURLParams[],
@@ -129,14 +175,18 @@ export class URLBuilder {
appParams.applicationVersion || this.appParams.applicationVersion;
}
if (pageParams) {
- const params = pageParams.reduce((acc, page) => {
- acc[page.pageId] = page;
- return acc;
- }, {} as Record);
+ const params = pageParams.reduce(
+ (acc, page) => {
+ acc[page.pageId] = page;
+ return acc;
+ },
+ {} as Record,
+ );
Object.assign(this.pageParams, params);
}
}
+ // Currently only used in pages/Applications page on mount
resetURLParams() {
this.appParams = {
applicationId: "",
@@ -145,11 +195,12 @@ export class URLBuilder {
this.pageParams = {};
}
+ // Current only used in src/pages/slug.test.tsx
getURLParams(pageId: string) {
return { ...this.appParams, ...this.pageParams[pageId] };
}
- generateBasePath(pageId: string, mode: APP_MODE) {
+ generateBasePathForApp(pageId: string, mode: APP_MODE) {
const { applicationVersion } = this.appParams;
const customSlug = this.pageParams[pageId]?.customSlug || "";
@@ -165,6 +216,10 @@ export class URLBuilder {
return basePath;
}
+ generateBasePath(pageId: string, mode: APP_MODE) {
+ return this.generateBasePathForApp(pageId, mode);
+ }
+
getCustomSlugPathPreview(pageId: string, customSlug: string) {
const urlPattern =
baseURLRegistry[URL_TYPE.CUSTOM_SLUG][APP_MODE.PUBLISHED];
@@ -188,6 +243,20 @@ export class URLBuilder {
return generatePath(urlPattern, formattedParams).toLowerCase();
}
+ resolveEntityIdForApp(builderParams: URLBuilderParams) {
+ return {
+ entityId: builderParams.pageId || this.currentPageId,
+ entityType: "pageId",
+ };
+ }
+
+ resolveEntityId(builderParams: URLBuilderParams): {
+ entityId?: string | null;
+ entityType: string;
+ } {
+ return this.resolveEntityIdForApp(builderParams);
+ }
+
/**
* @throws {URIError}
* @param builderParams
@@ -196,21 +265,22 @@ export class URLBuilder {
*/
build(builderParams: URLBuilderParams, mode: APP_MODE = APP_MODE.EDIT) {
const {
+ branch,
hash = "",
params = {},
persistExistingParams = false,
suffix,
- pageId,
- branch,
} = builderParams;
- if (!pageId) {
+ const { entityId, entityType } = this.resolveEntityId(builderParams);
+
+ if (!entityId) {
throw new URIError(
- "Missing pageId. If you are trying to set href inside a react component use the 'useHref' hook.",
+ `Missing ${entityType}. If you are trying to set href inside a react component use the 'useHref' hook.`,
);
}
- const basePath = this.generateBasePath(pageId, mode);
+ const basePath = this.generateBasePath(entityId, mode);
const queryParamsToPersist = fetchQueryParamsToPersist(
persistExistingParams,
diff --git a/app/client/src/ce/pages/AdminSettings/Branding/UpgradeBanner.tsx b/app/client/src/ce/pages/AdminSettings/Branding/UpgradeBanner.tsx
index 533bc7e374..ac66bdbd2e 100644
--- a/app/client/src/ce/pages/AdminSettings/Branding/UpgradeBanner.tsx
+++ b/app/client/src/ce/pages/AdminSettings/Branding/UpgradeBanner.tsx
@@ -53,7 +53,6 @@ const UpgradeBanner = () => {
data-testid="t--branding-upgrade-button"
onClick={onUpgrade}
size="md"
- startIcon="star-line"
>
Upgrade
diff --git a/app/client/src/ce/pages/AdminSettings/BreadcrumbCategories.tsx b/app/client/src/ce/pages/AdminSettings/BreadcrumbCategories.tsx
index ff1bbe61c9..7be4be1087 100644
--- a/app/client/src/ce/pages/AdminSettings/BreadcrumbCategories.tsx
+++ b/app/client/src/ce/pages/AdminSettings/BreadcrumbCategories.tsx
@@ -1,6 +1,6 @@
import { APPLICATIONS_URL } from "constants/routes";
import { SettingCategories } from "@appsmith/pages/AdminSettings/config/types";
-import { adminSettingsCategoryUrl } from "RouteBuilder";
+import { adminSettingsCategoryUrl } from "@appsmith/RouteBuilder";
export const BreadcrumbCategories = {
HOMEPAGE: {
@@ -15,9 +15,11 @@ export const BreadcrumbCategories = {
href: adminSettingsCategoryUrl({ category: SettingCategories.EMAIL }),
text: "Email",
},
- [SettingCategories.GOOGLE_MAPS]: {
- href: adminSettingsCategoryUrl({ category: SettingCategories.GOOGLE_MAPS }),
- text: "Google Maps",
+ [SettingCategories.DEVELOPER_SETTINGS]: {
+ href: adminSettingsCategoryUrl({
+ category: SettingCategories.DEVELOPER_SETTINGS,
+ }),
+ text: "Developer settings",
},
[SettingCategories.VERSION]: {
href: adminSettingsCategoryUrl({ category: SettingCategories.VERSION }),
diff --git a/app/client/src/ce/pages/AdminSettings/config/DeveloperSettings/googleMaps.ts b/app/client/src/ce/pages/AdminSettings/config/DeveloperSettings/googleMaps.ts
new file mode 100644
index 0000000000..7835e79366
--- /dev/null
+++ b/app/client/src/ce/pages/AdminSettings/config/DeveloperSettings/googleMaps.ts
@@ -0,0 +1,24 @@
+import { GOOGLE_MAPS_SETUP_DOC } from "constants/ThirdPartyConstants";
+import type { Setting } from "../types";
+import {
+ SettingCategories,
+ SettingSubtype,
+ SettingTypes,
+} from "@appsmith/pages/AdminSettings/config/types";
+
+export const googleMapsConfig: Setting[] = [
+ {
+ id: "APPSMITH_GOOGLE_MAPS_READ_MORE",
+ category: SettingCategories.DEVELOPER_SETTINGS,
+ controlType: SettingTypes.CALLOUT,
+ label: "How to configure google maps?",
+ url: GOOGLE_MAPS_SETUP_DOC,
+ },
+ {
+ id: "googleMapsKey",
+ category: SettingCategories.DEVELOPER_SETTINGS,
+ controlType: SettingTypes.TEXTINPUT,
+ controlSubType: SettingSubtype.TEXT,
+ label: "Google Maps API key",
+ },
+];
diff --git a/app/client/src/ce/pages/AdminSettings/config/DeveloperSettings/index.ts b/app/client/src/ce/pages/AdminSettings/config/DeveloperSettings/index.ts
new file mode 100644
index 0000000000..1d887a6388
--- /dev/null
+++ b/app/client/src/ce/pages/AdminSettings/config/DeveloperSettings/index.ts
@@ -0,0 +1,17 @@
+import type { AdminConfigType } from "@appsmith/pages/AdminSettings/config/types";
+import {
+ CategoryType,
+ SettingCategories,
+ SettingTypes,
+} from "@appsmith/pages/AdminSettings/config/types";
+import { googleMapsConfig } from "./googleMaps";
+
+export const config: AdminConfigType = {
+ icon: "snippet",
+ type: SettingCategories.DEVELOPER_SETTINGS,
+ categoryType: CategoryType.GENERAL,
+ controlType: SettingTypes.GROUP,
+ title: "Developer settings",
+ canSave: true,
+ settings: [...googleMapsConfig],
+};
diff --git a/app/client/src/ce/pages/AdminSettings/config/general.tsx b/app/client/src/ce/pages/AdminSettings/config/general.tsx
index 4a4417e944..a3ede65683 100644
--- a/app/client/src/ce/pages/AdminSettings/config/general.tsx
+++ b/app/client/src/ce/pages/AdminSettings/config/general.tsx
@@ -73,12 +73,12 @@ export const APPSMITH_DISABLE_TELEMETRY_SETTING: Setting = {
};
export const APPSMITH_HIDE_WATERMARK_SETTING: Setting = {
- id: "APPSMITH_HIDE_WATERMARK",
- name: "APPSMITH_HIDE_WATERMARK",
+ id: "hideWatermark",
+ name: "hideWatermark",
category: SettingCategories.GENERAL,
controlType: SettingTypes.CHECKBOX,
label: "Appsmith watermark",
- text: "Show Appsmith watermark",
+ text: "Hide Appsmith watermark",
isFeatureEnabled: false,
isDisabled: () => true,
textSuffix: ,
diff --git a/app/client/src/ce/pages/AdminSettings/config/index.ts b/app/client/src/ce/pages/AdminSettings/config/index.ts
index b5ac5778ba..e87e2f1add 100644
--- a/app/client/src/ce/pages/AdminSettings/config/index.ts
+++ b/app/client/src/ce/pages/AdminSettings/config/index.ts
@@ -2,7 +2,7 @@ import { ConfigFactory } from "pages/AdminSettings/config/ConfigFactory";
import { config as GeneralConfig } from "@appsmith/pages/AdminSettings/config/general";
import { config as EmailConfig } from "pages/AdminSettings/config/email";
-import { config as MapsConfig } from "pages/AdminSettings/config/googleMaps";
+import { config as DeveloperSettings } from "@appsmith/pages/AdminSettings/config/DeveloperSettings";
import { config as VersionConfig } from "pages/AdminSettings/config/version";
import { config as AdvancedConfig } from "pages/AdminSettings/config/advanced";
import { config as Authentication } from "@appsmith/pages/AdminSettings/config/authentication";
@@ -13,7 +13,7 @@ import { config as AuditLogsConfig } from "@appsmith/pages/AdminSettings/config/
ConfigFactory.register(GeneralConfig);
ConfigFactory.register(EmailConfig);
-ConfigFactory.register(MapsConfig);
+ConfigFactory.register(DeveloperSettings);
ConfigFactory.register(Authentication);
ConfigFactory.register(AdvancedConfig);
ConfigFactory.register(VersionConfig);
diff --git a/app/client/src/ce/pages/AdminSettings/config/types.ts b/app/client/src/ce/pages/AdminSettings/config/types.ts
index 7b214c07e7..39ffeb086e 100644
--- a/app/client/src/ce/pages/AdminSettings/config/types.ts
+++ b/app/client/src/ce/pages/AdminSettings/config/types.ts
@@ -11,7 +11,7 @@ type ControlType = {
};
}[keyof ControlPropsType];
-type ControlPropsType = {
+interface ControlPropsType {
[SettingTypes.RADIO]: RadioOptionProps;
[SettingTypes.TEXTINPUT]: unknown;
[SettingTypes.TOGGLE]: unknown;
@@ -25,7 +25,7 @@ type ControlPropsType = {
[SettingTypes.TAGINPUT]: unknown;
[SettingTypes.DROPDOWN]: unknown;
[SettingTypes.CHECKBOX]: unknown;
-};
+}
export enum SettingTypes {
RADIO = "RADIO",
@@ -86,6 +86,7 @@ export type Setting = ControlType & {
dropdownOptions?: Partial[];
isFeatureEnabled?: boolean;
tooltip?: string;
+ isEnterprise?: boolean;
};
export interface Category {
@@ -104,7 +105,6 @@ export interface Category {
export const SettingCategories = {
GENERAL: "general",
EMAIL: "email",
- GOOGLE_MAPS: "google-maps",
VERSION: "version",
ADVANCED: "advanced",
AUTHENTICATION: "authentication",
@@ -117,6 +117,7 @@ export const SettingCategories = {
BRANDING: "branding",
SAML_AUTH: "saml-auth",
OIDC_AUTH: "oidc-auth",
+ DEVELOPER_SETTINGS: "developer-settings",
};
export enum CategoryType {
@@ -125,7 +126,7 @@ export enum CategoryType {
OTHER = "other",
}
-export type AdminConfigType = {
+export interface AdminConfigType {
type: string;
controlType: SettingTypes;
title: string;
@@ -140,4 +141,4 @@ export type AdminConfigType = {
categoryType: CategoryType;
isEnterprise?: boolean;
isFeatureEnabled?: boolean;
-};
+}
diff --git a/app/client/src/ce/pages/AppViewer/NavigationLogo.tsx b/app/client/src/ce/pages/AppViewer/NavigationLogo.tsx
index 9c5c549c2c..e87dd92426 100644
--- a/app/client/src/ce/pages/AppViewer/NavigationLogo.tsx
+++ b/app/client/src/ce/pages/AppViewer/NavigationLogo.tsx
@@ -16,13 +16,13 @@ import {
} from "selectors/editorSelectors";
import { useHref } from "pages/Editor/utils";
import { APP_MODE } from "entities/App";
-import { builderURL, viewerURL } from "RouteBuilder";
+import { builderURL, viewerURL } from "@appsmith/RouteBuilder";
import { get } from "lodash";
import { getAssetUrl } from "@appsmith/utils/airgapHelpers";
-type NavigationLogoProps = {
+interface NavigationLogoProps {
logoConfiguration: NavigationSetting["logoConfiguration"];
-};
+}
const StyledImage = styled.img`
max-width: 10rem;
diff --git a/app/client/src/ce/pages/Applications/ApplicationCardList.tsx b/app/client/src/ce/pages/Applications/ApplicationCardList.tsx
index c0a0deb043..9d03ab288d 100644
--- a/app/client/src/ce/pages/Applications/ApplicationCardList.tsx
+++ b/app/client/src/ce/pages/Applications/ApplicationCardList.tsx
@@ -13,12 +13,16 @@ import { NoAppsFound } from "@appsmith/pages/Applications";
import ApplicationCard from "pages/Applications/ApplicationCard";
import type { ApplicationPayload } from "@appsmith/constants/ReduxActionConstants";
import type { UpdateApplicationPayload } from "@appsmith/api/ApplicationApi";
+import {
+ APPLICATION_CARD_LIST_ZERO_STATE,
+ createMessage,
+} from "@appsmith/constants/messages";
const NoAppsFoundIcon = importSvg(
async () => import("assets/svg/no-apps-icon.svg"),
);
-type ApplicationCardListProps = {
+interface ApplicationCardListProps {
applications: ApplicationPayload[];
canInviteToWorkspace: boolean;
enableImportExport: boolean;
@@ -32,7 +36,7 @@ type ApplicationCardListProps = {
id: string,
data: UpdateApplicationPayload,
) => void;
-};
+}
function ApplicationCardList({
applications,
@@ -81,7 +85,7 @@ function ApplicationCardList({
{applications.length === 0 && (
- There’s nothing inside this workspace
+ {createMessage(APPLICATION_CARD_LIST_ZERO_STATE)}
{/* below component is duplicate. This is because of cypress test were failing */}
{hasCreateNewApplicationPermission && (
void;
-};
+}
function WorkspaceAction({
isMobile,
diff --git a/app/client/src/ce/pages/Applications/WorkspaceMenu.tsx b/app/client/src/ce/pages/Applications/WorkspaceMenu.tsx
index 3e46d27190..45962dc772 100644
--- a/app/client/src/ce/pages/Applications/WorkspaceMenu.tsx
+++ b/app/client/src/ce/pages/Applications/WorkspaceMenu.tsx
@@ -19,7 +19,7 @@ import {
getOnSelectAction,
} from "pages/common/CustomizedDropdown/dropdownHelpers";
-type WorkspaceMenuProps = {
+interface WorkspaceMenuProps {
canDeleteWorkspace: boolean;
canInviteToWorkspace: boolean;
enableImportExport: boolean;
@@ -40,7 +40,7 @@ type WorkspaceMenuProps = {
workspace: Workspace;
workspaceNameChange: (newName: string, workspaceId: string) => void;
workspaceToOpenMenu: string | null;
-};
+}
const WorkspaceRename = styled(EditableText)`
padding: 0 2px;
diff --git a/app/client/src/ce/pages/Applications/index.tsx b/app/client/src/ce/pages/Applications/index.tsx
index a77e4d37fc..cabe8225d0 100644
--- a/app/client/src/ce/pages/Applications/index.tsx
+++ b/app/client/src/ce/pages/Applications/index.tsx
@@ -81,7 +81,7 @@ import DisconnectGitModal from "pages/Editor/gitSync/DisconnectGitModal";
import ReconnectDatasourceModal from "pages/Editor/gitSync/ReconnectDatasourceModal";
import LeftPaneBottomSection from "pages/Home/LeftPaneBottomSection";
import { MOBILE_MAX_WIDTH } from "constants/AppConstants";
-import urlBuilder from "entities/URLRedirect/URLAssembly";
+import urlBuilder from "@appsmith/entities/URLRedirect/URLAssembly";
import RepoLimitExceededErrorModal from "pages/Editor/gitSync/RepoLimitExceededErrorModal";
import { resetEditorRequest } from "actions/initActions";
import {
@@ -306,9 +306,9 @@ export const submitCreateWorkspaceForm = async (data: any, dispatch: any) => {
return result;
};
-export type LeftPaneProps = {
+export interface LeftPaneProps {
isBannerVisible?: boolean;
-};
+}
export function LeftPane(props: LeftPaneProps) {
const { isBannerVisible = false } = props;
diff --git a/app/client/src/ce/pages/Editor/Explorer/helpers.tsx b/app/client/src/ce/pages/Editor/Explorer/helpers.tsx
index 7c89fac378..a31c673c6b 100644
--- a/app/client/src/ce/pages/Editor/Explorer/helpers.tsx
+++ b/app/client/src/ce/pages/Editor/Explorer/helpers.tsx
@@ -37,15 +37,15 @@ export const ContextMenuPopoverModifiers: IPopoverSharedProps["modifiers"] = {
},
};
-export type ExplorerURLParams = {
+export interface ExplorerURLParams {
pageId: string;
-};
+}
-export type ExplorerFileEntity = {
+export interface ExplorerFileEntity {
type: PluginType | "group";
group?: string;
entity: ActionData | JSCollectionData;
-};
+}
export const matchBasePath = (pathname: string) => {
const basePathMatch = matchPath(pathname, {
@@ -154,18 +154,19 @@ export const useDatasourceIdFromURL = () => {
const EXPLORER_STORAGE_PREFIX = "explorerState_";
-export type ExplorerStateType = {
+export interface ExplorerStateType {
pages: boolean;
widgets: boolean;
queriesAndJs: boolean;
datasource: boolean;
-};
+ packages: boolean;
+}
export const getExplorerStatus = (
- appId: string,
+ resourceId: string,
entityName: keyof ExplorerStateType,
): boolean | null => {
- const storageItemName = EXPLORER_STORAGE_PREFIX + appId;
+ const storageItemName = EXPLORER_STORAGE_PREFIX + resourceId;
const data = localStorage.getItem(storageItemName);
if (data === null) return null;
const parsedData: ExplorerStateType = JSON.parse(data);
diff --git a/app/client/src/ce/pages/Upgrade/Carousel.tsx b/app/client/src/ce/pages/Upgrade/Carousel.tsx
index 3a57a41f59..0cfae1f499 100644
--- a/app/client/src/ce/pages/Upgrade/Carousel.tsx
+++ b/app/client/src/ce/pages/Upgrade/Carousel.tsx
@@ -65,7 +65,8 @@ const CarouselContainer = styled.div`
&.active {
height: max-content;
- box-shadow: 0 2px 4px -2px rgba(0, 0, 0, 0.06),
+ box-shadow:
+ 0 2px 4px -2px rgba(0, 0, 0, 0.06),
0 4px 8px -2px rgba(0, 0, 0, 0.1);
background-color: var(--ads-v2-color-bg);
diff --git a/app/client/src/ce/pages/Upgrade/businessEdition/UpgradeToBEPage.tsx b/app/client/src/ce/pages/Upgrade/businessEdition/UpgradeToBEPage.tsx
index 1a9da5b11f..3e51e3e05e 100644
--- a/app/client/src/ce/pages/Upgrade/businessEdition/UpgradeToBEPage.tsx
+++ b/app/client/src/ce/pages/Upgrade/businessEdition/UpgradeToBEPage.tsx
@@ -13,8 +13,10 @@ import { getAssetUrl } from "@appsmith/utils/airgapHelpers";
export const UpgradeToBEPageWrapper = styled.div`
width: 100%;
height: 100%;
- background: linear-gradient(90deg, #fff 20px, transparent 1%) center,
- linear-gradient(#fff 20px, transparent 1%) center, #d2ddec;
+ background:
+ linear-gradient(90deg, #fff 20px, transparent 1%) center,
+ linear-gradient(#fff 20px, transparent 1%) center,
+ #d2ddec;
background-size: 22px 22px;
position: relative;
diff --git a/app/client/src/ce/pages/Upgrade/types.ts b/app/client/src/ce/pages/Upgrade/types.ts
index 50368e07b5..19411d51a1 100644
--- a/app/client/src/ce/pages/Upgrade/types.ts
+++ b/app/client/src/ce/pages/Upgrade/types.ts
@@ -1,17 +1,17 @@
import type React from "react";
-export type Header = {
+export interface Header {
heading: string;
subHeadings: string[];
-};
+}
-export type CarouselTrigger = {
+export interface CarouselTrigger {
icon: string;
heading: string;
details: string[];
-};
+}
-export type Carousel = {
+export interface Carousel {
triggers: CarouselTrigger[];
targets: any[];
design:
@@ -19,19 +19,19 @@ export type Carousel = {
| "split-right-trigger"
| "trigger-contains-target"
| "no-target";
-};
+}
-export type Footer = {
+export interface Footer {
onClick: ((event: React.MouseEvent) => void) | undefined;
message: string;
showHeading?: boolean;
isEnterprise?: boolean;
-};
-export type UpgradePageProps = {
+}
+export interface UpgradePageProps {
header: Header;
carousel: Carousel;
footer: Footer;
-};
+}
export type HeaderProps = Header;
diff --git a/app/client/src/ce/pages/common/AppHeader.tsx b/app/client/src/ce/pages/common/AppHeader.tsx
new file mode 100644
index 0000000000..bdb09ddbd5
--- /dev/null
+++ b/app/client/src/ce/pages/common/AppHeader.tsx
@@ -0,0 +1,41 @@
+import React from "react";
+import PageHeader from "pages/common/PageHeader";
+import { Route, Switch } from "react-router";
+import {
+ VIEWER_PATH,
+ BUILDER_PATH,
+ SETUP,
+ SIGNUP_SUCCESS_URL,
+ USER_AUTH_URL,
+ BUILDER_PATH_DEPRECATED,
+ VIEWER_PATH_DEPRECATED,
+ ADMIN_SETTINGS_CATEGORY_PATH,
+ VIEWER_CUSTOM_PATH,
+ BUILDER_CUSTOM_PATH,
+ BASE_URL,
+} from "constants/routes";
+import Navigation from "pages/AppViewer/Navigation";
+import type { RouteComponentProps } from "react-router";
+import AppEditorHeader from "pages/Editor/EditorHeader";
+
+export type Props = RouteComponentProps;
+
+export const headerRoot = document.getElementById("header-root");
+
+export const Routes = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/app/client/src/ce/pages/workspace/helpers.ts b/app/client/src/ce/pages/workspace/helpers.ts
index 4f6ad34933..edae0a76df 100644
--- a/app/client/src/ce/pages/workspace/helpers.ts
+++ b/app/client/src/ce/pages/workspace/helpers.ts
@@ -2,18 +2,18 @@ import { ReduxActionTypes } from "@appsmith/constants/ReduxActionConstants";
import { SubmissionError } from "redux-form";
import type { RouteChildrenProps, RouteComponentProps } from "react-router-dom";
import type { DefaultOptionType } from "rc-select/lib/Select";
-export type InviteUsersToWorkspaceByRoleValues = {
+export interface InviteUsersToWorkspaceByRoleValues {
id: string;
users?: string;
permissionGroupId?: string;
permissionGroupName?: string;
roles?: any[];
-};
-export type InviteUsersToWorkspaceFormValues = {
+}
+export interface InviteUsersToWorkspaceFormValues {
usersByRole: InviteUsersToWorkspaceByRoleValues[];
-};
+}
-export type InviteUsersProps = {
+export interface InviteUsersProps {
roles?: DefaultOptionType[];
applicationId?: string;
workspaceId?: string;
@@ -24,11 +24,11 @@ export type InviteUsersProps = {
options?: any;
isMultiSelectDropdown?: boolean;
checkIfInvitedUsersFromDifferentDomain?: () => void;
-};
+}
-export type CreateWorkspaceFormValues = {
+export interface CreateWorkspaceFormValues {
name: string;
-};
+}
export const createWorkspaceSubmitHandler = async (
values: CreateWorkspaceFormValues,
diff --git a/app/client/src/ce/reducers/uiReducers/applicationsReducer.tsx b/app/client/src/ce/reducers/uiReducers/applicationsReducer.tsx
index f96cff7052..88978b7a38 100644
--- a/app/client/src/ce/reducers/uiReducers/applicationsReducer.tsx
+++ b/app/client/src/ce/reducers/uiReducers/applicationsReducer.tsx
@@ -822,10 +822,10 @@ const applicationsReducer = createReducer(initialState, handlers);
export type creatingApplicationMap = Record;
-export type DeletingMultipleApps = {
+export interface DeletingMultipleApps {
list?: string[];
isDeleting?: boolean;
-};
+}
export interface ApplicationsReduxState {
applicationList: ApplicationPayload[];
diff --git a/app/client/src/ce/reducers/uiReducers/editorContextReducer.ts b/app/client/src/ce/reducers/uiReducers/editorContextReducer.ts
index 8b309e71ed..60a246d636 100644
--- a/app/client/src/ce/reducers/uiReducers/editorContextReducer.ts
+++ b/app/client/src/ce/reducers/uiReducers/editorContextReducer.ts
@@ -7,35 +7,35 @@ export enum CursorPositionOrigin {
LastFocus = "LastFocus",
}
-export type CursorPosition = {
+export interface CursorPosition {
line: number;
ch: number;
origin: CursorPositionOrigin;
-};
+}
-export type EvaluatedPopupState = {
+export interface EvaluatedPopupState {
type: boolean;
example: boolean;
value: boolean;
-};
+}
-export type CodeEditorContext = {
+export interface CodeEditorContext {
cursorPosition?: CursorPosition;
evalPopupState?: EvaluatedPopupState;
-};
+}
-export type PropertyPanelContext = {
+export interface PropertyPanelContext {
propertySectionState: Record;
selectedPropertyTabIndex: number;
-};
+}
-export type PropertyPanelState = {
+export interface PropertyPanelState {
[key: string]: PropertyPanelContext;
-};
+}
export type CodeEditorHistory = Record;
-export type EditorContextState = {
+export interface EditorContextState {
entityCollapsibleFields: Record;
subEntityCollapsibleFields: Record;
explorerSwitchIndex: number;
@@ -44,7 +44,7 @@ export type EditorContextState = {
propertySectionState: Record;
selectedPropertyTabIndex: number;
propertyPanelState: PropertyPanelState;
-};
+}
export const initialState: EditorContextState = {
codeEditorHistory: {},
diff --git a/app/client/src/ce/sagas/ActionExecution/ActionExecutionSagas.ts b/app/client/src/ce/sagas/ActionExecution/ActionExecutionSagas.ts
index 1e2fd6ad96..c2541d9720 100644
--- a/app/client/src/ce/sagas/ActionExecution/ActionExecutionSagas.ts
+++ b/app/client/src/ce/sagas/ActionExecution/ActionExecutionSagas.ts
@@ -45,11 +45,11 @@ import type { ActionDescription } from "@appsmith/workers/Evaluation/fns";
import { getActionById } from "selectors/editorSelectors";
import type { AppState } from "@appsmith/reducers";
-export type TriggerMeta = {
+export interface TriggerMeta {
source?: TriggerSource;
triggerPropertyName?: string;
triggerKind?: TriggerKind;
-};
+}
/**
* The controller saga that routes different trigger effects to its executor sagas
diff --git a/app/client/src/ce/sagas/ApplicationSagas.tsx b/app/client/src/ce/sagas/ApplicationSagas.tsx
index 0f49425f24..cf02903b54 100644
--- a/app/client/src/ce/sagas/ApplicationSagas.tsx
+++ b/app/client/src/ce/sagas/ApplicationSagas.tsx
@@ -103,7 +103,7 @@ import {
import { failFastApiCalls } from "sagas/InitSagas";
import type { Datasource } from "entities/Datasource";
import { GUIDED_TOUR_STEPS } from "pages/Editor/GuidedTour/constants";
-import { builderURL, viewerURL } from "RouteBuilder";
+import { builderURL, viewerURL } from "@appsmith/RouteBuilder";
import { getDefaultPageId as selectDefaultPageId } from "sagas/selectors";
import PageApi from "api/PageApi";
import { identity, isEmpty, merge, pickBy } from "lodash";
@@ -260,10 +260,13 @@ export function* fetchAppAndPagesSaga(
const isValidResponse: boolean = yield call(validateResponse, response);
if (isValidResponse) {
const prevPagesState: Page[] = yield select(getPageList);
- const pagePermissionsMap = prevPagesState.reduce((acc, page) => {
- acc[page.pageId] = page.userPermissions ?? [];
- return acc;
- }, {} as Record);
+ const pagePermissionsMap = prevPagesState.reduce(
+ (acc, page) => {
+ acc[page.pageId] = page.userPermissions ?? [];
+ return acc;
+ },
+ {} as Record,
+ );
yield put({
type: ReduxActionTypes.FETCH_APPLICATION_SUCCESS,
payload: { ...response.data.application, pages: response.data.pages },
@@ -693,8 +696,10 @@ export function* forkApplicationSaga(
workspaceId: action.payload.workspaceId,
},
});
+
const pageURL = builderURL({
pageId: application.defaultPageId as string,
+ params: { branch: null },
});
if (action.payload.editMode) {
@@ -921,9 +926,8 @@ export function* initializeDatasourceWithDefaultValues(datasource: Datasource) {
datasource.datasourceStorages[currentEnvironment],
);
payload.isConfigured = false; // imported datasource as not configured yet
- const response: ApiResponse = yield DatasourcesApi.updateDatasourceStorage(
- payload,
- );
+ const response: ApiResponse =
+ yield DatasourcesApi.updateDatasourceStorage(payload);
const isValidResponse: boolean = yield validateResponse(response);
if (isValidResponse) {
yield put({
diff --git a/app/client/src/ce/sagas/SuperUserSagas.tsx b/app/client/src/ce/sagas/SuperUserSagas.tsx
index ad907d313c..0ef6294012 100644
--- a/app/client/src/ce/sagas/SuperUserSagas.tsx
+++ b/app/client/src/ce/sagas/SuperUserSagas.tsx
@@ -5,10 +5,7 @@ import {
ReduxActionErrorTypes,
ReduxActionTypes,
} from "@appsmith/constants/ReduxActionConstants";
-import {
- APPLICATIONS_URL,
- WORKSPACE_SETTINGS_BILLING_PAGE_URL,
-} from "constants/routes";
+import { APPLICATIONS_URL } from "constants/routes";
import type { User } from "constants/userConstants";
import { call, put, delay, select } from "redux-saga/effects";
import history from "utils/history";
@@ -41,7 +38,7 @@ export function* FetchAdminSettingsSaga() {
const isValidResponse: boolean = yield validateResponse(response);
if (isValidResponse) {
- const { appVersion, cloudHosting } = getAppsmithConfigs();
+ const { appVersion } = getAppsmithConfigs();
const settings = {
//@ts-expect-error: response is of type unknown
...response.data,
@@ -49,7 +46,6 @@ export function* FetchAdminSettingsSaga() {
APPSMITH_DISPLAY_VERSION,
appVersion.edition,
appVersion.id,
- cloudHosting,
),
};
@@ -150,7 +146,7 @@ export function* RestartServerPoll() {
yield call(RestryRestartServerPoll);
}
-export function* RestryRestartServerPoll(isMigration = false) {
+export function* RestryRestartServerPoll() {
let pollCount = 0;
const maxPollCount = RESTART_POLL_TIMEOUT / RESTART_POLL_INTERVAL;
while (pollCount < maxPollCount) {
@@ -165,8 +161,7 @@ export function* RestryRestartServerPoll(isMigration = false) {
response.data?.tenantConfiguration?.migrationStatus ===
MIGRATION_STATUS.COMPLETED
) {
- if (!isMigration) window.location.reload();
- else location.href = WORKSPACE_SETTINGS_BILLING_PAGE_URL;
+ window.location.reload();
}
} catch (e) {}
}
diff --git a/app/client/src/ce/sagas/WorkspaceSagas.ts b/app/client/src/ce/sagas/WorkspaceSagas.ts
index 12efda80a1..097b5e4904 100644
--- a/app/client/src/ce/sagas/WorkspaceSagas.ts
+++ b/app/client/src/ce/sagas/WorkspaceSagas.ts
@@ -273,9 +273,8 @@ export function* createWorkspaceSaga(
);
const isValidResponse: boolean = yield validateResponse(response);
if (!isValidResponse) {
- const errorMessage: string | undefined = yield getResponseErrorMessage(
- response,
- );
+ const errorMessage: string | undefined =
+ yield getResponseErrorMessage(response);
yield call(reject, { _error: errorMessage });
} else {
yield put({
diff --git a/app/client/src/ce/sagas/analyticsSaga.ts b/app/client/src/ce/sagas/analyticsSaga.ts
index e6460ee5dc..769ef7d71c 100644
--- a/app/client/src/ce/sagas/analyticsSaga.ts
+++ b/app/client/src/ce/sagas/analyticsSaga.ts
@@ -44,12 +44,10 @@ export function* getUserAndAppDetails() {
getCurrentApplication,
);
const user: ReturnType = yield select(getCurrentUser);
- const instanceId: ReturnType = yield select(
- getInstanceId,
- );
- const pageId: ReturnType = yield select(
- getCurrentPageId,
- );
+ const instanceId: ReturnType =
+ yield select(getInstanceId);
+ const pageId: ReturnType =
+ yield select(getCurrentPageId);
const userAndAppDetails: UserAndAppDetails = {
pageId,
appId: currentApp?.id || "",
diff --git a/app/client/src/ce/sagas/userSagas.tsx b/app/client/src/ce/sagas/userSagas.tsx
index 957fc49a9e..a9baf0d892 100644
--- a/app/client/src/ce/sagas/userSagas.tsx
+++ b/app/client/src/ce/sagas/userSagas.tsx
@@ -38,6 +38,7 @@ import {
fetchFeatureFlagsError,
fetchProductAlertSuccess,
fetchProductAlertFailure,
+ fetchFeatureFlagsInit,
} from "actions/userActions";
import AnalyticsUtil from "utils/AnalyticsUtil";
import { INVITE_USERS_TO_WORKSPACE_FORM } from "@appsmith/constants/forms";
@@ -53,7 +54,10 @@ import {
import localStorage from "utils/localStorage";
import log from "loglevel";
-import { getCurrentUser } from "selectors/usersSelectors";
+import {
+ getCurrentUser,
+ getFeatureFlagsFetched,
+} from "selectors/usersSelectors";
import {
initAppLevelSocketConnection,
initPageLevelSocketConnection,
@@ -85,6 +89,7 @@ import type {
ProductAlert,
ProductAlertConfig,
} from "reducers/uiReducers/usersReducer";
+import { selectFeatureFlags } from "@appsmith/selectors/featureFlagsSelectors";
export function* createUserSaga(
action: ReduxActionWithPromise,
@@ -196,12 +201,25 @@ export function* runUserSideEffectsSaga() {
enableTelemetry && AnalyticsUtil.identifyUser(currentUser);
}
+ const isFFFetched: boolean = yield select(getFeatureFlagsFetched);
+ if (!isFFFetched) {
+ yield call(fetchFeatureFlagsInit);
+ yield take(ReduxActionTypes.FETCH_FEATURE_FLAGS_SUCCESS);
+ }
+
+ const featureFlags: FeatureFlags = yield select(selectFeatureFlags);
+
+ const isGACEnabled = featureFlags?.license_gac_enabled;
+
+ const isFreeLicense = !isGACEnabled;
+
if (!isAirgappedInstance) {
// We need to stop and start tracking activity to ensure that the tracking from previous session is not carried forward
UsagePulse.stopTrackingActivity();
UsagePulse.startTrackingActivity(
enableTelemetry && getAppsmithConfigs().segment.enabled,
currentUser?.isAnonymous ?? false,
+ isFreeLicense,
);
}
@@ -228,9 +246,8 @@ export function* forgotPasswordSaga(
);
const isValidResponse: boolean = yield validateResponse(response);
if (!isValidResponse) {
- const errorMessage: string | undefined = yield getResponseErrorMessage(
- response,
- );
+ const errorMessage: string | undefined =
+ yield getResponseErrorMessage(response);
yield call(reject, { _error: errorMessage });
} else {
yield put({
@@ -260,9 +277,8 @@ export function* resetPasswordSaga(
const response: ApiResponse = yield callAPI(UserApi.resetPassword, request);
const isValidResponse: boolean = yield validateResponse(response);
if (!isValidResponse) {
- const errorMessage: string | undefined = yield getResponseErrorMessage(
- response,
- );
+ const errorMessage: string | undefined =
+ yield getResponseErrorMessage(response);
yield call(reject, { _error: errorMessage });
} else {
yield put({
@@ -294,9 +310,8 @@ export function* invitedUserSignupSaga(
);
const isValidResponse: boolean = yield validateResponse(response);
if (!isValidResponse) {
- const errorMessage: string | undefined = yield getResponseErrorMessage(
- response,
- );
+ const errorMessage: string | undefined =
+ yield getResponseErrorMessage(response);
yield call(reject, { _error: errorMessage });
} else {
yield put(invitedUserSignupSuccess());
@@ -309,10 +324,10 @@ export function* invitedUserSignupSaga(
}
}
-type InviteUserPayload = {
+interface InviteUserPayload {
email: string;
permissionGroupId: string;
-};
+}
export function* inviteUser(payload: InviteUserPayload, reject: any) {
const response: ApiResponse = yield callAPI(UserApi.inviteUser, payload);
diff --git a/app/client/src/ce/selectors/entitiesSelector.ts b/app/client/src/ce/selectors/entitiesSelector.ts
index e7c414f902..35aa61a050 100644
--- a/app/client/src/ce/selectors/entitiesSelector.ts
+++ b/app/client/src/ce/selectors/entitiesSelector.ts
@@ -860,10 +860,13 @@ export const getPageActions = (pageId = "") => {
export const selectDatasourceIdToNameMap = createSelector(
getDatasources,
(datasources) => {
- return datasources.reduce((acc, datasource) => {
- acc[datasource.id] = datasource.name;
- return acc;
- }, {} as Record);
+ return datasources.reduce(
+ (acc, datasource) => {
+ acc[datasource.id] = datasource.name;
+ return acc;
+ },
+ {} as Record,
+ );
},
);
@@ -1185,9 +1188,8 @@ export const getDatasourceScopeValue = (
const options = formConfig[0]?.children?.find(
(child: any) => child?.configProperty === configProperty,
)?.options;
- const label = options?.find(
- (option: any) => option.value === scopeValue,
- )?.label;
+ const label = options?.find((option: any) => option.value === scopeValue)
+ ?.label;
return label;
};
diff --git a/app/client/src/ce/selectors/tenantSelectors.tsx b/app/client/src/ce/selectors/tenantSelectors.tsx
index 429d91d99e..d74c446251 100644
--- a/app/client/src/ce/selectors/tenantSelectors.tsx
+++ b/app/client/src/ce/selectors/tenantSelectors.tsx
@@ -48,3 +48,9 @@ export const getIsFormLoginEnabled = (state: AppState): boolean =>
export const getInstanceId = (state: AppState): string =>
state.tenant?.instanceId;
+
+// eslint-disable-next-line
+export const shouldShowLicenseBanner = (state: AppState) => false;
+
+export const getHideWatermark = (state: AppState): boolean =>
+ state.tenant?.tenantConfiguration?.hideWatermark;
diff --git a/app/client/src/ce/workers/Evaluation/Actions.ts b/app/client/src/ce/workers/Evaluation/Actions.ts
index 03d4d128a4..3dc9b0d46b 100644
--- a/app/client/src/ce/workers/Evaluation/Actions.ts
+++ b/app/client/src/ce/workers/Evaluation/Actions.ts
@@ -1,12 +1,12 @@
/* eslint-disable @typescript-eslint/ban-types */
import set from "lodash/set";
+import type { DataTreeEntityConfig } from "@appsmith/entities/DataTree/types";
import type {
ConfigTree,
DataTree,
DataTreeEntity,
- DataTreeEntityConfig,
-} from "@appsmith/entities/DataTree/types";
+} from "entities/DataTree/dataTreeTypes";
import type { EvalContext } from "workers/Evaluation/evaluate";
import type { EvaluationVersion } from "@appsmith/api/ApplicationApi";
import { addFn } from "workers/Evaluation/fns/utils/fnGuard";
@@ -113,7 +113,7 @@ export const addDataTreeToContext = (args: {
};
export const addPlatformFunctionsToEvalContext = (context: any) => {
- for (const fnDef of getPlatformFunctions(self.$cloudHosting)) {
+ for (const fnDef of getPlatformFunctions()) {
addFn(context, fnDef.name, fnDef.fn.bind(context));
}
};
@@ -174,7 +174,7 @@ export const getAllAsyncFunctions = (
}
const setterMethods = getAllSetterFunctions(dataTree, configTree);
allAsyncFunctions = { ...allAsyncFunctions, ...setterMethods };
- for (const platformFn of getPlatformFunctions(self.$cloudHosting)) {
+ for (const platformFn of getPlatformFunctions()) {
allAsyncFunctions[platformFn.name] = true;
}
return allAsyncFunctions;
diff --git a/app/client/src/ce/workers/Evaluation/__tests__/dataTreeUtils.test.ts b/app/client/src/ce/workers/Evaluation/__tests__/dataTreeUtils.test.ts
index 08742a7a71..4d0af2cc54 100644
--- a/app/client/src/ce/workers/Evaluation/__tests__/dataTreeUtils.test.ts
+++ b/app/client/src/ce/workers/Evaluation/__tests__/dataTreeUtils.test.ts
@@ -1,4 +1,4 @@
-import type { DataTree } from "@appsmith/entities/DataTree/types";
+import type { DataTree } from "entities/DataTree/dataTreeTypes";
import { makeEntityConfigsAsObjProperties } from "@appsmith/workers/Evaluation/dataTreeUtils";
import { smallDataSet } from "workers/Evaluation/__tests__/generateOpimisedUpdates.test";
import produce from "immer";
diff --git a/app/client/src/ce/workers/Evaluation/dataTreeUtils.ts b/app/client/src/ce/workers/Evaluation/dataTreeUtils.ts
index f5ea3b6fe5..814aaf2be2 100644
--- a/app/client/src/ce/workers/Evaluation/dataTreeUtils.ts
+++ b/app/client/src/ce/workers/Evaluation/dataTreeUtils.ts
@@ -1,4 +1,4 @@
-import type { DataTree } from "@appsmith/entities/DataTree/types";
+import type { DataTree } from "entities/DataTree/dataTreeTypes";
import { get, isObject, set, unset } from "lodash";
import { klona } from "klona/json";
import type { EvalProps } from "workers/common/DataTreeEvaluator";
diff --git a/app/client/src/ce/workers/Evaluation/evaluationUtils.test.ts b/app/client/src/ce/workers/Evaluation/evaluationUtils.test.ts
index 543dca900c..538663cf19 100644
--- a/app/client/src/ce/workers/Evaluation/evaluationUtils.test.ts
+++ b/app/client/src/ce/workers/Evaluation/evaluationUtils.test.ts
@@ -4,19 +4,20 @@ import { RenderModes } from "constants/WidgetConstants";
import { ValidationTypes } from "constants/WidgetValidation";
import type {
- ConfigTree,
- DataTreeEntity,
WidgetEntity,
WidgetEntityConfig,
+ PrivateWidgets,
+ JSActionEntity,
} from "@appsmith/entities/DataTree/types";
import {
ENTITY_TYPE_VALUE,
EvaluationSubstitutionType,
} from "entities/DataTree/dataTreeFactory";
import type {
- PrivateWidgets,
- JSActionEntity,
-} from "@appsmith/entities/DataTree/types";
+ ConfigTree,
+ DataTreeEntity,
+ DataTree,
+} from "entities/DataTree/dataTreeTypes";
import type { DataTreeDiff } from "@appsmith/workers/Evaluation/evaluationUtils";
import {
addErrorToEntityProperty,
@@ -36,7 +37,6 @@ import {
overrideWidgetProperties,
findDatatype,
} from "@appsmith/workers/Evaluation/evaluationUtils";
-import type { DataTree } from "@appsmith/entities/DataTree/types";
import type { EvalMetaUpdates } from "@appsmith/workers/common/DataTreeEvaluator/types";
import { generateDataTreeWidget } from "entities/DataTree/dataTreeWidget";
import TableWidget from "widgets/TableWidget";
diff --git a/app/client/src/ce/workers/Evaluation/evaluationUtils.ts b/app/client/src/ce/workers/Evaluation/evaluationUtils.ts
index 409511eac7..c48595c2b8 100644
--- a/app/client/src/ce/workers/Evaluation/evaluationUtils.ts
+++ b/app/client/src/ce/workers/Evaluation/evaluationUtils.ts
@@ -9,28 +9,28 @@ import {
} from "utils/DynamicBindingUtils";
import type { Diff } from "deep-diff";
import type {
- DataTree,
- AppsmithEntity,
DataTreeEntity,
- WidgetEntity,
- DataTreeEntityConfig,
+ DataTree,
ConfigTree,
- WidgetEntityConfig,
-} from "@appsmith/entities/DataTree/types";
+} from "entities/DataTree/dataTreeTypes";
import { ENTITY_TYPE_VALUE } from "@appsmith/entities/DataTree/types";
-import _, { difference, find, get, has, isNil, set } from "lodash";
+import _, { difference, find, get, has, isEmpty, isNil, set } from "lodash";
import type { WidgetTypeConfigMap } from "WidgetProvider/factory";
import { PluginType } from "entities/Action";
import { klona } from "klona/full";
import { warn as logWarn } from "loglevel";
import type { EvalMetaUpdates } from "@appsmith/workers/common/DataTreeEvaluator/types";
import { isObject } from "lodash";
-import type { DataTreeEntityObject } from "@appsmith/entities/DataTree/types";
import type {
JSActionEntityConfig,
PrivateWidgets,
JSActionEntity,
ActionEntity,
+ AppsmithEntity,
+ WidgetEntity,
+ DataTreeEntityConfig,
+ WidgetEntityConfig,
+ DataTreeEntityObject,
} from "@appsmith/entities/DataTree/types";
import type { EvalProps } from "workers/common/DataTreeEvaluator";
import { validateWidgetProperty } from "workers/common/DataTreeEvaluator/validationUtils";
@@ -47,13 +47,13 @@ export enum DataTreeDiffEvent {
NOOP = "NOOP", // No Operation (don’t do anything)
}
-export type DataTreeDiff = {
+export interface DataTreeDiff {
payload: {
propertyPath: string;
value?: string;
};
event: DataTreeDiffEvent;
-};
+}
export class CrashingError extends Error {}
@@ -656,7 +656,8 @@ export const isDynamicLeaf = (
return false;
const relativePropertyPath = convertPathToString(propPathEls);
return (
- relativePropertyPath in entityConfig.reactivePaths ||
+ (!isEmpty(entityConfig.reactivePaths) &&
+ relativePropertyPath in entityConfig.reactivePaths) ||
(isWidget(entityConfig) &&
relativePropertyPath in entityConfig?.triggerPaths)
);
@@ -782,6 +783,7 @@ export const overrideWidgetProperties = (params: {
isNewWidget: boolean;
shouldUpdateGlobalContext?: boolean;
overriddenProperties?: string[];
+ safeTree?: DataTree;
}) => {
const {
configTree,
@@ -792,14 +794,15 @@ export const overrideWidgetProperties = (params: {
isNewWidget,
overriddenProperties,
propertyPath,
+ safeTree,
shouldUpdateGlobalContext,
value,
} = params;
- const clonedValue = klona(value);
const { entityName } = getEntityNameAndPropertyPath(fullPropertyPath);
const configEntity = configTree[entityName] as WidgetEntityConfig;
if (propertyPath in configEntity.overridingPropertyPaths) {
+ const clonedValue = klona(value);
const overridingPropertyPaths =
configEntity.overridingPropertyPaths[propertyPath];
@@ -812,14 +815,12 @@ export const overrideWidgetProperties = (params: {
overridingPropertyPaths.forEach((overriddenPropertyPath) => {
const overriddenPropertyPathArray = overriddenPropertyPath.split(".");
if (pathsNotToOverride.includes(overriddenPropertyPath)) return;
- _.set(
- currentTree,
- [entityName, ...overriddenPropertyPathArray],
- clonedValue,
- );
+ const fullPath = [entityName, ...overriddenPropertyPathArray];
+ _.set(currentTree, fullPath, clonedValue);
+ if (safeTree) _.set(safeTree, fullPath, klona(value));
if (shouldUpdateGlobalContext) {
- _.set(self, [entityName, ...overriddenPropertyPathArray], clonedValue);
+ _.set(self, fullPath, clonedValue);
}
overriddenProperties?.push(overriddenPropertyPath);
// evalMetaUpdates has all updates from property which overrides meta values.
@@ -837,7 +838,7 @@ export const overrideWidgetProperties = (params: {
});
} else if (
propertyPath in configEntity.propertyOverrideDependency &&
- clonedValue === undefined
+ value === undefined
) {
// When a reset a widget its meta value becomes undefined, ideally they should reset to default value.
// below we handle logic to reset meta values to default values.
@@ -845,17 +846,14 @@ export const overrideWidgetProperties = (params: {
configEntity.propertyOverrideDependency[propertyPath];
if (propertyOverridingKeyMap.DEFAULT) {
const defaultValue = entity[propertyOverridingKeyMap.DEFAULT];
- const clonedDefaultValue = klona(defaultValue);
if (defaultValue !== undefined) {
- const propertyPathArray = propertyPath.split(".");
- _.set(
- currentTree,
- [entityName, ...propertyPathArray],
- clonedDefaultValue,
- );
+ const clonedDefaultValue = klona(defaultValue);
+ const fullPath = [entityName, ...propertyPath.split(".")];
+ _.set(currentTree, fullPath, clonedDefaultValue);
+ if (safeTree) _.set(safeTree, fullPath, klona(defaultValue));
if (shouldUpdateGlobalContext) {
- _.set(self, [entityName, ...propertyPathArray], clonedDefaultValue);
+ _.set(self, fullPath, clonedDefaultValue);
}
return {
@@ -866,14 +864,16 @@ export const overrideWidgetProperties = (params: {
}
}
};
+
export function isValidEntity(
entity: DataTreeEntity,
): entity is DataTreeEntityObject {
if (!isObject(entity)) {
return false;
}
- return "ENTITY_TYPE" in entity;
+ return true;
}
+
export const isATriggerPath = (
entityConfig: DataTreeEntityConfig,
propertyPath: string,
diff --git a/app/client/src/components/BottomBar/components.ts b/app/client/src/components/BottomBar/components.ts
new file mode 100644
index 0000000000..26d1bc7150
--- /dev/null
+++ b/app/client/src/components/BottomBar/components.ts
@@ -0,0 +1,19 @@
+import styled from "styled-components";
+import { Layers } from "constants/Layers";
+
+export const Container = styled.div`
+ width: 100%;
+ height: ${(props) => props.theme.bottomBarHeight};
+ display: flex;
+ position: fixed;
+ justify-content: space-between;
+ background-color: ${(props) => props.theme.colors.editorBottomBar.background};
+ z-index: ${Layers.bottomBar};
+ border-top: solid 1px var(--ads-v2-color-border);
+`;
+
+export const Wrapper = styled.div`
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+`;
diff --git a/app/client/src/components/BottomBar/index.tsx b/app/client/src/components/BottomBar/index.tsx
index 742733dbe3..26eca910ad 100644
--- a/app/client/src/components/BottomBar/index.tsx
+++ b/app/client/src/components/BottomBar/index.tsx
@@ -1,29 +1,11 @@
import React from "react";
-import styled from "styled-components";
import QuickGitActions from "pages/Editor/gitSync/QuickGitActions";
-import { Layers } from "constants/Layers";
import { DebuggerTrigger } from "components/editorComponents/Debugger";
import HelpButton from "pages/Editor/HelpButton";
import ManualUpgrades from "./ManualUpgrades";
import { Button } from "design-system";
import SwitchEnvironment from "@appsmith/components/SwitchEnvironment";
-
-const Container = styled.div`
- width: 100%;
- height: ${(props) => props.theme.bottomBarHeight};
- display: flex;
- position: fixed;
- justify-content: space-between;
- background-color: ${(props) => props.theme.colors.editorBottomBar.background};
- z-index: ${Layers.bottomBar};
- border-top: solid 1px var(--ads-v2-color-border);
-`;
-
-const Wrapper = styled.div`
- display: flex;
- align-items: center;
- justify-content: space-between;
-`;
+import { Container, Wrapper } from "./components";
export default function BottomBar({ viewMode }: { viewMode: boolean }) {
return (
diff --git a/app/client/src/components/Sidebar/SidebarButton.tsx b/app/client/src/components/Sidebar/SidebarButton.tsx
new file mode 100644
index 0000000000..91f90b8438
--- /dev/null
+++ b/app/client/src/components/Sidebar/SidebarButton.tsx
@@ -0,0 +1,42 @@
+import React from "react";
+import { Icon, Text } from "design-system";
+import styled from "styled-components";
+
+interface Props {
+ title: string;
+ selected: boolean;
+ icon: string;
+}
+
+const Container = styled.div`
+ display: flex;
+ justify-content: center;
+ flex-direction: column;
+ height: 64px;
+ width: 50px;
+ text-align: center;
+ align-items: center;
+ gap: 5px;
+`;
+
+const IconContainer = styled.div<{ selected: boolean }>`
+ padding: 2px;
+ background-color: ${(props) =>
+ props.selected ? "var(--ads-v2-color-bg-muted)" : "white"};
+ border-radius: 3px;
+ width: 28px;
+ cursor: pointer;
+`;
+
+function SidebarButton(props: Props) {
+ return (
+
+
+
+
+ {props.title}
+
+ );
+}
+
+export default SidebarButton;
diff --git a/app/client/src/components/Sidebar/index.tsx b/app/client/src/components/Sidebar/index.tsx
new file mode 100644
index 0000000000..0552130249
--- /dev/null
+++ b/app/client/src/components/Sidebar/index.tsx
@@ -0,0 +1,26 @@
+import React from "react";
+import { getIsAppSidebarEnabled } from "selectors/ideSelectors";
+import { useSelector } from "react-redux";
+import styled from "styled-components";
+import SidebarButton from "./SidebarButton";
+
+const Container = styled.div`
+ width: 50px;
+ border-right: 1px solid var(--ads-v2-color-border);
+ height: 100%;
+`;
+
+function Sidebar() {
+ const isAppSidebarEnabled = useSelector(getIsAppSidebarEnabled);
+ if (!isAppSidebarEnabled) {
+ return null;
+ }
+ return (
+
+
+
+
+ );
+}
+
+export default Sidebar;
diff --git a/app/client/src/components/TabItemBackgroundFill.tsx b/app/client/src/components/TabItemBackgroundFill.tsx
index c4d559be66..deb4e08220 100644
--- a/app/client/src/components/TabItemBackgroundFill.tsx
+++ b/app/client/src/components/TabItemBackgroundFill.tsx
@@ -4,11 +4,11 @@ import type { TabProp } from "design-system-old";
import { getTypographyByKey } from "design-system-old";
import type { Theme } from "constants/DefaultTheme";
-type WrapperProps = {
+interface WrapperProps {
selected: boolean;
vertical: boolean;
theme: Theme;
-};
+}
const getFocusedStyles = (props: WrapperProps) => `
background-color: ${props.theme.colors.tabItemBackgroundFill.highlightBackground};
diff --git a/app/client/src/components/common/Card.tsx b/app/client/src/components/common/Card.tsx
index 663c29aaa0..22f8e253ab 100644
--- a/app/client/src/components/common/Card.tsx
+++ b/app/client/src/components/common/Card.tsx
@@ -29,12 +29,12 @@ type CardProps = PropsWithChildren<{
isSelected?: boolean;
}>;
-type NameWrapperProps = {
+interface NameWrapperProps {
hasReadPermission: boolean;
showOverlay: boolean;
isContextMenuOpen: boolean;
testId: string;
-};
+}
type ModifiedMenuItemProps = MenuItemProps & {
key?: string;
diff --git a/app/client/src/components/designSystems/appsmith/BaseButton.tsx b/app/client/src/components/designSystems/appsmith/BaseButton.tsx
index 1f235ec5be..3b5cbbc63d 100644
--- a/app/client/src/components/designSystems/appsmith/BaseButton.tsx
+++ b/app/client/src/components/designSystems/appsmith/BaseButton.tsx
@@ -274,7 +274,7 @@ const StyledButton = styled((props) => (
: "none"} !important;
`;
-type ButtonStyleProps = {
+interface ButtonStyleProps {
buttonColor?: string;
buttonStyle?: ButtonStyleType;
prevButtonStyle?: ButtonStyleType;
@@ -283,7 +283,7 @@ type ButtonStyleProps = {
borderRadius?: ButtonBorderRadius;
iconName?: IconName;
iconAlign?: Alignment;
-};
+}
// To be used in any other part of the app
export function BaseButton(props: IButtonProps & ButtonStyleProps) {
diff --git a/app/client/src/components/designSystems/appsmith/CloseButton.tsx b/app/client/src/components/designSystems/appsmith/CloseButton.tsx
index 93de5c88dd..e46fa63531 100644
--- a/app/client/src/components/designSystems/appsmith/CloseButton.tsx
+++ b/app/client/src/components/designSystems/appsmith/CloseButton.tsx
@@ -3,12 +3,12 @@ import styled from "styled-components";
import type { Color } from "constants/Colors";
import { Button } from "@blueprintjs/core";
-type CloseButtonProps = {
+interface CloseButtonProps {
color: Color;
size: number;
onClick: React.MouseEventHandler;
className?: string;
-};
+}
const StyledButton = styled(Button)`
position: absolute;
diff --git a/app/client/src/components/designSystems/appsmith/CreatableDropdown.tsx b/app/client/src/components/designSystems/appsmith/CreatableDropdown.tsx
index 6888ff3cd7..3e20d9c5c7 100644
--- a/app/client/src/components/designSystems/appsmith/CreatableDropdown.tsx
+++ b/app/client/src/components/designSystems/appsmith/CreatableDropdown.tsx
@@ -6,7 +6,7 @@ import type { WrappedFieldInputProps, WrappedFieldMetaProps } from "redux-form";
import { theme } from "constants/DefaultTheme";
import type { SelectComponents } from "react-select/src/components";
-type DropdownProps = {
+interface DropdownProps {
options: Array<{
value: string;
label: string;
@@ -21,7 +21,7 @@ type DropdownProps = {
noOptionsMessage?: (obj: { inputValue: string }) => string;
inputValue?: string;
onInputChange: (value: string, actionMeta: InputActionMeta) => void;
-};
+}
const selectStyles = {
placeholder: (provided: any) => ({
diff --git a/app/client/src/components/designSystems/appsmith/DraggableListComponent.tsx b/app/client/src/components/designSystems/appsmith/DraggableListComponent.tsx
index 7f0a19a1b9..ed0f8341ca 100644
--- a/app/client/src/components/designSystems/appsmith/DraggableListComponent.tsx
+++ b/app/client/src/components/designSystems/appsmith/DraggableListComponent.tsx
@@ -11,7 +11,7 @@ const DroppableWrapper = styled.div`
width: 250px;
`;
-type RenderComponentProps = {
+interface RenderComponentProps {
index: number;
item: {
label: string;
@@ -22,7 +22,7 @@ type RenderComponentProps = {
updateOption: (index: number, value: string) => void;
toggleVisibility?: (index: number) => void;
onEdit?: (index: number) => void;
-};
+}
interface DroppableComponentProps {
items: Array>;
diff --git a/app/client/src/components/designSystems/appsmith/Dropdown.tsx b/app/client/src/components/designSystems/appsmith/Dropdown.tsx
index 1472cd8501..1906a41b9f 100644
--- a/app/client/src/components/designSystems/appsmith/Dropdown.tsx
+++ b/app/client/src/components/designSystems/appsmith/Dropdown.tsx
@@ -6,7 +6,7 @@ import type { SelectComponentsConfig } from "react-select/src/components";
import { LayersContext } from "constants/Layers";
import { Colors } from "constants/Colors";
-export type DropdownProps = {
+export interface DropdownProps {
options: Array<{
value: string;
label?: string;
@@ -19,7 +19,7 @@ export type DropdownProps = {
customSelectStyles?: any;
maxMenuHeight: number;
components?: SelectComponentsConfig;
-};
+}
const selectStyles = {
placeholder: (provided: any) => ({
diff --git a/app/client/src/components/designSystems/appsmith/ModalComponent.tsx b/app/client/src/components/designSystems/appsmith/ModalComponent.tsx
index 3d56415e43..f3521ae895 100644
--- a/app/client/src/components/designSystems/appsmith/ModalComponent.tsx
+++ b/app/client/src/components/designSystems/appsmith/ModalComponent.tsx
@@ -58,7 +58,7 @@ const Content = styled.div<{
height: ${(props) => (props.height ? `${props.height}px` : "auto")};
`;
-export type ModalComponentProps = {
+export interface ModalComponentProps {
isOpen: boolean;
onClose: (e: any) => void;
onModalClose?: () => void;
@@ -77,7 +77,7 @@ export type ModalComponentProps = {
hasBackDrop?: boolean;
zIndex?: number;
portalClassName?: string;
-};
+}
/* eslint-disable react/display-name */
export function ModalComponent(props: ModalComponentProps) {
diff --git a/app/client/src/components/designSystems/appsmith/PositionedContainer.tsx b/app/client/src/components/designSystems/appsmith/PositionedContainer.tsx
index 631bcca3b3..2578241646 100644
--- a/app/client/src/components/designSystems/appsmith/PositionedContainer.tsx
+++ b/app/client/src/components/designSystems/appsmith/PositionedContainer.tsx
@@ -30,7 +30,7 @@ const PositionedWidget = styled.div<{
z-index: ${(props) => props.zIndexOnHover} !important;
}
`;
-export type PositionedContainerProps = {
+export interface PositionedContainerProps {
componentWidth: number;
componentHeight: number;
children: ReactNode;
@@ -48,7 +48,7 @@ export type PositionedContainerProps = {
isDisabled?: boolean;
isVisible?: boolean;
widgetName: string;
-};
+}
export function PositionedContainer(
props: PositionedContainerProps,
diff --git a/app/client/src/components/designSystems/appsmith/SignPostingBanner.tsx b/app/client/src/components/designSystems/appsmith/SignPostingBanner.tsx
index 3bb836c4ba..258a04a9d5 100644
--- a/app/client/src/components/designSystems/appsmith/SignPostingBanner.tsx
+++ b/app/client/src/components/designSystems/appsmith/SignPostingBanner.tsx
@@ -3,10 +3,10 @@ import type { ReactNode } from "react";
import styled from "styled-components";
import { Icon } from "design-system";
-export type SignPostingBannerProps = {
+export interface SignPostingBannerProps {
iconName: string;
content: ReactNode;
-};
+}
export const Container = styled.div`
background-color: var(--ads-v2-color-blue-100);
diff --git a/app/client/src/components/designSystems/appsmith/TabbedView.tsx b/app/client/src/components/designSystems/appsmith/TabbedView.tsx
index 450d748144..7e3ccf26c9 100644
--- a/app/client/src/components/designSystems/appsmith/TabbedView.tsx
+++ b/app/client/src/components/designSystems/appsmith/TabbedView.tsx
@@ -38,7 +38,7 @@ const TabsWrapper = styled.div<{ shouldOverflow?: boolean }>`
}
`;
-type TabbedViewComponentType = {
+interface TabbedViewComponentType {
tabs: Array<{
key: string;
title: string;
@@ -47,7 +47,7 @@ type TabbedViewComponentType = {
selectedIndex?: number;
setSelectedIndex?: (selectedIndex: number) => void;
overflow?: boolean;
-};
+}
export function BaseTabbedView(props: TabbedViewComponentType) {
return (
diff --git a/app/client/src/components/designSystems/appsmith/header/DeployLinkButton.tsx b/app/client/src/components/designSystems/appsmith/header/DeployLinkButton.tsx
index d2113a283f..8853985a15 100644
--- a/app/client/src/components/designSystems/appsmith/header/DeployLinkButton.tsx
+++ b/app/client/src/components/designSystems/appsmith/header/DeployLinkButton.tsx
@@ -13,10 +13,10 @@ import {
import { Button } from "design-system";
import { KBEditorMenuItem } from "@appsmith/pages/Editor/KnowledgeBase/KBEditorMenuItem";
-type Props = {
+interface Props {
trigger: ReactNode;
link: string;
-};
+}
export const DeployLinkButton = (props: Props) => {
const dispatch = useDispatch();
diff --git a/app/client/src/components/designSystems/appsmith/header/ThreeDotsLoading.tsx b/app/client/src/components/designSystems/appsmith/header/ThreeDotsLoading.tsx
index 354e67999a..dea0d2ab7c 100644
--- a/app/client/src/components/designSystems/appsmith/header/ThreeDotsLoading.tsx
+++ b/app/client/src/components/designSystems/appsmith/header/ThreeDotsLoading.tsx
@@ -52,9 +52,9 @@ const Spinner = styled.div`
}
`;
-type Props = {
+interface Props {
className?: string;
-};
+}
function ThreeDotLoading(props: Props) {
return (
diff --git a/app/client/src/components/editorComponents/ActionCreator/helpers.tsx b/app/client/src/components/editorComponents/ActionCreator/helpers.tsx
index d5de020d2f..c534fe3f04 100644
--- a/app/client/src/components/editorComponents/ActionCreator/helpers.tsx
+++ b/app/client/src/components/editorComponents/ActionCreator/helpers.tsx
@@ -60,7 +60,7 @@ import {
isAction,
isJSAction,
} from "@appsmith/workers/Evaluation/evaluationUtils";
-import type { DataTreeEntity } from "@appsmith/entities/DataTree/types";
+import type { DataTreeEntity } from "entities/DataTree/dataTreeTypes";
const actionList: {
label: string;
diff --git a/app/client/src/components/editorComponents/ActionCreator/types.ts b/app/client/src/components/editorComponents/ActionCreator/types.ts
index b3e9a1e6d3..cff39c8abb 100644
--- a/app/client/src/components/editorComponents/ActionCreator/types.ts
+++ b/app/client/src/components/editorComponents/ActionCreator/types.ts
@@ -12,11 +12,11 @@ import type { Variants } from "./constants";
export type GenericFunction = (...args: any[]) => any;
-export type SwitchType = {
+export interface SwitchType {
id: string;
text: string;
action: () => void;
-};
+}
export type ActionIntegrationType =
(typeof APPSMITH_INTEGRATIONS)[keyof typeof APPSMITH_INTEGRATIONS];
@@ -26,12 +26,12 @@ export type ActionType =
export type ViewType = (typeof ViewTypes)[keyof typeof ViewTypes];
-export type ViewProps = {
+export interface ViewProps {
label: string;
get: GenericFunction;
set: GenericFunction;
value: string;
-};
+}
export type SelectorViewProps = ViewProps & {
options: TreeDropdownOption[];
@@ -61,15 +61,15 @@ export type ButtonViewProps = Omit & {
onClick: () => void;
};
-export type FieldConfig = {
+export interface FieldConfig {
getter: GenericFunction;
setter: GenericFunction;
view: ViewType;
-};
+}
export type FieldConfigs = Partial>;
-export type ActionCreatorProps = {
+export interface ActionCreatorProps {
value: string;
action: string;
onValueChange: (newValue: string, isUpdatedViaKeyboard: boolean) => void;
@@ -79,9 +79,9 @@ export type ActionCreatorProps = {
widgetType: string;
widgetName: string;
dataTreePath: string | undefined;
-};
+}
-export type Field = {
+export interface Field {
field: FieldType;
value?: string;
label?: string;
@@ -89,16 +89,16 @@ export type Field = {
position?: number;
getter?: (value: string) => string;
setter?: (value: string, newValue: string) => string;
-};
+}
-export type SelectorField = {
+export interface SelectorField {
field: FieldType;
getParentValue?: (value: string) => string;
value: string | undefined;
label?: string;
-};
+}
-export type FieldProps = {
+export interface FieldProps {
onValueChange: (
newValue: string,
isUpdatedViaKeyboard: boolean,
@@ -117,7 +117,7 @@ export type FieldProps = {
activeTabApiAndQueryCallback: SwitchType;
apiAndQueryCallbackTabSwitches: SwitchType[];
dataTreePath?: string | undefined;
-};
+}
export type FieldGroupProps = Omit<
FieldProps,
@@ -130,9 +130,13 @@ export type FieldGroupProps = Omit<
isChainedAction?: boolean;
};
-export type OptionListType = { label: string; value: string; id: string };
+export interface OptionListType {
+ label: string;
+ value: string;
+ id: string;
+}
-export type AppsmithFunctionConfigValues = {
+export interface AppsmithFunctionConfigValues {
label: (args: FieldProps) => string;
defaultText: string;
options: (args: FieldProps) => null | TreeDropdownOption[] | OptionListType;
@@ -145,49 +149,49 @@ export type AppsmithFunctionConfigValues = {
view: ViewType;
exampleText: string;
toolTip?: string;
-};
+}
-export type AppsmithFunctionConfigType = {
+export interface AppsmithFunctionConfigType {
[key: string]: AppsmithFunctionConfigValues;
-};
+}
-export type DataTreeForActionCreator = {
+export interface DataTreeForActionCreator {
[key: string]: {
ENTITY_TYPE?: ENTITY_TYPE;
meta?: Record;
};
-};
+}
-export type FieldGroupValueType = {
+export interface FieldGroupValueType {
label: string;
fields: string[];
defaultParams: string;
value?: string;
children?: TreeDropdownOption[];
icon?: IconName;
-};
+}
-export type FieldGroupConfig = {
+export interface FieldGroupConfig {
[key: string]: FieldGroupValueType;
-};
+}
export interface CallbackBlock extends ActionTree {
type: "success" | "failure" | "then" | "catch";
}
-export type ActionTree = {
+export interface ActionTree {
code: string;
actionType: (typeof AppsmithFunction)[keyof typeof AppsmithFunction];
successBlocks: CallbackBlock[];
errorBlocks: CallbackBlock[];
-};
+}
-export type SelectedActionBlock = {
+export interface SelectedActionBlock {
type: "success" | "failure";
index: number;
-};
+}
-export type TActionBlock = {
+export interface TActionBlock {
code: string;
actionType: (typeof AppsmithFunction)[keyof typeof AppsmithFunction];
success: {
@@ -199,6 +203,6 @@ export type TActionBlock = {
blocks: TActionBlock[];
};
type?: "success" | "failure" | "then" | "catch";
-};
+}
export type VariantType = keyof typeof Variants;
diff --git a/app/client/src/components/editorComponents/ActionCreator/viewComponents/Action/ActionCard.tsx b/app/client/src/components/editorComponents/ActionCreator/viewComponents/Action/ActionCard.tsx
index 931272a2e9..43390754eb 100644
--- a/app/client/src/components/editorComponents/ActionCreator/viewComponents/Action/ActionCard.tsx
+++ b/app/client/src/components/editorComponents/ActionCreator/viewComponents/Action/ActionCard.tsx
@@ -6,7 +6,7 @@ import { AppsmithFunction } from "../../constants";
import type { TActionBlock, VariantType } from "../../types";
import { getActionInfo } from "../ActionBlockTree/utils";
-type TActionCardProps = {
+interface TActionCardProps {
onSelect: () => void;
selected: boolean;
actionBlock: TActionBlock;
@@ -15,7 +15,7 @@ type TActionCardProps = {
showCallbacks?: boolean;
id: string;
level: number;
-};
+}
function ActionCard(props: TActionCardProps) {
const actionBlock = props.actionBlock;
diff --git a/app/client/src/components/editorComponents/ActionCreator/viewComponents/Action/ActionSelector.tsx b/app/client/src/components/editorComponents/ActionCreator/viewComponents/Action/ActionSelector.tsx
index bf512a44f0..45d39058e2 100644
--- a/app/client/src/components/editorComponents/ActionCreator/viewComponents/Action/ActionSelector.tsx
+++ b/app/client/src/components/editorComponents/ActionCreator/viewComponents/Action/ActionSelector.tsx
@@ -63,12 +63,12 @@ export default function ActionSelector(props: {
);
}
-type TActionSelectorFormProps = {
+interface TActionSelectorFormProps {
action: TActionBlock;
onChange: (actionBlock: TActionBlock, del?: boolean) => void;
additionalAutoComplete?: AdditionalDynamicDataTree;
dataTreePath: string | undefined;
-};
+}
const pathClassList = [
"CodeMirror-hints",
diff --git a/app/client/src/components/editorComponents/ActionCreator/viewComponents/Action/index.tsx b/app/client/src/components/editorComponents/ActionCreator/viewComponents/Action/index.tsx
index 3db232e361..60e5cc7628 100644
--- a/app/client/src/components/editorComponents/ActionCreator/viewComponents/Action/index.tsx
+++ b/app/client/src/components/editorComponents/ActionCreator/viewComponents/Action/index.tsx
@@ -4,7 +4,7 @@ import { useApisQueriesAndJsActionOptions } from "../../helpers";
import type { TActionBlock } from "../../types";
import { actionToCode, codeToAction } from "../../utils";
-type TRootActionProps = {
+interface TRootActionProps {
code: string;
id: string;
onChange: (code: string) => void;
@@ -13,7 +13,7 @@ type TRootActionProps = {
widgetName: string;
widgetType: string;
dataTreePath: string | undefined;
-};
+}
export default function Action(props: TRootActionProps) {
const { code, id, onChange } = props;
diff --git a/app/client/src/components/editorComponents/ActionCreator/viewComponents/TabView/index.tsx b/app/client/src/components/editorComponents/ActionCreator/viewComponents/TabView/index.tsx
index 8f0ebc163f..4cfa4373d2 100644
--- a/app/client/src/components/editorComponents/ActionCreator/viewComponents/TabView/index.tsx
+++ b/app/client/src/components/editorComponents/ActionCreator/viewComponents/TabView/index.tsx
@@ -6,11 +6,11 @@ import {
import { SegmentedControl } from "design-system";
import React from "react";
-type Option = {
+interface Option {
id: string;
text: string;
action: () => void;
-};
+}
export function TabView(props: TabViewProps) {
const onClick = (id: string) => {
diff --git a/app/client/src/components/editorComponents/ActionExecutionInProgressView.tsx b/app/client/src/components/editorComponents/ActionExecutionInProgressView.tsx
index 929a855add..0232dfe30c 100644
--- a/app/client/src/components/editorComponents/ActionExecutionInProgressView.tsx
+++ b/app/client/src/components/editorComponents/ActionExecutionInProgressView.tsx
@@ -36,10 +36,10 @@ const handleCancelActionExecution = () => {
ActionAPI.abortActionExecutionTokenSource.cancel();
};
-type ActionExecutionInProgressViewProps = {
+interface ActionExecutionInProgressViewProps {
actionType: string;
theme?: EditorTheme;
-};
+}
const ActionExecutionInProgressView = ({
actionType,
diff --git a/app/client/src/components/editorComponents/ActionNameEditor.tsx b/app/client/src/components/editorComponents/ActionNameEditor.tsx
index 66951c26fe..88e301911a 100644
--- a/app/client/src/components/editorComponents/ActionNameEditor.tsx
+++ b/app/client/src/components/editorComponents/ActionNameEditor.tsx
@@ -58,7 +58,7 @@ const ApiIconBox = styled.div`
margin-right: 8px;
flex-shrink: 0;
`;
-type ActionNameEditorProps = {
+interface ActionNameEditorProps {
/*
This prop checks if page is API Pane or Query Pane or Curl Pane
So, that we can toggle between ads editable-text component and existing editable-text component
@@ -67,7 +67,7 @@ type ActionNameEditorProps = {
*/
page?: string;
disabled?: boolean;
-};
+}
function ActionNameEditor(props: ActionNameEditorProps) {
const params = useParams<{ apiId?: string; queryId?: string }>();
diff --git a/app/client/src/components/editorComponents/ActionRightPane/Connections.tsx b/app/client/src/components/editorComponents/ActionRightPane/Connections.tsx
index 4d055259fd..0b9d9da15d 100644
--- a/app/client/src/components/editorComponents/ActionRightPane/Connections.tsx
+++ b/app/client/src/components/editorComponents/ActionRightPane/Connections.tsx
@@ -85,13 +85,13 @@ function Dependencies(props: any) {
);
}
-type ConnectionsProps = {
+interface ConnectionsProps {
actionName: string;
entityDependencies: {
inverseDependencies: string[];
directDependencies: string[];
} | null;
-};
+}
function Connections(props: ConnectionsProps) {
return (
diff --git a/app/client/src/components/editorComponents/ActionRightPane/SuggestedWidgets.tsx b/app/client/src/components/editorComponents/ActionRightPane/SuggestedWidgets.tsx
index feb97b6099..367cd3e6f1 100644
--- a/app/client/src/components/editorComponents/ActionRightPane/SuggestedWidgets.tsx
+++ b/app/client/src/components/editorComponents/ActionRightPane/SuggestedWidgets.tsx
@@ -152,14 +152,14 @@ const SuggestedWidgetContainer = styled.div`
overflow: hidden;
`;
-type WidgetBindingInfo = {
+interface WidgetBindingInfo {
label: string;
propertyName: string;
widgetName: string;
image?: string;
icon?: string;
existingImage?: string;
-};
+}
export const WIDGET_DATA_FIELD_MAP: Record = {
LIST_WIDGET: {
@@ -305,11 +305,11 @@ function getWidgetProps(
}
}
-type SuggestedWidgetProps = {
+interface SuggestedWidgetProps {
actionName: string;
suggestedWidgets: SuggestedWidget[];
hasWidgets: boolean;
-};
+}
function renderHeading(heading: string, subHeading: string) {
return (
@@ -491,7 +491,7 @@ function SuggestedWidgets(props: SuggestedWidgetProps) {
eventParams: {
[FEATURE_WALKTHROUGH_KEYS.ds_binding]: true,
},
- delay: 5000,
+ delay: 2500,
});
};
diff --git a/app/client/src/components/editorComponents/ActionRightPane/index.tsx b/app/client/src/components/editorComponents/ActionRightPane/index.tsx
index 177f3d81a2..948c4d0398 100644
--- a/app/client/src/components/editorComponents/ActionRightPane/index.tsx
+++ b/app/client/src/components/editorComponents/ActionRightPane/index.tsx
@@ -27,7 +27,7 @@ import {
getCurrentPageId,
getPagePermissions,
} from "selectors/editorSelectors";
-import { builderURL } from "RouteBuilder";
+import { builderURL } from "@appsmith/RouteBuilder";
import DatasourceStructureHeader from "pages/Editor/Explorer/Datasources/DatasourceStructureHeader";
import {
DatasourceStructureContainer as DataStructureList,
@@ -185,7 +185,7 @@ const CollapsibleSection = styled.div<{ height: string; marginTop?: number }>`
}
`;
-type CollapsibleProps = {
+interface CollapsibleProps {
expand?: boolean;
children: ReactNode;
label: string;
@@ -193,12 +193,12 @@ type CollapsibleProps = {
isDisabled?: boolean;
datasourceId?: string;
containerRef?: MutableRefObject;
-};
+}
-type DisabledCollapsibleProps = {
+interface DisabledCollapsibleProps {
label: string;
tooltipLabel?: string;
-};
+}
export function Collapsible({
children,
@@ -391,7 +391,7 @@ function ActionSidebar({
eventParams: {
[FEATURE_WALKTHROUGH_KEYS.ds_schema]: true,
},
- delay: 5000,
+ delay: 2500,
});
};
diff --git a/app/client/src/components/editorComponents/ApiResponseView.tsx b/app/client/src/components/editorComponents/ApiResponseView.tsx
index 38a62abb7c..d597c911f9 100644
--- a/app/client/src/components/editorComponents/ApiResponseView.tsx
+++ b/app/client/src/components/editorComponents/ApiResponseView.tsx
@@ -64,9 +64,9 @@ import ActionExecutionInProgressView from "./ActionExecutionInProgressView";
import { CloseDebugger } from "./Debugger/DebuggerTabs";
import { EMPTY_RESPONSE } from "./emptyResponse";
-type TextStyleProps = {
+interface TextStyleProps {
accent: "primary" | "secondary" | "error";
-};
+}
export const BaseText = styled(BlueprintText)``;
const ResponseContainer = styled.div`
diff --git a/app/client/src/components/editorComponents/Button.tsx b/app/client/src/components/editorComponents/Button.tsx
index f7d5842283..cdcd1a2229 100644
--- a/app/client/src/components/editorComponents/Button.tsx
+++ b/app/client/src/components/editorComponents/Button.tsx
@@ -81,7 +81,7 @@ const StyledAnchorButton = styled(
${buttonStyles}
`;
-export type ButtonProps = {
+export interface ButtonProps {
outline?: boolean;
filled?: boolean;
intent?: Intent;
@@ -101,7 +101,7 @@ export type ButtonProps = {
borderRadius?: string;
boxShadow?: string;
boxShadowColor?: string;
-};
+}
export const Button = (props: ButtonProps) => {
const icon: IconName | undefined =
diff --git a/app/client/src/components/editorComponents/CloseEditor.tsx b/app/client/src/components/editorComponents/CloseEditor.tsx
index 9a1b33f719..2ed7edda42 100644
--- a/app/client/src/components/editorComponents/CloseEditor.tsx
+++ b/app/client/src/components/editorComponents/CloseEditor.tsx
@@ -9,7 +9,7 @@ import {
builderURL,
generateTemplateFormURL,
integrationEditorURL,
-} from "RouteBuilder";
+} from "@appsmith/RouteBuilder";
import { useSelector } from "react-redux";
import { getCurrentPageId } from "selectors/editorSelectors";
import AnalyticsUtil from "utils/AnalyticsUtil";
diff --git a/app/client/src/components/editorComponents/CodeEditor/EditorConfig.ts b/app/client/src/components/editorComponents/CodeEditor/EditorConfig.ts
index a6228afe78..e37c6ed700 100644
--- a/app/client/src/components/editorComponents/CodeEditor/EditorConfig.ts
+++ b/app/client/src/components/editorComponents/CodeEditor/EditorConfig.ts
@@ -1,5 +1,6 @@
import type CodeMirror from "codemirror";
-import type { DataTree, ENTITY_TYPE } from "@appsmith/entities/DataTree/types";
+import type { ENTITY_TYPE } from "@appsmith/entities/DataTree/types";
+import type { DataTree } from "entities/DataTree/dataTreeTypes";
import type { AutocompleteDataType } from "utils/autocomplete/AutocompleteDataType";
import type { EntityNavigationData } from "selectors/navigationSelectors";
import type { ExpectedValueExample } from "utils/validation/common";
@@ -36,7 +37,7 @@ export enum EditorSize {
COMPACT_RETAIN_FORMATTING = "COMPACT_RETAIN_FORMATTING",
}
-export type EditorConfig = {
+export interface EditorConfig {
theme: EditorTheme;
mode: TEditorModes;
tabBehaviour: TabBehaviour;
@@ -44,14 +45,14 @@ export type EditorConfig = {
hinting?: Array;
marking?: Array;
folding?: boolean;
-};
+}
export const EditorThemes: Record = {
[EditorTheme.LIGHT]: "duotone-light",
[EditorTheme.DARK]: "duotone-dark",
};
-export type FieldEntityInformation = {
+export interface FieldEntityInformation {
entityName?: string;
expectedType?: AutocompleteDataType;
entityType?: ENTITY_TYPE;
@@ -62,13 +63,13 @@ export type FieldEntityInformation = {
mode?: TEditorModes;
token?: CodeMirror.Token;
widgetType?: WidgetType;
-};
+}
export type HintHelper = (
editor: CodeMirror.Editor,
entitiesForNavigation: EntityNavigationData,
) => Hinter;
-export type Hinter = {
+export interface Hinter {
showHint: (
editor: CodeMirror.Editor,
entityInformation: FieldEntityInformation,
@@ -76,7 +77,7 @@ export type Hinter = {
) => boolean;
update?: (data: DataTree) => void;
fireOnFocus?: boolean;
-};
+}
export type MarkHelper = (
editor: CodeMirror.Editor,
diff --git a/app/client/src/components/editorComponents/CodeEditor/EvaluatedValuePopup.tsx b/app/client/src/components/editorComponents/CodeEditor/EvaluatedValuePopup.tsx
index 1e18442dde..4a353f4545 100644
--- a/app/client/src/components/editorComponents/CodeEditor/EvaluatedValuePopup.tsx
+++ b/app/client/src/components/editorComponents/CodeEditor/EvaluatedValuePopup.tsx
@@ -271,10 +271,10 @@ const PreparedStatementParameter = styled.span`
color: #333;
`;
-type PreparedStatementValue = {
+interface PreparedStatementValue {
value: string;
parameters: Record;
-};
+}
export function PreparedStatementViewer(props: {
evaluatedValue: PreparedStatementValue;
}) {
diff --git a/app/client/src/components/editorComponents/CodeEditor/PeekOverlayPopup/PeekOverlayPopup.tsx b/app/client/src/components/editorComponents/CodeEditor/PeekOverlayPopup/PeekOverlayPopup.tsx
index 9dd7fa1c32..117e77b6ad 100644
--- a/app/client/src/components/editorComponents/CodeEditor/PeekOverlayPopup/PeekOverlayPopup.tsx
+++ b/app/client/src/components/editorComponents/CodeEditor/PeekOverlayPopup/PeekOverlayPopup.tsx
@@ -13,12 +13,12 @@ import { getConfigTree, getDataTree } from "selectors/dataTreeSelectors";
import { filterInternalProperties } from "utils/FilterInternalProperties";
import { getJSCollections } from "@appsmith/selectors/entitiesSelector";
-export type PeekOverlayStateProps = {
+export interface PeekOverlayStateProps {
objectName: string;
propertyPath: string[];
position: DOMRect;
textWidth: number;
-};
+}
/*
* using `componentWillAppendToBody` to work with variable height for peek overlay
diff --git a/app/client/src/components/editorComponents/CodeEditor/assistiveBindingHinter.ts b/app/client/src/components/editorComponents/CodeEditor/assistiveBindingHinter.ts
index 515a278cc5..86ace15717 100644
--- a/app/client/src/components/editorComponents/CodeEditor/assistiveBindingHinter.ts
+++ b/app/client/src/components/editorComponents/CodeEditor/assistiveBindingHinter.ts
@@ -33,6 +33,7 @@ export const assistiveBindingHinter: HintHelper = (
enableAIAssistance,
executeCommand,
featureFlags,
+ focusEditor,
pluginIdToImageLocation,
recentEntities,
}: {
@@ -44,6 +45,7 @@ export const assistiveBindingHinter: HintHelper = (
entityId: string;
featureFlags: FeatureFlags;
enableAIAssistance: boolean;
+ focusEditor: (focusOnLine?: number, chOffset?: number) => void;
},
): boolean => {
// @ts-expect-error: Types are not available
@@ -135,15 +137,7 @@ export const assistiveBindingHinter: HintHelper = (
}
const cursor = editor.getCursor();
const currentLine = cursor.line;
- const currentCursorPosition = cursor.ch;
- const newCursorPosition = currentCursorPosition - 2; //offset cursor before the ending moustache braces '}}'
- setTimeout(() => {
- editor.focus();
- editor.setCursor({
- line: currentLine,
- ch: newCursorPosition,
- });
- });
+ focusEditor(currentLine, 2);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { data } = selected;
const { name, type } = data as NavigationData;
diff --git a/app/client/src/components/editorComponents/CodeEditor/commandsHelper.ts b/app/client/src/components/editorComponents/CodeEditor/commandsHelper.ts
index e0a4821c78..801306adb0 100644
--- a/app/client/src/components/editorComponents/CodeEditor/commandsHelper.ts
+++ b/app/client/src/components/editorComponents/CodeEditor/commandsHelper.ts
@@ -16,6 +16,7 @@ import type {
EntityNavigationData,
NavigationData,
} from "selectors/navigationSelectors";
+import { getAIContext } from "@appsmith/components/editorComponents/GPT/trigger";
export const slashCommandHintHelper: HintHelper = (
_,
@@ -33,18 +34,18 @@ export const slashCommandHintHelper: HintHelper = (
enableAIAssistance,
executeCommand,
featureFlags,
+ focusEditor,
pluginIdToImageLocation,
recentEntities,
- update,
}: {
datasources: Datasource[];
executeCommand: (payload: SlashCommandPayload) => void;
pluginIdToImageLocation: Record;
recentEntities: string[];
- update: (value: string) => void;
entityId: string;
featureFlags: FeatureFlags;
enableAIAssistance: boolean;
+ focusEditor: (focusOnLine?: number, chOffset?: number) => void;
},
): boolean => {
// @ts-expect-error: Types are not available
@@ -57,16 +58,30 @@ export const slashCommandHintHelper: HintHelper = (
},
);
const cursorBetweenBinding = checkIfCursorInsideBinding(editor);
- const value = editor.getValue();
- const slashIndex = value.lastIndexOf("/");
+ const cursorPosition = editor.getCursor();
+ const currentLineValue = editor.getLine(cursorPosition.line);
+ const slashIndex = currentLineValue.lastIndexOf("/");
const shouldShowBinding = !cursorBetweenBinding && slashIndex > -1;
+ const searchText = currentLineValue.substring(slashIndex + 1);
+
if (!shouldShowBinding) return false;
- const searchText = value.substring(slashIndex + 1);
+
+ const aiContext = getAIContext({
+ currentLineValue,
+ cursorPosition,
+ editor,
+ slashIndex,
+ entityType,
+ });
+
+ if (!aiContext) return false;
+
const list = generateQuickCommands(
filteredEntitiesForSuggestions,
currentEntityType,
searchText,
{
+ aiContext,
datasources,
executeCommand,
pluginIdToImageLocation,
@@ -96,20 +111,21 @@ export const slashCommandHintHelper: HintHelper = (
currentSelection = selected;
}
function handlePick(selected: CommandsCompletion) {
- update(value.slice(0, slashIndex) + selected.text);
- setTimeout(() => {
- editor.focus();
- editor.setCursor({
- line: editor.lineCount() - 1,
- ch: editor.getLine(editor.lineCount() - 1).length - 2,
- });
- if (selected.action && typeof selected.action === "function") {
- selected.action();
- } else {
- selected.triggerCompletionsPostPick &&
- CodeMirror.signal(editor, "postPick", selected.displayText);
- }
- });
+ if (selected.action && typeof selected.action === "function") {
+ const callback = (completion: string) => {
+ editor.replaceRange(completion, cursor);
+ };
+ selected.action(callback);
+ }
+
+ // Focus on the editor if the selected command has text
+ if (selected.text) {
+ focusEditor(cursorPosition.line, 2);
+ }
+
+ selected.triggerCompletionsPostPick &&
+ CodeMirror.signal(editor, "postPick", selected.displayText);
+
try {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { data, render, ...rest } = selected;
diff --git a/app/client/src/components/editorComponents/CodeEditor/generateQuickCommands.tsx b/app/client/src/components/editorComponents/CodeEditor/generateQuickCommands.tsx
index 3ed530035b..85cde062f5 100644
--- a/app/client/src/components/editorComponents/CodeEditor/generateQuickCommands.tsx
+++ b/app/client/src/components/editorComponents/CodeEditor/generateQuickCommands.tsx
@@ -14,6 +14,7 @@ import { DatasourceCreateEntryPoints } from "constants/Datasource";
import AnalyticsUtil from "utils/AnalyticsUtil";
import BetaCard from "../BetaCard";
import type { NavigationData } from "selectors/navigationSelectors";
+import type { AIEditorContext } from "@appsmith/components/editorComponents/GPT";
import type { ENTITY_TYPE } from "@appsmith/entities/DataTree/types";
export enum Shortcuts {
@@ -118,11 +119,13 @@ export const generateQuickCommands = (
currentEntityType: ENTITY_TYPE,
searchText: string,
{
+ aiContext,
datasources,
enableAIAssistance,
executeCommand,
pluginIdToImageLocation,
}: {
+ aiContext: AIEditorContext;
datasources: Datasource[];
executeCommand: (payload: SlashCommandPayload) => void;
pluginIdToImageLocation: Record;
@@ -198,10 +201,11 @@ export const generateQuickCommands = (
displayText: `${action.name}`,
className: "CodeMirror-commands",
data: action,
- action: () =>
+ action: (callback?: (completion: string) => void) =>
executeCommand({
actionType: SlashCommand.NEW_QUERY,
args: { datasource: action },
+ callback,
}),
render: (element: HTMLElement, self: any, data: CommandsCompletion) => {
const completionData = data.data as Datasource;
@@ -221,12 +225,9 @@ export const generateQuickCommands = (
},
};
});
- const suggestionsMatchingSearchText = matchingCommands(
- suggestions,
- searchText,
- 5,
- );
- const actionCommands = [newBinding];
+
+ const filteredCommands: CommandsCompletion[] = [];
+ const commonCommands: CommandsCompletion[] = [];
if (enableAIAssistance) {
const askGPT: CommandsCompletion = generateCreateNewCommand({
@@ -236,36 +237,72 @@ export const generateQuickCommands = (
triggerCompletionsPostPick: true,
description: "Generate code using AI",
isBeta: true,
+ action: () => {
+ executeCommand({
+ actionType: SlashCommand.ASK_AI,
+ args: aiContext,
+ });
+ },
});
- actionCommands.unshift(askGPT);
+ commonCommands.unshift(askGPT);
}
- const createNewCommands: CommandsCompletion[] = [];
- if (currentEntityType === ENTITY_TYPE_VALUE.WIDGET)
- createNewCommands.push(...datasourceCommands);
+ if (currentEntityType !== ENTITY_TYPE_VALUE.JSACTION) {
+ // New binding command is not applicable in JS Objects
+ commonCommands.push(newBinding);
+ }
- const createNewCommandsMatchingSearchText = matchingCommands(
- createNewCommands,
- searchText,
- 3,
- );
- const actionCommandsMatchingSearchText = matchingCommands(
- actionCommands,
+ // Filter common commands based on search text
+ const commonCommandsMatchingSearchText = matchingCommands(
+ commonCommands,
searchText,
);
- if (currentEntityType === ENTITY_TYPE_VALUE.WIDGET) {
- createNewCommandsMatchingSearchText.push(
- ...matchingCommands([newIntegration], searchText),
+
+ filteredCommands.push(...commonCommandsMatchingSearchText);
+
+ if (currentEntityType !== ENTITY_TYPE_VALUE.JSACTION) {
+ // Binding suggestions and create query commands are not applicable in JS Objects
+
+ // Get top 5 matching suggestions
+ const suggestionsMatchingSearchText = matchingCommands(
+ suggestions,
+ searchText,
+ 5,
);
+
+ if (suggestionsMatchingSearchText.length) {
+ // Add header only if there are suggestions
+ filteredCommands.push(
+ commandsHeader("Bind data", "", filteredCommands.length > 0),
+ );
+ filteredCommands.push(...suggestionsMatchingSearchText);
+ }
+
+ if (currentEntityType === ENTITY_TYPE_VALUE.WIDGET) {
+ const createNewCommands: CommandsCompletion[] = [];
+ createNewCommands.push(...datasourceCommands);
+
+ // Get top 3 matching create new commands
+ const createNewCommandsMatchingSearchText = matchingCommands(
+ createNewCommands,
+ searchText,
+ 3,
+ );
+
+ // Check if new integration command matches search text
+ createNewCommandsMatchingSearchText.push(
+ ...matchingCommands([newIntegration], searchText),
+ );
+
+ if (createNewCommandsMatchingSearchText.length) {
+ // Add header only if there are create new commands
+ filteredCommands.push(
+ commandsHeader("Create a query", "", filteredCommands.length > 0),
+ );
+ filteredCommands.push(...createNewCommandsMatchingSearchText);
+ }
+ }
}
- const list: CommandsCompletion[] = actionCommandsMatchingSearchText;
- if (suggestionsMatchingSearchText.length) {
- list.push(commandsHeader("Bind data", "", list.length > 0));
- }
- list.push(...suggestionsMatchingSearchText);
- if (createNewCommandsMatchingSearchText.length) {
- list.push(commandsHeader("Create a query", "", list.length > 0));
- }
- list.push(...createNewCommandsMatchingSearchText);
- return list;
+
+ return filteredCommands;
};
diff --git a/app/client/src/components/editorComponents/CodeEditor/hintHelpers.test.ts b/app/client/src/components/editorComponents/CodeEditor/hintHelpers.test.ts
index b40d7cdeff..a1961e5664 100644
--- a/app/client/src/components/editorComponents/CodeEditor/hintHelpers.test.ts
+++ b/app/client/src/components/editorComponents/CodeEditor/hintHelpers.test.ts
@@ -12,12 +12,12 @@ describe("hint helpers", () => {
it("opens hint correctly", () => {
// Setup
- type Case = {
+ interface Case {
value: string;
cursor: { ch: number; line: number };
toCall: "closeHint" | "showHint";
getLine?: string[];
- };
+ }
const cases: Case[] = [
{ value: "ABC", cursor: { ch: 3, line: 0 }, toCall: "closeHint" },
{ value: "{{ }}", cursor: { ch: 3, line: 0 }, toCall: "showHint" },
diff --git a/app/client/src/components/editorComponents/CodeEditor/hintHelpers.ts b/app/client/src/components/editorComponents/CodeEditor/hintHelpers.ts
index d9fe5171c8..3e5714b8eb 100644
--- a/app/client/src/components/editorComponents/CodeEditor/hintHelpers.ts
+++ b/app/client/src/components/editorComponents/CodeEditor/hintHelpers.ts
@@ -15,8 +15,9 @@ import {
filterCompletions,
getHintDetailsFromClassName,
} from "./utils/sqlHint";
+import { isAISlashCommand } from "@appsmith/components/editorComponents/GPT/trigger";
-export const bindingHintHelper: HintHelper = (editor) => {
+export const bindingHintHelper: HintHelper = (editor: CodeMirror.Editor) => {
editor.setOption("extraKeys", {
// @ts-expect-error: Types are not available
...editor.options.extraKeys,
@@ -46,11 +47,17 @@ export const bindingHintHelper: HintHelper = (editor) => {
const entityType = entityInformation?.entityType;
let shouldShow = false;
+
if (entityType === ENTITY_TYPE_VALUE.JSACTION) {
- shouldShow = true;
+ if (additionalData?.enableAIAssistance) {
+ shouldShow = !isAISlashCommand(editor);
+ } else {
+ shouldShow = true;
+ }
} else {
shouldShow = checkIfCursorInsideBinding(editor);
}
+
if (shouldShow) {
CodemirrorTernService.complete(editor);
diff --git a/app/client/src/components/editorComponents/CodeEditor/index.tsx b/app/client/src/components/editorComponents/CodeEditor/index.tsx
index 46b40f5181..a1c5598d04 100644
--- a/app/client/src/components/editorComponents/CodeEditor/index.tsx
+++ b/app/client/src/components/editorComponents/CodeEditor/index.tsx
@@ -27,14 +27,12 @@ import "codemirror/addon/hint/sql-hint";
import { getDataTreeForAutocomplete } from "selectors/dataTreeSelectors";
import EvaluatedValuePopup from "components/editorComponents/CodeEditor/EvaluatedValuePopup";
import type { WrappedFieldInputProps } from "redux-form";
-import _, { debounce, isEqual } from "lodash";
+import _, { debounce, isEqual, isNumber } from "lodash";
import scrollIntoView from "scroll-into-view-if-needed";
import { ENTITY_TYPE_VALUE } from "entities/DataTree/dataTreeFactory";
-import type {
- DataTree,
- EvaluationSubstitutionType,
-} from "@appsmith/entities/DataTree/types";
+import type { EvaluationSubstitutionType } from "@appsmith/entities/DataTree/types";
+import type { DataTree } from "entities/DataTree/dataTreeTypes";
import { Skin } from "constants/DefaultTheme";
import AnalyticsUtil from "utils/AnalyticsUtil";
import "components/editorComponents/CodeEditor/sql/customMimes";
@@ -102,7 +100,6 @@ import { getLintAnnotations, getLintTooltipDirection } from "./lintHelpers";
import { executeCommandAction } from "actions/apiPaneActions";
import { startingEntityUpdate } from "actions/editorActions";
import type { SlashCommandPayload } from "entities/Action";
-import { SlashCommand } from "entities/Action";
import type { Indices } from "constants/Layers";
import { replayHighlightClass } from "globalStyles/portals";
import {
@@ -146,10 +143,7 @@ import { selectFeatureFlags } from "@appsmith/selectors/featureFlagsSelectors";
import { AIWindow } from "@appsmith/components/editorComponents/GPT";
import { AskAIButton } from "@appsmith/components/editorComponents/GPT/AskAIButton";
import classNames from "classnames";
-import {
- APPSMITH_AI,
- isAIEnabled,
-} from "@appsmith/components/editorComponents/GPT/trigger";
+import { isAIEnabled } from "@appsmith/components/editorComponents/GPT/trigger";
import {
getAllDatasourceTableKeys,
selectInstalledLibraries,
@@ -167,14 +161,14 @@ import { EMPTY_BINDING } from "../ActionCreator/constants";
type ReduxStateProps = ReturnType;
type ReduxDispatchProps = ReturnType;
-export type CodeEditorExpected = {
+export interface CodeEditorExpected {
type: string;
example: ExpectedValueExample;
autocompleteDataType: AutocompleteDataType;
openExampleTextByDefault?: boolean;
-};
+}
-export type EditorStyleProps = {
+export interface EditorStyleProps {
placeholder?: string;
leftIcon?: React.ReactNode;
rightIcon?: React.ReactNode;
@@ -198,7 +192,7 @@ export type EditorStyleProps = {
popperPlacement?: Placement;
popperZIndex?: Indices;
blockCompletions?: FieldEntityInformation["blockCompletions"];
-};
+}
/**
* line => Line to which the gutter is added
*
@@ -206,18 +200,18 @@ export type EditorStyleProps = {
*
* isFocusedAction => function called when focused
*/
-export type GutterConfig = {
+export interface GutterConfig {
line: number;
element: HTMLElement;
isFocusedAction: () => void;
-};
+}
-export type CodeEditorGutter = {
+export interface CodeEditorGutter {
getGutterConfig:
| ((editorValue: string, cursorLineNumber: number) => GutterConfig | null)
| null;
gutterId: string;
-};
+}
export type EditorProps = EditorStyleProps &
EditorConfig & {
@@ -253,7 +247,7 @@ export type EditorProps = EditorStyleProps &
interface Props extends ReduxStateProps, EditorProps, ReduxDispatchProps {}
-type State = {
+interface State {
isFocused: boolean;
isOpened: boolean;
autoCompleteVisible: boolean;
@@ -268,7 +262,7 @@ type State = {
| undefined;
isDynamic: boolean;
showAIWindow: boolean;
-};
+}
const getEditorIdentifier = (props: EditorProps): string => {
return props.dataTreePath || props.focusElementName || "";
@@ -308,6 +302,7 @@ class CodeEditor extends Component {
showAIWindow: false,
};
this.updatePropertyValue = this.updatePropertyValue.bind(this);
+ this.focusEditor = this.focusEditor.bind(this);
this.peekOverlayExpressionIdentifier = new PeekOverlayExpressionIdentifier(
props.isJSObject
? {
@@ -442,7 +437,6 @@ class CodeEditor extends Component {
editor.on("focus", this.handleEditorFocus);
editor.on("cursorActivity", this.handleCursorMovement);
editor.on("blur", this.handleEditorBlur);
- editor.on("postPick", this.handleSlashCommandSelection);
editor.on("mousedown", this.handleClick);
editor.on("scrollCursorIntoView", this.handleScrollCursorIntoView);
CodeMirror.on(
@@ -507,21 +501,6 @@ class CodeEditor extends Component {
}
}
- handleSlashCommandSelection = (...args: any) => {
- const [command] = args;
-
- if (command === APPSMITH_AI) {
- this.props.executeCommand({
- actionType: SlashCommand.ASK_AI,
- args: {
- mode: this.props.mode,
- },
- });
- this.setState({ showAIWindow: true });
- }
- this.handleAutocompleteVisibility(this.editor);
- };
-
shouldComponentUpdate(nextProps: Props, nextState: State) {
if (this.props.dynamicData !== nextProps.dynamicData) {
// check if isFocused as the other components that are not focused don't need a rerender (perf)
@@ -894,7 +873,6 @@ class CodeEditor extends Component {
this.editor.off("focus", this.handleEditorFocus);
this.editor.off("cursorActivity", this.handleCursorMovement);
this.editor.off("blur", this.handleEditorBlur);
- this.editor.off("postPick", this.handleSlashCommandSelection);
CodeMirror.off(
this.editor.getWrapperElement(),
"mousemove",
@@ -1324,16 +1302,8 @@ class CodeEditor extends Component {
recentEntities: this.props.recentEntities,
featureFlags: this.props.featureFlags,
enableAIAssistance: this.AIEnabled,
- update: this.props.input.onChange?.bind(this),
- executeCommand: (payload: any) => {
- this.props.executeCommand({
- ...payload,
- callback: (binding: string) => {
- const value = this.editor.getValue() + binding;
- this.updatePropertyValue(value, value.length);
- },
- });
- },
+ focusEditor: this.focusEditor,
+ executeCommand: this.props.executeCommand,
});
if (hinterOpen) break;
}
@@ -1342,7 +1312,6 @@ class CodeEditor extends Component {
handleAutocompleteKeydown = (cm: CodeMirror.Editor, event: KeyboardEvent) => {
const key = event.key;
-
// Since selection from AutoComplete list is also done using the Enter keydown event
// we need to return from here so that autocomplete selection works fine
if (key === "Enter") return;
@@ -1437,18 +1406,29 @@ class CodeEditor extends Component {
marking.forEach((helper) => helper(editor, entityNavigationData, from, to));
};
- updatePropertyValue(value: string, cursor?: number) {
+ focusEditor(focusOnline?: number, chOffset = 0) {
+ const lineToFocus = isNumber(focusOnline)
+ ? focusOnline
+ : this.editor.lineCount() - 1;
+ const focusedLineContent = this.editor.getLine(lineToFocus);
+
+ this.editor.setCursor({
+ line: lineToFocus,
+ ch: focusedLineContent.length - chOffset,
+ });
+
+ this.setState({ isFocused: true }, () => {
+ this.handleAutocompleteVisibility(this.editor);
+ });
+ }
+
+ updatePropertyValue(value: string, focusOnline?: number, chOffset = 0) {
this.editor.focus();
if (value) {
this.editor.setValue(value);
}
- this.editor.setCursor({
- line: cursor || this.editor.lineCount() - 1,
- ch: this.editor.getLine(this.editor.lineCount() - 1).length - 2,
- });
- this.setState({ isFocused: true }, () => {
- this.handleAutocompleteVisibility(this.editor);
- });
+
+ this.focusEditor(focusOnline, chOffset);
}
getErrors(dynamicData: DataTree, dataTreePath: string) {
@@ -1585,7 +1565,7 @@ class CodeEditor extends Component {
typeof this.props.input.value === "string"
? this.props.input.value + "/"
: "/";
- this.updatePropertyValue(newValue, newValue.length);
+ this.updatePropertyValue(newValue);
}}
size="sm"
tabIndex={-1}
@@ -1622,16 +1602,17 @@ class CodeEditor extends Component {
useValidationMessage={useValidationMessage}
>
{
- this.setState({ showAIWindow: false });
- }}
currentValue={this.props.input.value}
dataTreePath={dataTreePath}
+ editor={this.editor}
enableAIAssistance={this.AIEnabled}
entitiesForNavigation={this.props.entitiesForNavigation}
entity={entityInformation}
isOpen={this.state.showAIWindow}
mode={this.props.mode}
+ onOpenChanged={(showAIWindow: boolean) => {
+ this.setState({ showAIWindow });
+ }}
triggerContext={this.props.expected}
update={this.updateValueWithAIResponse}
>
diff --git a/app/client/src/components/editorComponents/CodeEditor/modes.ts b/app/client/src/components/editorComponents/CodeEditor/modes.ts
index ab3d6bb07a..65c0a3a690 100644
--- a/app/client/src/components/editorComponents/CodeEditor/modes.ts
+++ b/app/client/src/components/editorComponents/CodeEditor/modes.ts
@@ -59,18 +59,21 @@ export const MULTIPLEXING_MODE_CONFIGS: MultiplexingModeConfigs = {
},
...Object.values(sqlModesConfig)
.filter((config) => config.isMultiplex)
- .reduce((prev, current) => {
- prev[current.mode] = {
- outerMode: current.mime,
- innerModes: [
- {
- open: BINDING_OPEN,
- close: BINDING_CLOSE,
- },
- ],
- };
- return prev;
- }, {} as Record),
+ .reduce(
+ (prev, current) => {
+ prev[current.mode] = {
+ outerMode: current.mime,
+ innerModes: [
+ {
+ open: BINDING_OPEN,
+ close: BINDING_CLOSE,
+ },
+ ],
+ };
+ return prev;
+ },
+ {} as Record,
+ ),
"text/plain": undefined,
"application/json": undefined,
javascript: undefined,
diff --git a/app/client/src/components/editorComponents/ContextDropdown.tsx b/app/client/src/components/editorComponents/ContextDropdown.tsx
index 33f02e0e2d..28e20d2b8f 100644
--- a/app/client/src/components/editorComponents/ContextDropdown.tsx
+++ b/app/client/src/components/editorComponents/ContextDropdown.tsx
@@ -32,7 +32,7 @@ const StyledMenuItem = styled(MenuItem)`
}
`;
-type ContextDropdownProps = {
+interface ContextDropdownProps {
options: ContextDropdownOption[];
className: string;
toggle: {
@@ -43,7 +43,7 @@ type ContextDropdownProps = {
placeholder?: string;
color?: string;
};
-};
+}
function DropdownItem(option: ContextDropdownOption) {
return (
diff --git a/app/client/src/components/editorComponents/Debugger/ContextualMenu.tsx b/app/client/src/components/editorComponents/Debugger/ContextualMenu.tsx
index 2384be8dd8..373df1ba1d 100644
--- a/app/client/src/components/editorComponents/Debugger/ContextualMenu.tsx
+++ b/app/client/src/components/editorComponents/Debugger/ContextualMenu.tsx
@@ -69,12 +69,12 @@ const getOptions = (type?: string, subType?: string) => {
}
};
-type ContextualMenuProps = {
+interface ContextualMenuProps {
error: Message;
children: JSX.Element;
entity?: FieldEntityInformation | SourceEntity;
enableTooltip?: boolean;
-};
+}
const searchAction: Record<
CONTEXT_MENU_ACTIONS,
diff --git a/app/client/src/components/editorComponents/Debugger/DebugCTA.tsx b/app/client/src/components/editorComponents/Debugger/DebugCTA.tsx
index 1e1ab9cd55..2a6448a727 100644
--- a/app/client/src/components/editorComponents/Debugger/DebugCTA.tsx
+++ b/app/client/src/components/editorComponents/Debugger/DebugCTA.tsx
@@ -55,11 +55,11 @@ const StyledButton = styled(Button)`
}
`;
-type DebugCTAProps = {
+interface DebugCTAProps {
className?: string;
// For Analytics
source?: string;
-};
+}
function DebugCTA(props: DebugCTAProps) {
const dispatch = useDispatch();
@@ -79,10 +79,10 @@ function DebugCTA(props: DebugCTAProps) {
return ;
}
-type DebugButtonProps = {
+interface DebugButtonProps {
className?: string;
onClick: () => void;
-};
+}
export function DebugButton(props: DebugButtonProps) {
return (
diff --git a/app/client/src/components/editorComponents/Debugger/DebuggerLogs.tsx b/app/client/src/components/editorComponents/Debugger/DebuggerLogs.tsx
index c0d9730f9a..4179757d80 100644
--- a/app/client/src/components/editorComponents/Debugger/DebuggerLogs.tsx
+++ b/app/client/src/components/editorComponents/Debugger/DebuggerLogs.tsx
@@ -40,10 +40,10 @@ export const ListWrapper = styled.div`
padding-bottom: 37px;
`;
-type Props = {
+interface Props {
searchQuery: string;
hasShortCut?: boolean;
-};
+}
const LOGS_FILTER_OPTIONS = (theme: DefaultTheme) => [
{
diff --git a/app/client/src/components/editorComponents/Debugger/DebuggerMessage.tsx b/app/client/src/components/editorComponents/Debugger/DebuggerMessage.tsx
index 6a66663961..ed3480901d 100644
--- a/app/client/src/components/editorComponents/Debugger/DebuggerMessage.tsx
+++ b/app/client/src/components/editorComponents/Debugger/DebuggerMessage.tsx
@@ -12,10 +12,10 @@ const Container = styled.div`
color: ${(props) => props.theme.colors.debugger.messageTextColor};
`;
-type DebuggerMessageProps = {
+interface DebuggerMessageProps {
onClick: () => void;
secondHalfText: string;
-};
+}
function DebuggerMessage(props: DebuggerMessageProps) {
return (
diff --git a/app/client/src/components/editorComponents/Debugger/EntityDependecies.tsx b/app/client/src/components/editorComponents/Debugger/EntityDependecies.tsx
index b9eefee9ca..8ad58d23ee 100644
--- a/app/client/src/components/editorComponents/Debugger/EntityDependecies.tsx
+++ b/app/client/src/components/editorComponents/Debugger/EntityDependecies.tsx
@@ -124,18 +124,18 @@ const ConnectionContainer = styled.div`
width: 100%;
`;
-type ConnectionsProps = {
+interface ConnectionsProps {
entityName: string;
entityDependencies: {
inverseDependencies: string[];
directDependencies: string[];
} | null;
-};
+}
-type ConnectionProps = {
+interface ConnectionProps {
entityName: string;
onClick: (entityName: string, entityType: string) => void;
-};
+}
const getEntityDescription = (entityType?: ENTITY_TYPE) => {
if (entityType === ENTITY_TYPE.WIDGET) {
diff --git a/app/client/src/components/editorComponents/Debugger/EntityLink.tsx b/app/client/src/components/editorComponents/Debugger/EntityLink.tsx
index d0f3893f27..b82b226418 100644
--- a/app/client/src/components/editorComponents/Debugger/EntityLink.tsx
+++ b/app/client/src/components/editorComponents/Debugger/EntityLink.tsx
@@ -9,7 +9,7 @@ import { getAction, getDatasource } from "@appsmith/selectors/entitiesSelector";
import AnalyticsUtil from "utils/AnalyticsUtil";
import history from "utils/history";
import { getQueryParams } from "utils/URLUtils";
-import { datasourcesEditorIdURL } from "RouteBuilder";
+import { datasourcesEditorIdURL } from "@appsmith/RouteBuilder";
import type LOG_TYPE from "entities/AppsmithConsole/logtype";
import { Link } from "design-system";
import type { Plugin } from "api/PluginApi";
diff --git a/app/client/src/components/editorComponents/Debugger/ErrorLogs/ErrorLogItem.tsx b/app/client/src/components/editorComponents/Debugger/ErrorLogs/ErrorLogItem.tsx
index 8253706681..aa592b728e 100644
--- a/app/client/src/components/editorComponents/Debugger/ErrorLogs/ErrorLogItem.tsx
+++ b/app/client/src/components/editorComponents/Debugger/ErrorLogs/ErrorLogItem.tsx
@@ -163,7 +163,7 @@ export const getLogItemProps = (e: Log) => {
};
};
-export type LogItemProps = {
+export interface LogItemProps {
collapsable?: boolean;
icon: string;
timestamp: string;
@@ -182,7 +182,7 @@ export type LogItemProps = {
pluginErrorDetails?: PluginErrorDetails;
isExpanded: boolean;
environmentName?: string;
-};
+}
// Log item component
const ErrorLogItem = (props: LogItemProps) => {
diff --git a/app/client/src/components/editorComponents/Debugger/FilterHeader.tsx b/app/client/src/components/editorComponents/Debugger/FilterHeader.tsx
index 5d68cd8d0d..8d0d78f783 100644
--- a/app/client/src/components/editorComponents/Debugger/FilterHeader.tsx
+++ b/app/client/src/components/editorComponents/Debugger/FilterHeader.tsx
@@ -42,7 +42,7 @@ const OptionLabel = styled(Text)`
margin-top: 2px;
`;
-type FilterHeaderProps = {
+interface FilterHeaderProps {
options: DropdownOption[];
selected: DropdownOption;
onChange: (value: string) => void;
@@ -50,7 +50,7 @@ type FilterHeaderProps = {
defaultValue: string;
value: string;
searchQuery: string;
-};
+}
function FilterHeader(props: FilterHeaderProps) {
const dispatch = useDispatch();
diff --git a/app/client/src/components/editorComponents/Debugger/LogItem.tsx b/app/client/src/components/editorComponents/Debugger/LogItem.tsx
index 66075e3896..d718de1b7e 100644
--- a/app/client/src/components/editorComponents/Debugger/LogItem.tsx
+++ b/app/client/src/components/editorComponents/Debugger/LogItem.tsx
@@ -210,7 +210,7 @@ export const getLogItemProps = (e: Log) => {
};
};
-type LogItemProps = {
+interface LogItemProps {
collapsible?: boolean;
icon: string;
timestamp: string;
@@ -226,7 +226,7 @@ type LogItemProps = {
expand?: boolean;
messages?: Message[];
occurences: number;
-};
+}
function LogItem(props: LogItemProps) {
const [isOpen, setIsOpen] = useState(!!props.expand);
diff --git a/app/client/src/components/editorComponents/Debugger/Resizer/index.tsx b/app/client/src/components/editorComponents/Debugger/Resizer/index.tsx
index 9d506e73a3..6bb3e10254 100644
--- a/app/client/src/components/editorComponents/Debugger/Resizer/index.tsx
+++ b/app/client/src/components/editorComponents/Debugger/Resizer/index.tsx
@@ -17,14 +17,14 @@ const Top = styled.div`
margin-bottom: -2px;
`;
-type ResizerProps = {
+interface ResizerProps {
panelRef: RefObject;
setContainerDimensions?: (height: number) => void;
onResizeComplete?: (height: number) => void;
snapToHeight?: number;
openResizer?: boolean;
initialHeight?: number;
-};
+}
function Resizer(props: ResizerProps) {
const [mouseDown, setMouseDown] = useState(false);
diff --git a/app/client/src/components/editorComponents/Debugger/hooks/debuggerHooks.ts b/app/client/src/components/editorComponents/Debugger/hooks/debuggerHooks.ts
index 3533599a53..94cc34b3ab 100644
--- a/app/client/src/components/editorComponents/Debugger/hooks/debuggerHooks.ts
+++ b/app/client/src/components/editorComponents/Debugger/hooks/debuggerHooks.ts
@@ -21,7 +21,7 @@ import {
isWidget,
} from "@appsmith/workers/Evaluation/evaluationUtils";
import history, { NavigationMethod } from "utils/history";
-import { jsCollectionIdURL } from "RouteBuilder";
+import { jsCollectionIdURL } from "@appsmith/RouteBuilder";
import store from "store";
import { PluginType } from "entities/Action";
diff --git a/app/client/src/components/editorComponents/EditableText.tsx b/app/client/src/components/editorComponents/EditableText.tsx
index a53c7217ae..c58e76f4ea 100644
--- a/app/client/src/components/editorComponents/EditableText.tsx
+++ b/app/client/src/components/editorComponents/EditableText.tsx
@@ -12,7 +12,7 @@ export enum EditInteractionKind {
DOUBLE,
}
-type EditableTextProps = {
+interface EditableTextProps {
type: "text" | "password" | "email" | "phone" | "date";
defaultValue: string;
onTextChanged: (value: string) => void;
@@ -37,7 +37,7 @@ type EditableTextProps = {
minLines?: number;
customErrorTooltip?: string;
useFullWidth?: boolean;
-};
+}
// using the !important keyword here is mandatory because a style is being applied to that element using the style attribute
// which has higher specificity than other css selectors. It seems the overriding style is being applied by the package itself.
diff --git a/app/client/src/components/editorComponents/EditorContextProvider.test.tsx b/app/client/src/components/editorComponents/EditorContextProvider.test.tsx
index 5bf03f3c0c..0171e5b6b0 100644
--- a/app/client/src/components/editorComponents/EditorContextProvider.test.tsx
+++ b/app/client/src/components/editorComponents/EditorContextProvider.test.tsx
@@ -6,9 +6,9 @@ import { Provider } from "react-redux";
import type { EditorContextType } from "./EditorContextProvider";
import EditorContextProvider, { EditorContext } from "./EditorContextProvider";
-type TestChildProps = {
+interface TestChildProps {
editorContext: EditorContextType;
-};
+}
const TestChild = (props: TestChildProps) => {
return {Object.keys(props)}
;
diff --git a/app/client/src/components/editorComponents/EditorContextProvider.tsx b/app/client/src/components/editorComponents/EditorContextProvider.tsx
index 01591ea968..35d946f629 100644
--- a/app/client/src/components/editorComponents/EditorContextProvider.tsx
+++ b/app/client/src/components/editorComponents/EditorContextProvider.tsx
@@ -49,7 +49,7 @@ import {
} from "actions/autoLayoutActions";
import { updateOneClickBindingOptionsVisibility } from "actions/oneClickBindingActions";
-export type EditorContextType = {
+export interface EditorContextType {
executeAction?: (triggerPayload: ExecuteTriggerPayload) => void;
updateWidget?: (
operation: WidgetOperation,
@@ -99,7 +99,7 @@ export type EditorContextType = {
selectWidgetRequest?: WidgetSelectionRequest;
updatePositionsOnTabChange?: (widgetId: string, selectedTab: string) => void;
updateOneClickBindingOptionsVisibility?: (visibility: boolean) => void;
-};
+}
export const EditorContext: Context = createContext({});
type EditorContextProviderProps = EditorContextType & {
@@ -152,12 +152,15 @@ function extractFromObj(
keys: K[],
): [Pick, T[K][]] {
const deps = [] as T[K][];
- const newObj = keys.reduce((newObj, curr) => {
- newObj[curr] = obj[curr];
- deps.push(obj[curr]);
+ const newObj = keys.reduce(
+ (newObj, curr) => {
+ newObj[curr] = obj[curr];
+ deps.push(obj[curr]);
- return newObj;
- }, {} as Pick);
+ return newObj;
+ },
+ {} as Pick,
+ );
return [newObj, deps];
}
diff --git a/app/client/src/components/editorComponents/EntityBottomTabs.tsx b/app/client/src/components/editorComponents/EntityBottomTabs.tsx
index 25043a5730..0506ae66ef 100644
--- a/app/client/src/components/editorComponents/EntityBottomTabs.tsx
+++ b/app/client/src/components/editorComponents/EntityBottomTabs.tsx
@@ -23,7 +23,7 @@ const TabsListWrapper = styled(TabsList)`
var(--ads-v2-spaces-1);
`;
-type EntityBottomTabsProps = {
+interface EntityBottomTabsProps {
className?: string;
tabs: any;
onSelect?: (tab: any) => void;
@@ -33,7 +33,7 @@ type EntityBottomTabsProps = {
containerRef?: RefObject;
// height of container when expanded
expandedHeight?: string;
-};
+}
type CollapsibleEntityBottomTabsProps = EntityBottomTabsProps &
CollapsibleTabProps;
diff --git a/app/client/src/components/editorComponents/ErrorBoundry.tsx b/app/client/src/components/editorComponents/ErrorBoundry.tsx
index 0be202320d..99acb2bff2 100644
--- a/app/client/src/components/editorComponents/ErrorBoundry.tsx
+++ b/app/client/src/components/editorComponents/ErrorBoundry.tsx
@@ -4,8 +4,12 @@ import styled from "styled-components";
import * as Sentry from "@sentry/react";
import * as log from "loglevel";
-type Props = { children: ReactNode };
-type State = { hasError: boolean };
+interface Props {
+ children: ReactNode;
+}
+interface State {
+ hasError: boolean;
+}
const ErrorBoundaryContainer = styled.div`
height: 100%;
diff --git a/app/client/src/components/editorComponents/GlobalSearch/Description.tsx b/app/client/src/components/editorComponents/GlobalSearch/Description.tsx
index 2323d3a731..1945b3976b 100644
--- a/app/client/src/components/editorComponents/GlobalSearch/Description.tsx
+++ b/app/client/src/components/editorComponents/GlobalSearch/Description.tsx
@@ -6,12 +6,12 @@ import { getItemTitle, SEARCH_ITEM_TYPES } from "./utils";
import { getTypographyByKey } from "design-system-old";
import type { SearchItem } from "./utils";
-type Props = {
+interface Props {
activeItem: SearchItem;
activeItemType?: SEARCH_ITEM_TYPES;
query: string;
scrollPositionRef: React.MutableRefObject;
-};
+}
const Container = styled.div`
flex: 2;
diff --git a/app/client/src/components/editorComponents/GlobalSearch/GlobalSearchContext.tsx b/app/client/src/components/editorComponents/GlobalSearch/GlobalSearchContext.tsx
index c7a3ace513..3103cb4a86 100644
--- a/app/client/src/components/editorComponents/GlobalSearch/GlobalSearchContext.tsx
+++ b/app/client/src/components/editorComponents/GlobalSearch/GlobalSearchContext.tsx
@@ -1,7 +1,7 @@
import React from "react";
import type { SearchItem, SelectEvent } from "./utils";
-type SearchContextType = {
+interface SearchContextType {
handleItemLinkClick: (
event: SelectEvent,
item?: SearchItem,
@@ -9,7 +9,7 @@ type SearchContextType = {
) => void;
setActiveItemIndex: (index: number) => void;
activeItemIndex: number;
-};
+}
const SearchContext = React.createContext(
undefined,
diff --git a/app/client/src/components/editorComponents/GlobalSearch/GlobalSearchHooks.tsx b/app/client/src/components/editorComponents/GlobalSearch/GlobalSearchHooks.tsx
index 296a4f9f60..5adb9d3ef6 100644
--- a/app/client/src/components/editorComponents/GlobalSearch/GlobalSearchHooks.tsx
+++ b/app/client/src/components/editorComponents/GlobalSearch/GlobalSearchHooks.tsx
@@ -23,7 +23,7 @@ import {
SEARCH_ITEM_TYPES,
} from "./utils";
import { PluginType } from "entities/Action";
-import { integrationEditorURL } from "RouteBuilder";
+import { integrationEditorURL } from "@appsmith/RouteBuilder";
import { EntityIcon } from "pages/Editor/Explorer/ExplorerIcons";
import { createNewQueryAction } from "actions/apiPaneActions";
import type { AppState } from "@appsmith/reducers";
diff --git a/app/client/src/components/editorComponents/GlobalSearch/GlobalSearchHotKeys.tsx b/app/client/src/components/editorComponents/GlobalSearch/GlobalSearchHotKeys.tsx
index ed0ddd14b4..d478fad841 100644
--- a/app/client/src/components/editorComponents/GlobalSearch/GlobalSearchHotKeys.tsx
+++ b/app/client/src/components/editorComponents/GlobalSearch/GlobalSearchHotKeys.tsx
@@ -2,7 +2,7 @@ import React from "react";
import { Hotkey, Hotkeys, HotkeysTarget } from "@blueprintjs/core";
import type { SearchItem, SelectEvent } from "./utils";
-type Props = {
+interface Props {
modalOpen: boolean;
toggleShow: () => void;
handleUpKey: () => void;
@@ -13,7 +13,7 @@ type Props = {
source?: string,
) => void;
children: React.ReactNode;
-};
+}
@HotkeysTarget
class GlobalSearchHotKeys extends React.Component {
get hotKeysConfig() {
diff --git a/app/client/src/components/editorComponents/GlobalSearch/HelpBar.tsx b/app/client/src/components/editorComponents/GlobalSearch/HelpBar.tsx
index fa5e4a0e84..7a942c9250 100644
--- a/app/client/src/components/editorComponents/GlobalSearch/HelpBar.tsx
+++ b/app/client/src/components/editorComponents/GlobalSearch/HelpBar.tsx
@@ -31,9 +31,9 @@ const StyledHelpBar = styled.div`
}
`;
-type Props = {
+interface Props {
toggleShowModal: () => void;
-};
+}
function HelpBar({ toggleShowModal }: Props) {
return (
diff --git a/app/client/src/components/editorComponents/GlobalSearch/SearchBox.tsx b/app/client/src/components/editorComponents/GlobalSearch/SearchBox.tsx
index d09e3842bb..b80f001a43 100644
--- a/app/client/src/components/editorComponents/GlobalSearch/SearchBox.tsx
+++ b/app/client/src/components/editorComponents/GlobalSearch/SearchBox.tsx
@@ -83,12 +83,12 @@ const handleKeyDown = (e: React.KeyboardEvent) => {
}
};
-type SearchBoxProps = {
+interface SearchBoxProps {
query: string;
setQuery: (query: string) => void;
category: SearchCategory;
setCategory: (category: any) => void;
-};
+}
const useListenToChange = (modalOpen: boolean) => {
const [listenToChange, setListenToChange] = useState(false);
diff --git a/app/client/src/components/editorComponents/GlobalSearch/SearchModal.tsx b/app/client/src/components/editorComponents/GlobalSearch/SearchModal.tsx
index 2e1a93c43e..829f118fbf 100644
--- a/app/client/src/components/editorComponents/GlobalSearch/SearchModal.tsx
+++ b/app/client/src/components/editorComponents/GlobalSearch/SearchModal.tsx
@@ -30,12 +30,12 @@ const StyledDocsSearchModal = styled(ModalContent)`
}
`;
-type Props = {
+interface Props {
modalOpen: boolean;
toggleShow: () => void;
children: React.ReactNode;
className?: string;
-};
+}
function DocsSearchModal({
children,
diff --git a/app/client/src/components/editorComponents/GlobalSearch/SearchResults.tsx b/app/client/src/components/editorComponents/GlobalSearch/SearchResults.tsx
index ee2eb7fa70..c0579045b3 100644
--- a/app/client/src/components/editorComponents/GlobalSearch/SearchResults.tsx
+++ b/app/client/src/components/editorComponents/GlobalSearch/SearchResults.tsx
@@ -395,11 +395,11 @@ const SearchItemByType = {
[SEARCH_ITEM_TYPES.actionOperation]: ActionOperationItem,
};
-type ItemProps = {
+interface ItemProps {
item: IHit | SearchItem;
index: number;
query: string;
-};
+}
function SearchItemComponent(props: ItemProps) {
const { index, item, query } = props;
diff --git a/app/client/src/components/editorComponents/GlobalSearch/index.tsx b/app/client/src/components/editorComponents/GlobalSearch/index.tsx
index 45455f0523..9b96a47742 100644
--- a/app/client/src/components/editorComponents/GlobalSearch/index.tsx
+++ b/app/client/src/components/editorComponents/GlobalSearch/index.tsx
@@ -59,7 +59,7 @@ import {
builderURL,
datasourcesEditorIdURL,
jsCollectionIdURL,
-} from "RouteBuilder";
+} from "@appsmith/RouteBuilder";
import { getPlugins } from "@appsmith/selectors/entitiesSelector";
import {
DatasourceCreateEntryPoints,
@@ -68,7 +68,9 @@ import {
const StyledContainer = styled.div<{ category: SearchCategory; query: string }>`
max-height: 530px;
- transition: height 0.1s ease, width 0.1s ease;
+ transition:
+ height 0.1s ease,
+ width 0.1s ease;
height: ${(props) =>
isMenu(props.category) ||
isActionOperation(props.category) ||
diff --git a/app/client/src/components/editorComponents/GlobalSearch/utils.tsx b/app/client/src/components/editorComponents/GlobalSearch/utils.tsx
index 71a2417bd9..0568b38a3d 100644
--- a/app/client/src/components/editorComponents/GlobalSearch/utils.tsx
+++ b/app/client/src/components/editorComponents/GlobalSearch/utils.tsx
@@ -22,7 +22,7 @@ import { createNewJSCollection } from "actions/jsPaneActions";
import type { EventLocation } from "@appsmith/utils/analyticsUtilTypes";
import { getQueryParams } from "utils/URLUtils";
import history from "utils/history";
-import { curlImportPageURL } from "RouteBuilder";
+import { curlImportPageURL } from "@appsmith/RouteBuilder";
import { isMacOrIOS, modText, shiftText } from "utils/helpers";
import { FocusEntity } from "navigation/FocusEntity";
@@ -32,11 +32,11 @@ export type SelectEvent =
| KeyboardEvent
| null;
-export type RecentEntity = {
+export interface RecentEntity {
type: FocusEntity;
id: string;
pageId: string;
-};
+}
export enum SEARCH_CATEGORY_ID {
NAVIGATION = "Navigate",
@@ -66,15 +66,15 @@ export const comboHelpText = {
),
};
-export type Snippet = {
+export interface Snippet {
entities?: [string];
fields?: [string];
dataType?: string;
language: string;
body: SnippetBody;
-};
+}
-export type SnippetBody = {
+export interface SnippetBody {
title: string;
snippet: string;
isTrigger?: boolean;
@@ -83,7 +83,7 @@ export type SnippetBody = {
template: string;
snippetMeta?: string;
shortTitle?: string;
-};
+}
export type FilterEntity = WidgetType | ENTITY_TYPE;
@@ -102,20 +102,20 @@ export const getSnippetFilterLabel = (state: AppState, label: string) => {
);
};
-export type SnippetArgument = {
+export interface SnippetArgument {
identifier: string;
name: string;
type: ValidationTypes;
placeholder?: boolean;
-};
+}
-export type SearchCategory = {
+export interface SearchCategory {
id: SEARCH_CATEGORY_ID;
kind?: SEARCH_ITEM_TYPES;
title?: string;
desc?: string;
show?: () => boolean;
-};
+}
export function getOptionalFilters(optionalFilterMeta: any) {
return Object.entries(optionalFilterMeta || {}).reduce(
@@ -247,7 +247,7 @@ export const getEntityId = (entity: {
}
};
-export type ActionOperation = {
+export interface ActionOperation {
title: string;
desc: string;
icon?: any;
@@ -255,7 +255,7 @@ export type ActionOperation = {
action?: (pageId: string, location: EventLocation) => any;
redirect?: (pageId: string, from: EventLocation) => any;
pluginId?: string;
-};
+}
export const actionOperations: ActionOperation[] = [
{
diff --git a/app/client/src/components/editorComponents/HighlightedCode/index.tsx b/app/client/src/components/editorComponents/HighlightedCode/index.tsx
index 0aabec9de1..7161b284a9 100644
--- a/app/client/src/components/editorComponents/HighlightedCode/index.tsx
+++ b/app/client/src/components/editorComponents/HighlightedCode/index.tsx
@@ -28,14 +28,14 @@ export enum SYNTAX_HIGHLIGHTING_SUPPORTED_LANGUAGES {
APPSMITH = "language-appsmith-binding", // Please note that we're using the CSS class name required by prismjs.
}
-type HighlightedCodeProps = {
+interface HighlightedCodeProps {
codeText: string;
language?: SYNTAX_HIGHLIGHTING_SUPPORTED_LANGUAGES;
skin: Skin;
multiline?: boolean;
onClick?: () => void;
className?: string;
-};
+}
/* eslint-disable react/display-name */
export const HighlightedCode = forwardRef(
(props: HighlightedCodeProps, ref: Ref) => {
diff --git a/app/client/src/components/editorComponents/InputComponent.tsx b/app/client/src/components/editorComponents/InputComponent.tsx
index acfb15eddd..60f7b168c4 100644
--- a/app/client/src/components/editorComponents/InputComponent.tsx
+++ b/app/client/src/components/editorComponents/InputComponent.tsx
@@ -14,14 +14,14 @@ const StyledInputGroup = styled(InputGroup)`
export type InputType = "text" | "password" | "number" | "email" | "tel";
-type InputComponentProps = {
+interface InputComponentProps {
placeholder: string;
input: Partial;
type?: InputType;
intent?: Intent;
disabled?: boolean;
autoFocus?: boolean;
-};
+}
function InputComponent(props: InputComponentProps) {
return (
diff --git a/app/client/src/components/editorComponents/LightningMenu/index.tsx b/app/client/src/components/editorComponents/LightningMenu/index.tsx
index a752c2ff3d..ce355a84dd 100644
--- a/app/client/src/components/editorComponents/LightningMenu/index.tsx
+++ b/app/client/src/components/editorComponents/LightningMenu/index.tsx
@@ -55,7 +55,7 @@ const lightningMenuOptions = (
};
};
-type LightningMenuProps = {
+interface LightningMenuProps {
isFocused: boolean;
isOpened: boolean;
onSelect?: (value: string) => void;
@@ -63,7 +63,7 @@ type LightningMenuProps = {
onCloseLightningMenu?: () => void;
updateDynamicInputValue: (value: string, cursor?: number) => void;
skin: Skin;
-};
+}
export function LightningMenu(props: LightningMenuProps) {
const widgets = useWidgets();
diff --git a/app/client/src/components/editorComponents/NavBarItem.tsx b/app/client/src/components/editorComponents/NavBarItem.tsx
index 6dcb8f7747..02923c931b 100644
--- a/app/client/src/components/editorComponents/NavBarItem.tsx
+++ b/app/client/src/components/editorComponents/NavBarItem.tsx
@@ -6,7 +6,7 @@ import { NavLink } from "react-router-dom";
import AnalyticsUtil from "utils/AnalyticsUtil";
import { Colors } from "constants/Colors";
-type MenuBarItemProps = {
+interface MenuBarItemProps {
icon: Function;
path: string;
title: string;
@@ -18,7 +18,7 @@ type MenuBarItemProps = {
highlight?: boolean;
onClick?: Function;
isActive: (currentPath: string, expectedPath: string) => boolean;
-};
+}
type Props = MenuBarItemProps;
diff --git a/app/client/src/components/editorComponents/PageLoader.tsx b/app/client/src/components/editorComponents/PageLoader.tsx
index 12596c18cb..005263f88f 100644
--- a/app/client/src/components/editorComponents/PageLoader.tsx
+++ b/app/client/src/components/editorComponents/PageLoader.tsx
@@ -19,9 +19,9 @@ const PageLoaderWrapper = styled.div`
}
`;
-type PageLoaderProps = {
+interface PageLoaderProps {
value?: number;
-};
+}
export function PageLoader(props: PageLoaderProps) {
return (
diff --git a/app/client/src/components/editorComponents/PaneWrapper.tsx b/app/client/src/components/editorComponents/PaneWrapper.tsx
index a82fdbebf0..ad2dd63d65 100644
--- a/app/client/src/components/editorComponents/PaneWrapper.tsx
+++ b/app/client/src/components/editorComponents/PaneWrapper.tsx
@@ -4,7 +4,9 @@ import { Colors } from "constants/Colors";
export default styled.div`
background-color: ${Colors.GREY_1};
border-radius: ${(props) => props.theme.radii[0]}px;
- box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2), 0px 2px 10px rgba(0, 0, 0, 0.1);
+ box-shadow:
+ 0px 0px 2px rgba(0, 0, 0, 0.2),
+ 0px 2px 10px rgba(0, 0, 0, 0.1);
color: ${(props) => props.theme.colors.textOnDarkBG};
text-transform: capitalize;
`;
diff --git a/app/client/src/components/editorComponents/PropertyPaneSidebar.tsx b/app/client/src/components/editorComponents/PropertyPaneSidebar.tsx
index 3f85e44cfb..9f8f68a4b3 100644
--- a/app/client/src/components/editorComponents/PropertyPaneSidebar.tsx
+++ b/app/client/src/components/editorComponents/PropertyPaneSidebar.tsx
@@ -39,11 +39,11 @@ const StyledResizer = styled.div<{ resizing: boolean }>`
}
`;
-type Props = {
+interface Props {
width: number;
onDragEnd?: () => void;
onWidthChange: (width: number) => void;
-};
+}
export const PropertyPaneSidebar = memo((props: Props) => {
const sidebarRef = useRef(null);
diff --git a/app/client/src/components/editorComponents/RadioButtonGroup.tsx b/app/client/src/components/editorComponents/RadioButtonGroup.tsx
index 241f52ba0b..30f0736a58 100644
--- a/app/client/src/components/editorComponents/RadioButtonGroup.tsx
+++ b/app/client/src/components/editorComponents/RadioButtonGroup.tsx
@@ -3,18 +3,18 @@ import styled from "styled-components";
import { Text, Button } from "design-system";
import type { WrappedFieldMetaProps, WrappedFieldInputProps } from "redux-form";
-type RadioButtonGroupProps = {
+interface RadioButtonGroupProps {
options: RadioButtonProps[];
label: string;
initialValue: string;
meta?: Partial;
input?: Partial;
-};
+}
-type RadioButtonProps = {
+interface RadioButtonProps {
label: string;
value: string;
-};
+}
const StyledButton = styled(Button)`
&[aria-checked="true"] {
diff --git a/app/client/src/components/editorComponents/SelectComponent.tsx b/app/client/src/components/editorComponents/SelectComponent.tsx
index 457d9200f8..7911845183 100644
--- a/app/client/src/components/editorComponents/SelectComponent.tsx
+++ b/app/client/src/components/editorComponents/SelectComponent.tsx
@@ -3,7 +3,7 @@ import React from "react";
import type { CustomizedDropdownProps } from "pages/common/CustomizedDropdown/index";
import CustomizedDropdown from "pages/common/CustomizedDropdown/index";
-type SelectComponentProps = {
+interface SelectComponentProps {
input: {
value?: string;
onChange?: (value: string) => void;
@@ -12,7 +12,7 @@ type SelectComponentProps = {
placeholder?: string;
size?: "large" | "small";
outline?: boolean;
-};
+}
export function SelectComponent(props: SelectComponentProps) {
const dropdownProps: CustomizedDropdownProps = {
diff --git a/app/client/src/components/editorComponents/Sidebar.tsx b/app/client/src/components/editorComponents/Sidebar.tsx
index 4ee998ae2a..00b3ca39f4 100644
--- a/app/client/src/components/editorComponents/Sidebar.tsx
+++ b/app/client/src/components/editorComponents/Sidebar.tsx
@@ -50,9 +50,9 @@ const StyledResizer = styled.div<{ resizing: boolean }>`
}
`;
-type Props = {
+interface Props {
children: React.ReactNode;
-};
+}
export const EntityExplorerSidebar = memo(({ children }: Props) => {
let tooltipTimeout: ReturnType;
diff --git a/app/client/src/components/editorComponents/StoreAsDatasource.tsx b/app/client/src/components/editorComponents/StoreAsDatasource.tsx
index 1fa4d2b5e1..bde1ca6acb 100644
--- a/app/client/src/components/editorComponents/StoreAsDatasource.tsx
+++ b/app/client/src/components/editorComponents/StoreAsDatasource.tsx
@@ -5,7 +5,7 @@ import {
} from "actions/datasourceActions";
import { connect, useDispatch, useSelector } from "react-redux";
import history from "utils/history";
-import { datasourcesEditorIdURL } from "RouteBuilder";
+import { datasourcesEditorIdURL } from "@appsmith/RouteBuilder";
import { getQueryParams } from "utils/URLUtils";
import { getCurrentPageId } from "selectors/editorSelectors";
import {
@@ -15,7 +15,7 @@ import {
} from "@appsmith/constants/messages";
import { Button } from "design-system";
-type storeDataSourceProps = {
+interface storeDataSourceProps {
datasourceId?: string;
enable: boolean;
shouldSave: boolean;
@@ -23,7 +23,7 @@ type storeDataSourceProps = {
datasourceId: string;
viewMode: boolean;
}) => void;
-};
+}
interface ReduxDispatchProps {
setDatasourceViewMode: (payload: {
diff --git a/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/CommonControls/DatasourceDropdown/DropdownOption.tsx b/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/CommonControls/DatasourceDropdown/DropdownOption.tsx
index 315506c290..9732bd31e9 100644
--- a/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/CommonControls/DatasourceDropdown/DropdownOption.tsx
+++ b/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/CommonControls/DatasourceDropdown/DropdownOption.tsx
@@ -28,12 +28,12 @@ const Label = styled.div`
text-overflow: ellipsis;
`;
-type Props = {
+interface Props {
label?: JSX.Element | string;
leftIcon?: JSX.Element;
rightIcon?: JSX.Element;
className?: string;
-};
+}
export function DropdownOption(props: Props) {
const { className, label, leftIcon, rightIcon } = props;
@@ -49,10 +49,10 @@ export function DropdownOption(props: Props) {
);
}
-type LoadmoreProps = {
+interface LoadmoreProps {
count: number;
onLoadMore: () => void;
-};
+}
export function LoadMoreOptions(props: LoadmoreProps) {
if (props.count > DEFAULT_QUERY_OPTIONS_COUNTS_TO_SHOW) {
diff --git a/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/CommonControls/DatasourceDropdown/useSource/useOtherOptions.tsx b/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/CommonControls/DatasourceDropdown/useSource/useOtherOptions.tsx
index fb1d1ebb96..28c4615b24 100644
--- a/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/CommonControls/DatasourceDropdown/useSource/useOtherOptions.tsx
+++ b/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/CommonControls/DatasourceDropdown/useSource/useOtherOptions.tsx
@@ -1,7 +1,7 @@
import React, { useContext, useMemo } from "react";
import { Icon } from "design-system";
import history from "utils/history";
-import { integrationEditorURL } from "RouteBuilder";
+import { integrationEditorURL } from "@appsmith/RouteBuilder";
import { INTEGRATION_TABS } from "constants/routes";
import AnalyticsUtil from "utils/AnalyticsUtil";
import { DatasourceCreateEntryPoints } from "constants/Datasource";
diff --git a/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/WidgetSpecificControls/ColumnDropdown/index.tsx b/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/WidgetSpecificControls/ColumnDropdown/index.tsx
index 66d91919de..d4493fd3c5 100644
--- a/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/WidgetSpecificControls/ColumnDropdown/index.tsx
+++ b/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/WidgetSpecificControls/ColumnDropdown/index.tsx
@@ -5,13 +5,13 @@ import { DropdownOption } from "../../CommonControls/DatasourceDropdown/Dropdown
import { ErrorMessage, Label, SelectWrapper } from "../../styles";
import { useColumns } from "./useColumns";
-type Props = {
+interface Props {
id: string;
alias: string;
label: string;
onSelect: () => void;
isSearcheable: boolean;
-};
+}
function ColumnDropdown(props: Props) {
const { alias, isSearcheable } = props;
diff --git a/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/WidgetSpecificControls/OtherFields/Field/Dropdown/useDropdown.tsx b/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/WidgetSpecificControls/OtherFields/Field/Dropdown/useDropdown.tsx
index 9bde2c0546..9ed0b7be41 100644
--- a/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/WidgetSpecificControls/OtherFields/Field/Dropdown/useDropdown.tsx
+++ b/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/WidgetSpecificControls/OtherFields/Field/Dropdown/useDropdown.tsx
@@ -26,7 +26,7 @@ import type { AppState } from "@appsmith/reducers";
import { getWidget } from "sagas/selectors";
import AnalyticsUtil from "utils/AnalyticsUtil";
-export type OneClickDropdownFieldProps = {
+export interface OneClickDropdownFieldProps {
label: string;
name: string;
options: DropdownOptionType[];
@@ -35,7 +35,7 @@ export type OneClickDropdownFieldProps = {
defaultValue?: string;
isDataIdentifier?: boolean;
allowClear?: boolean;
-};
+}
/* useDropdown hook - this hook is specific to one click binding control and handles all the logic for the dropdown
* This hook is used to get the options for the dropdown based on the optionType provided by the widget's control config
diff --git a/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/WidgetSpecificControls/index.tsx b/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/WidgetSpecificControls/index.tsx
index 232ffda515..4f0eb842e9 100644
--- a/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/WidgetSpecificControls/index.tsx
+++ b/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/WidgetSpecificControls/index.tsx
@@ -5,11 +5,11 @@ import type { Alias, OtherField } from "../types";
import { OtherFieldComponent } from "./OtherFields";
import { useFormConfig } from "../common/useFormConfig";
-type Props = {
+interface Props {
hasSearchableColumn?: boolean;
aliases?: Alias[];
otherFields?: OtherField[];
-};
+}
export default function WidgetSpecificControls(props: Props) {
let searchableColumn = null;
diff --git a/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/index.tsx b/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/index.tsx
index 0ef8bba672..24702c7a19 100644
--- a/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/index.tsx
+++ b/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/index.tsx
@@ -22,7 +22,7 @@ import {
import { DROPDOWN_VARIANT } from "./CommonControls/DatasourceDropdown/types";
-type WidgetQueryGeneratorFormContextType = {
+interface WidgetQueryGeneratorFormContextType {
widgetId: string;
propertyValue: string;
propertyName: string;
@@ -56,7 +56,7 @@ type WidgetQueryGeneratorFormContextType = {
datasourceDropdownVariant: DROPDOWN_VARIANT;
alertMessage?: AlertMessage | null;
showEditFieldsModal?: boolean;
-};
+}
const DEFAULT_CONFIG_VALUE = {
datasource: "",
@@ -96,7 +96,7 @@ export const WidgetQueryGeneratorFormContext =
DEFAULT_CONTEXT_VALUE,
);
-type Props = {
+interface Props {
propertyPath: string;
propertyValue: string;
onUpdate: (snippet?: string, makeDynamicPropertyPath?: boolean) => void;
@@ -113,7 +113,7 @@ type Props = {
datasourceDropdownVariant: DROPDOWN_VARIANT;
actionButtonCtaText?: string;
alertMessage?: AlertMessage;
-};
+}
function WidgetQueryGeneratorForm(props: Props) {
const dispatch = useDispatch();
@@ -121,22 +121,22 @@ function WidgetQueryGeneratorForm(props: Props) {
const [pristine, setPristine] = useState(true);
const {
- aliases,
- alertMessage,
- showEditFieldsModal = false,
actionButtonCtaText = createMessage(CONNECT_BUTTON_TEXT),
+ alertMessage,
+ aliases,
+ datasourceDropdownVariant,
errorMsg,
excludePrimaryColumnFromQueryGeneration,
expectedType,
+ isConnectableToWidget,
onUpdate,
+ otherFields = [],
propertyPath,
propertyValue,
sampleData,
searchableColumn,
+ showEditFieldsModal = false,
widgetId,
- otherFields = [],
- isConnectableToWidget,
- datasourceDropdownVariant,
} = props;
const isSourceOpen = useSelector(getIsOneClickBindingOptionsVisibility);
diff --git a/app/client/src/components/editorComponents/form/FieldError.tsx b/app/client/src/components/editorComponents/form/FieldError.tsx
index 5b5471d30c..4e617c3fb5 100644
--- a/app/client/src/components/editorComponents/form/FieldError.tsx
+++ b/app/client/src/components/editorComponents/form/FieldError.tsx
@@ -15,10 +15,10 @@ const StyledError = styled.span<{ show: boolean }>`
margin-top: ${(props) => props.theme.spaces[1]}px;
`;
-type FormFieldErrorProps = {
+interface FormFieldErrorProps {
error?: string;
className?: string;
-};
+}
export function FormFieldError(props: FormFieldErrorProps) {
return (
diff --git a/app/client/src/components/editorComponents/form/FormActionButton.tsx b/app/client/src/components/editorComponents/form/FormActionButton.tsx
index d2a7fa5f0d..e76b36ac39 100644
--- a/app/client/src/components/editorComponents/form/FormActionButton.tsx
+++ b/app/client/src/components/editorComponents/form/FormActionButton.tsx
@@ -3,10 +3,10 @@ import { Button } from "@blueprintjs/core";
import type { Intent } from "constants/DefaultTheme";
import { BlueprintButtonIntentsCSS } from "constants/DefaultTheme";
-type FormActionButtonProps = {
+interface FormActionButtonProps {
intent?: Intent;
large?: boolean;
-};
+}
export default styled(Button)`
${BlueprintButtonIntentsCSS}
diff --git a/app/client/src/components/editorComponents/form/FormDialogComponent.tsx b/app/client/src/components/editorComponents/form/FormDialogComponent.tsx
index a5d4874519..c4597694d6 100644
--- a/app/client/src/components/editorComponents/form/FormDialogComponent.tsx
+++ b/app/client/src/components/editorComponents/form/FormDialogComponent.tsx
@@ -7,7 +7,7 @@ import {
ModalHeader,
} from "design-system";
-type FormDialogComponentProps = {
+interface FormDialogComponentProps {
isOpen?: boolean;
workspace?: any;
title?: string;
@@ -17,7 +17,7 @@ type FormDialogComponentProps = {
applicationId?: string;
placeholder?: string;
hideDefaultTrigger?: boolean;
-};
+}
export function FormDialogComponent(props: FormDialogComponentProps) {
const [isModalOpen, setIsModalOpenState] = useState(!!props.isOpen);
diff --git a/app/client/src/components/editorComponents/form/FormFooter.tsx b/app/client/src/components/editorComponents/form/FormFooter.tsx
index 807af74bb9..062e120f8d 100644
--- a/app/client/src/components/editorComponents/form/FormFooter.tsx
+++ b/app/client/src/components/editorComponents/form/FormFooter.tsx
@@ -3,7 +3,7 @@ import styled from "styled-components";
import Button from "components/editorComponents/Button";
import Divider from "components/editorComponents/Divider";
-type FormFooterProps = {
+interface FormFooterProps {
onCancel?: () => void;
onSubmit?: () => void;
divider?: boolean;
@@ -13,7 +13,7 @@ type FormFooterProps = {
submitOnEnter?: boolean;
canSubmit?: boolean;
size?: "large" | "small";
-};
+}
const FooterActions = styled.div`
margin: 1em;
diff --git a/app/client/src/components/editorComponents/form/FormMessage.tsx b/app/client/src/components/editorComponents/form/FormMessage.tsx
index 1b077f9c31..5da430af88 100644
--- a/app/client/src/components/editorComponents/form/FormMessage.tsx
+++ b/app/client/src/components/editorComponents/form/FormMessage.tsx
@@ -10,12 +10,12 @@ import {
} from "constants/DefaultTheme";
import Button from "components/editorComponents/Button";
-export type MessageAction = {
+export interface MessageAction {
url?: string;
onClick?: () => void;
text: string;
intent: Intent;
-};
+}
const StyledMessage = styled.div`
& {
@@ -99,11 +99,11 @@ export function ActionButton(props: MessageAction) {
return null;
}
-export type FormMessageProps = {
+export interface FormMessageProps {
intent: Intent;
message: string;
actions?: MessageAction[];
-};
+}
export function FormMessage(props: FormMessageProps) {
const actions =
diff --git a/app/client/src/components/editorComponents/form/FormTextField.tsx b/app/client/src/components/editorComponents/form/FormTextField.tsx
index ee6f62b4f7..a7947c0feb 100644
--- a/app/client/src/components/editorComponents/form/FormTextField.tsx
+++ b/app/client/src/components/editorComponents/form/FormTextField.tsx
@@ -21,7 +21,7 @@ const renderComponent = (
);
};
-type FormTextFieldProps = {
+interface FormTextFieldProps {
name: string;
placeholder: string;
type?: InputType;
@@ -29,7 +29,7 @@ type FormTextFieldProps = {
intent?: Intent;
disabled?: boolean;
autoFocus?: boolean;
-};
+}
// trigger tests
function FormTextField(props: FormTextFieldProps) {
diff --git a/app/client/src/components/editorComponents/form/ToggleComponentToJson.tsx b/app/client/src/components/editorComponents/form/ToggleComponentToJson.tsx
index fdcdd7a190..29391caffc 100644
--- a/app/client/src/components/editorComponents/form/ToggleComponentToJson.tsx
+++ b/app/client/src/components/editorComponents/form/ToggleComponentToJson.tsx
@@ -18,7 +18,7 @@ import { JS_TOGGLE_DISABLED_MESSAGE } from "@appsmith/constants/messages";
import { ToggleButton, Tooltip } from "design-system";
import styled from "styled-components";
-type Props = {
+interface Props {
viewType: ViewTypes;
customStyles: Record;
componentControlType: string;
@@ -27,13 +27,13 @@ type Props = {
formName: string;
disabled: boolean | undefined;
renderCompFunction: (config?: ControlProps) => JSX.Element;
-};
+}
-type HandlerProps = {
+interface HandlerProps {
configProperty: string;
formName: string;
change: (formName: string, id: string, value: any) => void;
-};
+}
function ToggleComponentToJsonHandler(props: HandlerProps) {
const formValues: Partial = useSelector((state: AppState) =>
diff --git a/app/client/src/components/editorComponents/form/fields/DropdownWrapper.tsx b/app/client/src/components/editorComponents/form/fields/DropdownWrapper.tsx
index 765518acbc..ea6c035fff 100644
--- a/app/client/src/components/editorComponents/form/fields/DropdownWrapper.tsx
+++ b/app/client/src/components/editorComponents/form/fields/DropdownWrapper.tsx
@@ -3,7 +3,7 @@ import { Text, Option, Select } from "design-system";
import React, { useEffect, useState } from "react";
import type { DropdownOnSelect } from "./SelectField";
-type DropdownWrapperProps = {
+interface DropdownWrapperProps {
allowDeselection?: boolean;
placeholder: string;
input?: {
@@ -24,7 +24,7 @@ type DropdownWrapperProps = {
disabled?: boolean;
dropdownMaxHeight?: string;
enableSearch?: boolean;
-};
+}
function DropdownWrapper(props: DropdownWrapperProps) {
const [selectedOption, setSelectedOption] = useState([
diff --git a/app/client/src/components/editorComponents/form/fields/EmbeddedDatasourcePathField.tsx b/app/client/src/components/editorComponents/form/fields/EmbeddedDatasourcePathField.tsx
index 2d5002db86..bb49c11bf8 100644
--- a/app/client/src/components/editorComponents/form/fields/EmbeddedDatasourcePathField.tsx
+++ b/app/client/src/components/editorComponents/form/fields/EmbeddedDatasourcePathField.tsx
@@ -34,7 +34,7 @@ import { getCurrentApplicationId } from "selectors/editorSelectors";
import { Indices } from "constants/Layers";
import { getExpectedValue } from "utils/validation/common";
import { ValidationTypes } from "constants/WidgetValidation";
-import type { DataTree } from "@appsmith/entities/DataTree/types";
+import type { DataTree } from "entities/DataTree/dataTreeTypes";
import { ENTITY_TYPE_VALUE } from "entities/DataTree/dataTreeFactory";
import { getDataTree } from "selectors/dataTreeSelectors";
import type { KeyValuePair } from "entities/Action";
@@ -61,7 +61,7 @@ import {
import { isGACEnabled } from "@appsmith/utils/planHelpers";
import { selectFeatureFlags } from "@appsmith/selectors/featureFlagsSelectors";
-type ReduxStateProps = {
+interface ReduxStateProps {
workspaceId: string;
currentEnvironment: string;
datasource: EmbeddedRestDatasource;
@@ -73,11 +73,11 @@ type ReduxStateProps = {
formName: string;
userWorkspacePermissions: string[];
isFeatureEnabled: boolean;
-};
+}
-type ReduxDispatchProps = {
+interface ReduxDispatchProps {
updateDatasource: (datasource: EmbeddedRestDatasource) => void;
-};
+}
type Props = EditorProps &
ReduxStateProps &
@@ -147,7 +147,8 @@ const StyledTooltip = styled.span<{ width?: number }>`
text-align: left;
background-color: var(--ads-v2-color-bg-emphasis-max);
border-radius: var(--ads-v2-border-radius);
- box-shadow: 0 2px 4px -2px rgba(0, 0, 0, 0.06),
+ box-shadow:
+ 0 2px 4px -2px rgba(0, 0, 0, 0.06),
0 4px 8px -2px rgba(0, 0, 0, 0.1);
color: var(--ads-v2-color-fg-on-emphasis-max);
font-family: var(--ads-v2-font-family);
diff --git a/app/client/src/components/editorComponents/form/fields/KeyValueFieldArray.tsx b/app/client/src/components/editorComponents/form/fields/KeyValueFieldArray.tsx
index f085ce875b..670ec522d4 100644
--- a/app/client/src/components/editorComponents/form/fields/KeyValueFieldArray.tsx
+++ b/app/client/src/components/editorComponents/form/fields/KeyValueFieldArray.tsx
@@ -21,9 +21,9 @@ import {
import { Button, Text } from "design-system";
import RequestDropdownField from "./RequestDropdownField";
-type CustomStack = {
+interface CustomStack {
removeTopPadding?: boolean;
-};
+}
const KeyValueStackContainer = styled.div`
padding: 0 0 var(--ads-v2-spaces-7) 0;
@@ -269,7 +269,7 @@ function KeyValueRow(props: Props & WrappedFieldArrayProps) {
);
}
-type Props = {
+interface Props {
name: string;
label: string;
rightIcon?: React.ReactNode;
@@ -285,7 +285,7 @@ type Props = {
theme?: EditorTheme;
hasType?: boolean;
removeTopPadding?: boolean;
-};
+}
function KeyValueFieldArray(props: Props) {
return (
diff --git a/app/client/src/components/editorComponents/form/fields/RadioGroupWrapper.tsx b/app/client/src/components/editorComponents/form/fields/RadioGroupWrapper.tsx
index 9b2a96d757..34a34dc087 100644
--- a/app/client/src/components/editorComponents/form/fields/RadioGroupWrapper.tsx
+++ b/app/client/src/components/editorComponents/form/fields/RadioGroupWrapper.tsx
@@ -3,7 +3,7 @@ import React, { useEffect, useState } from "react";
import type { WrappedFieldInputProps } from "redux-form";
import styled from "styled-components";
-export type RadioGroupWrapperProps = {
+export interface RadioGroupWrapperProps {
placeholder: string;
input: WrappedFieldInputProps;
options: Array<{ value: string; label: string }>;
@@ -11,7 +11,7 @@ export type RadioGroupWrapperProps = {
className?: string;
columns?: number;
rows?: number;
-};
+}
const RadioContainer = styled.div`
display: flex;
diff --git a/app/client/src/components/editorComponents/form/fields/SelectField.tsx b/app/client/src/components/editorComponents/form/fields/SelectField.tsx
index 50fc0ae4af..56a2f26502 100644
--- a/app/client/src/components/editorComponents/form/fields/SelectField.tsx
+++ b/app/client/src/components/editorComponents/form/fields/SelectField.tsx
@@ -15,7 +15,7 @@ const renderComponent = (
export type DropdownOnSelect = (value?: string, dropdownOption?: any) => void;
-type SelectFieldProps = {
+interface SelectFieldProps {
allowDeselection?: boolean;
isMultiSelect?: boolean;
name: string;
@@ -32,7 +32,7 @@ type SelectFieldProps = {
disabled?: boolean;
dropdownMaxHeight?: string;
enableSearch?: boolean;
-};
+}
export function SelectField(props: SelectFieldProps) {
return (
diff --git a/app/client/src/components/editorComponents/form/fields/TagListField.tsx b/app/client/src/components/editorComponents/form/fields/TagListField.tsx
index 3ae36bd710..1146863fbb 100644
--- a/app/client/src/components/editorComponents/form/fields/TagListField.tsx
+++ b/app/client/src/components/editorComponents/form/fields/TagListField.tsx
@@ -14,7 +14,7 @@ const renderComponent = (
return ;
};
-type TagListFieldProps = {
+interface TagListFieldProps {
autofocus?: boolean;
className?: string;
name: string;
@@ -25,7 +25,7 @@ type TagListFieldProps = {
customError: (err: string, values?: string[]) => void;
suggestions?: { id: string; name: string; icon?: string }[];
suggestionLeftIcon?: ReactElement;
-};
+}
function TagListField(props: TagListFieldProps) {
return ;
diff --git a/app/client/src/components/editorComponents/form/fields/TextField.tsx b/app/client/src/components/editorComponents/form/fields/TextField.tsx
index bc5d85cf00..04802b7f70 100644
--- a/app/client/src/components/editorComponents/form/fields/TextField.tsx
+++ b/app/client/src/components/editorComponents/form/fields/TextField.tsx
@@ -4,9 +4,9 @@ import { Field } from "redux-form";
import type { InputProps } from "design-system";
import { Input } from "design-system";
-type FieldProps = {
+interface FieldProps {
type?: string;
-};
+}
class TextField extends React.Component<
BaseFieldProps & InputProps & FieldProps
diff --git a/app/client/src/components/featureWalkthrough/utils.ts b/app/client/src/components/featureWalkthrough/utils.ts
index d46280a28f..3ada8245f5 100644
--- a/app/client/src/components/featureWalkthrough/utils.ts
+++ b/app/client/src/components/featureWalkthrough/utils.ts
@@ -3,10 +3,10 @@ import type { OffsetType, PositionType } from "./walkthroughContext";
const DEFAULT_POSITION: PositionType = "top";
export const PADDING_HIGHLIGHT = 10;
-type PositionCalculator = {
+interface PositionCalculator {
offset?: OffsetType;
targetId: string;
-};
+}
export function getPosition({ offset, targetId }: PositionCalculator) {
const target = document.querySelector(targetId);
diff --git a/app/client/src/components/featureWalkthrough/walkthroughContext.tsx b/app/client/src/components/featureWalkthrough/walkthroughContext.tsx
index 4e3a85046f..74978f9d2a 100644
--- a/app/client/src/components/featureWalkthrough/walkthroughContext.tsx
+++ b/app/client/src/components/featureWalkthrough/walkthroughContext.tsx
@@ -4,7 +4,7 @@ export type PositionType = "top" | "bottom" | "left" | "right";
export const DEFAULT_DELAY = 0;
-export type OffsetType = {
+export interface OffsetType {
// Position for the instructions and indicator
position?: PositionType;
// Adds an offset to top or bottom properties (of Instruction div) depending upon the position
@@ -18,18 +18,18 @@ export type OffsetType = {
indicatorLeft?: number;
// container offset for highlight
highlightPad?: number;
-};
+}
-export type FeatureDetails = {
+export interface FeatureDetails {
// Title to show on the instruction screen
title: string;
// Description to show on the instruction screen
description: string;
// Gif or Image to give a walkthrough
imageURL?: string;
-};
+}
-export type FeatureParams = {
+export interface FeatureParams {
// To execute a function on dismissing the tutorial walkthrough.
onDismiss?: () => void;
// Target Id without # to highlight the feature
@@ -50,14 +50,14 @@ export type FeatureParams = {
dismissOnOverlayClick?: boolean;
// execute function just before showing walkthrough highlight
runBeforeWalkthrough?: () => void;
-};
+}
-type WalkthroughContextType = {
+interface WalkthroughContextType {
pushFeature: (feature: FeatureParams, prioritize?: boolean) => void;
popFeature: (triggeredFrom?: string) => void;
feature: FeatureParams[];
isOpened: boolean;
-};
+}
const WalkthroughContext = React.createContext<
WalkthroughContextType | undefined
diff --git a/app/client/src/components/featureWalkthrough/walkthroughRenderer.tsx b/app/client/src/components/featureWalkthrough/walkthroughRenderer.tsx
index 89f7d6c6f0..9948e1c06c 100644
--- a/app/client/src/components/featureWalkthrough/walkthroughRenderer.tsx
+++ b/app/client/src/components/featureWalkthrough/walkthroughRenderer.tsx
@@ -70,7 +70,7 @@ const InstructionsHeaderWrapper = styled.div`
}
`;
-type RefRectParams = {
+interface RefRectParams {
// body params
bh: number;
bw: number;
@@ -79,7 +79,7 @@ type RefRectParams = {
tw: number;
tx: number;
ty: number;
-};
+}
/*
* Clip Path Polygon for single target with bounding rect :
@@ -122,12 +122,12 @@ type BoundingRectTargets = Record;
const WalkthroughRenderer = ({
details,
- offset,
- targetId,
+ dismissOnOverlayClick,
eventParams = {},
multipleHighlights,
+ offset,
overlayColor,
- dismissOnOverlayClick,
+ targetId,
}: FeatureParams) => {
const [boundingRects, setBoundingRects] =
useState(null);
diff --git a/app/client/src/components/formControls/BaseControl.tsx b/app/client/src/components/formControls/BaseControl.tsx
index 114cac275c..3a3d4e8a7d 100644
--- a/app/client/src/components/formControls/BaseControl.tsx
+++ b/app/client/src/components/formControls/BaseControl.tsx
@@ -29,14 +29,17 @@ export enum ComparisonOperationsEnum {
export type HiddenType = boolean | Condition | ConditionObject;
-export type ConditionObject = { conditionType: string; conditions: Conditions };
+export interface ConditionObject {
+ conditionType: string;
+ conditions: Conditions;
+}
-export type Condition = {
+export interface Condition {
path: string;
comparison: ComparisonOperations;
value: any;
flagValue: FeatureFlag;
-};
+}
export type Conditions = Array | ConditionObject;
export interface ControlBuilder {
diff --git a/app/client/src/components/formControls/DropDownControl.tsx b/app/client/src/components/formControls/DropDownControl.tsx
index 21c583ffd5..c32ca384d3 100644
--- a/app/client/src/components/formControls/DropDownControl.tsx
+++ b/app/client/src/components/formControls/DropDownControl.tsx
@@ -269,13 +269,13 @@ export interface DropDownControlProps extends ControlProps {
formValues: Partial;
}
-type ReduxDispatchProps = {
+interface ReduxDispatchProps {
updateConfigPropertyValue: (
formName: string,
field: string,
value: any,
) => void;
-};
+}
type Props = DropDownControlProps & ReduxDispatchProps;
diff --git a/app/client/src/components/formControls/SegmentedControl.tsx b/app/client/src/components/formControls/SegmentedControl.tsx
index bcfda91994..b3bca23c6b 100644
--- a/app/client/src/components/formControls/SegmentedControl.tsx
+++ b/app/client/src/components/formControls/SegmentedControl.tsx
@@ -105,13 +105,13 @@ export interface SegmentedControlProps extends ControlProps {
formValues: Partial;
}
-type ReduxDispatchProps = {
+interface ReduxDispatchProps {
updateConfigPropertyValue: (
formName: string,
field: string,
value: any,
) => void;
-};
+}
type Props = SegmentedControlProps & ReduxDispatchProps;
diff --git a/app/client/src/components/formControls/StyledControls.tsx b/app/client/src/components/formControls/StyledControls.tsx
index ffd1bfb4dc..58dd3e6c69 100644
--- a/app/client/src/components/formControls/StyledControls.tsx
+++ b/app/client/src/components/formControls/StyledControls.tsx
@@ -13,9 +13,9 @@ import type { ContainerOrientation } from "constants/WidgetConstants";
import { DateInput } from "@blueprintjs/datetime";
import { Colors } from "constants/Colors";
-type ControlWrapperProps = {
+interface ControlWrapperProps {
orientation?: ContainerOrientation;
-};
+}
export const ControlWrapper = styled.div`
display: ${(props) =>
diff --git a/app/client/src/components/formControls/WhereClauseControl.tsx b/app/client/src/components/formControls/WhereClauseControl.tsx
index 9e5f622fdc..12f6f92d6d 100644
--- a/app/client/src/components/formControls/WhereClauseControl.tsx
+++ b/app/client/src/components/formControls/WhereClauseControl.tsx
@@ -16,12 +16,12 @@ const OperatorDropdownWidth = 100; // operators should have longer dropdown widt
const Margin = 8;
// Type of the value for each condition
-export type whereClauseValueType = {
+export interface whereClauseValueType {
condition?: string;
children?: [whereClauseValueType];
key?: string;
value?: string;
-};
+}
// Form config for the value field
const valueFieldConfig: any = {
diff --git a/app/client/src/components/propertyControls/ButtonControl.tsx b/app/client/src/components/propertyControls/ButtonControl.tsx
index 425e92927a..656ce0d206 100644
--- a/app/client/src/components/propertyControls/ButtonControl.tsx
+++ b/app/client/src/components/propertyControls/ButtonControl.tsx
@@ -4,12 +4,12 @@ import type { ControlProps } from "./BaseControl";
import BaseControl from "./BaseControl";
import { Button } from "design-system";
-export type OnButtonClickProps = {
+export interface OnButtonClickProps {
props: ControlProps;
updateProperty: (propertyName: string, propertyValue: any) => void;
deleteProperties: (propertyPaths: string[]) => void;
batchUpdateProperties: (updates: Record) => void;
-};
+}
export type ButtonControlProps = ControlProps & {
onClick: (props: OnButtonClickProps) => void;
@@ -17,9 +17,9 @@ export type ButtonControlProps = ControlProps & {
isDisabled?: (widgetProperties: any) => boolean;
};
-type ButtonControlState = {
+interface ButtonControlState {
isLoading: boolean;
-};
+}
class ButtonControl extends BaseControl<
ButtonControlProps,
diff --git a/app/client/src/components/propertyControls/ButtonListControl.tsx b/app/client/src/components/propertyControls/ButtonListControl.tsx
index f738f540c2..bd9d258eee 100644
--- a/app/client/src/components/propertyControls/ButtonListControl.tsx
+++ b/app/client/src/components/propertyControls/ButtonListControl.tsx
@@ -11,9 +11,9 @@ import { ButtonPlacementTypes } from "components/constants";
import { DraggableListControl } from "pages/Editor/PropertyPane/DraggableListControl";
import { DraggableListCard } from "components/propertyControls/DraggableListCard";
-type State = {
+interface State {
focusedIndex: number | null;
-};
+}
class ButtonListControl extends BaseControl {
constructor(props: ControlProps) {
diff --git a/app/client/src/components/propertyControls/ChartDataControl.tsx b/app/client/src/components/propertyControls/ChartDataControl.tsx
index d189b92f40..762ff5c76d 100644
--- a/app/client/src/components/propertyControls/ChartDataControl.tsx
+++ b/app/client/src/components/propertyControls/ChartDataControl.tsx
@@ -81,7 +81,7 @@ const Box = styled.div`
height: 16px;
`;
-type RenderComponentProps = {
+interface RenderComponentProps {
index: string;
item: ChartData;
length: number;
@@ -95,7 +95,7 @@ type RenderComponentProps = {
};
theme: EditorTheme;
isPieChart?: boolean;
-};
+}
const expectedSeriesName: CodeEditorExpected = {
type: "string",
diff --git a/app/client/src/components/propertyControls/DraggableListCard.tsx b/app/client/src/components/propertyControls/DraggableListCard.tsx
index 8a409feb11..635aa5c374 100644
--- a/app/client/src/components/propertyControls/DraggableListCard.tsx
+++ b/app/client/src/components/propertyControls/DraggableListCard.tsx
@@ -17,7 +17,7 @@ const ItemWrapper = styled.div`
}
`;
-type RenderComponentProps = {
+interface RenderComponentProps {
focusedIndex: number | null | undefined;
index: number;
item: {
@@ -40,7 +40,7 @@ type RenderComponentProps = {
toggleVisibility?: (index: number) => void;
toggleCheckbox?: (index: number, checked: boolean) => void;
isAllColumnEditable?: boolean;
-};
+}
const PADDING_WITHOUT_CHECKBOX = 60;
const PADDING_WITH_CHECKBOX = 90;
diff --git a/app/client/src/components/propertyControls/DraggableListComponent.tsx b/app/client/src/components/propertyControls/DraggableListComponent.tsx
index 744356c651..3290f2973e 100644
--- a/app/client/src/components/propertyControls/DraggableListComponent.tsx
+++ b/app/client/src/components/propertyControls/DraggableListComponent.tsx
@@ -2,13 +2,16 @@ import equal from "fast-deep-equal/es6";
import React from "react";
import { DraggableList } from "design-system-old";
-export type BaseItemProps = {
+export interface BaseItemProps {
id: string;
isVisible?: boolean;
label: string;
-};
+ isDuplicateLabel?: boolean;
+ isChecked?: boolean;
+ isDragDisabled?: boolean;
+}
-export type RenderComponentProps = {
+export interface RenderComponentProps {
focusedIndex: number | null | undefined;
index: number;
item: TItem;
@@ -20,9 +23,9 @@ export type RenderComponentProps = {
updateFocus?: (index: number, isFocused: boolean) => void;
isDragging: boolean;
isDelete?: boolean;
-};
+}
-export type DroppableComponentProps = {
+export interface DroppableComponentProps {
className?: string;
fixedHeight?: number | boolean;
focusedIndex: number | null | undefined;
@@ -37,7 +40,7 @@ export type DroppableComponentProps = {
onEdit?: (index: number) => void;
updateFocus?: (index: number, isFocused: boolean) => void;
keyAccessor?: string;
-};
+}
export class DroppableComponent<
TItem extends BaseItemProps,
@@ -63,7 +66,7 @@ export class DroppableComponent<
);
}
- getVisibleObject(item: Record) {
+ getVisibleObject(item: TItem) {
if (!item) return {};
return {
diff --git a/app/client/src/components/propertyControls/DropDownControl.tsx b/app/client/src/components/propertyControls/DropDownControl.tsx
index 430f839e29..9406f5296b 100644
--- a/app/client/src/components/propertyControls/DropDownControl.tsx
+++ b/app/client/src/components/propertyControls/DropDownControl.tsx
@@ -100,9 +100,8 @@ class DropDownControl extends BaseControl {
? this.props.evaluatedValue
: this.props.propertyValue;
- selected = options.find(
- (option) => option.value === computedValue,
- )?.value;
+ selected = options.find((option) => option.value === computedValue)
+ ?.value;
if (this.props.alwaysShowSelected && !selected) {
selected = computedValue;
diff --git a/app/client/src/components/propertyControls/FieldConfigurationControl.tsx b/app/client/src/components/propertyControls/FieldConfigurationControl.tsx
index c7f43c6f61..e7a6c0ec18 100644
--- a/app/client/src/components/propertyControls/FieldConfigurationControl.tsx
+++ b/app/client/src/components/propertyControls/FieldConfigurationControl.tsx
@@ -25,9 +25,9 @@ type DroppableItem = BaseItemProps & {
isCustomField: boolean;
};
-type State = {
+interface State {
focusedIndex: number | null;
-};
+}
const DEFAULT_FIELD_NAME = "customField";
@@ -113,7 +113,7 @@ class FieldConfigurationControl extends BaseControl {
addNewField = () => {
if (this.isArrayItem()) return;
- const { propertyValue = {}, propertyName, widgetProperties } = this.props;
+ const { propertyName, propertyValue = {}, widgetProperties } = this.props;
const { childStylesheet, widgetName } =
widgetProperties as JSONFormWidgetProps;
const schema: Schema = propertyValue;
@@ -193,7 +193,7 @@ class FieldConfigurationControl extends BaseControl {
};
render() {
- const { propertyValue = {}, panelConfig } = this.props;
+ const { panelConfig, propertyValue = {} } = this.props;
const schema: Schema = propertyValue;
const schemaItems = Object.values(schema);
diff --git a/app/client/src/components/propertyControls/KeyValueComponent.tsx b/app/client/src/components/propertyControls/KeyValueComponent.tsx
index 98d2f22ab8..ab9ef69223 100644
--- a/app/client/src/components/propertyControls/KeyValueComponent.tsx
+++ b/app/client/src/components/propertyControls/KeyValueComponent.tsx
@@ -48,11 +48,11 @@ type UpdatePairFunction = (
isUpdatedViaKeyboard?: boolean,
) => any;
-type KeyValueComponentProps = {
+interface KeyValueComponentProps {
pairs: SegmentedControlOption[];
updatePairs: UpdatePairFunction;
addLabel?: string;
-};
+}
type SegmentedControlOptionWithKey = SegmentedControlOption & {
key: string;
diff --git a/app/client/src/components/propertyControls/MenuButtonDynamicItemsControl.tsx b/app/client/src/components/propertyControls/MenuButtonDynamicItemsControl.tsx
index c7870916f4..aa0e5a541c 100644
--- a/app/client/src/components/propertyControls/MenuButtonDynamicItemsControl.tsx
+++ b/app/client/src/components/propertyControls/MenuButtonDynamicItemsControl.tsx
@@ -43,7 +43,7 @@ const CurlyBraces = styled.span`
font-weight: var(--ads-v2-font-weight-bold);
`;
-type InputTextProp = {
+interface InputTextProp {
label: string;
value: string;
onChange: (event: React.ChangeEvent | string) => void;
@@ -53,7 +53,7 @@ type InputTextProp = {
dataTreePath?: string;
additionalDynamicData: AdditionalDynamicDataTree;
theme: EditorTheme;
-};
+}
function InputText(props: InputTextProp) {
const {
diff --git a/app/client/src/components/propertyControls/MenuItemsControl.tsx b/app/client/src/components/propertyControls/MenuItemsControl.tsx
index b15f9b2840..a575e054f0 100644
--- a/app/client/src/components/propertyControls/MenuItemsControl.tsx
+++ b/app/client/src/components/propertyControls/MenuItemsControl.tsx
@@ -10,9 +10,9 @@ import { DraggableListControl } from "pages/Editor/PropertyPane/DraggableListCon
import { DraggableListCard } from "components/propertyControls/DraggableListCard";
import { Button } from "design-system";
-type State = {
+interface State {
focusedIndex: number | null;
-};
+}
class MenuItemsControl extends BaseControl {
constructor(props: ControlProps) {
diff --git a/app/client/src/components/propertyControls/PrimaryColumnsControl.tsx b/app/client/src/components/propertyControls/PrimaryColumnsControl.tsx
index 476bd671f7..faa9c8d4b4 100644
--- a/app/client/src/components/propertyControls/PrimaryColumnsControl.tsx
+++ b/app/client/src/components/propertyControls/PrimaryColumnsControl.tsx
@@ -17,7 +17,7 @@ import {
getTableStyles,
} from "widgets/TableWidget/component/TableUtilities";
import { reorderColumns } from "widgets/TableWidget/component/TableHelpers";
-import type { DataTree } from "@appsmith/entities/DataTree/types";
+import type { DataTree } from "entities/DataTree/dataTreeTypes";
import { getDataTreeForAutocomplete } from "selectors/dataTreeSelectors";
import type { EvaluationError } from "utils/DynamicBindingUtils";
import { getEvalErrorPath, getEvalValuePath } from "utils/DynamicBindingUtils";
@@ -56,10 +56,10 @@ const getOriginalColumn = (
return column;
};
-type State = {
+interface State {
focusedIndex: number | null;
duplicateColumnIds: string[];
-};
+}
class PrimaryColumnsControl extends BaseControl {
constructor(props: ControlProps) {
diff --git a/app/client/src/components/propertyControls/PrimaryColumnsControlV2.tsx b/app/client/src/components/propertyControls/PrimaryColumnsControlV2.tsx
index 484de803ed..814ba86463 100644
--- a/app/client/src/components/propertyControls/PrimaryColumnsControlV2.tsx
+++ b/app/client/src/components/propertyControls/PrimaryColumnsControlV2.tsx
@@ -18,7 +18,7 @@ import {
isColumnTypeEditable,
reorderColumns,
} from "widgets/TableWidgetV2/widget/utilities";
-import type { DataTree } from "@appsmith/entities/DataTree/types";
+import type { DataTree } from "entities/DataTree/dataTreeTypes";
import {
getDataTreeForAutocomplete,
getPathEvalErrors,
@@ -81,11 +81,11 @@ const getOriginalColumn = (
return column;
};
-type State = {
+interface State {
focusedIndex: number | null;
duplicateColumnIds: string[];
hasScrollableList: boolean;
-};
+}
const LIST_CLASSNAME = "tablewidgetv2-primarycolumn-list";
class PrimaryColumnsControlV2 extends BaseControl {
diff --git a/app/client/src/components/propertyControls/SelectDefaultValueControl.tsx b/app/client/src/components/propertyControls/SelectDefaultValueControl.tsx
index cbf5eee371..926164863a 100644
--- a/app/client/src/components/propertyControls/SelectDefaultValueControl.tsx
+++ b/app/client/src/components/propertyControls/SelectDefaultValueControl.tsx
@@ -48,7 +48,7 @@ export const JSToString = (js: string): string => {
.join("");
};
-type InputTextProp = {
+interface InputTextProp {
label: string;
value: string;
onChange: (event: React.ChangeEvent | string) => void;
@@ -57,7 +57,7 @@ type InputTextProp = {
placeholder?: string;
dataTreePath?: string;
theme: EditorTheme;
-};
+}
function InputText(props: InputTextProp) {
const {
diff --git a/app/client/src/components/propertyControls/StyledControls.tsx b/app/client/src/components/propertyControls/StyledControls.tsx
index 943c93056a..7a13720d11 100644
--- a/app/client/src/components/propertyControls/StyledControls.tsx
+++ b/app/client/src/components/propertyControls/StyledControls.tsx
@@ -5,10 +5,10 @@ import type { ContainerOrientation } from "constants/WidgetConstants";
import { Input, Icon } from "design-system";
import useInteractionAnalyticsEvent from "utils/hooks/useInteractionAnalyticsEvent";
-type ControlWrapperProps = {
+interface ControlWrapperProps {
orientation?: ContainerOrientation;
isAction?: boolean;
-};
+}
export const ControlWrapper = styled.div`
display: ${(props) =>
diff --git a/app/client/src/components/propertyControls/TabControl.tsx b/app/client/src/components/propertyControls/TabControl.tsx
index dc86b06e99..e1797cae16 100644
--- a/app/client/src/components/propertyControls/TabControl.tsx
+++ b/app/client/src/components/propertyControls/TabControl.tsx
@@ -61,10 +61,10 @@ function TabControlComponent(props: RenderComponentProps) {
);
}
-type State = {
+interface State {
focusedIndex: number | null;
duplicateTabIds: string[];
-};
+}
class TabControl extends BaseControl {
constructor(props: ControlProps) {
diff --git a/app/client/src/components/propertyControls/TableComputeValue.tsx b/app/client/src/components/propertyControls/TableComputeValue.tsx
index 620f6658e5..a4f07e6f0e 100644
--- a/app/client/src/components/propertyControls/TableComputeValue.tsx
+++ b/app/client/src/components/propertyControls/TableComputeValue.tsx
@@ -39,7 +39,7 @@ const CurlyBraces = styled.span`
font-weight: var(--ads-v2-font-weight-bold);
`;
-type InputTextProp = {
+interface InputTextProp {
label: string;
value: string;
onChange: (event: React.ChangeEvent | string) => void;
@@ -49,7 +49,7 @@ type InputTextProp = {
dataTreePath?: string;
additionalDynamicData: AdditionalDynamicDataTree;
theme: EditorTheme;
-};
+}
function InputText(props: InputTextProp) {
const {
diff --git a/app/client/src/components/propertyControls/TableInlineEditValidationControl.tsx b/app/client/src/components/propertyControls/TableInlineEditValidationControl.tsx
index 4cae9ff9ca..75edcc5d50 100644
--- a/app/client/src/components/propertyControls/TableInlineEditValidationControl.tsx
+++ b/app/client/src/components/propertyControls/TableInlineEditValidationControl.tsx
@@ -51,7 +51,7 @@ export const CurlyBraces = styled.span`
font-weight: var(--ads-v2-font-weight-bold);
`;
-type InputTextProp = {
+interface InputTextProp {
label: string;
value: string;
onChange: (event: React.ChangeEvent | string) => void;
@@ -62,7 +62,7 @@ type InputTextProp = {
additionalDynamicData: AdditionalDynamicDataTree;
theme: EditorTheme;
promptMessage?: JSX.Element;
-};
+}
export function InputText(props: InputTextProp) {
const {
diff --git a/app/client/src/components/propertyControls/WrappedCodeEditorControl.tsx b/app/client/src/components/propertyControls/WrappedCodeEditorControl.tsx
index 7969a8d742..f02df3e8e9 100644
--- a/app/client/src/components/propertyControls/WrappedCodeEditorControl.tsx
+++ b/app/client/src/components/propertyControls/WrappedCodeEditorControl.tsx
@@ -19,7 +19,7 @@ import { assistiveBindingHinter } from "components/editorComponents/CodeEditor/a
import { bindingHintHelper } from "components/editorComponents/CodeEditor/hintHelpers";
import { slashCommandHintHelper } from "components/editorComponents/CodeEditor/commandsHelper";
-type InputTextProp = {
+interface InputTextProp {
label: string;
value: string;
onChange: (event: React.ChangeEvent | string) => void;
@@ -29,7 +29,7 @@ type InputTextProp = {
dataTreePath?: string;
additionalDynamicData?: AdditionalDynamicDataTree;
theme: EditorTheme;
-};
+}
function InputText(props: InputTextProp) {
const {
diff --git a/app/client/src/components/utils/NameEditorComponent.tsx b/app/client/src/components/utils/NameEditorComponent.tsx
index 290e59b229..22864df943 100644
--- a/app/client/src/components/utils/NameEditorComponent.tsx
+++ b/app/client/src/components/utils/NameEditorComponent.tsx
@@ -19,14 +19,14 @@ import {
} from "@appsmith/constants/messages";
import { PluginType } from "entities/Action";
-type NameEditorProps = {
+interface NameEditorProps {
checkForGuidedTour?: boolean;
children: (params: any) => JSX.Element;
currentActionConfig: { id: string; name: string } | undefined;
dispatchAction: (a: any) => any;
suffixErrorMessage?: (params?: any) => string;
pluginType?: PluginType;
-};
+}
/**
* It is wrapper component using render props method.
diff --git a/app/client/src/components/utils/ReduxFormTextField.tsx b/app/client/src/components/utils/ReduxFormTextField.tsx
index afc12c86fa..70ba9e3cda 100644
--- a/app/client/src/components/utils/ReduxFormTextField.tsx
+++ b/app/client/src/components/utils/ReduxFormTextField.tsx
@@ -20,11 +20,9 @@ const renderComponent = (
{...omit(componentProps, "type")}
{...componentProps.input}
errorMessage={
- !componentProps.hideErrorMessage &&
- showError &&
- componentProps.meta.error &&
- componentProps.meta.error
+ !componentProps.hideErrorMessage && componentProps.meta.error
}
+ isDisabled={componentProps.disabled}
label={componentProps.label as string}
/>
) : (
@@ -36,13 +34,14 @@ const renderComponent = (
showError &&
componentProps.meta.error
}
+ isDisabled={componentProps.disabled}
renderAs={"input"}
size="md"
/>
);
};
-export type FormTextFieldProps = {
+export interface FormTextFieldProps {
name: string;
placeholder: string;
description?: string;
@@ -53,7 +52,7 @@ export type FormTextFieldProps = {
autoFocus?: boolean;
hideErrorMessage?: boolean;
isRequired?: boolean;
-};
+}
function ReduxFormTextField(props: FormTextFieldProps) {
return ;
diff --git a/app/client/src/components/utils/TreeStructure.tsx b/app/client/src/components/utils/TreeStructure.tsx
index dfe7783d81..c93942ba1d 100644
--- a/app/client/src/components/utils/TreeStructure.tsx
+++ b/app/client/src/components/utils/TreeStructure.tsx
@@ -67,9 +67,9 @@ const TreeStructureWrapper = styled.div`
}
`;
-type TreeStructureProps = {
+interface TreeStructureProps {
children: React.ReactNode;
-};
+}
const TreeStructure = React.forwardRef(
(props: TreeStructureProps, ref: any) => {
diff --git a/app/client/src/components/wds/Checkbox/index.tsx b/app/client/src/components/wds/Checkbox/index.tsx
index fbc6ba769f..a34850ab12 100644
--- a/app/client/src/components/wds/Checkbox/index.tsx
+++ b/app/client/src/components/wds/Checkbox/index.tsx
@@ -7,7 +7,7 @@ import DisabledIndeterminate from "assets/icons/widget/checkbox//disabled-indete
import { darkenColor } from "widgets/WidgetUtils";
-type StyledCheckboxProps = {
+interface StyledCheckboxProps {
checked?: boolean;
disabled?: boolean;
borderRadius?: string;
@@ -15,7 +15,7 @@ type StyledCheckboxProps = {
hasError?: boolean;
accentColor?: string;
inputRef?: (el: HTMLInputElement | null) => any;
-};
+}
const Checkbox = styled(BlueprintCheckbox)`
${({ accentColor, alignIndicator, borderRadius, hasError }) => `
diff --git a/app/client/src/components/wds/constants.ts b/app/client/src/components/wds/constants.ts
index b86e2aa195..cb05ba5aa2 100644
--- a/app/client/src/components/wds/constants.ts
+++ b/app/client/src/components/wds/constants.ts
@@ -1,4 +1,5 @@
export const WDS_V2_WIDGET_MAP = {
- BUTTON_WIDGET: "BUTTON_WIDGET_V2",
- INPUT_WIDGET_V2: "INPUT_WIDGET_V3",
+ BUTTON_WIDGET: "WDS_BUTTON_WIDGET",
+ INPUT_WIDGET_V2: "WDS_INPUT_WIDGET",
+ CHECKBOX_WIDGET: "WDS_CHECKBOX_WIDGET",
};
diff --git a/app/client/src/constants/ApiEditorConstants/GraphQLEditorConstants.ts b/app/client/src/constants/ApiEditorConstants/GraphQLEditorConstants.ts
index 0c81f7b0c4..0115f46b77 100644
--- a/app/client/src/constants/ApiEditorConstants/GraphQLEditorConstants.ts
+++ b/app/client/src/constants/ApiEditorConstants/GraphQLEditorConstants.ts
@@ -17,13 +17,13 @@ export const GRAPHQL_HTTP_METHOD_OPTIONS = [
];
// Graphql Pagination type
-type GRAPHQL_PAGINATION_INDIVIDUAL_TYPE = {
+interface GRAPHQL_PAGINATION_INDIVIDUAL_TYPE {
name?: any;
type?: any;
value?: any;
-};
+}
-export type GRAPHQL_PAGINATION_TYPE = {
+export interface GRAPHQL_PAGINATION_TYPE {
cursorBased?: {
next?: {
limit?: GRAPHQL_PAGINATION_INDIVIDUAL_TYPE & { isSeparate: boolean };
@@ -38,7 +38,7 @@ export type GRAPHQL_PAGINATION_TYPE = {
limit?: GRAPHQL_PAGINATION_INDIVIDUAL_TYPE;
offset?: GRAPHQL_PAGINATION_INDIVIDUAL_TYPE;
};
-};
+}
// Graphql Default Config
export const DEFAULT_GRAPHQL_ACTION_CONFIG: ApiActionConfig = {
diff --git a/app/client/src/constants/AppConstants.ts b/app/client/src/constants/AppConstants.ts
index ce2c8fc913..43d201193c 100644
--- a/app/client/src/constants/AppConstants.ts
+++ b/app/client/src/constants/AppConstants.ts
@@ -78,7 +78,7 @@ export const NAVIGATION_SETTINGS = {
},
};
-export type NavigationSetting = {
+export interface NavigationSetting {
showNavbar: boolean;
showSignIn: boolean;
orientation: (typeof NAVIGATION_SETTINGS.ORIENTATION)[keyof typeof NAVIGATION_SETTINGS.ORIENTATION];
@@ -88,7 +88,7 @@ export type NavigationSetting = {
colorStyle: (typeof NAVIGATION_SETTINGS.COLOR_STYLE)[keyof typeof NAVIGATION_SETTINGS.COLOR_STYLE];
logoAssetId: string;
logoConfiguration: (typeof NAVIGATION_SETTINGS.LOGO_CONFIGURATION)[keyof typeof NAVIGATION_SETTINGS.LOGO_CONFIGURATION];
-};
+}
export type StringsFromNavigationSetting = Omit<
NavigationSetting,
@@ -125,6 +125,8 @@ export const SIDEBAR_WIDTH = {
MINIMAL: 66,
};
+export const APP_SIDEBAR_WIDTH = 50;
+
export const APPLICATION_TITLE_MAX_WIDTH = 192;
export const APPLICATION_TITLE_MAX_WIDTH_MOBILE = 150;
//all values are in milliseconds
diff --git a/app/client/src/constants/AppsmithActionConstants/ActionConstants.tsx b/app/client/src/constants/AppsmithActionConstants/ActionConstants.tsx
index 8a6f055bb1..81d5168a06 100644
--- a/app/client/src/constants/AppsmithActionConstants/ActionConstants.tsx
+++ b/app/client/src/constants/AppsmithActionConstants/ActionConstants.tsx
@@ -9,29 +9,29 @@ import apiActionDependencyConfig from "constants/AppsmithActionConstants/formCon
import apiActionDatasourceFormButtonConfig from "constants/AppsmithActionConstants/formConfig/ApiDatasourceFormsButtonConfig";
import type { ENTITY_TYPE } from "@appsmith/entities/DataTree/types";
-export type ExecuteActionPayloadEvent = {
+export interface ExecuteActionPayloadEvent {
type: EventType;
callback?: (result: ExecutionResult) => void;
-};
+}
-export type ExecutionResult = {
+export interface ExecutionResult {
success: boolean;
-};
+}
-export type TriggerSource = {
+export interface TriggerSource {
id: string;
name: string;
entityType?: ENTITY_TYPE;
collectionId?: string;
isJSAction?: boolean;
actionId?: string;
-};
+}
export enum TriggerKind {
EVENT_EXECUTION = "EVENT_EXECUTION", // Eg. Button onClick
JS_FUNCTION_EXECUTION = "JS_FUNCTION_EXECUTION", // Executing js function from jsObject page
}
-export type ExecuteTriggerPayload = {
+export interface ExecuteTriggerPayload {
dynamicString: string;
event: ExecuteActionPayloadEvent;
callbackData?: Array;
@@ -39,7 +39,7 @@ export type ExecuteTriggerPayload = {
source?: TriggerSource;
widgetId?: string;
globalContext?: Record;
-};
+}
export type ContentType =
| "application/json"
diff --git a/app/client/src/constants/CanvasEditorConstants.tsx b/app/client/src/constants/CanvasEditorConstants.tsx
index e3c4ce2cc4..181340c4a8 100644
--- a/app/client/src/constants/CanvasEditorConstants.tsx
+++ b/app/client/src/constants/CanvasEditorConstants.tsx
@@ -1,13 +1,13 @@
-export type OccupiedSpace = {
+export interface OccupiedSpace {
left: number;
right: number;
top: number;
bottom: number;
id: string;
parentId?: string;
-};
+}
-export type WidgetSpace = {
+export interface WidgetSpace {
left: number;
right: number;
top: number;
@@ -17,7 +17,7 @@ export type WidgetSpace = {
parentId?: string;
isDropTarget?: boolean;
fixedHeight?: number;
-};
+}
export const zIndexLayers = {
PROPERTY_PANE: "z-[3]",
diff --git a/app/client/src/constants/DefaultTheme.tsx b/app/client/src/constants/DefaultTheme.tsx
index a00e9542f6..462b7e4871 100644
--- a/app/client/src/constants/DefaultTheme.tsx
+++ b/app/client/src/constants/DefaultTheme.tsx
@@ -369,25 +369,25 @@ const iconSizes = {
type IconSizeType = typeof iconSizes;
-export type ThemeBorder = {
+export interface ThemeBorder {
thickness: number;
style: "dashed" | "solid";
color: Color;
-};
+}
-type PropertyPaneTheme = {
+interface PropertyPaneTheme {
width: number;
height: number;
dividerColor: Color;
titleHeight: number;
connectionsHeight: number;
-};
+}
export type NestedObjectOrArray =
| Record>
| T
| T[];
-export type Theme = {
+export interface Theme {
radii: Array;
fontSizes: Array;
drawerWidth: string;
@@ -513,7 +513,7 @@ export type Theme = {
footerShadow: string;
linkBg: string;
};
-};
+}
export const getColorWithOpacity = (color: Color, opacity: number) => {
color = color.slice(1);
@@ -665,15 +665,15 @@ const lightShades = [
type ShadeColor = (typeof darkShades)[number] | (typeof lightShades)[number];
-type buttonVariant = {
+interface buttonVariant {
main: string;
light: string;
dark: string;
darker: string;
darkest: string;
-};
+}
-type ButtonVariantColor = {
+interface ButtonVariantColor {
primary: {
bgColor?: Color;
borderColor?: Color;
@@ -692,9 +692,9 @@ type ButtonVariantColor = {
hoverColor: Color;
textColor?: Color;
};
-};
+}
-type ColorType = {
+interface ColorType {
overlayColor: string;
button: {
disabledText: ShadeColor;
@@ -1329,7 +1329,7 @@ type ColorType = {
settings: {
link: string;
};
-};
+}
const editorBottomBar = {
background: Colors.WHITE,
diff --git a/app/client/src/constants/IconConstants.tsx b/app/client/src/constants/IconConstants.tsx
index b30f9d9bb8..40be6ef047 100644
--- a/app/client/src/constants/IconConstants.tsx
+++ b/app/client/src/constants/IconConstants.tsx
@@ -1,7 +1,7 @@
import styled from "styled-components";
import type { Color } from "./Colors";
-export type IconProps = {
+export interface IconProps {
width?: number;
height?: number;
color?: Color;
@@ -11,7 +11,7 @@ export type IconProps = {
keepColors?: boolean;
disabled?: boolean;
cursor?: "move" | "grab" | "default";
-};
+}
export const IconWrapper = styled.div`
&:focus {
diff --git a/app/client/src/constants/ProductUpdate.ts b/app/client/src/constants/ProductUpdate.ts
index bef8a4824e..a463f7d30c 100644
--- a/app/client/src/constants/ProductUpdate.ts
+++ b/app/client/src/constants/ProductUpdate.ts
@@ -4,7 +4,7 @@
*
*/
-type ProductUpdate = {
+interface ProductUpdate {
id: string; // ID is important for dismissal and remindLater to work
enabled: boolean; // Won't be shown till this is true
title: string;
@@ -12,7 +12,7 @@ type ProductUpdate = {
learnMoreLink: string;
canDismiss: boolean; // Can the user close this message.
remindLaterDays?: number; // If the user chooses to remind later, // it will be shown again after these many days
-};
+}
const update: ProductUpdate = {
enabled: false,
diff --git a/app/client/src/constants/PropertyControlConstants.tsx b/app/client/src/constants/PropertyControlConstants.tsx
index 6e54fe3771..45e2b3855f 100644
--- a/app/client/src/constants/PropertyControlConstants.tsx
+++ b/app/client/src/constants/PropertyControlConstants.tsx
@@ -14,7 +14,7 @@ import type { PropertyUpdates } from "WidgetProvider/constants";
const ControlTypes = getPropertyControlTypes();
export type ControlType = (typeof ControlTypes)[keyof typeof ControlTypes];
-export type PropertyPaneSectionConfig = {
+export interface PropertyPaneSectionConfig {
sectionName: string;
id?: string;
children: PropertyPaneConfig[];
@@ -24,9 +24,9 @@ export type PropertyPaneSectionConfig = {
isDefaultOpen?: boolean;
propertySectionPath?: string;
tag?: string; // Used to show a tag right after the section name (only in the search results)
-};
+}
-export type PanelConfig = {
+export interface PanelConfig {
editableTitle: boolean;
titlePropertyName: string;
panelIdPropertyName: string;
@@ -39,9 +39,9 @@ export type PanelConfig = {
propertyPath: string,
propertyValue: any,
) => Array | undefined;
-};
+}
-export type PropertyPaneControlConfig = {
+export interface PropertyPaneControlConfig {
id?: string;
label: string;
propertyName: string;
@@ -98,9 +98,9 @@ export type PropertyPaneControlConfig = {
isToggleDisabled: boolean,
triggerFlag?: boolean,
) => boolean;
-};
+}
-type ValidationConfigParams = {
+interface ValidationConfigParams {
min?: number; // min allowed for a number
max?: number; // max allowed for a number
natural?: boolean; // is a positive integer
@@ -135,13 +135,13 @@ type ValidationConfigParams = {
limitLineBreaks?: boolean; // Used for ValidationType.TEXT to limit line breaks in a large json object.
defaultValue?: unknown; // used for ValidationType.UNION when none the union type validation is success
defaultErrorMessage?: string; // used for ValidationType.UNION when none the union type validation is success
-};
+}
-export type ValidationConfig = {
+export interface ValidationConfig {
type: ValidationTypes;
params?: ValidationConfigParams;
dependentPaths?: string[];
-};
+}
export type PropertyPaneConfig =
| PropertyPaneSectionConfig
diff --git a/app/client/src/constants/ThemeConstants.tsx b/app/client/src/constants/ThemeConstants.tsx
index 64f09ec6eb..85171fc4d0 100644
--- a/app/client/src/constants/ThemeConstants.tsx
+++ b/app/client/src/constants/ThemeConstants.tsx
@@ -5,11 +5,11 @@ import { invert } from "lodash";
*
* NOTE: these are used in colorpicker
*/
-export type TailwindColors = {
+export interface TailwindColors {
[key: string]: {
[key: string]: string;
};
-};
+}
export const TAILWIND_COLORS: TailwindColors = {
gray: {
diff --git a/app/client/src/constants/ThirdPartyConstants.tsx b/app/client/src/constants/ThirdPartyConstants.tsx
index c179106675..938c44e86b 100644
--- a/app/client/src/constants/ThirdPartyConstants.tsx
+++ b/app/client/src/constants/ThirdPartyConstants.tsx
@@ -36,3 +36,14 @@ export const PRICING_PAGE_URL = (
`${URL}?source=${source}${instanceId ? `&instance=${instanceId}` : ``}${
feature ? `&feature=${feature}` : ""
}${section ? `§ion=${section}` : ""}`;
+
+export const CUSTOMER_PORTAL_URL_WITH_PARAMS = (
+ URL: string,
+ source: string,
+ instanceId: string,
+ feature?: string,
+ section?: string,
+) =>
+ `${URL}?source=${source}${instanceId ? `&instance=${instanceId}` : ``}${
+ feature ? `&feature=${feature}` : ""
+ }${section ? `§ion=${section}` : ""}`;
diff --git a/app/client/src/constants/WidgetValidation.ts b/app/client/src/constants/WidgetValidation.ts
index cfe96b1ace..f149850ca5 100644
--- a/app/client/src/constants/WidgetValidation.ts
+++ b/app/client/src/constants/WidgetValidation.ts
@@ -19,13 +19,13 @@ export enum ValidationTypes {
UNION = "UNION",
}
-export type ValidationResponse = {
+export interface ValidationResponse {
isValid: boolean;
parsed: any;
messages?: Array;
transformed?: any;
isParsedValueTheSame?: boolean;
-};
+}
export type Validator = (
config: ValidationConfig,
diff --git a/app/client/src/constants/collectionsConstants.ts b/app/client/src/constants/collectionsConstants.ts
index e5bd1ba2eb..706caabdd0 100644
--- a/app/client/src/constants/collectionsConstants.ts
+++ b/app/client/src/constants/collectionsConstants.ts
@@ -1,6 +1,6 @@
import type { ApiResponse } from "api/ApiResponses";
-export type TemplateList = {
+export interface TemplateList {
id: string;
delete: boolean;
name: string;
@@ -8,13 +8,13 @@ export type TemplateList = {
publisher: string;
packageName: string;
versionId: string;
-};
+}
-export type CollectionDataArray = {
+export interface CollectionDataArray {
id: string;
deleted: boolean;
apiTemplateList: Array;
-};
+}
export type ImportedCollections = ApiResponse & {
data: Array;
diff --git a/app/client/src/constants/providerConstants.ts b/app/client/src/constants/providerConstants.ts
index c71d1b5aec..b910b77013 100644
--- a/app/client/src/constants/providerConstants.ts
+++ b/app/client/src/constants/providerConstants.ts
@@ -27,7 +27,7 @@ export type ProviderTemplates = ApiResponse & {
templateId: string;
};
-export type ApiTemplates = {
+export interface ApiTemplates {
id: string;
deleted: boolean;
name: string;
@@ -52,7 +52,7 @@ export type ApiTemplates = {
datasourceConfiguration: {
url: string;
};
-};
+}
export type ProviderTemplateArray = ApiResponse & {
templateData: {
@@ -86,13 +86,13 @@ export type ProviderTemplateArray = ApiResponse & {
addToPageLoading: boolean;
};
-export type SearchResultsProviders = {
+export interface SearchResultsProviders {
id: string;
name: string;
description: string;
imageUrl: string;
url: string;
documentationUrl: string;
-};
+}
export const DEFAULT_TEMPLATE_TYPE = "TEMPLATE";
diff --git a/app/client/src/constants/routes.test.ts b/app/client/src/constants/routes.test.ts
index 99917bc2b8..03d5fe4533 100644
--- a/app/client/src/constants/routes.test.ts
+++ b/app/client/src/constants/routes.test.ts
@@ -1,5 +1,5 @@
-import urlBuilder from "entities/URLRedirect/URLAssembly";
-import { builderURL, viewerURL } from "RouteBuilder";
+import urlBuilder from "@appsmith/entities/URLRedirect/URLAssembly";
+import { builderURL, viewerURL } from "@appsmith/RouteBuilder";
describe("builderURL", () => {
let location: typeof window.location;
diff --git a/app/client/src/constants/routes/appRoutes.ts b/app/client/src/constants/routes/appRoutes.ts
index bed3acea55..0f1b37cbef 100644
--- a/app/client/src/constants/routes/appRoutes.ts
+++ b/app/client/src/constants/routes/appRoutes.ts
@@ -94,36 +94,36 @@ export const addBranchParam = (branch: string) => {
return url.toString().slice(url.origin.length);
};
-export type BuilderRouteParams = {
+export interface BuilderRouteParams {
pageId: string;
applicationId: string;
-};
+}
-export type AppViewerRouteParams = {
+export interface AppViewerRouteParams {
pageId: string;
applicationId?: string;
-};
+}
-export type APIEditorRouteParams = {
+export interface APIEditorRouteParams {
pageId: string;
apiId?: string;
-};
+}
-export type ProviderViewerRouteParams = {
+export interface ProviderViewerRouteParams {
pageId: string;
providerId: string;
-};
+}
-export type QueryEditorRouteParams = {
+export interface QueryEditorRouteParams {
pageId: string;
queryId?: string;
apiId?: string;
-};
+}
-export type JSEditorRouteParams = {
+export interface JSEditorRouteParams {
pageId: string;
collectionId?: string;
-};
+}
export const GIT_BRANCH_QUERY_KEY = "branch";
diff --git a/app/client/src/constants/routes/baseRoutes.ts b/app/client/src/constants/routes/baseRoutes.ts
index 583419d6db..4b0a059c63 100644
--- a/app/client/src/constants/routes/baseRoutes.ts
+++ b/app/client/src/constants/routes/baseRoutes.ts
@@ -28,7 +28,7 @@ export const WORKSPACE_INVITE_USERS_PAGE_URL = `${WORKSPACE_URL}/invite`;
export const WORKSPACE_SETTINGS_PAGE_URL = `${WORKSPACE_URL}/settings`;
export const WORKSPACE_SETTINGS_GENERAL_PAGE_URL = `${WORKSPACE_URL}/settings/general`;
export const WORKSPACE_SETTINGS_MEMBERS_PAGE_URL = `${WORKSPACE_URL}/settings/members`;
-export const WORKSPACE_SETTINGS_BILLING_PAGE_URL = `/settings/billing`;
+export const WORKSPACE_SETTINGS_LICENSE_PAGE_URL = `/settings/license`;
export const matchApplicationPath = match(APPLICATIONS_URL);
export const matchTemplatesPath = match(TEMPLATES_PATH);
diff --git a/app/client/src/constants/userConstants.ts b/app/client/src/constants/userConstants.ts
index 43caa5a9db..33c614fb38 100644
--- a/app/client/src/constants/userConstants.ts
+++ b/app/client/src/constants/userConstants.ts
@@ -2,7 +2,7 @@ export const ANONYMOUS_USERNAME = "anonymousUser";
type Gender = "MALE" | "FEMALE";
-export type User = {
+export interface User {
email: string;
workspaceIds: string[];
username: string;
@@ -19,7 +19,7 @@ export type User = {
isAnonymous?: boolean;
isIntercomConsentGiven?: boolean;
emailVerified: boolean;
-};
+}
export interface UserApplication {
id: string;
@@ -48,7 +48,7 @@ export const DefaultCurrentUserDetails: User = {
export const USER_PHOTO_URL = "v1/users/photo";
export const USER_PHOTO_ASSET_URL = "v1/assets";
-export type UserRoleUsecasePayload = {
+export interface UserRoleUsecasePayload {
role: string;
useCase: string;
-};
+}
diff --git a/app/client/src/ee/RouteBuilder.ts b/app/client/src/ee/RouteBuilder.ts
new file mode 100644
index 0000000000..1ca10fd6a7
--- /dev/null
+++ b/app/client/src/ee/RouteBuilder.ts
@@ -0,0 +1 @@
+export * from "ce/RouteBuilder";
diff --git a/app/client/src/ee/components/EnvConfigSection/index.tsx b/app/client/src/ee/components/EnvConfigSection/index.tsx
index 87bfba2728..400272023d 100644
--- a/app/client/src/ee/components/EnvConfigSection/index.tsx
+++ b/app/client/src/ee/components/EnvConfigSection/index.tsx
@@ -1,12 +1,12 @@
import type { Datasource } from "entities/Datasource";
import { renderDatasourceSection } from "pages/Editor/DataSourceEditor/DatasourceSection";
-type Props = {
+interface Props {
currentEnv: string;
config: any;
datasource: Datasource;
viewMode: boolean | undefined;
-};
+}
export function EnvConfigSection({
config,
diff --git a/app/client/src/ee/entities/URLRedirect/URLAssembly.ts b/app/client/src/ee/entities/URLRedirect/URLAssembly.ts
new file mode 100644
index 0000000000..492c934e6c
--- /dev/null
+++ b/app/client/src/ee/entities/URLRedirect/URLAssembly.ts
@@ -0,0 +1,3 @@
+export * from "ce/entities/URLRedirect/URLAssembly";
+import { default as CE_urlBUilder } from "ce/entities/URLRedirect/URLAssembly";
+export default CE_urlBUilder;
diff --git a/app/client/src/ee/pages/AdminSettings/config/DeveloperSettings/index.ts b/app/client/src/ee/pages/AdminSettings/config/DeveloperSettings/index.ts
new file mode 100644
index 0000000000..bdc549e9f3
--- /dev/null
+++ b/app/client/src/ee/pages/AdminSettings/config/DeveloperSettings/index.ts
@@ -0,0 +1 @@
+export * from "ce/pages/AdminSettings/config/DeveloperSettings";
diff --git a/app/client/src/ee/pages/common/AppHeader.tsx b/app/client/src/ee/pages/common/AppHeader.tsx
new file mode 100644
index 0000000000..72bdbe75d7
--- /dev/null
+++ b/app/client/src/ee/pages/common/AppHeader.tsx
@@ -0,0 +1,38 @@
+export * from "ce/pages/common/AppHeader";
+import { Routes as CE_Routes } from "ce/pages/common/AppHeader";
+import React from "react";
+import ReactDOM from "react-dom";
+import { Switch } from "react-router";
+import type { RouteComponentProps } from "react-router";
+import { withRouter } from "react-router";
+
+type Props = RouteComponentProps;
+
+const headerRoot = document.getElementById("header-root");
+
+const Routes = () => {
+ return (
+
+
+
+ );
+};
+
+class AppHeader extends React.Component {
+ private container = document.createElement("div");
+
+ componentDidMount() {
+ headerRoot?.appendChild(this.container);
+ }
+ componentWillUnmount() {
+ headerRoot?.removeChild(this.container);
+ }
+ get header() {
+ return ;
+ }
+ render() {
+ return ReactDOM.createPortal(this.header, this.container);
+ }
+}
+
+export default withRouter(AppHeader);
diff --git a/app/client/src/entities/Action/index.ts b/app/client/src/entities/Action/index.ts
index f27eed1f2f..9756c02d52 100644
--- a/app/client/src/entities/Action/index.ts
+++ b/app/client/src/entities/Action/index.ts
@@ -62,10 +62,10 @@ export interface KeyValuePair {
value?: unknown;
}
-export type LimitOffset = {
+export interface LimitOffset {
limit: Record;
offset: Record;
-};
+}
export interface SelfReferencingData {
limitBased?: LimitOffset;
curserBased?: {
@@ -196,14 +196,14 @@ export interface QueryAction extends BaseAction {
datasource: StoredDatasource;
}
-export type ActionViewMode = {
+export interface ActionViewMode {
id: string;
name: string;
pageId: string;
jsonPathKeys: string[];
confirmBeforeExecute?: boolean;
timeoutInMillisecond?: number;
-};
+}
export type Action = ApiAction | QueryAction | SaaSAction | RemoteAction;
@@ -214,11 +214,11 @@ export enum SlashCommand {
ASK_AI,
}
-export type SlashCommandPayload = {
+export interface SlashCommandPayload {
actionType: SlashCommand;
callback?: (binding: string) => void;
args: any;
-};
+}
export function isAPIAction(action: Action): action is ApiAction {
return action.pluginType === PluginType.API;
diff --git a/app/client/src/entities/AppCollab/CollabInterfaces.ts b/app/client/src/entities/AppCollab/CollabInterfaces.ts
index 9b1827609f..c7dc357eeb 100644
--- a/app/client/src/entities/AppCollab/CollabInterfaces.ts
+++ b/app/client/src/entities/AppCollab/CollabInterfaces.ts
@@ -1,4 +1,4 @@
-export type User = {
+export interface User {
name: string;
email: string;
-};
+}
diff --git a/app/client/src/entities/AppTheming/index.ts b/app/client/src/entities/AppTheming/index.ts
index e40b76b7e9..5193be0a86 100644
--- a/app/client/src/entities/AppTheming/index.ts
+++ b/app/client/src/entities/AppTheming/index.ts
@@ -8,24 +8,24 @@ export type Stylesheet = T extends void
? DefaultStylesheet
: T & DefaultStylesheet;
-export type AppThemeStylesheet = {
+export interface AppThemeStylesheet {
[key: string]: Stylesheet;
-};
+}
-export type ButtonStyles = {
+export interface ButtonStyles {
resetButtonStyles: {
[key: string]: string;
};
submitButtonStyles: {
[key: string]: string;
};
-};
+}
-export type ChildStylesheet = {
+export interface ChildStylesheet {
childStylesheet: AppThemeStylesheet;
-};
+}
-export type AppTheme = {
+export interface AppTheme {
id: string;
name: string;
displayName: string;
@@ -76,9 +76,9 @@ export type AppTheme = {
[key: string]: string;
};
};
-};
+}
-export type SetterConfig = {
+export interface SetterConfig {
__setters: {
[key: string]: {
path: string;
@@ -87,4 +87,4 @@ export type SetterConfig = {
accessor?: string;
};
};
-};
+}
diff --git a/app/client/src/entities/AppsmithConsole/index.ts b/app/client/src/entities/AppsmithConsole/index.ts
index 50e9a81822..4f31256e64 100644
--- a/app/client/src/entities/AppsmithConsole/index.ts
+++ b/app/client/src/entities/AppsmithConsole/index.ts
@@ -29,14 +29,14 @@ export type Methods =
| "count"
| "assert";
-export type LogObject = {
+export interface LogObject {
method: Methods | "result";
data: any[];
timestamp: string;
id: string;
severity: Severity;
source: SourceEntity;
-};
+}
export type ErrorType = PropertyEvaluationErrorType | PLATFORM_ERROR;
@@ -53,7 +53,7 @@ export enum Severity {
// CRITICAL = "critical",
}
-export type UserAction = {
+export interface UserAction {
// Label is used to display the
label: string;
// As there can be multiple errors of the same base type at the same time
@@ -61,7 +61,7 @@ export type UserAction = {
// these action types should have a dynamic `id` associated with them
// or we should use JS callback functions instead
reduxAction: ReduxAction;
-};
+}
export interface SourceEntity {
type: ENTITY_TYPE;
diff --git a/app/client/src/entities/DataTree/dataTreeFactory.ts b/app/client/src/entities/DataTree/dataTreeFactory.ts
index 7428610823..e3a49e7c65 100644
--- a/app/client/src/entities/DataTree/dataTreeFactory.ts
+++ b/app/client/src/entities/DataTree/dataTreeFactory.ts
@@ -9,12 +9,14 @@ import {
import { generateDataTreeModuleInputs } from "@appsmith/entities/DataTree/utils";
import type {
DataTreeSeed,
- unEvalAndConfigTree,
- ConfigTree,
AppsmithEntity,
- UnEvalTree,
ENTITY_TYPE,
} from "@appsmith/entities/DataTree/types";
+import type {
+ unEvalAndConfigTree,
+ ConfigTree,
+ UnEvalTree,
+} from "entities/DataTree/dataTreeTypes";
import { isEmpty } from "lodash";
export class DataTreeFactory {
@@ -34,8 +36,8 @@ export class DataTreeFactory {
widgets,
widgetsMeta,
}: DataTreeSeed): unEvalAndConfigTree {
- let dataTree: UnEvalTree = {};
- let configTree: ConfigTree = {};
+ const dataTree: UnEvalTree = {};
+ const configTree: ConfigTree = {};
const start = performance.now();
const startActions = performance.now();
@@ -64,13 +66,14 @@ export class DataTreeFactory {
const startWidgets = performance.now();
if (!isEmpty(moduleInputs)) {
- const data = generateDataTreeModuleInputs(
- dataTree,
- configTree,
- moduleInputs,
- );
- dataTree = data.dataTree;
- configTree = data.configTree;
+ for (const [key, value] of Object.entries(moduleInputs)) {
+ const { configEntity, unEvalEntity } =
+ generateDataTreeModuleInputs(value);
+ if (!!configEntity && !!unEvalEntity) {
+ dataTree[key] = unEvalEntity;
+ configTree[key] = configEntity;
+ }
+ }
}
Object.values(widgets).forEach((widget) => {
diff --git a/app/client/src/entities/DataTree/dataTreeTypes.ts b/app/client/src/entities/DataTree/dataTreeTypes.ts
new file mode 100644
index 0000000000..8d0996a839
--- /dev/null
+++ b/app/client/src/entities/DataTree/dataTreeTypes.ts
@@ -0,0 +1,27 @@
+import type {
+ DataTreeEntityConfig,
+ DataTreeEntityObject,
+ ActionDispatcher,
+ UnEvalTreeEntityObject,
+ AppsmithEntity,
+} from "@appsmith/entities/DataTree/types";
+import type { Page } from "@appsmith/constants/ReduxActionConstants";
+
+export interface unEvalAndConfigTree {
+ unEvalTree: UnEvalTree;
+ configTree: ConfigTree;
+}
+
+export interface ConfigTree {
+ [entityName: string]: DataTreeEntityConfig;
+}
+export type DataTreeEntity = DataTreeEntityObject | Page[] | ActionDispatcher;
+
+export interface DataTree {
+ [entityName: string]: DataTreeEntity;
+}
+export type UnEvalTreeEntity = UnEvalTreeEntityObject | AppsmithEntity | Page[];
+
+export interface UnEvalTree {
+ [entityName: string]: UnEvalTreeEntity;
+}
diff --git a/app/client/src/entities/Engine/index.ts b/app/client/src/entities/Engine/index.ts
index 9c94b86230..50e05f5f2f 100644
--- a/app/client/src/entities/Engine/index.ts
+++ b/app/client/src/entities/Engine/index.ts
@@ -18,12 +18,12 @@ import URLGeneratorFactory from "entities/URLRedirect/factory";
import { updateBranchLocally } from "actions/gitSyncActions";
import { getCurrentGitBranch } from "selectors/gitSyncSelectors";
-export type AppEnginePayload = {
+export interface AppEnginePayload {
applicationId?: string;
pageId?: string;
branch?: string;
mode: APP_MODE;
-};
+}
export interface IAppEngine {
setupEngine(payload: AppEnginePayload): any;
diff --git a/app/client/src/entities/GitSync.ts b/app/client/src/entities/GitSync.ts
index 65f464028c..6b8d46bde2 100644
--- a/app/client/src/entities/GitSync.ts
+++ b/app/client/src/entities/GitSync.ts
@@ -5,21 +5,21 @@ export enum GitSyncModalTab {
SETTINGS = "SETTINGS",
}
-export type GitConfig = {
+export interface GitConfig {
authorName: string;
authorEmail: string;
useGlobalProfile?: boolean;
-};
+}
-export type Branch = {
+export interface Branch {
branchName: string;
default: boolean;
-};
+}
-export type MergeStatus = {
+export interface MergeStatus {
isMergeAble: boolean;
conflictingFiles: Array;
status?: string;
message?: string;
referenceDoc?: string;
-};
+}
diff --git a/app/client/src/entities/JSCollection/index.ts b/app/client/src/entities/JSCollection/index.ts
index df540b556f..c1bbe97ba0 100644
--- a/app/client/src/entities/JSCollection/index.ts
+++ b/app/client/src/entities/JSCollection/index.ts
@@ -2,10 +2,10 @@ import type { BaseAction } from "../Action";
import type { PluginType } from "entities/Action";
import type { LayoutOnLoadActionErrors } from "constants/AppsmithActionConstants/ActionConstants";
-export type Variable = {
+export interface Variable {
name: string;
value: any;
-};
+}
export interface JSCollection {
id: string;
applicationId: string;
diff --git a/app/client/src/entities/Replay/ReplayEntity/ReplayCanvas.ts b/app/client/src/entities/Replay/ReplayEntity/ReplayCanvas.ts
index a4134998c8..0134501aa1 100644
--- a/app/client/src/entities/Replay/ReplayEntity/ReplayCanvas.ts
+++ b/app/client/src/entities/Replay/ReplayEntity/ReplayCanvas.ts
@@ -13,10 +13,10 @@ import {
import type { AppTheme } from "entities/AppTheming";
import { ENTITY_TYPE } from "entities/AppsmithConsole";
-export type Canvas = {
+export interface Canvas {
widgets: CanvasWidgetsReduxState;
theme: AppTheme;
-};
+}
export type CanvasDiff = Diff;
export type DSLDiff = Diff;
diff --git a/app/client/src/entities/Replay/ReplayEntity/ReplayEditor.ts b/app/client/src/entities/Replay/ReplayEntity/ReplayEditor.ts
index 4ba85a92d5..364b201ba2 100644
--- a/app/client/src/entities/Replay/ReplayEntity/ReplayEditor.ts
+++ b/app/client/src/entities/Replay/ReplayEntity/ReplayEditor.ts
@@ -20,13 +20,13 @@ export type Replayable =
type ReplayEditorDiff = Diff;
-export type ReplayEditorUpdate = {
+export interface ReplayEditorUpdate {
modifiedProperty: string;
index?: number;
update: Replayable | ReplayEditorDiff;
kind: "N" | "D" | "E" | "A";
isUndo?: boolean;
-};
+}
export default class ReplayEditor extends ReplayEntity {
constructor(entity: Replayable, entityType: ENTITY_TYPE) {
super(entity, entityType);
diff --git a/app/client/src/entities/URLRedirect/DefaultURLRedirect.ts b/app/client/src/entities/URLRedirect/DefaultURLRedirect.ts
index c5eb3d37b0..5a380bd717 100644
--- a/app/client/src/entities/URLRedirect/DefaultURLRedirect.ts
+++ b/app/client/src/entities/URLRedirect/DefaultURLRedirect.ts
@@ -2,7 +2,7 @@ import { ApplicationVersion } from "@appsmith/actions/applicationActions";
import type { ApplicationPayload } from "@appsmith/constants/ReduxActionConstants";
import { APP_MODE } from "entities/App";
import { select } from "redux-saga/effects";
-import { builderURL } from "RouteBuilder";
+import { builderURL } from "@appsmith/RouteBuilder";
import { getCurrentApplication } from "@appsmith/selectors/applicationSelectors";
import { isURLDeprecated } from "utils/helpers";
import URLRedirect from ".";
diff --git a/app/client/src/entities/URLRedirect/SlugURLRedirect.ts b/app/client/src/entities/URLRedirect/SlugURLRedirect.ts
index 3d03aca20d..3b2b13ba49 100644
--- a/app/client/src/entities/URLRedirect/SlugURLRedirect.ts
+++ b/app/client/src/entities/URLRedirect/SlugURLRedirect.ts
@@ -4,7 +4,7 @@ import type {
} from "@appsmith/constants/ReduxActionConstants";
import { APP_MODE } from "entities/App";
import { select } from "redux-saga/effects";
-import { fillPathname, viewerURL } from "RouteBuilder";
+import { fillPathname, viewerURL } from "@appsmith/RouteBuilder";
import { getCurrentApplication } from "@appsmith/selectors/applicationSelectors";
import { getPageById } from "selectors/editorSelectors";
import { getUpdatedRoute, isURLDeprecated } from "utils/helpers";
diff --git a/app/client/src/layoutSystems/anvil/integrations/actions/actionTypes.ts b/app/client/src/layoutSystems/anvil/integrations/actions/actionTypes.ts
index 97ef0dc919..6eccae1173 100644
--- a/app/client/src/layoutSystems/anvil/integrations/actions/actionTypes.ts
+++ b/app/client/src/layoutSystems/anvil/integrations/actions/actionTypes.ts
@@ -1,7 +1,7 @@
-export type AnvilReduxAction = {
+export interface AnvilReduxAction {
type: AnvilReduxActionTypes;
payload: T;
-};
+}
export enum AnvilReduxActionTypes {
READ_WIDGET_POSITIONS = "READ_WIDGET_POSITIONS",
diff --git a/app/client/src/layoutSystems/autolayout/canvas/types.ts b/app/client/src/layoutSystems/autolayout/canvas/types.ts
index e9528c099c..e7ff54f663 100644
--- a/app/client/src/layoutSystems/autolayout/canvas/types.ts
+++ b/app/client/src/layoutSystems/autolayout/canvas/types.ts
@@ -1,4 +1,4 @@
-export type AdditionalAutoLayoutProperties = {
+export interface AdditionalAutoLayoutProperties {
parentColumnSpace: number;
parentRowSpace: number;
-};
+}
diff --git a/app/client/src/layoutSystems/autolayout/utils/AutoLayoutUtils.ts b/app/client/src/layoutSystems/autolayout/utils/AutoLayoutUtils.ts
index 897a4de233..7b18ead699 100644
--- a/app/client/src/layoutSystems/autolayout/utils/AutoLayoutUtils.ts
+++ b/app/client/src/layoutSystems/autolayout/utils/AutoLayoutUtils.ts
@@ -34,11 +34,11 @@ import type {
} from "layoutSystems/autolayout/utils/types";
import type { FlexLayer, LayerChild } from "./types";
-export type ReadableSnapShotDetails = {
+export interface ReadableSnapShotDetails {
timeSince: string;
timeTillExpiration: string;
readableDate: string;
-};
+}
/**
* Update flex layers of parent canvas upon deleting a child widget.
diff --git a/app/client/src/layoutSystems/autolayout/utils/types.ts b/app/client/src/layoutSystems/autolayout/utils/types.ts
index a6b6660648..4fa28d18c9 100644
--- a/app/client/src/layoutSystems/autolayout/utils/types.ts
+++ b/app/client/src/layoutSystems/autolayout/utils/types.ts
@@ -17,7 +17,7 @@ export interface FlexLayer {
children: LayerChild[];
}
-export type FlexComponentProps = {
+export interface FlexComponentProps {
alignment: FlexVerticalAlignment;
children: ReactNode;
componentHeight: number;
@@ -34,20 +34,20 @@ export type FlexComponentProps = {
flexVerticalAlignment: FlexVerticalAlignment;
isMobile: boolean;
renderMode: RenderMode;
-};
+}
export type AlignmentColumnInfo = {
[key in FlexLayerAlignment]: number;
};
-export type FlexBoxAlignmentColumnInfo = {
+export interface FlexBoxAlignmentColumnInfo {
[key: number]: AlignmentColumnInfo;
-};
+}
-export type AlignmentColumnData = {
+export interface AlignmentColumnData {
alignment: FlexLayerAlignment;
columns: number;
-};
+}
/**
* Start: Position utils types
diff --git a/app/client/src/layoutSystems/common/WidgetNamesCanvas/WidgetNameTypes.ts b/app/client/src/layoutSystems/common/WidgetNamesCanvas/WidgetNameTypes.ts
index 7336cb6a9f..d7b0af3c20 100644
--- a/app/client/src/layoutSystems/common/WidgetNamesCanvas/WidgetNameTypes.ts
+++ b/app/client/src/layoutSystems/common/WidgetNamesCanvas/WidgetNameTypes.ts
@@ -4,30 +4,30 @@ import type { WidgetNameState } from "./WidgetNameConstants";
export type WIDGET_NAME_TYPE = "selected" | "focused";
//Contains the data of widget which are required to draw widget names on canvas
-export type WidgetNameData = {
+export interface WidgetNameData {
id: string;
position: WidgetPosition;
widgetName: string;
parentId: string;
nameState: WidgetNameState;
dragDisabled: boolean;
-};
+}
//Position of the widget name on canvas, required to enable interaction on canvas
-export type WidgetNamePositionData = {
+export interface WidgetNamePositionData {
left: number;
top: number;
width: number;
height: number;
widgetNameData: WidgetNameData;
-};
+}
//Position of canvas with respect to client browser
-export type CanvasPositions = {
+export interface CanvasPositions {
top: number;
left: number;
xDiff: number;
width: number;
yDiff: number;
height: number;
-};
+}
diff --git a/app/client/src/layoutSystems/common/canvasArenas/ArenaTypes.ts b/app/client/src/layoutSystems/common/canvasArenas/ArenaTypes.ts
index d3f6106f57..52e76a7bd6 100644
--- a/app/client/src/layoutSystems/common/canvasArenas/ArenaTypes.ts
+++ b/app/client/src/layoutSystems/common/canvasArenas/ArenaTypes.ts
@@ -4,7 +4,7 @@ import type { WidgetOperationParams } from "utils/WidgetPropsUtils";
//WidgetDraggingBlock contains information related to a dragging widget,
//that is used in computing logic to enable drag and drop of the particular widget
-export type WidgetDraggingBlock = {
+export interface WidgetDraggingBlock {
left: number;
top: number;
width: number;
@@ -16,7 +16,7 @@ export type WidgetDraggingBlock = {
detachFromLayout?: boolean;
fixedHeight?: number;
type: string;
-};
+}
//WidgetDraggingUpdateParams is an extension of WidgetDraggingBlock,
// with updateWidgetParams information required to dispatch action for updating DSL
diff --git a/app/client/src/layoutSystems/common/canvasArenas/CanvasMultiPointerArena.tsx b/app/client/src/layoutSystems/common/canvasArenas/CanvasMultiPointerArena.tsx
index d34a16a996..59120ebe54 100644
--- a/app/client/src/layoutSystems/common/canvasArenas/CanvasMultiPointerArena.tsx
+++ b/app/client/src/layoutSystems/common/canvasArenas/CanvasMultiPointerArena.tsx
@@ -72,9 +72,9 @@ const drawMousePointer = (
};
// This maps the `socketId` to pointerEventData for all concurrent users.
-type PointerDataType = {
+interface PointerDataType {
[s: string]: any;
-};
+}
function CanvasMultiPointerArena({ pageId }: { pageId: string }) {
const dispatch = useDispatch();
diff --git a/app/client/src/layoutSystems/common/canvasViewer/CanvasViewerWrapper.tsx b/app/client/src/layoutSystems/common/canvasViewer/CanvasViewerWrapper.tsx
index 1f8c7b887e..bb33542b3d 100644
--- a/app/client/src/layoutSystems/common/canvasViewer/CanvasViewerWrapper.tsx
+++ b/app/client/src/layoutSystems/common/canvasViewer/CanvasViewerWrapper.tsx
@@ -3,11 +3,11 @@ import type { CSSProperties, ReactNode } from "react";
import React from "react";
import { getCanvasClassName } from "utils/generators";
-type CanvasViewerWrapperProps = {
+interface CanvasViewerWrapperProps {
snapRows: number;
isListWidgetCanvas: boolean;
children: ReactNode;
-};
+}
/**
* This component is a wrapper for the canvas in the viewer.
diff --git a/app/client/src/layoutSystems/common/draggable/DraggableComponent.tsx b/app/client/src/layoutSystems/common/draggable/DraggableComponent.tsx
index 6ad39ab64b..604b04b3c7 100644
--- a/app/client/src/layoutSystems/common/draggable/DraggableComponent.tsx
+++ b/app/client/src/layoutSystems/common/draggable/DraggableComponent.tsx
@@ -26,7 +26,7 @@ const DraggableWrapper = styled.div`
cursor: grab;
`;
-type DraggableComponentProps = {
+interface DraggableComponentProps {
widgetId: string;
parentId?: string;
isFlexChild?: boolean;
@@ -40,7 +40,7 @@ type DraggableComponentProps = {
parentColumnSpace: number;
children: ReactNode;
dragDisabled?: boolean;
-};
+}
// Widget Boundaries which is shown to indicate the boundaries of the widget
const WidgetBoundaries = styled.div`
diff --git a/app/client/src/layoutSystems/common/dropTarget/DragLayerComponent.tsx b/app/client/src/layoutSystems/common/dropTarget/DragLayerComponent.tsx
index 2ec8e26ce5..ea238aee63 100644
--- a/app/client/src/layoutSystems/common/dropTarget/DragLayerComponent.tsx
+++ b/app/client/src/layoutSystems/common/dropTarget/DragLayerComponent.tsx
@@ -34,10 +34,10 @@ const WrappedDragLayer = styled.div<{
${GridDefaults.DEFAULT_GRID_ROW_HEIGHT}px;
`;
-type DragLayerProps = {
+interface DragLayerProps {
parentColumnWidth: number;
noPad: boolean;
-};
+}
function DragLayerComponent(props: DragLayerProps) {
return (
diff --git a/app/client/src/layoutSystems/common/dropTarget/DropTargetComponentWrapper.tsx b/app/client/src/layoutSystems/common/dropTarget/DropTargetComponentWrapper.tsx
index e0e1482639..45ec5947a6 100644
--- a/app/client/src/layoutSystems/common/dropTarget/DropTargetComponentWrapper.tsx
+++ b/app/client/src/layoutSystems/common/dropTarget/DropTargetComponentWrapper.tsx
@@ -4,12 +4,12 @@ import type { ReactNode } from "react";
import { memo } from "react";
import React from "react";
-type DropTargetComponentWrapperProps = {
+interface DropTargetComponentWrapperProps {
dropTargetProps: DropTargetComponentProps;
dropDisabled: boolean;
children: ReactNode;
snapColumnSpace: number;
-};
+}
/**
* This component is a wrapper for the DropTargetComponent.
diff --git a/app/client/src/layoutSystems/common/resizer/ModalResizable.tsx b/app/client/src/layoutSystems/common/resizer/ModalResizable.tsx
index 42ed69b0f0..5e08f8874e 100644
--- a/app/client/src/layoutSystems/common/resizer/ModalResizable.tsx
+++ b/app/client/src/layoutSystems/common/resizer/ModalResizable.tsx
@@ -25,7 +25,7 @@ const getSnappedValues = (
};
};
-type ResizableHandleProps = {
+interface ResizableHandleProps {
allowResize: boolean;
showLightBorder?: boolean;
isHovered: boolean;
@@ -38,11 +38,11 @@ type ResizableHandleProps = {
x: number;
y: number;
};
-};
+}
function ResizableHandle(props: ResizableHandleProps) {
const bind = useDrag(
- ({ first, last, dragging, movement: [mx, my], memo }) => {
+ ({ dragging, first, last, memo, movement: [mx, my] }) => {
if (!props.allowResize) {
return;
}
@@ -69,7 +69,7 @@ function ResizableHandle(props: ResizableHandleProps) {
return ;
}
-type ResizableProps = {
+interface ResizableProps {
allowResize: boolean;
handles: {
left?: StyledComponent<"div", Record>;
@@ -101,7 +101,7 @@ type ResizableProps = {
widgetId: string;
showLightBorder?: boolean;
zWidgetType?: string;
-};
+}
export function ModalResizable(props: ResizableProps) {
// Performance tracking start
diff --git a/app/client/src/layoutSystems/common/resizer/ResizableUtils.ts b/app/client/src/layoutSystems/common/resizer/ResizableUtils.ts
index 202f94fd20..48e5ec29d1 100644
--- a/app/client/src/layoutSystems/common/resizer/ResizableUtils.ts
+++ b/app/client/src/layoutSystems/common/resizer/ResizableUtils.ts
@@ -4,18 +4,21 @@ import type { XYCord } from "layoutSystems/common/canvasArenas/ArenaTypes";
import { ReflowDirection } from "reflow/reflowTypes";
import { ResponsiveBehavior } from "layoutSystems/common/utils/constants";
-export type UIElementSize = { height: number; width: number };
+export interface UIElementSize {
+ height: number;
+ width: number;
+}
export const RESIZABLE_CONTAINER_BORDER_THEME_INDEX = 1;
-export type WidgetPosition = {
+export interface WidgetPosition {
rightColumn: number;
leftColumn: number;
bottomRow: number;
topRow: number;
parentRowSpace: number;
parentColumnSpace: number;
-};
+}
export type WidgetExtendedPosition = WidgetPosition & {
paddingOffset: number;
diff --git a/app/client/src/layoutSystems/common/resizer/common.tsx b/app/client/src/layoutSystems/common/resizer/common.tsx
index 06e2bfbeb9..b10b511b2c 100644
--- a/app/client/src/layoutSystems/common/resizer/common.tsx
+++ b/app/client/src/layoutSystems/common/resizer/common.tsx
@@ -130,7 +130,7 @@ const getSnappedValues = (
};
};
-export type DimensionUpdateProps = {
+export interface DimensionUpdateProps {
width: number;
height: number;
x: number;
@@ -141,9 +141,9 @@ export type DimensionUpdateProps = {
Y?: number;
reflectPosition: boolean;
reflectDimension: boolean;
-};
+}
-type ResizableHandleProps = {
+interface ResizableHandleProps {
allowResize: boolean;
scrollParent: HTMLDivElement | null;
disableDot: boolean;
@@ -163,14 +163,14 @@ type ResizableHandleProps = {
y: number;
};
direction?: ReflowDirection;
-};
+}
export function ResizableHandle(props: ResizableHandleProps) {
const bind = useDrag((state) => {
const {
+ dragging,
first,
last,
- dragging,
memo,
movement: [mx, my],
} = state;
@@ -219,7 +219,7 @@ export function ResizableHandle(props: ResizableHandleProps) {
);
}
-export type ResizableProps = {
+export interface ResizableProps {
allowResize: boolean;
handles: {
left?: StyledComponent<"div", Record>;
@@ -265,4 +265,4 @@ export type ResizableProps = {
isMobile: boolean;
showResizeBoundary: boolean;
topRow: number;
-};
+}
diff --git a/app/client/src/layoutSystems/common/selectors.ts b/app/client/src/layoutSystems/common/selectors.ts
index 97d88fc27c..341ad7e922 100644
--- a/app/client/src/layoutSystems/common/selectors.ts
+++ b/app/client/src/layoutSystems/common/selectors.ts
@@ -12,7 +12,7 @@ import { getErrorCount } from "layoutSystems/common/widgetName/utils";
import type { WidgetPositions } from "./types";
import type { WidgetProps } from "widgets/BaseWidget";
import type { WidgetNameData } from "./WidgetNamesCanvas/WidgetNameTypes";
-import type { DataTree } from "@appsmith/entities/DataTree/types";
+import type { DataTree } from "entities/DataTree/dataTreeTypes";
export const getWidgetPositions = (state: AppState) =>
state.entities.widgetPositions;
diff --git a/app/client/src/layoutSystems/common/snipeable/SnipeableComponent.tsx b/app/client/src/layoutSystems/common/snipeable/SnipeableComponent.tsx
index c4d678024a..4a99c29122 100644
--- a/app/client/src/layoutSystems/common/snipeable/SnipeableComponent.tsx
+++ b/app/client/src/layoutSystems/common/snipeable/SnipeableComponent.tsx
@@ -30,11 +30,11 @@ const SnipeableWrapper = styled.div<{ isFocused: boolean }>`
}
`;
-type SnipeableComponentProps = {
+interface SnipeableComponentProps {
widgetId: string;
type: string;
children: ReactNode;
-};
+}
/**
* SnipeableComponent
diff --git a/app/client/src/layoutSystems/common/types.ts b/app/client/src/layoutSystems/common/types.ts
index 217e81240f..5e1e455ef6 100644
--- a/app/client/src/layoutSystems/common/types.ts
+++ b/app/client/src/layoutSystems/common/types.ts
@@ -1,12 +1,12 @@
/*
Hols the position of a widget in pixels from the top left of the MainContainer
*/
-export type WidgetPosition = {
+export interface WidgetPosition {
left: number;
top: number;
height: number;
width: number;
-};
+}
export interface WidgetPositions {
[widgetId: string]: WidgetPosition;
diff --git a/app/client/src/layoutSystems/common/utils/canvasDraggingUtils.ts b/app/client/src/layoutSystems/common/utils/canvasDraggingUtils.ts
index 17f0a4f3f4..edd998c0b4 100644
--- a/app/client/src/layoutSystems/common/utils/canvasDraggingUtils.ts
+++ b/app/client/src/layoutSystems/common/utils/canvasDraggingUtils.ts
@@ -101,14 +101,14 @@ export function getReflowedSpaces(
return draggingSpace;
}
-type NewWidgetBlock = {
+interface NewWidgetBlock {
columns: number;
rows: number;
widgetId: string;
detachFromLayout: boolean;
isDynamicHeight: boolean;
type: WidgetType;
-};
+}
/**
* This method returns blocks and dragging spaces of the widgets being dragged on canvas..
diff --git a/app/client/src/layoutSystems/common/utils/commonTypes.ts b/app/client/src/layoutSystems/common/utils/commonTypes.ts
index 69008298d7..a34cc9d043 100644
--- a/app/client/src/layoutSystems/common/utils/commonTypes.ts
+++ b/app/client/src/layoutSystems/common/utils/commonTypes.ts
@@ -7,7 +7,7 @@ import type {
} from "layoutSystems/common/utils/constants";
import type { ReactNode } from "react";
-export type AutoLayoutProps = {
+export interface AutoLayoutProps {
alignment: FlexLayerAlignment;
children: ReactNode;
componentHeight: number;
@@ -24,4 +24,4 @@ export type AutoLayoutProps = {
flexVerticalAlignment: FlexVerticalAlignment;
isMobile: boolean;
renderMode: RenderMode;
-};
+}
diff --git a/app/client/src/layoutSystems/common/widgetComponent/WidgetComponentBoundary.tsx b/app/client/src/layoutSystems/common/widgetComponent/WidgetComponentBoundary.tsx
index 6c5ee8271b..c8896ae61e 100644
--- a/app/client/src/layoutSystems/common/widgetComponent/WidgetComponentBoundary.tsx
+++ b/app/client/src/layoutSystems/common/widgetComponent/WidgetComponentBoundary.tsx
@@ -5,7 +5,10 @@ import styled from "styled-components";
import WalkthroughContext from "components/featureWalkthrough/walkthroughContext";
import { WIDGET_COMPONENT_BOUNDARY_CLASS } from "constants/componentClassNameConstants";
-type Props = { children: ReactNode; widgetType: string };
+interface Props {
+ children: ReactNode;
+ widgetType: string;
+}
const WidgetComponentBoundaryWrapper = styled.div`
height: 100%;
diff --git a/app/client/src/layoutSystems/common/widgetName/DeleteControl.tsx b/app/client/src/layoutSystems/common/widgetName/DeleteControl.tsx
index 77bb05c12a..30d300d9fd 100644
--- a/app/client/src/layoutSystems/common/widgetName/DeleteControl.tsx
+++ b/app/client/src/layoutSystems/common/widgetName/DeleteControl.tsx
@@ -26,10 +26,10 @@ const StyledDeleteIcon = styled.div`
}
`;
-type DeleteControlProps = {
+interface DeleteControlProps {
deleteWidget: () => void;
show: boolean;
-};
+}
function DeleteControl(props: DeleteControlProps) {
return props.show ? (
diff --git a/app/client/src/layoutSystems/common/widgetName/SettingsControl.tsx b/app/client/src/layoutSystems/common/widgetName/SettingsControl.tsx
index 6c6c079b16..e02342db41 100644
--- a/app/client/src/layoutSystems/common/widgetName/SettingsControl.tsx
+++ b/app/client/src/layoutSystems/common/widgetName/SettingsControl.tsx
@@ -64,14 +64,14 @@ const StyledErrorIcon = styled(Icon)`
margin-right: ${(props) => props.theme.spaces[1]}px;
`;
-type SettingsControlProps = {
+interface SettingsControlProps {
toggleSettings: (e: any) => void;
activity: Activities;
name: string;
errorCount: number;
inverted: boolean;
widgetWidth: number;
-};
+}
const getStyles = (
activity: Activities,
diff --git a/app/client/src/layoutSystems/common/widgetName/WidgetNameLayer.tsx b/app/client/src/layoutSystems/common/widgetName/WidgetNameLayer.tsx
index 32422bd69f..1e2e06e5e6 100644
--- a/app/client/src/layoutSystems/common/widgetName/WidgetNameLayer.tsx
+++ b/app/client/src/layoutSystems/common/widgetName/WidgetNameLayer.tsx
@@ -2,7 +2,7 @@ import WidgetNameComponent from "layoutSystems/common/widgetName";
import React from "react";
import { getErrorCount } from "./utils";
-type WidgetNameLayerProps = {
+interface WidgetNameLayerProps {
disablePropertyPane?: boolean;
children: any;
parentId?: string;
@@ -14,7 +14,7 @@ type WidgetNameLayerProps = {
componentWidth: number;
evalErrorsObj: Record;
showControls?: boolean;
-};
+}
export const WidgetNameLayer = (props: WidgetNameLayerProps) => {
return !props.disablePropertyPane ? (
diff --git a/app/client/src/layoutSystems/common/widgetName/index.tsx b/app/client/src/layoutSystems/common/widgetName/index.tsx
index f14bd38540..b1b13655df 100644
--- a/app/client/src/layoutSystems/common/widgetName/index.tsx
+++ b/app/client/src/layoutSystems/common/widgetName/index.tsx
@@ -66,7 +66,7 @@ const ControlGroup = styled.div`
}
`;
-type WidgetNameComponentProps = {
+interface WidgetNameComponentProps {
widgetName: string;
widgetId: string;
parentId?: string;
@@ -75,7 +75,7 @@ type WidgetNameComponentProps = {
topRow: number;
errorCount: number;
widgetWidth: number;
-};
+}
export function WidgetNameComponent(props: WidgetNameComponentProps) {
const dispatch = useDispatch();
diff --git a/app/client/src/layoutSystems/fixedlayout/canvas/types.ts b/app/client/src/layoutSystems/fixedlayout/canvas/types.ts
index 17e014d9a9..9d9a20e8de 100644
--- a/app/client/src/layoutSystems/fixedlayout/canvas/types.ts
+++ b/app/client/src/layoutSystems/fixedlayout/canvas/types.ts
@@ -1,4 +1,4 @@
-export type AdditionalFixedLayoutProperties = {
+export interface AdditionalFixedLayoutProperties {
parentRowSpace: number;
parentColumnSpace: number;
-};
+}
diff --git a/app/client/src/layoutSystems/fixedlayout/common/autoHeight/AutoHeightContainerWrapper.tsx b/app/client/src/layoutSystems/fixedlayout/common/autoHeight/AutoHeightContainerWrapper.tsx
index 5ecaf403e2..964ee85b2d 100644
--- a/app/client/src/layoutSystems/fixedlayout/common/autoHeight/AutoHeightContainerWrapper.tsx
+++ b/app/client/src/layoutSystems/fixedlayout/common/autoHeight/AutoHeightContainerWrapper.tsx
@@ -10,10 +10,10 @@ import {
} from "widgets/WidgetUtils";
import AutoHeightContainer from "./AutoHeightContainer";
-export type AutoHeightWrapperProps = {
+export interface AutoHeightWrapperProps {
widgetProps: WidgetProps;
children: ReactNode;
-};
+}
export function AutoHeightContainerWrapper(props: WidgetProps) {
const isCanvas = useWidgetConfig(props.type, "isCanvas");
diff --git a/app/client/src/layoutSystems/fixedlayout/common/autoHeightOverlay/store.tsx b/app/client/src/layoutSystems/fixedlayout/common/autoHeightOverlay/store.tsx
index eae15b57b5..71847d1074 100644
--- a/app/client/src/layoutSystems/fixedlayout/common/autoHeightOverlay/store.tsx
+++ b/app/client/src/layoutSystems/fixedlayout/common/autoHeightOverlay/store.tsx
@@ -10,19 +10,31 @@ interface AutoHeightLimitsUIState {
mindY: number; // the difference during dragging
}
-type SET_MAX_Y = { type: "SET_MAX_Y"; payload: { maxY: number } };
-type SET_MIN_Y = { type: "SET_MIN_Y"; payload: { minY: number } };
-type SET_MAX_D_Y = { type: "SET_MAX_D_Y"; payload: { maxdY: number } };
-type SET_MIN_D_Y = { type: "SET_MIN_D_Y"; payload: { mindY: number } };
-type SET_IS_MIN_DOT_DRAGGING = {
+interface SET_MAX_Y {
+ type: "SET_MAX_Y";
+ payload: { maxY: number };
+}
+interface SET_MIN_Y {
+ type: "SET_MIN_Y";
+ payload: { minY: number };
+}
+interface SET_MAX_D_Y {
+ type: "SET_MAX_D_Y";
+ payload: { maxdY: number };
+}
+interface SET_MIN_D_Y {
+ type: "SET_MIN_D_Y";
+ payload: { mindY: number };
+}
+interface SET_IS_MIN_DOT_DRAGGING {
type: "SET_IS_MIN_DOT_DRAGGING";
payload: { isMinDotDragging: boolean };
-};
+}
-type SET_IS_MAX_DOT_DRAGGING = {
+interface SET_IS_MAX_DOT_DRAGGING {
type: "SET_IS_MAX_DOT_DRAGGING";
payload: { isMaxDotDragging: boolean };
-};
+}
type AutoHeightLimitsUIAction =
| SET_MAX_Y
diff --git a/app/client/src/layoutSystems/fixedlayout/common/widgetGrouping/WidgetsMultiSelectBox.tsx b/app/client/src/layoutSystems/fixedlayout/common/widgetGrouping/WidgetsMultiSelectBox.tsx
index f40d8d7578..d8e6d4f19e 100644
--- a/app/client/src/layoutSystems/fixedlayout/common/widgetGrouping/WidgetsMultiSelectBox.tsx
+++ b/app/client/src/layoutSystems/fixedlayout/common/widgetGrouping/WidgetsMultiSelectBox.tsx
@@ -206,10 +206,8 @@ function WidgetsMultiSelectBox(props: {
left: (e.clientX - bounds.left) / props.snapColumnSpace,
};
const top = minBy(selectedWidgets, (rect) => rect.topRow)?.topRow;
- const left = minBy(
- selectedWidgets,
- (rect) => rect.leftColumn,
- )?.leftColumn;
+ const left = minBy(selectedWidgets, (rect) => rect.leftColumn)
+ ?.leftColumn;
setDraggingState({
isDragging: true,
dragGroupActualParent: parentId || "",
diff --git a/app/client/src/layoutSystems/types/index.ts b/app/client/src/layoutSystems/types/index.ts
index 916d541d14..c33285754b 100644
--- a/app/client/src/layoutSystems/types/index.ts
+++ b/app/client/src/layoutSystems/types/index.ts
@@ -10,9 +10,9 @@ export enum LayoutSystemTypes {
// interface for appPositioning(aka layoutStystem) details.
// It is part of applicationDetails Record of an Application
// Refer to ApplicationPayload
-export type LayoutSystemTypeConfig = {
+export interface LayoutSystemTypeConfig {
type: LayoutSystemTypes;
-};
+}
/**
* @type WidgetLayoutSystem
@@ -23,10 +23,10 @@ export type LayoutSystemTypeConfig = {
* @property propertyEnhancer - function that is used to enhance/modify widget properties as per the layout system
*/
-export type WidgetLayoutSystem = {
+export interface WidgetLayoutSystem {
WidgetWrapper: (props: WidgetProps) => JSX.Element;
propertyEnhancer: (props: WidgetProps) => WidgetProps;
-};
+}
/**
* @type CanvasLayoutSystem
@@ -36,10 +36,10 @@ export type WidgetLayoutSystem = {
* @property propertyEnhancer - function that is used to enhance/modify canvas properties as per the layout system
*/
-export type CanvasLayoutSystem = {
+export interface CanvasLayoutSystem {
Canvas: (props: WidgetProps) => JSX.Element;
propertyEnhancer: (props: WidgetProps) => WidgetProps;
-};
+}
/**
* @type LayoutSystem
@@ -51,7 +51,7 @@ export type CanvasLayoutSystem = {
* @property canvasSystem - provides canvas specific entities
*/
-export type LayoutSystem = {
+export interface LayoutSystem {
widgetSystem: WidgetLayoutSystem;
canvasSystem: CanvasLayoutSystem;
-};
+}
diff --git a/app/client/src/navigation/FocusElements.ts b/app/client/src/navigation/FocusElements.ts
index 8a917ea1ff..0e4910c211 100644
--- a/app/client/src/navigation/FocusElements.ts
+++ b/app/client/src/navigation/FocusElements.ts
@@ -91,13 +91,13 @@ export enum FocusElement {
InputField = "InputField",
}
-type Config = {
+interface Config {
name: FocusElement;
selector: (state: AppState) => unknown;
setter: (payload: any) => ReduxAction;
defaultValue?: unknown;
subTypes?: Record;
-};
+}
export const FocusElementsConfig: Record = {
[FocusEntity.NONE]: [],
diff --git a/app/client/src/navigation/FocusEntity.ts b/app/client/src/navigation/FocusEntity.ts
index 3706caab60..0924db6bb1 100644
--- a/app/client/src/navigation/FocusEntity.ts
+++ b/app/client/src/navigation/FocusEntity.ts
@@ -31,11 +31,11 @@ export const FocusStoreHierarchy: Partial> = {
[FocusEntity.PROPERTY_PANE]: FocusEntity.CANVAS,
};
-export type FocusEntityInfo = {
+export interface FocusEntityInfo {
entity: FocusEntity;
id: string;
pageId?: string;
-};
+}
/**
* Method to indicate if the URL is of type API, Query etc.,
diff --git a/app/client/src/pages/AdminSettings/Authentication/AuthPage.tsx b/app/client/src/pages/AdminSettings/Authentication/AuthPage.tsx
index 5e8e4eb54e..500fe11cdf 100644
--- a/app/client/src/pages/AdminSettings/Authentication/AuthPage.tsx
+++ b/app/client/src/pages/AdminSettings/Authentication/AuthPage.tsx
@@ -12,7 +12,7 @@ import {
AUTHENTICATION_METHOD_ENABLED,
} from "@appsmith/constants/messages";
import { Button, Callout, Divider, Icon, Text, Tooltip } from "design-system";
-import { adminSettingsCategoryUrl } from "RouteBuilder";
+import { adminSettingsCategoryUrl } from "@appsmith/RouteBuilder";
import AnalyticsUtil from "utils/AnalyticsUtil";
import useOnUpgrade from "utils/hooks/useOnUpgrade";
import BusinessTag from "components/BusinessTag";
@@ -79,12 +79,12 @@ const MethodTitle = styled(Text)`
const MethodDets = styled(Text)``;
-export type banner = {
+export interface banner {
actionLabel: string;
title: string;
-};
+}
-export type AuthMethodType = {
+export interface AuthMethodType {
id: string;
category?: string;
label: string;
@@ -94,7 +94,7 @@ export type AuthMethodType = {
calloutBanner?: banner;
icon?: string;
isFeatureEnabled: boolean;
-};
+}
const ButtonWrapper = styled.div`
min-width: 100px;
diff --git a/app/client/src/pages/AdminSettings/Branding/BrandingPage.tsx b/app/client/src/pages/AdminSettings/Branding/BrandingPage.tsx
index 2cdc51e479..5632c4317b 100644
--- a/app/client/src/pages/AdminSettings/Branding/BrandingPage.tsx
+++ b/app/client/src/pages/AdminSettings/Branding/BrandingPage.tsx
@@ -18,15 +18,15 @@ export type brandColorsKeys =
| "hover"
| "disabled";
-export type Inputs = {
+export interface Inputs {
brandColors: Record;
brandLogo: string;
brandFavicon: string;
-};
+}
-type BrandingPageProps = {
+interface BrandingPageProps {
category: AdminConfigType;
-};
+}
function BrandingPage(props: BrandingPageProps) {
const { category } = props;
diff --git a/app/client/src/pages/AdminSettings/Branding/SettingsForm.tsx b/app/client/src/pages/AdminSettings/Branding/SettingsForm.tsx
index bb3ef50180..6128a4e31c 100644
--- a/app/client/src/pages/AdminSettings/Branding/SettingsForm.tsx
+++ b/app/client/src/pages/AdminSettings/Branding/SettingsForm.tsx
@@ -40,7 +40,7 @@ const StyledText = styled(Text)`
font-weight: var(--ads-v2-font-weight-bold);
`;
-type SettingsFormProps = {
+interface SettingsFormProps {
disabled?: boolean;
control: Control;
formState: FormState;
@@ -50,7 +50,7 @@ type SettingsFormProps = {
setValue: UseFormSetValue;
resetField: UseFormResetField;
values: Inputs;
-};
+}
function SettingsForm(props: SettingsFormProps) {
const { control, defaultValues, disabled, formState, handleSubmit } = props;
diff --git a/app/client/src/pages/AdminSettings/Branding/previews/PreviewBox.tsx b/app/client/src/pages/AdminSettings/Branding/previews/PreviewBox.tsx
index ca7350534e..da7ca73332 100644
--- a/app/client/src/pages/AdminSettings/Branding/previews/PreviewBox.tsx
+++ b/app/client/src/pages/AdminSettings/Branding/previews/PreviewBox.tsx
@@ -2,12 +2,12 @@ import React from "react";
import { ContentBox } from "pages/AdminSettings/components";
import { Text } from "design-system";
-type PreviewBoxProps = {
+interface PreviewBoxProps {
title?: string;
children: React.ReactNode;
className?: string;
style?: React.CSSProperties;
-};
+}
const PreviewBox = (props: PreviewBoxProps) => {
const { children, className, title, ...rest } = props;
diff --git a/app/client/src/pages/AdminSettings/Branding/previews/index.tsx b/app/client/src/pages/AdminSettings/Branding/previews/index.tsx
index 76aec449bb..2be99567da 100644
--- a/app/client/src/pages/AdminSettings/Branding/previews/index.tsx
+++ b/app/client/src/pages/AdminSettings/Branding/previews/index.tsx
@@ -9,11 +9,11 @@ import DashboardPreview from "./DashboardPreview";
import type { brandColorsKeys } from "../BrandingPage";
import { ContentBox } from "pages/AdminSettings/components";
-export type PreviewsProps = {
+export interface PreviewsProps {
shades: Record;
logo: string | Blob;
favicon: string;
-};
+}
const Previews = (props: PreviewsProps) => {
const { favicon, logo } = props;
diff --git a/app/client/src/pages/AdminSettings/FormGroup/Accordion.tsx b/app/client/src/pages/AdminSettings/FormGroup/Accordion.tsx
index f67ddf1644..62492b5093 100644
--- a/app/client/src/pages/AdminSettings/FormGroup/Accordion.tsx
+++ b/app/client/src/pages/AdminSettings/FormGroup/Accordion.tsx
@@ -39,13 +39,13 @@ const Line = styled.hr`
}
`;
-type AccordionProps = {
+interface AccordionProps {
label?: React.ReactNode;
settings?: Setting[];
isHidden?: boolean;
category?: string;
subCategory?: string;
-};
+}
export default function Accordion({
category,
diff --git a/app/client/src/pages/AdminSettings/FormGroup/Button.tsx b/app/client/src/pages/AdminSettings/FormGroup/Button.tsx
index e5c3dfbcd6..c1bef4609f 100644
--- a/app/client/src/pages/AdminSettings/FormGroup/Button.tsx
+++ b/app/client/src/pages/AdminSettings/FormGroup/Button.tsx
@@ -1,14 +1,21 @@
import { SETTINGS_FORM_NAME } from "@appsmith/constants/forms";
import React from "react";
-import { Button, Text } from "design-system";
+import { Button } from "design-system";
import { useDispatch, useSelector } from "react-redux";
import { getFormValues } from "redux-form";
import styled from "styled-components";
-import type { SettingComponentProps } from "./Common";
+import { FormGroup, type SettingComponentProps } from "./Common";
const ButtonWrapper = styled.div`
width: 357px;
- margin-bottom: 8px;
+
+ .styled-label {
+ padding: 0 0 0.5rem;
+ }
+
+ .admin-settings-form-group-label {
+ font-weight: var(--ads-v2-h5-font-weight);
+ }
`;
export const StyledButton = styled(Button)`
@@ -22,28 +29,21 @@ export default function ButtonComponent({ setting }: SettingComponentProps) {
const settings = useSelector(formValuesSelector);
return (
-
- {setting.label}
-
- {
- if (setting.action) {
- setting.action(dispatch, settings);
- }
- }}
- size="md"
- >
- {setting.text}
-
+
+ {
+ if (setting.action) {
+ setting.action(dispatch, settings);
+ }
+ }}
+ size="md"
+ >
+ {setting.text}
+
+
);
}
diff --git a/app/client/src/pages/AdminSettings/FormGroup/Checkbox.tsx b/app/client/src/pages/AdminSettings/FormGroup/Checkbox.tsx
index b18d18a7df..5d9ad0ba7a 100644
--- a/app/client/src/pages/AdminSettings/FormGroup/Checkbox.tsx
+++ b/app/client/src/pages/AdminSettings/FormGroup/Checkbox.tsx
@@ -2,13 +2,12 @@ import React, { memo } from "react";
import type { WrappedFieldInputProps, WrappedFieldMetaProps } from "redux-form";
import { Field, getFormValues } from "redux-form";
import styled from "styled-components";
-import type { SettingComponentProps } from "./Common";
+import { FormGroup, type SettingComponentProps } from "./Common";
import type { FormTextFieldProps } from "components/utils/ReduxFormTextField";
-import { Checkbox, Text } from "design-system";
+import { Checkbox } from "design-system";
import { useSelector } from "react-redux";
import { SETTINGS_FORM_NAME } from "@appsmith/constants/forms";
import { isTenantConfig } from "@appsmith/utils/adminSettingsHelpers";
-import BusinessTag from "components/BusinessTag";
const CheckboxWrapper = styled.div`
display: grid;
@@ -18,7 +17,7 @@ const CheckboxWrapper = styled.div`
gap: 16px;
`;
-type CheckboxProps = {
+interface CheckboxProps {
label?: React.ReactNode;
id?: string;
isDisabled?: boolean;
@@ -26,7 +25,7 @@ type CheckboxProps = {
text: string;
labelSuffix?: React.ReactElement;
isPropertyDisabled?: boolean;
-};
+}
function FieldCheckboxWithCheckboxText(props: CheckboxProps) {
return function FieldCheckbox(
@@ -65,7 +64,13 @@ function FieldCheckboxWithCheckboxText(props: CheckboxProps) {
}
const StyledFieldCheckboxGroup = styled.div`
- margin-bottom: 8px;
+ .styled-label {
+ padding: 0 0 0.5rem;
+ }
+
+ .admin-settings-form-group-label {
+ font-weight: var(--ads-v2-h5-font-weight);
+ }
`;
const formValuesSelector = getFormValues(SETTINGS_FORM_NAME);
@@ -75,32 +80,22 @@ export function CheckboxComponent({ setting }: SettingComponentProps) {
return (
-
-
- {setting.label}
-
- {setting.isFeatureEnabled === false && }
-
-
+
+
+
);
}
diff --git a/app/client/src/pages/AdminSettings/FormGroup/ColorInput.tsx b/app/client/src/pages/AdminSettings/FormGroup/ColorInput.tsx
index 1dd4ea0c68..5e7cc5a834 100644
--- a/app/client/src/pages/AdminSettings/FormGroup/ColorInput.tsx
+++ b/app/client/src/pages/AdminSettings/FormGroup/ColorInput.tsx
@@ -78,7 +78,7 @@ const StyledText = styled(Text)`
font-weight: 500;
`;
-type ColorInputProps = {
+interface ColorInputProps {
value: Record;
onChange?: (value: any) => void;
className?: string;
@@ -86,7 +86,7 @@ type ColorInputProps = {
filter?: (key: brandColorsKeys) => boolean;
defaultValue?: Record;
logEvent?: (property: string) => void;
-};
+}
const LeftIcon = (
props: Omit & { value: string },
@@ -102,11 +102,11 @@ export const ColorInput = (props: ColorInputProps) => {
useState("primary");
const {
className,
+ filter = () => true,
+ logEvent,
onChange,
tooltips,
value,
- filter = () => true,
- logEvent,
} = props;
const colorInputRef = useRef(null);
diff --git a/app/client/src/pages/AdminSettings/FormGroup/Common.tsx b/app/client/src/pages/AdminSettings/FormGroup/Common.tsx
index accb024b98..254c3e03de 100644
--- a/app/client/src/pages/AdminSettings/FormGroup/Common.tsx
+++ b/app/client/src/pages/AdminSettings/FormGroup/Common.tsx
@@ -3,13 +3,15 @@ import React from "react";
import styled from "styled-components";
import { Icon, Tooltip, Text } from "design-system";
import type { Setting } from "@appsmith/pages/AdminSettings/config/types";
+import EnterpriseTag from "components/EnterpriseTag";
+import BusinessTag from "components/BusinessTag";
-type FieldHelperProps = {
+interface FieldHelperProps {
setting: Setting;
children: React.ReactNode;
className?: string;
isToggle?: boolean;
-};
+}
export const StyledFormGroup = styled.div`
width: 40rem;
@@ -28,6 +30,8 @@ export const StyledFormGroup = styled.div`
export const StyledLabel = styled.div`
margin-bottom: 4px;
+ display: flex;
+ align-items: center;
`;
export const StyledSubtext = styled(Text)`
@@ -48,7 +52,7 @@ export function FormGroup({ children, className, setting }: FieldHelperProps) {
className={`${className}`}
data-testid="admin-settings-form-group"
>
-
+
{setting.label && (
)}
+
+ {setting.isFeatureEnabled === false &&
+ (setting.isEnterprise === true ? (
+
+ ) : (
+
+ ))}
+
{children}
{setting.subText && (
@@ -87,6 +99,6 @@ export function FormGroup({ children, className, setting }: FieldHelperProps) {
);
}
-export type SettingComponentProps = {
+export interface SettingComponentProps {
setting: Setting;
-};
+}
diff --git a/app/client/src/pages/AdminSettings/FormGroup/ImageInput.tsx b/app/client/src/pages/AdminSettings/FormGroup/ImageInput.tsx
index 40f91b4495..4a72c54af0 100644
--- a/app/client/src/pages/AdminSettings/FormGroup/ImageInput.tsx
+++ b/app/client/src/pages/AdminSettings/FormGroup/ImageInput.tsx
@@ -10,7 +10,7 @@ import { FormGroup } from "./Common";
import { ContentBox } from "../components";
import { getAssetUrl } from "@appsmith/utils/airgapHelpers";
-type ImageInputProps = {
+interface ImageInputProps {
value?: any;
onChange?(value?: any): void;
validate?(
@@ -19,7 +19,7 @@ type ImageInputProps = {
): void;
className?: string;
defaultValue?: string;
-};
+}
export const ImageInput = (props: ImageInputProps) => {
const { className, defaultValue, onChange, validate, value } = props;
const [preview, setPreview] = useState(null);
diff --git a/app/client/src/pages/AdminSettings/FormGroup/Radio.tsx b/app/client/src/pages/AdminSettings/FormGroup/Radio.tsx
index 65fc0f6be3..81e3624bbe 100644
--- a/app/client/src/pages/AdminSettings/FormGroup/Radio.tsx
+++ b/app/client/src/pages/AdminSettings/FormGroup/Radio.tsx
@@ -2,7 +2,7 @@ import React, { useEffect, useState } from "react";
import type { ReactElement } from "react";
import { FieldError } from "design-system-old";
import { Popover2 } from "@blueprintjs/popover2";
-import type { SettingComponentProps } from "./Common";
+import { FormGroup, type SettingComponentProps } from "./Common";
import type { WrappedFieldInputProps, WrappedFieldMetaProps } from "redux-form";
import { Field } from "redux-form";
import styled, { createGlobalStyle } from "styled-components";
@@ -24,9 +24,9 @@ type RadioOption = {
};
label: string;
} & RadioProps;
-export type RadioOptionProps = {
+export interface RadioOptionProps {
options: RadioOption[];
-};
+}
const StyledTag = styled(Tag)<{ selected?: boolean }>`
/*
@@ -87,6 +87,16 @@ const PopoverStyles = createGlobalStyle`
}
`;
+const StyledFormGroup = styled(FormGroup)`
+ .styled-label {
+ padding: 0 0 0.5rem;
+ }
+
+ .admin-settings-form-group-label {
+ font-weight: var(--ads-v2-h5-font-weight);
+ }
+`;
+
type RadioGroupProps = SettingComponentProps;
function RadioFieldWrapper(
@@ -201,20 +211,12 @@ export default function RadioField({ setting }: RadioGroupProps) {
const controlTypeProps = setting.controlTypeProps as RadioOptionProps;
return (
-
-
- {setting.label}
-
-
+
);
}
diff --git a/app/client/src/pages/AdminSettings/FormGroup/TagInputField.tsx b/app/client/src/pages/AdminSettings/FormGroup/TagInputField.tsx
index 8f4cdedf6d..38476ec359 100644
--- a/app/client/src/pages/AdminSettings/FormGroup/TagInputField.tsx
+++ b/app/client/src/pages/AdminSettings/FormGroup/TagInputField.tsx
@@ -25,7 +25,7 @@ const renderComponent = (
);
};
-type TagListFieldProps = {
+interface TagListFieldProps {
name: string;
placeholder: string;
type: string;
@@ -33,7 +33,7 @@ type TagListFieldProps = {
intent: Intent;
setting: Setting;
customError?: (err: string) => void;
-};
+}
function TagInputField(props: TagListFieldProps) {
return ;
diff --git a/app/client/src/pages/AdminSettings/FormGroup/TextAreaField.tsx b/app/client/src/pages/AdminSettings/FormGroup/TextAreaField.tsx
index 6f54e8e6a6..b778e2bd5d 100644
--- a/app/client/src/pages/AdminSettings/FormGroup/TextAreaField.tsx
+++ b/app/client/src/pages/AdminSettings/FormGroup/TextAreaField.tsx
@@ -35,7 +35,7 @@ const renderComponent = (
);
};
-export type FormTextAreaFieldProps = {
+export interface FormTextAreaFieldProps {
name?: string;
placeholder?: string;
label?: string;
@@ -44,7 +44,7 @@ export type FormTextAreaFieldProps = {
autoFocus?: boolean;
hideErrorMessage?: boolean;
setting: Setting;
-};
+}
function FormTextAreaField(props: FormTextAreaFieldProps) {
const { setting } = props;
diff --git a/app/client/src/pages/AdminSettings/FormGroup/TextInput.tsx b/app/client/src/pages/AdminSettings/FormGroup/TextInput.tsx
index 3d3c6981c3..2662119630 100644
--- a/app/client/src/pages/AdminSettings/FormGroup/TextInput.tsx
+++ b/app/client/src/pages/AdminSettings/FormGroup/TextInput.tsx
@@ -1,23 +1,23 @@
import FormTextField from "components/utils/ReduxFormTextField";
import { createMessage } from "@appsmith/constants/messages";
import React from "react";
-import type { SettingComponentProps } from "./Common";
+import { FormGroup, type SettingComponentProps } from "./Common";
export default function TextInput({ setting }: SettingComponentProps) {
return (
-
setting.placeholder || "")}
type={setting.controlSubType}
/>
-
+
);
}
diff --git a/app/client/src/pages/AdminSettings/FormGroup/group.tsx b/app/client/src/pages/AdminSettings/FormGroup/group.tsx
index 4e9c087fd0..7583e1ef86 100644
--- a/app/client/src/pages/AdminSettings/FormGroup/group.tsx
+++ b/app/client/src/pages/AdminSettings/FormGroup/group.tsx
@@ -21,13 +21,13 @@ import Radio from "./Radio";
import { getTypographyByKey } from "constants/DefaultTheme";
import classNames from "classnames";
-type GroupProps = {
+interface GroupProps {
name?: string;
settings?: Setting[];
isHidden?: boolean;
category?: string;
subCategory?: string;
-};
+}
const GroupWrapper = styled.div`
position: relative;
diff --git a/app/client/src/pages/AdminSettings/LeftPane.tsx b/app/client/src/pages/AdminSettings/LeftPane.tsx
index 6d00765def..d73cff9491 100644
--- a/app/client/src/pages/AdminSettings/LeftPane.tsx
+++ b/app/client/src/pages/AdminSettings/LeftPane.tsx
@@ -5,7 +5,7 @@ import {
CategoryType,
type Category,
} from "@appsmith/pages/AdminSettings/config/types";
-import { adminSettingsCategoryUrl } from "RouteBuilder";
+import { adminSettingsCategoryUrl } from "@appsmith/RouteBuilder";
import { useParams } from "react-router";
import AnalyticsUtil from "utils/AnalyticsUtil";
import { Link, Text } from "design-system";
diff --git a/app/client/src/pages/AdminSettings/SaveSettings.tsx b/app/client/src/pages/AdminSettings/SaveSettings.tsx
index 6654a5ed41..74ceda927e 100644
--- a/app/client/src/pages/AdminSettings/SaveSettings.tsx
+++ b/app/client/src/pages/AdminSettings/SaveSettings.tsx
@@ -30,7 +30,7 @@ const SettingsButtonWrapper = styled.div`
align-items: center;
`;
-type SaveAdminSettingsProps = {
+interface SaveAdminSettingsProps {
isOnlyTenantConfig?: boolean;
isSaving?: boolean;
needsRefresh?: boolean;
@@ -39,7 +39,7 @@ type SaveAdminSettingsProps = {
settings: Record;
valid: boolean;
updatedTenantSettings?: string[];
-};
+}
const saveAdminSettings = (props: SaveAdminSettingsProps) => {
const {
diff --git a/app/client/src/pages/AdminSettings/SettingsForm.tsx b/app/client/src/pages/AdminSettings/SettingsForm.tsx
index 5ddcb06b6b..f224afe58f 100644
--- a/app/client/src/pages/AdminSettings/SettingsForm.tsx
+++ b/app/client/src/pages/AdminSettings/SettingsForm.tsx
@@ -51,12 +51,12 @@ import {
import { updateTenantConfig } from "@appsmith/actions/tenantActions";
import { tenantConfigConnection } from "@appsmith/constants/tenantConstants";
-type FormProps = {
+interface FormProps {
settings: Record;
settingsConfig: Record;
isSaving: boolean;
showReleaseNotes: boolean;
-};
+}
function getSettingLabel(name = "") {
return name.replace(/-/g, "");
@@ -337,8 +337,9 @@ export default withRouter(
setting.controlType === SettingTypes.CHECKBOX &&
!settingsConfig[name] &&
!fieldValue;
-
- if (fieldValue !== settingsConfig[name] && !doNotUpdate) {
+ //We are not performing type check here as inputs we take are stored as string
+ //But server stores as numeric, string etc..
+ if (fieldValue != settingsConfig[name] && !doNotUpdate) {
newProps.settings[name] = fieldValue;
}
});
diff --git a/app/client/src/pages/AdminSettings/config/googleMaps.ts b/app/client/src/pages/AdminSettings/config/googleMaps.ts
deleted file mode 100644
index 159ccd026c..0000000000
--- a/app/client/src/pages/AdminSettings/config/googleMaps.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { GOOGLE_MAPS_SETUP_DOC } from "constants/ThirdPartyConstants";
-import type { AdminConfigType } from "@appsmith/pages/AdminSettings/config/types";
-import {
- CategoryType,
- SettingCategories,
- SettingSubtype,
- SettingTypes,
-} from "@appsmith/pages/AdminSettings/config/types";
-
-export const config: AdminConfigType = {
- icon: "map-pin-2-line",
- type: SettingCategories.GOOGLE_MAPS,
- categoryType: CategoryType.GENERAL,
- controlType: SettingTypes.GROUP,
- title: "Google Maps",
- canSave: true,
- needsRefresh: true,
- settings: [
- {
- id: "APPSMITH_GOOGLE_MAPS_READ_MORE",
- category: SettingCategories.GOOGLE_MAPS,
- controlType: SettingTypes.CALLOUT,
- label: "How to configure?",
- url: GOOGLE_MAPS_SETUP_DOC,
- },
- {
- id: "googleMapsKey",
- category: SettingCategories.GOOGLE_MAPS,
- controlType: SettingTypes.TEXTINPUT,
- controlSubType: SettingSubtype.TEXT,
- label: "Google Maps API key",
- },
- ],
-};
diff --git a/app/client/src/pages/AppViewer/AppPage.tsx b/app/client/src/pages/AppViewer/AppPage.tsx
index 28f2640382..68e0a14fd3 100644
--- a/app/client/src/pages/AppViewer/AppPage.tsx
+++ b/app/client/src/pages/AppViewer/AppPage.tsx
@@ -17,13 +17,13 @@ import { useLocation } from "react-router";
import { renderAppsmithCanvas } from "layoutSystems/CanvasFactory";
import type { WidgetProps } from "widgets/BaseWidget";
-type AppPageProps = {
+interface AppPageProps {
appName?: string;
canvasWidth: number;
pageId?: string;
pageName?: string;
widgetsStructure: CanvasWidgetStructure;
-};
+}
export function AppPage(props: AppPageProps) {
const currentApplicationDetails = useSelector(getCurrentApplication);
diff --git a/app/client/src/pages/AppViewer/AppViewerPageContainer.tsx b/app/client/src/pages/AppViewer/AppViewerPageContainer.tsx
index b07549780a..cef242e0c2 100644
--- a/app/client/src/pages/AppViewer/AppViewerPageContainer.tsx
+++ b/app/client/src/pages/AppViewer/AppViewerPageContainer.tsx
@@ -16,7 +16,7 @@ import {
isPermitted,
PERMISSION_TYPE,
} from "@appsmith/utils/permissionHelpers";
-import { builderURL } from "RouteBuilder";
+import { builderURL } from "@appsmith/RouteBuilder";
import { getCanvasWidgetsStructure } from "@appsmith/selectors/entitiesSelector";
import equal from "fast-deep-equal/es6";
diff --git a/app/client/src/pages/AppViewer/Navigation/Sidebar.tsx b/app/client/src/pages/AppViewer/Navigation/Sidebar.tsx
index ddad01faf6..b6cd1d3f12 100644
--- a/app/client/src/pages/AppViewer/Navigation/Sidebar.tsx
+++ b/app/client/src/pages/AppViewer/Navigation/Sidebar.tsx
@@ -13,7 +13,7 @@ import MenuItem from "./components/MenuItem";
import ShareButton from "./components/ShareButton";
import PrimaryCTA from "../PrimaryCTA";
import { useHref } from "pages/Editor/utils";
-import { builderURL } from "RouteBuilder";
+import { builderURL } from "@appsmith/RouteBuilder";
import {
getCurrentPageId,
previewModeSelector,
@@ -38,13 +38,13 @@ import NavigationLogo from "@appsmith/pages/AppViewer/NavigationLogo";
import MenuItemContainer from "./components/MenuItemContainer";
import BackToAppsButton from "./components/BackToAppsButton";
-type SidebarProps = {
+interface SidebarProps {
currentApplicationDetails?: ApplicationPayload;
pages: Page[];
currentWorkspaceId: string;
currentUser: User | undefined;
showUserSettings: boolean;
-};
+}
export function Sidebar(props: SidebarProps) {
const selectedTheme = useSelector(getSelectedAppTheme);
diff --git a/app/client/src/pages/AppViewer/Navigation/TopInline.tsx b/app/client/src/pages/AppViewer/Navigation/TopInline.tsx
index e9169cc1f9..776a2163f5 100644
--- a/app/client/src/pages/AppViewer/Navigation/TopInline.tsx
+++ b/app/client/src/pages/AppViewer/Navigation/TopInline.tsx
@@ -21,10 +21,10 @@ import { throttle } from "lodash";
// TODO - @Dhruvik - ImprovedAppNav
// Replace with NavigationProps if nothing changes
// appsmith/app/client/src/pages/AppViewer/Navigation/constants.ts
-type TopInlineProps = {
+interface TopInlineProps {
currentApplicationDetails?: ApplicationPayload;
pages: Page[];
-};
+}
export function TopInline(props: TopInlineProps) {
const { currentApplicationDetails, pages } = props;
diff --git a/app/client/src/pages/AppViewer/Navigation/TopStacked.tsx b/app/client/src/pages/AppViewer/Navigation/TopStacked.tsx
index 111083ae3e..9a2386774c 100644
--- a/app/client/src/pages/AppViewer/Navigation/TopStacked.tsx
+++ b/app/client/src/pages/AppViewer/Navigation/TopStacked.tsx
@@ -16,10 +16,10 @@ import { Container, ScrollBtnContainer } from "./TopStacked.styled";
// TODO - @Dhruvik - ImprovedAppNav
// Replace with NavigationProps if nothing changes
// appsmith/app/client/src/pages/AppViewer/Navigation/constants.ts
-type TopStackedProps = {
+interface TopStackedProps {
currentApplicationDetails?: ApplicationPayload;
pages: Page[];
-};
+}
export function TopStacked(props: TopStackedProps) {
const { currentApplicationDetails, pages } = props;
diff --git a/app/client/src/pages/AppViewer/Navigation/components/ApplicationName.tsx b/app/client/src/pages/AppViewer/Navigation/components/ApplicationName.tsx
index e1d262c0e0..80fb5a93e5 100644
--- a/app/client/src/pages/AppViewer/Navigation/components/ApplicationName.tsx
+++ b/app/client/src/pages/AppViewer/Navigation/components/ApplicationName.tsx
@@ -5,14 +5,14 @@ import { isEllipsisActive } from "utils/helpers";
import { Tooltip } from "design-system";
import { useIsMobileDevice } from "utils/hooks/useDeviceDetect";
-type ApplicationNameProps = {
+interface ApplicationNameProps {
appName?: string;
navColorStyle: NavigationSetting["colorStyle"];
navStyle: NavigationSetting["navStyle"];
primaryColor: string;
forSidebar?: boolean;
fontWeight?: "regular" | "bold";
-};
+}
const ApplicationName = (props: ApplicationNameProps) => {
const {
diff --git a/app/client/src/pages/AppViewer/Navigation/components/BackToAppsButton.tsx b/app/client/src/pages/AppViewer/Navigation/components/BackToAppsButton.tsx
index 34bd59af1f..c5bbd486ae 100644
--- a/app/client/src/pages/AppViewer/Navigation/components/BackToAppsButton.tsx
+++ b/app/client/src/pages/AppViewer/Navigation/components/BackToAppsButton.tsx
@@ -20,11 +20,11 @@ const AppsLineIcon = importRemixIcon(
async () => import("remixicon-react/AppsLineIcon"),
);
-type BackToAppsButtonProps = {
+interface BackToAppsButtonProps {
currentApplicationDetails?: ApplicationPayload;
insideSidebar?: boolean;
isMinimal?: boolean;
-};
+}
const StyledAppIcon = styled(AppsLineIcon)<{
primaryColor: string;
diff --git a/app/client/src/pages/AppViewer/Navigation/components/CollapseButton.tsx b/app/client/src/pages/AppViewer/Navigation/components/CollapseButton.tsx
index 8caf7d3d68..18be8d1b26 100644
--- a/app/client/src/pages/AppViewer/Navigation/components/CollapseButton.tsx
+++ b/app/client/src/pages/AppViewer/Navigation/components/CollapseButton.tsx
@@ -21,14 +21,14 @@ const PinIcon = importSvg(
async () => import("assets/icons/ads/double-arrow-left.svg"),
);
-type CollapseButtonProps = {
+interface CollapseButtonProps {
borderRadius: string;
primaryColor: string;
navColorStyle: NavigationSetting["colorStyle"];
isOpen: boolean;
isPinned: boolean;
setIsPinned: (isPinned: boolean) => void;
-};
+}
const CollapseButton = (props: CollapseButtonProps) => {
const {
diff --git a/app/client/src/pages/AppViewer/Navigation/components/MenuItem.tsx b/app/client/src/pages/AppViewer/Navigation/components/MenuItem.tsx
index 74473707dd..1b4ea3569c 100644
--- a/app/client/src/pages/AppViewer/Navigation/components/MenuItem.tsx
+++ b/app/client/src/pages/AppViewer/Navigation/components/MenuItem.tsx
@@ -6,7 +6,7 @@ import { APP_MODE } from "entities/App";
import { get } from "lodash";
import { useHref } from "pages/Editor/utils";
import { useSelector } from "react-redux";
-import { builderURL, viewerURL } from "RouteBuilder";
+import { builderURL, viewerURL } from "@appsmith/RouteBuilder";
import { getAppMode } from "@appsmith/selectors/applicationSelectors";
import { getSelectedAppTheme } from "selectors/appThemingSelectors";
import { trimQueryString } from "utils/helpers";
@@ -15,12 +15,12 @@ import MenuText from "./MenuText";
import classNames from "classnames";
import { StyledMenuItem } from "./MenuItem.styled";
-type MenuItemProps = {
+interface MenuItemProps {
page: Page;
query: string;
navigationSetting?: NavigationSetting;
isMinimal?: boolean;
-};
+}
const MenuItem = ({
isMinimal,
diff --git a/app/client/src/pages/AppViewer/Navigation/components/MenuItemContainer.tsx b/app/client/src/pages/AppViewer/Navigation/components/MenuItemContainer.tsx
index c379a25fbf..0242550886 100644
--- a/app/client/src/pages/AppViewer/Navigation/components/MenuItemContainer.tsx
+++ b/app/client/src/pages/AppViewer/Navigation/components/MenuItemContainer.tsx
@@ -1,13 +1,13 @@
import React, { useEffect, useRef } from "react";
import scrollIntoView from "scroll-into-view-if-needed";
-type MenuItemContainerProps = {
+interface MenuItemContainerProps {
children: React.ReactNode;
isTabActive: boolean;
tabsScrollable?: boolean;
setShowScrollArrows?: () => void;
forSidebar?: boolean;
-};
+}
const MenuItemContainer = ({
children,
diff --git a/app/client/src/pages/AppViewer/Navigation/components/MenuText.tsx b/app/client/src/pages/AppViewer/Navigation/components/MenuText.tsx
index 2a30d7dc06..3016d52f10 100644
--- a/app/client/src/pages/AppViewer/Navigation/components/MenuText.tsx
+++ b/app/client/src/pages/AppViewer/Navigation/components/MenuText.tsx
@@ -4,11 +4,11 @@ import { TooltipComponent } from "design-system-old";
import { isEllipsisActive } from "utils/helpers";
import { StyledMenuItemText } from "./MenuText.styled";
-type MenuTextProps = {
+interface MenuTextProps {
name: string;
primaryColor: string;
navColorStyle: NavigationSetting["colorStyle"];
-};
+}
const MenuText = ({ name, navColorStyle, primaryColor }: MenuTextProps) => {
const tabNameRef = useRef(null);
diff --git a/app/client/src/pages/AppViewer/Navigation/components/MobileNavToggle.tsx b/app/client/src/pages/AppViewer/Navigation/components/MobileNavToggle.tsx
index 3d8e1bed2b..fb2b17c462 100644
--- a/app/client/src/pages/AppViewer/Navigation/components/MobileNavToggle.tsx
+++ b/app/client/src/pages/AppViewer/Navigation/components/MobileNavToggle.tsx
@@ -3,12 +3,12 @@ import { getMenuItemTextColor } from "pages/AppViewer/utils";
import type { NavigationSetting } from "constants/AppConstants";
import { Icon } from "design-system";
-type MobileNavToggleProps = {
+interface MobileNavToggleProps {
isMenuOpen: boolean;
setMenuOpen: (prevState: boolean) => void;
navColorStyle: NavigationSetting["colorStyle"];
primaryColor: string;
-};
+}
const MobileNavToggle = (props: MobileNavToggleProps) => {
const { isMenuOpen, navColorStyle, primaryColor, setMenuOpen } = props;
diff --git a/app/client/src/pages/AppViewer/Navigation/components/MoreDropdownButton.tsx b/app/client/src/pages/AppViewer/Navigation/components/MoreDropdownButton.tsx
index 2f07176389..556743f91f 100644
--- a/app/client/src/pages/AppViewer/Navigation/components/MoreDropdownButton.tsx
+++ b/app/client/src/pages/AppViewer/Navigation/components/MoreDropdownButton.tsx
@@ -15,13 +15,13 @@ import {
import type { Page } from "@appsmith/constants/ReduxActionConstants";
import { getAppMode } from "@appsmith/selectors/applicationSelectors";
import { APP_MODE } from "entities/App";
-import { builderURL, viewerURL } from "RouteBuilder";
+import { builderURL, viewerURL } from "@appsmith/RouteBuilder";
import { trimQueryString } from "utils/helpers";
-type MoreDropdownButtonProps = {
+interface MoreDropdownButtonProps {
navigationSetting?: NavigationSetting;
pages: Page[];
-};
+}
const MoreDropdownButton = ({
navigationSetting,
diff --git a/app/client/src/pages/AppViewer/Navigation/components/ShareButton.tsx b/app/client/src/pages/AppViewer/Navigation/components/ShareButton.tsx
index 628ba0cb9c..ee54b9b394 100644
--- a/app/client/src/pages/AppViewer/Navigation/components/ShareButton.tsx
+++ b/app/client/src/pages/AppViewer/Navigation/components/ShareButton.tsx
@@ -18,12 +18,12 @@ import { getCurrentAppWorkspace } from "@appsmith/selectors/workspaceSelectors";
import { useFeatureFlag } from "utils/hooks/useFeatureFlag";
import { FEATURE_FLAG } from "@appsmith/entities/FeatureFlag";
-type ShareButtonProps = {
+interface ShareButtonProps {
currentApplicationDetails?: ApplicationPayload;
currentWorkspaceId: string;
insideSidebar?: boolean;
isMinimal?: boolean;
-};
+}
const ShareButton = (props: ShareButtonProps) => {
const [showModal, setShowModal] = useState(false);
diff --git a/app/client/src/pages/AppViewer/Navigation/components/SidebarProfileComponent.tsx b/app/client/src/pages/AppViewer/Navigation/components/SidebarProfileComponent.tsx
index 01d3f8fe48..2de3a941ce 100644
--- a/app/client/src/pages/AppViewer/Navigation/components/SidebarProfileComponent.tsx
+++ b/app/client/src/pages/AppViewer/Navigation/components/SidebarProfileComponent.tsx
@@ -10,12 +10,12 @@ import {
StyledTextContainer,
} from "./SidebarProfileComponent.styled";
-type SidebarProfileComponent = {
+interface SidebarProfileComponent {
currentUser: User | undefined;
primaryColor: string;
navColorStyle: NavigationSetting["colorStyle"];
isMinimal: boolean;
-};
+}
const SidebarProfileComponent = (props: SidebarProfileComponent) => {
const { currentUser, isMinimal, navColorStyle, primaryColor } = props;
diff --git a/app/client/src/pages/AppViewer/Navigation/components/TopHeader.tsx b/app/client/src/pages/AppViewer/Navigation/components/TopHeader.tsx
index 36b9352d52..e368c56126 100644
--- a/app/client/src/pages/AppViewer/Navigation/components/TopHeader.tsx
+++ b/app/client/src/pages/AppViewer/Navigation/components/TopHeader.tsx
@@ -7,7 +7,7 @@ import { get } from "lodash";
import { useHref } from "pages/Editor/utils";
import React from "react";
import { useSelector } from "react-redux";
-import { builderURL } from "RouteBuilder";
+import { builderURL } from "@appsmith/RouteBuilder";
import { getSelectedAppTheme } from "selectors/appThemingSelectors";
import { getCurrentPageId } from "selectors/editorSelectors";
import MobileNavToggle from "./MobileNavToggle";
@@ -24,7 +24,7 @@ import TopInline from "../TopInline";
import NavigationLogo from "@appsmith/pages/AppViewer/NavigationLogo";
import BackToAppsButton from "./BackToAppsButton";
-type TopHeaderProps = {
+interface TopHeaderProps {
currentApplicationDetails?: ApplicationPayload;
pages: Page[];
currentWorkspaceId: string;
@@ -32,7 +32,7 @@ type TopHeaderProps = {
isMenuOpen: boolean;
setMenuOpen: (isMenuOpen: boolean) => void;
showUserSettings: boolean;
-};
+}
const TopHeader = (props: TopHeaderProps) => {
const {
diff --git a/app/client/src/pages/AppViewer/Navigation/constants.ts b/app/client/src/pages/AppViewer/Navigation/constants.ts
index 4250afe541..90c426353e 100644
--- a/app/client/src/pages/AppViewer/Navigation/constants.ts
+++ b/app/client/src/pages/AppViewer/Navigation/constants.ts
@@ -3,7 +3,7 @@ import type {
Page,
} from "@appsmith/constants/ReduxActionConstants";
-export type NavigationProps = {
+export interface NavigationProps {
pages: Page[];
currentApplicationDetails?: ApplicationPayload;
-};
+}
diff --git a/app/client/src/pages/AppViewer/Navigation/index.tsx b/app/client/src/pages/AppViewer/Navigation/index.tsx
index 4ef8d7eee8..9e0b444654 100644
--- a/app/client/src/pages/AppViewer/Navigation/index.tsx
+++ b/app/client/src/pages/AppViewer/Navigation/index.tsx
@@ -18,7 +18,7 @@ import { NAVIGATION_SETTINGS } from "constants/AppConstants";
import PageMenu from "pages/AppViewer/PageMenu";
import TourCompletionMessage from "pages/Editor/GuidedTour/TourCompletionMessage";
import { useHref } from "pages/Editor/utils";
-import { builderURL } from "RouteBuilder";
+import { builderURL } from "@appsmith/RouteBuilder";
import TopHeader from "./components/TopHeader";
import Sidebar from "./Sidebar";
import { getCurrentApplication } from "@appsmith/selectors/applicationSelectors";
diff --git a/app/client/src/pages/AppViewer/PageMenu.tsx b/app/client/src/pages/AppViewer/PageMenu.tsx
index f810b07aa6..c405556686 100644
--- a/app/client/src/pages/AppViewer/PageMenu.tsx
+++ b/app/client/src/pages/AppViewer/PageMenu.tsx
@@ -14,9 +14,8 @@ import { getAppViewHeaderHeight } from "selectors/appViewSelectors";
import { useOnClickOutside } from "utils/hooks/useOnClickOutside";
import { useHref } from "pages/Editor/utils";
import { APP_MODE } from "entities/App";
-import { builderURL, viewerURL } from "RouteBuilder";
+import { builderURL, viewerURL } from "@appsmith/RouteBuilder";
import { trimQueryString } from "utils/helpers";
-import { getAppsmithConfigs } from "@appsmith/configs";
import type { NavigationSetting } from "constants/AppConstants";
import { NAVIGATION_SETTINGS } from "constants/AppConstants";
import { get } from "lodash";
@@ -24,15 +23,16 @@ import { PageMenuContainer, StyledNavLink } from "./PageMenu.styled";
import { StyledCtaContainer } from "./Navigation/Sidebar.styled";
import ShareButton from "./Navigation/components/ShareButton";
import BackToAppsButton from "./Navigation/components/BackToAppsButton";
+import { getHideWatermark } from "@appsmith/selectors/tenantSelectors";
-type NavigationProps = {
+interface NavigationProps {
isOpen?: boolean;
application?: ApplicationPayload;
pages: Page[];
url?: string;
setMenuOpen?: (shouldOpen: boolean) => void;
headerRef?: React.RefObject;
-};
+}
export function PageMenu(props: NavigationProps) {
const { application, headerRef, isOpen, pages, setMenuOpen } = props;
@@ -41,7 +41,7 @@ export function PageMenu(props: NavigationProps) {
const workspaceID = useSelector(getCurrentWorkspaceId);
const headerHeight = useSelector(getAppViewHeaderHeight);
const [query, setQuery] = useState("");
- const { hideWatermark } = getAppsmithConfigs();
+ const hideWatermark = useSelector(getHideWatermark);
const navColorStyle =
application?.applicationDetail?.navigationSetting?.colorStyle ||
NAVIGATION_SETTINGS.COLOR_STYLE.LIGHT;
@@ -147,7 +147,7 @@ export function PageMenu(props: NavigationProps) {
{!hideWatermark && (
{children};
}
-type Props = {
+interface Props {
appPages: Page[];
currentApplicationDetails?: ApplicationPayload;
measuredTabsRef: (ref: HTMLElement | null) => void;
tabsScrollable: boolean;
setShowScrollArrows: () => void;
-};
+}
export function PageTabs(props: Props) {
const { appPages, currentApplicationDetails } = props;
diff --git a/app/client/src/pages/AppViewer/PrimaryCTA.tsx b/app/client/src/pages/AppViewer/PrimaryCTA.tsx
index 3db8451f65..fb41ab5cba 100644
--- a/app/client/src/pages/AppViewer/PrimaryCTA.tsx
+++ b/app/client/src/pages/AppViewer/PrimaryCTA.tsx
@@ -21,7 +21,7 @@ import {
import { getCurrentUser } from "selectors/usersSelectors";
import { ANONYMOUS_USERNAME } from "constants/userConstants";
import ForkApplicationModal from "pages/Applications/ForkApplicationModal";
-import { viewerURL } from "RouteBuilder";
+import { viewerURL } from "@appsmith/RouteBuilder";
import { useHistory, useLocation } from "react-router";
import { useHref } from "pages/Editor/utils";
import type { NavigationSetting } from "constants/AppConstants";
@@ -35,14 +35,14 @@ import { setPreviewModeInitAction } from "actions/editorActions";
* TYPES
* ---------------------------------------------------------------------------------------------------
*/
-type Props = {
+interface Props {
url?: string;
className?: string;
primaryColor: string;
navColorStyle: NavigationSetting["colorStyle"];
insideSidebar?: boolean;
isMinimal?: boolean;
-};
+}
/**
* ---------------------------------------------------------------------------------------------------
@@ -117,6 +117,7 @@ function PrimaryCTA(props: Props) {
pageId: currentPageID,
params: {
fork: "true",
+ branch: null,
},
});
diff --git a/app/client/src/pages/AppViewer/SideNav.tsx b/app/client/src/pages/AppViewer/SideNav.tsx
index 24ec3308b1..48a6a27ff5 100644
--- a/app/client/src/pages/AppViewer/SideNav.tsx
+++ b/app/client/src/pages/AppViewer/SideNav.tsx
@@ -4,13 +4,13 @@ import { Menu, Button } from "@blueprintjs/core";
import type { SideNavItemProps } from "./SideNavItem";
import SideNavItem from "./SideNavItem";
import LetterIcon from "components/editorComponents/LetterIcon";
-type SideNavProps = {
+interface SideNavProps {
items?: SideNavItemProps[];
active?: string;
headeroffset?: number;
open: boolean;
toggleCollapse: (open: boolean) => void;
-};
+}
/* eslint-disable no-unexpected-multiline */
diff --git a/app/client/src/pages/AppViewer/SideNavItem.tsx b/app/client/src/pages/AppViewer/SideNavItem.tsx
index f17e8ad51d..c880bdc17a 100644
--- a/app/client/src/pages/AppViewer/SideNavItem.tsx
+++ b/app/client/src/pages/AppViewer/SideNavItem.tsx
@@ -14,14 +14,14 @@ const Content = styled.div<{ collapsed: boolean }>`
}
`;
-export type SideNavItemProps = {
+export interface SideNavItemProps {
id: string;
icon?: ReactNode;
text: string;
path: string;
loading: boolean;
showText?: boolean;
-};
+}
export function SideNavItem(props: SideNavItemProps) {
const match = useRouteMatch({
diff --git a/app/client/src/pages/AppViewer/index.tsx b/app/client/src/pages/AppViewer/index.tsx
index a9f3cca915..6b76997765 100644
--- a/app/client/src/pages/AppViewer/index.tsx
+++ b/app/client/src/pages/AppViewer/index.tsx
@@ -34,7 +34,6 @@ import { getIsBranchUpdated } from "../utils";
import { APP_MODE } from "entities/App";
import { initAppViewer } from "actions/initActions";
import { WidgetGlobaStyles } from "globalStyles/WidgetGlobalStyles";
-import { getAppsmithConfigs } from "@appsmith/configs";
import useWidgetFocus from "utils/hooks/useWidgetFocus/useWidgetFocus";
import HtmlTitle from "./AppViewerHtmlTitle";
import BottomBar from "components/BottomBar";
@@ -53,6 +52,8 @@ import { RAMP_NAME } from "utils/ProductRamps/RampsControlList";
import { showProductRamps } from "@appsmith/selectors/rampSelectors";
import { FEATURE_FLAG } from "@appsmith/entities/FeatureFlag";
import { KBViewerFloatingButton } from "@appsmith/pages/AppViewer/KnowledgeBase/KBViewerFloatingButton";
+import urlBuilder from "@appsmith/entities/URLRedirect/URLAssembly";
+import { getHideWatermark } from "@appsmith/selectors/tenantSelectors";
const AppViewerBody = styled.section<{
hasPages: boolean;
@@ -102,7 +103,7 @@ function AppViewer(props: Props) {
const headerHeight = useSelector(getAppViewHeaderHeight);
const branch = getSearchQuery(search, GIT_BRANCH_QUERY_KEY);
const prevValues = usePrevious({ branch, location: props.location, pageId });
- const { hideWatermark } = getAppsmithConfigs();
+ const hideWatermark = useSelector(getHideWatermark);
const pageDescription = useSelector(getCurrentPageDescription);
const currentApplicationDetails: ApplicationPayload | undefined = useSelector(
getCurrentApplication,
@@ -171,6 +172,14 @@ function AppViewer(props: Props) {
}
}, [branch, pageId, applicationId, pathname]);
+ useEffect(() => {
+ urlBuilder.setCurrentPageId(pageId);
+
+ return () => {
+ urlBuilder.setCurrentPageId(null);
+ };
+ }, [pageId]);
+
useEffect(() => {
const header = document.querySelector(".js-appviewer-header");
diff --git a/app/client/src/pages/Applications/ApplicationCard.tsx b/app/client/src/pages/Applications/ApplicationCard.tsx
index 862259dd0f..4061622bb8 100644
--- a/app/client/src/pages/Applications/ApplicationCard.tsx
+++ b/app/client/src/pages/Applications/ApplicationCard.tsx
@@ -47,9 +47,9 @@ import {
} from "@appsmith/selectors/applicationSelectors";
import ForkApplicationModal from "./ForkApplicationModal";
import { getExportAppAPIRoute } from "@appsmith/constants/ApiConstants";
-import { builderURL, viewerURL } from "RouteBuilder";
+import { builderURL, viewerURL } from "@appsmith/RouteBuilder";
import history from "utils/history";
-import urlBuilder from "entities/URLRedirect/URLAssembly";
+import urlBuilder from "@appsmith/entities/URLRedirect/URLAssembly";
import { toast } from "design-system";
import { getAppsmithConfigs } from "@appsmith/configs";
import { addItemsInContextMenu } from "@appsmith/utils";
@@ -63,7 +63,7 @@ import {
const { cloudHosting } = getAppsmithConfigs();
-type ApplicationCardProps = {
+interface ApplicationCardProps {
application: ApplicationPayload;
share?: (applicationId: string) => void;
delete?: (applicationId: string) => void;
@@ -77,7 +77,7 @@ type ApplicationCardProps = {
canInviteToWorkspace?: boolean;
};
workspaceId: string;
-};
+}
const IconScrollWrapper = styled.div`
position: relative;
diff --git a/app/client/src/pages/Applications/EmbedSnippet/DimensionsInput.tsx b/app/client/src/pages/Applications/EmbedSnippet/DimensionsInput.tsx
index 8324e4ddac..2f96cb9410 100644
--- a/app/client/src/pages/Applications/EmbedSnippet/DimensionsInput.tsx
+++ b/app/client/src/pages/Applications/EmbedSnippet/DimensionsInput.tsx
@@ -12,12 +12,12 @@ const StyledInput = styled(Input)`
}
`;
-type DimensionsInputProp = {
+interface DimensionsInputProp {
onChange?: ((value: string) => void) | undefined;
value: string;
prefix: string;
icon: string;
-};
+}
const regex = /^[1-9][0-9]{0,3}((px)|(em)|(%)|(vw)|(vh))?$/;
diff --git a/app/client/src/pages/Applications/EmbedSnippet/Snippet.tsx b/app/client/src/pages/Applications/EmbedSnippet/Snippet.tsx
index feaf3916e0..36d1a950fe 100644
--- a/app/client/src/pages/Applications/EmbedSnippet/Snippet.tsx
+++ b/app/client/src/pages/Applications/EmbedSnippet/Snippet.tsx
@@ -19,15 +19,15 @@ const EmbedSnippetContainer = styled.div`
gap: 1.5rem;
`;
-type EmbedCodeSnippetProps = {
+interface EmbedCodeSnippetProps {
snippet: string;
isAppSettings?: boolean;
-};
+}
-type SnippetProps = {
+interface SnippetProps {
onCopy: () => void;
snippet: string;
-};
+}
function AppSettings(props: SnippetProps) {
return (
diff --git a/app/client/src/pages/Applications/EmbedSnippet/useUpdateEmbedSnippet.tsx b/app/client/src/pages/Applications/EmbedSnippet/useUpdateEmbedSnippet.tsx
index 343ca9d2f9..243551c007 100644
--- a/app/client/src/pages/Applications/EmbedSnippet/useUpdateEmbedSnippet.tsx
+++ b/app/client/src/pages/Applications/EmbedSnippet/useUpdateEmbedSnippet.tsx
@@ -7,7 +7,7 @@ import { getCurrentApplication } from "@appsmith/selectors/applicationSelectors"
import { ReduxActionTypes } from "@appsmith/constants/ReduxActionConstants";
import debounce from "lodash/debounce";
import { updateApplication } from "@appsmith/actions/applicationActions";
-import { viewerURL } from "RouteBuilder";
+import { viewerURL } from "@appsmith/RouteBuilder";
import {
createMessage,
IN_APP_EMBED_SETTING,
diff --git a/app/client/src/pages/Applications/ForkApplicationModal.tsx b/app/client/src/pages/Applications/ForkApplicationModal.tsx
index 970b22f146..60580629dd 100644
--- a/app/client/src/pages/Applications/ForkApplicationModal.tsx
+++ b/app/client/src/pages/Applications/ForkApplicationModal.tsx
@@ -27,7 +27,7 @@ import {
} from "@appsmith/constants/messages";
import { getAllApplications } from "@appsmith/actions/applicationActions";
-type ForkApplicationModalProps = {
+interface ForkApplicationModalProps {
applicationId: string;
// if a trigger is passed
// it renders that component
@@ -36,7 +36,7 @@ type ForkApplicationModalProps = {
handleOpen?: () => void;
handleClose?: () => void;
isInEditMode?: boolean;
-};
+}
function ForkApplicationModal(props: ForkApplicationModalProps) {
const { handleClose, handleOpen, isModalOpen } = props;
diff --git a/app/client/src/pages/Applications/ImportApplicationModal.tsx b/app/client/src/pages/Applications/ImportApplicationModal.tsx
index a22fb91269..406afafcb0 100644
--- a/app/client/src/pages/Applications/ImportApplicationModal.tsx
+++ b/app/client/src/pages/Applications/ImportApplicationModal.tsx
@@ -183,13 +183,13 @@ function GitImportCard(props: { children?: ReactNode; handler?: () => void }) {
);
}
-type ImportApplicationModalProps = {
+interface ImportApplicationModalProps {
workspaceId?: string;
isModalOpen?: boolean;
onClose?: () => void;
appId?: string;
toApp?: boolean;
-};
+}
function ImportApplicationModal(props: ImportApplicationModalProps) {
const { appId, isModalOpen, onClose, toApp = false, workspaceId } = props;
diff --git a/app/client/src/pages/Applications/ProductUpdatesModal/ReleaseComponent.tsx b/app/client/src/pages/Applications/ProductUpdatesModal/ReleaseComponent.tsx
index 8043b81b84..2b04dba363 100644
--- a/app/client/src/pages/Applications/ProductUpdatesModal/ReleaseComponent.tsx
+++ b/app/client/src/pages/Applications/ProductUpdatesModal/ReleaseComponent.tsx
@@ -72,16 +72,16 @@ const StyledContent = styled.div<{ maxHeight: number }>`
max-height: ${(props) => props.maxHeight}px;
`;
-export type Release = {
+export interface Release {
descriptionHtml: string;
name: string;
publishedAt?: string;
tagName: string;
-};
+}
-type ReleaseProps = {
+interface ReleaseProps {
release: Release;
-};
+}
enum ReleaseComponentViewState {
"collapsed",
diff --git a/app/client/src/pages/Applications/ProductUpdatesModal/index.tsx b/app/client/src/pages/Applications/ProductUpdatesModal/index.tsx
index 0b0d7a72a4..29bab4f1d9 100644
--- a/app/client/src/pages/Applications/ProductUpdatesModal/index.tsx
+++ b/app/client/src/pages/Applications/ProductUpdatesModal/index.tsx
@@ -17,11 +17,11 @@ const Container = styled.div`
height: 410px;
`;
-type ProductUpdatesModalProps = {
+interface ProductUpdatesModalProps {
isOpen?: boolean;
onClose?: () => void;
hideTrigger?: boolean;
-};
+}
function ProductUpdatesModal(props: ProductUpdatesModalProps) {
const { releaseItems } = useSelector((state: AppState) => state.ui.releases);
diff --git a/app/client/src/pages/Applications/helpers.ts b/app/client/src/pages/Applications/helpers.ts
index 830ec8448b..d249e5b91c 100644
--- a/app/client/src/pages/Applications/helpers.ts
+++ b/app/client/src/pages/Applications/helpers.ts
@@ -5,17 +5,17 @@ import { SubmissionError } from "redux-form";
import { truncateString, howMuchTimeBeforeText } from "utils/helpers";
-export type CreateApplicationFormValues = {
+export interface CreateApplicationFormValues {
applicationName: string;
workspaceId: string;
colorCode?: AppColorCode;
appName?: AppIconName;
-};
+}
-export type EditedByTextProps = {
+export interface EditedByTextProps {
modifiedAt?: string;
modifiedBy?: string;
-};
+}
export const CREATE_APPLICATION_FORM_NAME_FIELD = "applicationName";
diff --git a/app/client/src/pages/Editor/APIEditor/ApiRightPane.tsx b/app/client/src/pages/Editor/APIEditor/ApiRightPane.tsx
index b9b10def27..29baf5b6de 100644
--- a/app/client/src/pages/Editor/APIEditor/ApiRightPane.tsx
+++ b/app/client/src/pages/Editor/APIEditor/ApiRightPane.tsx
@@ -9,7 +9,7 @@ import ActionRightPane, {
useEntityDependencies,
} from "components/editorComponents/ActionRightPane";
import { sortedDatasourcesHandler } from "./helpers";
-import { datasourcesEditorIdURL } from "RouteBuilder";
+import { datasourcesEditorIdURL } from "@appsmith/RouteBuilder";
import { setApiRightPaneSelectedTab } from "actions/apiPaneActions";
import { useDispatch, useSelector } from "react-redux";
import { getApiRightPaneSelectedTab } from "selectors/apiPaneSelectors";
diff --git a/app/client/src/pages/Editor/APIEditor/GraphQL/GraphQLEditorForm.tsx b/app/client/src/pages/Editor/APIEditor/GraphQL/GraphQLEditorForm.tsx
index beaf6bd818..d953fd8735 100644
--- a/app/client/src/pages/Editor/APIEditor/GraphQL/GraphQLEditorForm.tsx
+++ b/app/client/src/pages/Editor/APIEditor/GraphQL/GraphQLEditorForm.tsx
@@ -148,9 +148,9 @@ function GraphQLEditorForm(props: Props) {
const selector = formValueSelector(API_EDITOR_FORM_NAME);
-type ReduxDispatchProps = {
+interface ReduxDispatchProps {
updateDatasource: (datasource: Datasource) => void;
-};
+}
const mapDispatchToProps = (dispatch: any): ReduxDispatchProps => ({
updateDatasource: (datasource) => {
diff --git a/app/client/src/pages/Editor/APIEditor/GraphQL/Pagination.tsx b/app/client/src/pages/Editor/APIEditor/GraphQL/Pagination.tsx
index 5ffae1394c..208170f9c9 100644
--- a/app/client/src/pages/Editor/APIEditor/GraphQL/Pagination.tsx
+++ b/app/client/src/pages/Editor/APIEditor/GraphQL/Pagination.tsx
@@ -151,7 +151,7 @@ const graphqlParseVariables = (queryBody: string) => {
return variables;
};
-type PaginationTypeBasedWrapperProps = {
+interface PaginationTypeBasedWrapperProps {
actionName: string;
className: string;
dataReplayId: string;
@@ -174,7 +174,7 @@ type PaginationTypeBasedWrapperProps = {
variableLabel: string;
variableTooltip?: string;
valueTooltip?: string;
-};
+}
function PaginationTypeBasedWrapper({
actionName,
diff --git a/app/client/src/pages/Editor/APIEditor/GraphQL/QueryEditor.tsx b/app/client/src/pages/Editor/APIEditor/GraphQL/QueryEditor.tsx
index 074f1190ee..37c9505565 100644
--- a/app/client/src/pages/Editor/APIEditor/GraphQL/QueryEditor.tsx
+++ b/app/client/src/pages/Editor/APIEditor/GraphQL/QueryEditor.tsx
@@ -25,7 +25,7 @@ const QueryHeader = styled.div`
padding: 8px 16px;
`;
-type QueryProps = {
+interface QueryProps {
// Path to store the value in the actual data object
dataTreePath: string;
// Height for the editor
@@ -34,7 +34,7 @@ type QueryProps = {
name: string;
// Theme to be used in CodeEditor
theme: EditorTheme;
-};
+}
/**
* Query Editor is for writing Graphql query using the Codemirror Editor which we use
diff --git a/app/client/src/pages/Editor/APIEditor/GraphQL/VariableEditor.tsx b/app/client/src/pages/Editor/APIEditor/GraphQL/VariableEditor.tsx
index 5335f45a97..e5ea15ef1f 100644
--- a/app/client/src/pages/Editor/APIEditor/GraphQL/VariableEditor.tsx
+++ b/app/client/src/pages/Editor/APIEditor/GraphQL/VariableEditor.tsx
@@ -38,12 +38,12 @@ const EXPECTED_VARIABLE = {
autocompleteDataType: AutocompleteDataType.OBJECT,
};
-type VariableProps = {
+interface VariableProps {
// Name of the action to define the path to the config property
actionName: string;
// Theme to be used in CodeEditor
theme: EditorTheme;
-};
+}
/**
* Variable Editor is for writing Graphql variables using the Codemirror Editor which we use for JSON
diff --git a/app/client/src/pages/Editor/APIEditor/ProviderTemplates.tsx b/app/client/src/pages/Editor/APIEditor/ProviderTemplates.tsx
index ec3841c207..7f631f36b5 100644
--- a/app/client/src/pages/Editor/APIEditor/ProviderTemplates.tsx
+++ b/app/client/src/pages/Editor/APIEditor/ProviderTemplates.tsx
@@ -32,7 +32,7 @@ import { getInitialsAndColorCode } from "utils/AppsmithUtils";
import AnalyticsUtil from "utils/AnalyticsUtil";
import { getAppCardColorPalette } from "selectors/themeSelectors";
import { getCurrentApplicationId } from "selectors/editorSelectors";
-import { integrationEditorURL } from "RouteBuilder";
+import { integrationEditorURL } from "@appsmith/RouteBuilder";
import { getAssetUrl } from "@appsmith/utils/airgapHelpers";
const TEMPLATES_TOP_SECTION_HEIGHT = "83px";
diff --git a/app/client/src/pages/Editor/APIEditor/RestAPIForm.tsx b/app/client/src/pages/Editor/APIEditor/RestAPIForm.tsx
index 6a127d3201..11a98c1775 100644
--- a/app/client/src/pages/Editor/APIEditor/RestAPIForm.tsx
+++ b/app/client/src/pages/Editor/APIEditor/RestAPIForm.tsx
@@ -73,9 +73,9 @@ function ApiEditorForm(props: Props) {
const selector = formValueSelector(API_EDITOR_FORM_NAME);
-type ReduxDispatchProps = {
+interface ReduxDispatchProps {
updateDatasource: (datasource: Datasource) => void;
-};
+}
const mapDispatchToProps = (dispatch: any): ReduxDispatchProps => ({
updateDatasource: (datasource) => {
diff --git a/app/client/src/pages/Editor/APIEditor/helpers.ts b/app/client/src/pages/Editor/APIEditor/helpers.ts
index 6e29b240c3..b752e18bd7 100644
--- a/app/client/src/pages/Editor/APIEditor/helpers.ts
+++ b/app/client/src/pages/Editor/APIEditor/helpers.ts
@@ -1,10 +1,10 @@
import { submitCurlImportForm } from "actions/importActions";
-export type curlImportFormValues = {
+export interface curlImportFormValues {
curl: string;
pageId: string;
name: string;
-};
+}
export const curlImportSubmitHandler = (
values: curlImportFormValues,
@@ -32,11 +32,11 @@ export const sortedDatasourcesHandler = (
return sortedArr;
};
-export type AutoGeneratedHeader = {
+export interface AutoGeneratedHeader {
key: string;
value: string;
isInvalid: boolean;
-};
+}
const isKeyInArray = (arr: any[], key: any) => {
return arr.some(
diff --git a/app/client/src/pages/Editor/APIEditor/index.tsx b/app/client/src/pages/Editor/APIEditor/index.tsx
index 38806b2518..3dc41400b2 100644
--- a/app/client/src/pages/Editor/APIEditor/index.tsx
+++ b/app/client/src/pages/Editor/APIEditor/index.tsx
@@ -41,7 +41,7 @@ import {
getPluginSettingConfigs,
} from "@appsmith/selectors/entitiesSelector";
import history from "utils/history";
-import { saasEditorApiIdURL } from "RouteBuilder";
+import { saasEditorApiIdURL } from "@appsmith/RouteBuilder";
import GraphQLEditorForm from "./GraphQL/GraphQLEditorForm";
const LoadingContainer = styled(CenteredWrapper)`
diff --git a/app/client/src/pages/Editor/AppSettingsPane/AppSettings/EmbedSettings/MakeApplicationForkable.tsx b/app/client/src/pages/Editor/AppSettingsPane/AppSettings/EmbedSettings/MakeApplicationForkable.tsx
index 04d4dc14ae..6aa751b482 100644
--- a/app/client/src/pages/Editor/AppSettingsPane/AppSettings/EmbedSettings/MakeApplicationForkable.tsx
+++ b/app/client/src/pages/Editor/AppSettingsPane/AppSettings/EmbedSettings/MakeApplicationForkable.tsx
@@ -19,11 +19,11 @@ import { getIsFetchingApplications } from "@appsmith/selectors/applicationSelect
import { updateApplication } from "@appsmith/actions/applicationActions";
import type { ApplicationPayload } from "@appsmith/constants/ReduxActionConstants";
-type ConfirmEnableForkingModalProps = {
+interface ConfirmEnableForkingModalProps {
isOpen: boolean;
onClose: () => void;
onConfirm: () => void;
-};
+}
function ConfirmEnableForkingModal({
isOpen,
diff --git a/app/client/src/pages/Editor/AppSettingsPane/AppSettings/NavigationSettings/ButtonGroupSetting.tsx b/app/client/src/pages/Editor/AppSettingsPane/AppSettings/NavigationSettings/ButtonGroupSetting.tsx
index 95b976bbb0..6a44006110 100644
--- a/app/client/src/pages/Editor/AppSettingsPane/AppSettings/NavigationSettings/ButtonGroupSetting.tsx
+++ b/app/client/src/pages/Editor/AppSettingsPane/AppSettings/NavigationSettings/ButtonGroupSetting.tsx
@@ -16,7 +16,7 @@ const StyledSegmentedControl = styled(SegmentedControl)`
}
`;
-export type ButtonGroupSettingProps = {
+export interface ButtonGroupSettingProps {
heading: string;
options: Array<
SegmentedControlOption & { startIcon?: any; hidden?: boolean }
@@ -24,7 +24,7 @@ export type ButtonGroupSettingProps = {
navigationSetting: NavigationSetting;
keyName: keyof StringsFromNavigationSetting;
updateSetting: UpdateSetting;
-};
+}
const ButtonGroupSetting = ({
heading,
diff --git a/app/client/src/pages/Editor/AppSettingsPane/AppSettings/NavigationSettings/ImageInput.tsx b/app/client/src/pages/Editor/AppSettingsPane/AppSettings/NavigationSettings/ImageInput.tsx
index 02adebc53d..0acc1ef2e9 100644
--- a/app/client/src/pages/Editor/AppSettingsPane/AppSettings/NavigationSettings/ImageInput.tsx
+++ b/app/client/src/pages/Editor/AppSettingsPane/AppSettings/NavigationSettings/ImageInput.tsx
@@ -10,7 +10,7 @@ import {
} from "@appsmith/selectors/applicationSelectors";
import { ContentBox } from "pages/AdminSettings/components";
-type ImageInputProps = {
+interface ImageInputProps {
value?: any;
onChange?(value?: any): void;
validate?(
@@ -19,7 +19,7 @@ type ImageInputProps = {
): void;
className?: string;
defaultValue?: string;
-};
+}
const StyledImg = styled.img`
object-fit: contain;
diff --git a/app/client/src/pages/Editor/AppSettingsPane/AppSettings/NavigationSettings/index.tsx b/app/client/src/pages/Editor/AppSettingsPane/AppSettings/NavigationSettings/index.tsx
index 42573add5d..a8fd0451a1 100644
--- a/app/client/src/pages/Editor/AppSettingsPane/AppSettings/NavigationSettings/index.tsx
+++ b/app/client/src/pages/Editor/AppSettingsPane/AppSettings/NavigationSettings/index.tsx
@@ -39,10 +39,10 @@ export type UpdateSetting = (
value: NavigationSetting[keyof NavigationSetting],
) => void;
-export type LogoConfigurationSwitches = {
+export interface LogoConfigurationSwitches {
logo: boolean;
applicationTitle: boolean;
-};
+}
function NavigationSettings() {
const application = useSelector(getCurrentApplication);
diff --git a/app/client/src/pages/Editor/AppSettingsPane/Utils.ts b/app/client/src/pages/Editor/AppSettingsPane/Utils.ts
index 33213fcd48..a9f6537276 100644
--- a/app/client/src/pages/Editor/AppSettingsPane/Utils.ts
+++ b/app/client/src/pages/Editor/AppSettingsPane/Utils.ts
@@ -1,5 +1,5 @@
import { APP_MODE } from "entities/App";
-import urlBuilder from "entities/URLRedirect/URLAssembly";
+import urlBuilder from "@appsmith/entities/URLRedirect/URLAssembly";
import { splitPathPreview } from "utils/helpers";
export const getUrlPreview = (
diff --git a/app/client/src/pages/Editor/AppsmithLink.tsx b/app/client/src/pages/Editor/AppsmithLink.tsx
new file mode 100644
index 0000000000..124e4e294c
--- /dev/null
+++ b/app/client/src/pages/Editor/AppsmithLink.tsx
@@ -0,0 +1,36 @@
+import React from "react";
+import { Link, Tooltip } from "design-system";
+import styled from "styled-components";
+import { LOGO_TOOLTIP, createMessage } from "@appsmith/constants/messages";
+import { APPLICATIONS_URL } from "constants/routes";
+import AppsmithLogo from "assets/images/appsmith_logo_square.png";
+
+export const StyledLink = styled((props) => {
+ // we are removing non input related props before passing them in the components
+ // eslint-disable @typescript-eslint/no-unused-vars
+ return ;
+})`
+ height: 24px;
+ min-width: 24px;
+ width: 24px;
+ display: inline-block;
+ img {
+ min-width: 24px;
+ width: 24px;
+ height: 24px;
+ }
+`;
+
+export const AppsmithLink = () => {
+ return (
+
+
+
+
+
+ );
+};
diff --git a/app/client/src/pages/Editor/CanvasLayoutConversion/ConversionCompleteLayout.tsx b/app/client/src/pages/Editor/CanvasLayoutConversion/ConversionCompleteLayout.tsx
index 2a88b11751..aef3493263 100644
--- a/app/client/src/pages/Editor/CanvasLayoutConversion/ConversionCompleteLayout.tsx
+++ b/app/client/src/pages/Editor/CanvasLayoutConversion/ConversionCompleteLayout.tsx
@@ -19,12 +19,12 @@ const AlertIcons = {
},
};
-export type ConversionCompleteLayoutProps = {
+export interface ConversionCompleteLayoutProps {
alertType: AlertType;
headerText: string;
infoText: string;
errorText?: string;
-};
+}
const StyledHugeIcon = styled(Icon)`
svg {
diff --git a/app/client/src/pages/Editor/CanvasLayoutConversion/ConversionForm.tsx b/app/client/src/pages/Editor/CanvasLayoutConversion/ConversionForm.tsx
index dd42a62764..69be2ecf10 100644
--- a/app/client/src/pages/Editor/CanvasLayoutConversion/ConversionForm.tsx
+++ b/app/client/src/pages/Editor/CanvasLayoutConversion/ConversionForm.tsx
@@ -27,9 +27,13 @@ const SnapshotContainer = styled.div`
border-radius: var(--ads-v2-border-radius);
`;
-type ButtonInfo = { text: string; closeModal?: boolean; onClick: () => void };
+interface ButtonInfo {
+ text: string;
+ closeModal?: boolean;
+ onClick: () => void;
+}
-export type ConversionProps = {
+export interface ConversionProps {
bannerMessageDetails?: {
message: string;
kind: CalloutKind;
@@ -57,7 +61,7 @@ export type ConversionProps = {
icon: string;
text: string;
};
-};
+}
export function ConversionForm(
props: ConversionProps & { closeModal: () => void },
diff --git a/app/client/src/pages/Editor/CanvasLayoutConversion/InfoBlock.tsx b/app/client/src/pages/Editor/CanvasLayoutConversion/InfoBlock.tsx
index b78fc40cc7..a67ebf5a26 100644
--- a/app/client/src/pages/Editor/CanvasLayoutConversion/InfoBlock.tsx
+++ b/app/client/src/pages/Editor/CanvasLayoutConversion/InfoBlock.tsx
@@ -1,11 +1,11 @@
import React from "react";
import { Icon, Text } from "design-system";
-export type InfoBlockProps = {
+export interface InfoBlockProps {
icon: string;
header: string;
info: string;
-};
+}
export const InfoBlock = (props: InfoBlockProps) => {
return (
diff --git a/app/client/src/pages/Editor/CommunityTemplates/Modals/CommunityTemplatesPublishInfo.tsx b/app/client/src/pages/Editor/CommunityTemplates/Modals/CommunityTemplatesPublishInfo.tsx
index 595c540004..997efe8e1a 100644
--- a/app/client/src/pages/Editor/CommunityTemplates/Modals/CommunityTemplatesPublishInfo.tsx
+++ b/app/client/src/pages/Editor/CommunityTemplates/Modals/CommunityTemplatesPublishInfo.tsx
@@ -10,10 +10,10 @@ import React, { useCallback, useEffect } from "react";
import { useDispatch, useSelector } from "react-redux";
import styled from "styled-components";
-type Props = {
+interface Props {
onPublishClick: () => void;
setShowHostModal: (showModal: boolean) => void;
-};
+}
const CommunityTemplatesPublishInfo = ({
onPublishClick,
setShowHostModal,
diff --git a/app/client/src/pages/Editor/CommunityTemplates/Modals/PublishCommunityTemplate/CommunityTemplateForm.tsx b/app/client/src/pages/Editor/CommunityTemplates/Modals/PublishCommunityTemplate/CommunityTemplateForm.tsx
index a1d942f5e0..cdeb1efee5 100644
--- a/app/client/src/pages/Editor/CommunityTemplates/Modals/PublishCommunityTemplate/CommunityTemplateForm.tsx
+++ b/app/client/src/pages/Editor/CommunityTemplates/Modals/PublishCommunityTemplate/CommunityTemplateForm.tsx
@@ -18,14 +18,13 @@ import {
import ApplicationSettings from "./components/ApplicationSettings";
import AuthorDetailsInput from "./components/AuthorDetailsInput";
import PublishedInfo from "./components/PublishedInfo";
-import TemplateCardPreview from "./components/TemplateCardPreview";
import TemplateInfoForm from "./components/TemplateInfoForm";
-import { viewerURL } from "RouteBuilder";
+import { viewerURL } from "@appsmith/RouteBuilder";
import { getCurrentPageId } from "@appsmith/selectors/entitiesSelector";
-type Props = {
+interface Props {
onPublishSuccess: () => void;
-};
+}
const CommunityTemplateForm = ({ onPublishSuccess }: Props) => {
const currentUser = useSelector(getCurrentUser);
@@ -110,11 +109,11 @@ const CommunityTemplateForm = ({ onPublishSuccess }: Props) => {
return (
<>
-
+ />*/}
void;
setIsPublic: (isForkable: boolean) => void;
-};
+}
const ApplicationSettings = ({
isForkable,
diff --git a/app/client/src/pages/Editor/CommunityTemplates/Modals/PublishCommunityTemplate/components/AuthorDetailsInput.tsx b/app/client/src/pages/Editor/CommunityTemplates/Modals/PublishCommunityTemplate/components/AuthorDetailsInput.tsx
index a26a6906a2..7bb3186035 100644
--- a/app/client/src/pages/Editor/CommunityTemplates/Modals/PublishCommunityTemplate/components/AuthorDetailsInput.tsx
+++ b/app/client/src/pages/Editor/CommunityTemplates/Modals/PublishCommunityTemplate/components/AuthorDetailsInput.tsx
@@ -8,14 +8,14 @@ import { emailValidator } from "design-system-old";
import React, { useMemo } from "react";
import styled from "styled-components";
-type Props = {
+interface Props {
authorEmail: string;
authorName: string;
disableEmail: boolean;
disableName: boolean;
setAuthorEmail: React.Dispatch;
setAuthorName: React.Dispatch;
-};
+}
const AuthorDetailsInput = ({
authorEmail,
authorName,
diff --git a/app/client/src/pages/Editor/CommunityTemplates/Modals/PublishCommunityTemplate/components/TemplateCardPreview.tsx b/app/client/src/pages/Editor/CommunityTemplates/Modals/PublishCommunityTemplate/components/TemplateCardPreview.tsx
index a02e033e93..2b1322c88d 100644
--- a/app/client/src/pages/Editor/CommunityTemplates/Modals/PublishCommunityTemplate/components/TemplateCardPreview.tsx
+++ b/app/client/src/pages/Editor/CommunityTemplates/Modals/PublishCommunityTemplate/components/TemplateCardPreview.tsx
@@ -13,11 +13,11 @@ import {
TemplatePreviewProfileContainer,
} from "../StyledComponents";
-type Props = {
+interface Props {
excerpt: string;
templateName: string;
useCases: string[];
-};
+}
const TemplateCardPreview = ({ excerpt, templateName, useCases }: Props) => {
return (
diff --git a/app/client/src/pages/Editor/CommunityTemplates/Modals/PublishCommunityTemplate/components/TemplateInfoForm.tsx b/app/client/src/pages/Editor/CommunityTemplates/Modals/PublishCommunityTemplate/components/TemplateInfoForm.tsx
index 5cd6379e84..386ee4c303 100644
--- a/app/client/src/pages/Editor/CommunityTemplates/Modals/PublishCommunityTemplate/components/TemplateInfoForm.tsx
+++ b/app/client/src/pages/Editor/CommunityTemplates/Modals/PublishCommunityTemplate/components/TemplateInfoForm.tsx
@@ -12,7 +12,7 @@ import {
import { useSelector } from "react-redux";
import { allTemplatesFiltersSelector } from "selectors/templatesSelectors";
-type Props = {
+interface Props {
setTemplateDescription: (templateDescription: string) => void;
setTemplateExcerpt: (excerpt: string) => void;
setTemplateName: (templateName: string) => void;
@@ -21,7 +21,7 @@ type Props = {
templateExcerpt: string;
templateName: string;
templateUseCases: string[];
-};
+}
const TemplateInfoForm = ({
setTemplateDescription,
@@ -115,10 +115,10 @@ const TemplateInfoForm = ({
export default TemplateInfoForm;
-type UseCaseProps = {
+interface UseCaseProps {
setTemplateUseCases: (useCases: string[]) => void;
templateUseCases: string[];
-};
+}
const UseCasesSelect = ({
setTemplateUseCases,
templateUseCases,
diff --git a/app/client/src/pages/Editor/CommunityTemplates/Modals/PublishCommunityTemplate/index.tsx b/app/client/src/pages/Editor/CommunityTemplates/Modals/PublishCommunityTemplate/index.tsx
index b2646dbc69..d861380105 100644
--- a/app/client/src/pages/Editor/CommunityTemplates/Modals/PublishCommunityTemplate/index.tsx
+++ b/app/client/src/pages/Editor/CommunityTemplates/Modals/PublishCommunityTemplate/index.tsx
@@ -13,11 +13,11 @@ import React from "react";
import CommunityTemplateForm from "./CommunityTemplateForm";
import { PublishPageHeaderContainer } from "./StyledComponents";
-type Props = {
+interface Props {
onPublishSuccess: () => void;
setShowModal: (showModal: boolean) => void;
showModal: boolean;
-};
+}
const PublishCommunityTemplateModal = ({
onPublishSuccess,
diff --git a/app/client/src/pages/Editor/DataSourceEditor/BackButton.tsx b/app/client/src/pages/Editor/DataSourceEditor/BackButton.tsx
index e860ebe793..851ac0ac48 100644
--- a/app/client/src/pages/Editor/DataSourceEditor/BackButton.tsx
+++ b/app/client/src/pages/Editor/DataSourceEditor/BackButton.tsx
@@ -1,7 +1,7 @@
import React from "react";
import styled from "styled-components";
import { getIsGeneratePageInitiator } from "utils/GenerateCrudUtil";
-import { builderURL, generateTemplateFormURL } from "RouteBuilder";
+import { builderURL, generateTemplateFormURL } from "@appsmith/RouteBuilder";
import AnalyticsUtil from "utils/AnalyticsUtil";
import { useSelector } from "react-redux";
import { getCurrentPageId } from "selectors/editorSelectors";
diff --git a/app/client/src/pages/Editor/DataSourceEditor/DSFormHeader.tsx b/app/client/src/pages/Editor/DataSourceEditor/DSFormHeader.tsx
index e3c6d4503d..a19ff78fad 100644
--- a/app/client/src/pages/Editor/DataSourceEditor/DSFormHeader.tsx
+++ b/app/client/src/pages/Editor/DataSourceEditor/DSFormHeader.tsx
@@ -64,7 +64,7 @@ export const PluginImage = (props: any) => {
);
};
-type DSFormHeaderProps = {
+interface DSFormHeaderProps {
canCreateDatasourceActions: boolean;
canDeleteDatasource: boolean;
canManageDatasource: boolean;
@@ -82,7 +82,7 @@ type DSFormHeaderProps = {
}) => void;
viewMode: boolean;
isNewQuerySecondaryButton?: boolean;
-};
+}
export const DSFormHeader = (props: DSFormHeaderProps) => {
const {
diff --git a/app/client/src/pages/Editor/DataSourceEditor/DatasourceSection.tsx b/app/client/src/pages/Editor/DataSourceEditor/DatasourceSection.tsx
index b1c558efeb..51b7bd832b 100644
--- a/app/client/src/pages/Editor/DataSourceEditor/DatasourceSection.tsx
+++ b/app/client/src/pages/Editor/DataSourceEditor/DatasourceSection.tsx
@@ -43,14 +43,14 @@ const FieldWrapper = styled.div`
}
`;
-type RenderDatasourceSectionProps = {
+interface RenderDatasourceSectionProps {
config: any;
datasource: Datasource;
viewMode?: boolean;
showOnlyCurrentEnv?: boolean;
currentEnv: string;
isEnvEnabled: boolean;
-};
+}
const renderKVArray = (
children: Array,
currentEnvironment: string,
diff --git a/app/client/src/pages/Editor/DataSourceEditor/DatasourceViewModeSchema.tsx b/app/client/src/pages/Editor/DataSourceEditor/DatasourceViewModeSchema.tsx
index 39daafbc08..9488b04641 100644
--- a/app/client/src/pages/Editor/DataSourceEditor/DatasourceViewModeSchema.tsx
+++ b/app/client/src/pages/Editor/DataSourceEditor/DatasourceViewModeSchema.tsx
@@ -88,11 +88,11 @@ const ButtonContainer = styled.div`
justify-content: flex-end;
`;
-type Props = {
+interface Props {
datasourceId: string;
datasource: Datasource;
setDatasourceViewModeFlag: (viewMode: boolean) => void;
-};
+}
const DatasourceViewModeSchema = (props: Props) => {
const dispatch = useDispatch();
diff --git a/app/client/src/pages/Editor/DataSourceEditor/NewActionButton.tsx b/app/client/src/pages/Editor/DataSourceEditor/NewActionButton.tsx
index 3566970c0e..e68bc46afd 100644
--- a/app/client/src/pages/Editor/DataSourceEditor/NewActionButton.tsx
+++ b/app/client/src/pages/Editor/DataSourceEditor/NewActionButton.tsx
@@ -22,7 +22,7 @@ import { adaptiveSignpostingEnabled } from "@appsmith/selectors/featureFlagsSele
import { actionsExistInCurrentPage } from "@appsmith/selectors/entitiesSelector";
import { SignpostingWalkthroughConfig } from "../FirstTimeUserOnboarding/Utils";
-type NewActionButtonProps = {
+interface NewActionButtonProps {
datasource?: Datasource;
disabled?: boolean;
packageName?: string;
@@ -31,7 +31,7 @@ type NewActionButtonProps = {
pluginType?: string;
style?: any;
isNewQuerySecondaryButton?: boolean;
-};
+}
function NewActionButton(props: NewActionButtonProps) {
const { datasource, disabled, isNewQuerySecondaryButton, pluginType } = props;
const [isSelected, setIsSelected] = useState(false);
diff --git a/app/client/src/pages/Editor/DataSourceEditor/hooks.ts b/app/client/src/pages/Editor/DataSourceEditor/hooks.ts
index abf18d1ec9..9acdcd29d2 100644
--- a/app/client/src/pages/Editor/DataSourceEditor/hooks.ts
+++ b/app/client/src/pages/Editor/DataSourceEditor/hooks.ts
@@ -3,21 +3,21 @@ import type { QueryTemplate } from "entities/Datasource";
import { useState, useCallback } from "react";
import { useDispatch } from "react-redux";
-type FetchPreviewData = {
+interface FetchPreviewData {
datasourceId: string;
template: QueryTemplate;
-};
+}
-type UseDatasourceQueryReturn = {
+interface UseDatasourceQueryReturn {
fetchPreviewData: (data: FetchPreviewData) => void;
isLoading: boolean;
failedFetchingPreviewData: boolean;
-};
+}
-type UseDatasourceQueryParams = {
+interface UseDatasourceQueryParams {
setPreviewData: (data: any) => void;
setPreviewDataError: (string: any) => void;
-};
+}
export const useDatasourceQuery = ({
setPreviewData,
diff --git a/app/client/src/pages/Editor/DataSourceEditor/index.tsx b/app/client/src/pages/Editor/DataSourceEditor/index.tsx
index 6633322f3b..bc68270046 100644
--- a/app/client/src/pages/Editor/DataSourceEditor/index.tsx
+++ b/app/client/src/pages/Editor/DataSourceEditor/index.tsx
@@ -45,7 +45,7 @@ import {
getPagePermissions,
selectURLSlugs,
} from "selectors/editorSelectors";
-import { saasEditorDatasourceIdURL } from "RouteBuilder";
+import { saasEditorDatasourceIdURL } from "@appsmith/RouteBuilder";
import {
createMessage,
REST_API_AUTHORIZATION_APPSMITH_ERROR,
@@ -175,11 +175,11 @@ export const CalloutContainer = styled.div<{
margin-left: ${(props) => (!props.viewMode ? "24px" : "0px")};
`;
-export type DatasourceFilterState = {
+export interface DatasourceFilterState {
id: string;
name: string;
userPermissions: string[];
-};
+}
/*
**** State Variables Description ****
@@ -192,7 +192,7 @@ export type DatasourceFilterState = {
unblock: on blocking routes using history.block, it returns a function which can be used to unblock the routes
navigation: function that navigates to path that we want to transition to, after discard action on datasource discard dialog popup
*/
-type State = {
+interface State {
showDialog: boolean;
routesBlocked: boolean;
switchFilterBlocked: boolean;
@@ -203,7 +203,7 @@ type State = {
unblock(): void;
navigation(): void;
-};
+}
export interface DatasourcePaneFunctions {
switchDatasource: (id: string) => void;
diff --git a/app/client/src/pages/Editor/EditorAppName/NavigationMenu.tsx b/app/client/src/pages/Editor/EditorAppName/NavigationMenu.tsx
index 6705108558..880f7d942f 100644
--- a/app/client/src/pages/Editor/EditorAppName/NavigationMenu.tsx
+++ b/app/client/src/pages/Editor/EditorAppName/NavigationMenu.tsx
@@ -6,10 +6,10 @@ import type { MenuItemData } from "./NavigationMenuItem";
import { MenuContent } from "design-system";
import { NavigationMenuItem } from "./NavigationMenuItem";
-type NavigationMenuProps = {
+interface NavigationMenuProps {
menuItems: MenuItemData[] | undefined;
setIsPopoverOpen: typeof noop;
-};
+}
export function NavigationMenu(props: NavigationMenuProps) {
const { menuItems, setIsPopoverOpen } = props;
diff --git a/app/client/src/pages/Editor/EditorHeader.tsx b/app/client/src/pages/Editor/EditorHeader.tsx
index 704835049c..0a2c8a2fca 100644
--- a/app/client/src/pages/Editor/EditorHeader.tsx
+++ b/app/client/src/pages/Editor/EditorHeader.tsx
@@ -1,18 +1,7 @@
-import React, {
- useCallback,
- useEffect,
- useState,
- lazy,
- Suspense,
- useContext,
-} from "react";
-import styled, { ThemeProvider } from "styled-components";
-import classNames from "classnames";
-import { APPLICATIONS_URL } from "constants/routes";
+import React, { useCallback, useEffect, useState, useContext } from "react";
+import { ThemeProvider } from "styled-components";
import AppInviteUsersForm from "pages/workspace/AppInviteUsersForm";
import AnalyticsUtil from "utils/AnalyticsUtil";
-import AppsmithLogo from "assets/images/appsmith_logo_square.png";
-import { Link } from "react-router-dom";
import {
getApplicationLastDeployedAt,
getCurrentApplicationId,
@@ -21,7 +10,6 @@ import {
previewModeSelector,
} from "selectors/editorSelectors";
import {
- getAllUsers,
getCurrentAppWorkspace,
getCurrentWorkspaceId,
} from "@appsmith/selectors/workspaceSelectors";
@@ -38,15 +26,9 @@ import {
getCurrentApplication,
} from "@appsmith/selectors/applicationSelectors";
import EditorAppName from "./EditorAppName";
-import { getCurrentUser } from "selectors/usersSelectors";
-import {
- EditInteractionKind,
- SavingState,
- getTypographyByKey,
-} from "design-system-old";
+import { EditInteractionKind, SavingState } from "design-system-old";
import {
Button,
- Icon,
Tooltip,
Modal,
ModalHeader,
@@ -57,11 +39,8 @@ import {
Tab,
TabPanel,
} from "design-system";
-import { Profile } from "pages/common/ProfileImage";
-import HelpBar from "components/editorComponents/GlobalSearch/HelpBar";
import { getTheme, ThemeMode } from "selectors/themeSelectors";
import ToggleModeButton from "pages/Editor/ToggleModeButton";
-import { snipingModeSelector } from "selectors/editorSelectors";
import { showConnectGitModal } from "actions/gitSyncActions";
import RealtimeAppEditors from "./RealtimeAppEditors";
import { EditorSaveIndicator } from "./EditorSaveIndicator";
@@ -69,36 +48,23 @@ import {
adaptiveSignpostingEnabled,
selectFeatureFlags,
} from "@appsmith/selectors/featureFlagsSelectors";
-import { retryPromise } from "utils/AppsmithUtils";
import { fetchUsersForWorkspace } from "@appsmith/actions/workspaceActions";
import { getIsGitConnected } from "selectors/gitSyncSelectors";
import {
- CLOSE_ENTITY_EXPLORER_MESSAGE,
createMessage,
DEPLOY_BUTTON_TOOLTIP,
DEPLOY_MENU_OPTION,
- EDITOR_HEADER,
INVITE_TAB,
IN_APP_EMBED_SETTING,
- LOCK_ENTITY_EXPLORER_MESSAGE,
- LOGO_TOOLTIP,
RENAME_APPLICATION_TOOLTIP,
- SHARE_BUTTON_TOOLTIP,
- SHARE_BUTTON_TOOLTIP_WITH_USER,
COMMUNITY_TEMPLATES,
APPLICATION_INVITE,
} from "@appsmith/constants/messages";
-import { getExplorerPinned } from "selectors/explorerSelector";
-import {
- setExplorerActiveAction,
- setExplorerPinnedAction,
-} from "actions/explorerActions";
-import { modText } from "utils/helpers";
import Boxed from "./GuidedTour/Boxed";
import EndTour from "./GuidedTour/EndTour";
import { GUIDED_TOUR_STEPS } from "./GuidedTour/constants";
-import { viewerURL } from "RouteBuilder";
+import { viewerURL } from "@appsmith/RouteBuilder";
import { useHref } from "./utils";
import { getAppsmithConfigs } from "@appsmith/configs";
import { getIsAppSettingsPaneWithNavigationTabOpen } from "selectors/appSettingsPaneSelectors";
@@ -118,126 +84,21 @@ import PublishCommunityTemplateModal from "./CommunityTemplates/Modals/PublishCo
import { useFeatureFlag } from "utils/hooks/useFeatureFlag";
import { FEATURE_FLAG } from "@appsmith/entities/FeatureFlag";
import { getEmbedSnippetForm } from "@appsmith/utils/BusinessFeatures/privateEmbedHelpers";
+import { HeaderSection, HeaderWrapper } from "./commons/EditorHeaderComponents";
+import { LockEntityExplorer } from "./commons/LockEntityExplorer";
+import { Omnibar } from "./commons/Omnibar";
+import { EditorShareButton } from "./EditorShareButton";
+import { HelperBarInHeader } from "./HelpBarInHeader";
+import { AppsmithLink } from "./AppsmithLink";
const { cloudHosting } = getAppsmithConfigs();
-const HeaderWrapper = styled.div`
- width: 100%;
- display: flex;
- align-items: center;
- background-color: var(--ads-v2-color-bg);
- flex-direction: row;
- box-shadow: none;
- border-bottom: 1px solid var(--ads-v2-color-border);
- height: ${(props) => props.theme.smallHeaderHeight};
- & .editable-application-name {
- ${getTypographyByKey("h4")}
- color: ${(props) => props.theme.colors.header.appName};
- }
- & ${Profile} {
- width: 24px;
- height: 24px;
- }
-
- @media only screen and (max-width: 900px) {
- & .help-bar {
- display: none;
- }
- }
-
- @media only screen and (max-width: 700px) {
- & .app-realtime-editors {
- display: none;
- }
- }
-`;
-
-const HeaderSection = styled.div`
- position: relative;
- display: flex;
- flex: 1;
- overflow: visible;
- align-items: center;
- :nth-child(1) {
- justify-content: flex-start;
- max-width: 30%;
- }
- :nth-child(2) {
- justify-content: center;
- }
- :nth-child(3) {
- justify-content: flex-end;
- }
-`;
-
-const AppsmithLink = styled((props) => {
- // we are removing non input related props before passing them in the components
- // eslint-disable @typescript-eslint/no-unused-vars
- return ;
-})`
- height: 24px;
- min-width: 24px;
- width: 24px;
- display: inline-block;
- img {
- min-width: 24px;
- width: 24px;
- height: 24px;
- }
-`;
-
-const BindingBanner = styled.div`
- position: fixed;
- width: 199px;
- height: 36px;
- left: 50%;
- top: ${(props) => props.theme.smallHeaderHeight};
- transform: translate(-50%, 0);
- text-align: center;
- background: var(--ads-v2-color-fg-information);
- color: var(--ads-v2-color-white);
- border-radius: var(--ads-v2-border-radius);
- font-weight: 500;
- font-size: 15px;
- line-height: 20px;
- /* Depth: 01 */
- display: flex;
- align-items: center;
- justify-content: center;
- box-shadow: var(--ads-v2-shadow-popovers);
- z-index: 9999;
-`;
-
-const SidebarNavButton = styled(Button)`
- .ads-v2-button__content {
- padding: 0;
- }
- .group {
- height: 36px;
- width: 36px;
- display: flex;
- align-items: center;
- justify-content: center;
- }
-`;
-
-const GlobalSearch = lazy(async () => {
- return retryPromise(
- async () =>
- import(
- /* webpackChunkName: "global-search" */ "components/editorComponents/GlobalSearch"
- ),
- );
-});
-
const theme = getTheme(ThemeMode.LIGHT);
export function EditorHeader() {
const [activeTab, setActiveTab] = useState("invite");
const dispatch = useDispatch();
- const isSnipingMode = useSelector(snipingModeSelector);
const isSavingName = useSelector(getIsSavingAppName);
- const pinned = useSelector(getExplorerPinned);
const isGitConnected = useSelector(getIsGitConnected);
const isErroredSavingName = useSelector(getIsErroredSavingAppName);
const applicationList = useSelector(getApplicationList);
@@ -249,8 +110,6 @@ export function EditorHeader() {
const currentApplication = useSelector(getCurrentApplication);
const isPublishing = useSelector(getIsPublishingApplication);
const pageId = useSelector(getCurrentPageId) as string;
- const sharedUserList = useSelector(getAllUsers);
- const currentUser = useSelector(getCurrentUser);
const featureFlags = useSelector(selectFeatureFlags);
const deployLink = useHref(viewerURL, { pageId });
@@ -338,29 +197,12 @@ export function EditorHeader() {
[dispatch, handlePublish],
);
- /**
- * on hovering the menu, make the explorer active
- */
- const onMenuHover = useCallback(() => {
- dispatch(setExplorerActiveAction(true));
- }, [setExplorerActiveAction]);
-
- /**
- * toggles the pinned state of sidebar
- */
- const onPin = useCallback(() => {
- dispatch(setExplorerPinnedAction(!pinned));
- }, [pinned, dispatch, setExplorerPinnedAction]);
-
//Fetch all users for the application to show the share button tooltip
useEffect(() => {
if (workspaceId) {
dispatch(fetchUsersForWorkspace(workspaceId));
}
}, [workspaceId]);
- const filteredSharedUserList = sharedUserList.filter(
- (user) => user.username !== currentUser?.username,
- );
const {
isOpened: isWalkthroughOpened,
@@ -412,74 +254,10 @@ export function EditorHeader() {
>
{!signpostingEnabled && (
-
-
- {!pinned
- ? createMessage(LOCK_ENTITY_EXPLORER_MESSAGE)
- : createMessage(CLOSE_ENTITY_EXPLORER_MESSAGE)}
-
- {modText()} /
-
- }
- placement="bottomLeft"
- >
-
-