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. [![AnaghHegde](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/12005551?v=4&w=50&h=50&mask=circle)](https://github.com/AnaghHegde) [![arunvjn](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/32433245?v=4&w=50&h=50&mask=circle)](https://github.com/arunvjn) [![NandanAnantharamu](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/67676905?v=4&w=50&h=50&mask=circle)](https://github.com/NandanAnantharamu) -[![nayan-rafiq](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/83352306?v=4&w=50&h=50&mask=circle)](https://github.com/nayan-rafiq) [![abhvsn](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/41686026?v=4&w=50&h=50&mask=circle)](https://github.com/abhvsn) +[![nayan-rafiq](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/83352306?v=4&w=50&h=50&mask=circle)](https://github.com/nayan-rafiq) [![ankitakinger](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/28362912?v=4&w=50&h=50&mask=circle)](https://github.com/ankitakinger) [![jsartisan](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/6636360?v=4&w=50&h=50&mask=circle)](https://github.com/jsartisan) [![Rishabh-Rathod](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/23132741?v=4&w=50&h=50&mask=circle)](https://github.com/Rishabh-Rathod) @@ -94,20 +94,19 @@ Let's build great software together. [![ayushpahwa](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/8526215?v=4&w=50&h=50&mask=circle)](https://github.com/ayushpahwa) [![yatinappsmith](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/84702014?v=4&w=50&h=50&mask=circle)](https://github.com/yatinappsmith) [![Parthvi12](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/80334441?v=4&w=50&h=50&mask=circle)](https://github.com/Parthvi12) -[![somangshu](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/11089579?v=4&w=50&h=50&mask=circle)](https://github.com/somangshu) [![ApekshaBhosale](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/7846888?v=4&w=50&h=50&mask=circle)](https://github.com/ApekshaBhosale) +[![somangshu](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/11089579?v=4&w=50&h=50&mask=circle)](https://github.com/somangshu) +[![pratapaprasanna](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/15846947?v=4&w=50&h=50&mask=circle)](https://github.com/pratapaprasanna) [![pranavkanade](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/13262095?v=4&w=50&h=50&mask=circle)](https://github.com/pranavkanade) [![sneha122](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/30018882?v=4&w=50&h=50&mask=circle)](https://github.com/sneha122) -[![pratapaprasanna](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/15846947?v=4&w=50&h=50&mask=circle)](https://github.com/pratapaprasanna) [![albinAppsmith](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/87797149?v=4&w=50&h=50&mask=circle)](https://github.com/albinAppsmith) -[![sum35h](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/20785806?v=4&w=50&h=50&mask=circle)](https://github.com/sum35h) [![marks0351](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/35134347?v=4&w=50&h=50&mask=circle)](https://github.com/marks0351) [![ashit-rath](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/88306433?v=4&w=50&h=50&mask=circle)](https://github.com/ashit-rath) [![nsarupr](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/20905988?v=4&w=50&h=50&mask=circle)](https://github.com/nsarupr) [![rajatagrawal](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/1189106?v=4&w=50&h=50&mask=circle)](https://github.com/rajatagrawal) +[![sondermanish](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/107841575?v=4&w=50&h=50&mask=circle)](https://github.com/sondermanish) [![NilanshBansal](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/25542733?v=4&w=50&h=50&mask=circle)](https://github.com/NilanshBansal) [![dhruvikn](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/22471214?v=4&w=50&h=50&mask=circle)](https://github.com/dhruvikn) -[![sondermanish](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/107841575?v=4&w=50&h=50&mask=circle)](https://github.com/sondermanish) [![KelvinOm](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/11555074?v=4&w=50&h=50&mask=circle)](https://github.com/KelvinOm) [![areyabhishek](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/30255708?v=4&w=50&h=50&mask=circle)](https://github.com/areyabhishek) [![Druthi](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/20187542?v=4&w=50&h=50&mask=circle)](https://github.com/Druthi) @@ -121,11 +120,11 @@ Let's build great software together. [![sharanya-appsmith](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/135708039?v=4&w=50&h=50&mask=circle)](https://github.com/sharanya-appsmith) [![brayn003](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/8724051?v=4&w=50&h=50&mask=circle)](https://github.com/brayn003) [![shubham7saxena7](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/136057998?v=4&w=50&h=50&mask=circle)](https://github.com/shubham7saxena7) -[![ramsaptami](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/79509062?v=4&w=50&h=50&mask=circle)](https://github.com/ramsaptami) [![dvj1988](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/18716465?v=4&w=50&h=50&mask=circle)](https://github.com/dvj1988) +[![ramsaptami](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/79509062?v=4&w=50&h=50&mask=circle)](https://github.com/ramsaptami) [![vivonk](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/25587962?v=4&w=50&h=50&mask=circle)](https://github.com/vivonk) -[![gitstart-appsmith](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/114667275?v=4&w=50&h=50&mask=circle)](https://github.com/gitstart-appsmith) [![rohan-arthur](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/94514895?v=4&w=50&h=50&mask=circle)](https://github.com/rohan-arthur) +[![gitstart-appsmith](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/114667275?v=4&w=50&h=50&mask=circle)](https://github.com/gitstart-appsmith) [![danciaclara](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/32227135?v=4&w=50&h=50&mask=circle)](https://github.com/danciaclara) [![kocharrahul7](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/20532920?v=4&w=50&h=50&mask=circle)](https://github.com/kocharrahul7) [![riteshkew](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/20280935?v=4&w=50&h=50&mask=circle)](https://github.com/riteshkew) @@ -186,6 +185,7 @@ Let's build great software together. [![Vijetha-Kaja](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/119562824?v=4&w=50&h=50&mask=circle)](https://github.com/Vijetha-Kaja) [![haojin111](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/63215848?v=4&w=50&h=50&mask=circle)](https://github.com/haojin111) [![berzerkeer](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/74818788?v=4&w=50&h=50&mask=circle)](https://github.com/berzerkeer) +[![sum35h](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/20785806?v=4&w=50&h=50&mask=circle)](https://github.com/sum35h) [![ChandanBalajiBP](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/104058110?v=4&w=50&h=50&mask=circle)](https://github.com/ChandanBalajiBP) [![devrk96](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/68607686?v=4&w=50&h=50&mask=circle)](https://github.com/devrk96) [![keyurparalkar](https://images.weserv.nl/?url=https://avatars.githubusercontent.com/u/14138515?v=4&w=50&h=50&mask=circle)](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 && ( - - )} + {applicationId && } setShowModal(isOpen)} open={showModal} @@ -582,7 +330,7 @@ export function EditorHeader() { {featureFlags.release_show_publish_app_to_community_enabled && cloudHosting && ( - {createMessage(COMMUNITY_TEMPLATES.publish)} + {createMessage(COMMUNITY_TEMPLATES.tabTitle)} )} @@ -640,14 +388,7 @@ export function EditorHeader() { - }> - - - {isSnipingMode && ( - - Select a widget to bind - - )} + ); diff --git a/app/client/src/pages/Editor/EditorShareButton.tsx b/app/client/src/pages/Editor/EditorShareButton.tsx new file mode 100644 index 0000000000..ffc8004334 --- /dev/null +++ b/app/client/src/pages/Editor/EditorShareButton.tsx @@ -0,0 +1,45 @@ +import React from "react"; +import { Button, Tooltip } from "design-system"; +import { + EDITOR_HEADER, + SHARE_BUTTON_TOOLTIP, + SHARE_BUTTON_TOOLTIP_WITH_USER, + createMessage, +} from "@appsmith/constants/messages"; +import { getCurrentUser } from "selectors/usersSelectors"; +import { getAllUsers } from "@appsmith/selectors/workspaceSelectors"; +import { useSelector } from "react-redux"; + +export const EditorShareButton = ({ + setShowModal, +}: { + setShowModal: (val: boolean) => void; +}) => { + const sharedUserList = useSelector(getAllUsers); + const currentUser = useSelector(getCurrentUser); + const filteredSharedUserList = sharedUserList.filter( + (user) => user.username !== currentUser?.username, + ); + return ( + + + + ); +}; diff --git a/app/client/src/pages/Editor/EntityNavigation/JSObjectsPane/index.ts b/app/client/src/pages/Editor/EntityNavigation/JSObjectsPane/index.ts index 83afc4c5f5..a66d6b42bd 100644 --- a/app/client/src/pages/Editor/EntityNavigation/JSObjectsPane/index.ts +++ b/app/client/src/pages/Editor/EntityNavigation/JSObjectsPane/index.ts @@ -6,7 +6,7 @@ import PaneNavigation from "../PaneNavigation"; import type { JSCollection } from "entities/JSCollection"; import { call, delay, put, select } from "redux-saga/effects"; import history from "utils/history"; -import { jsCollectionIdURL } from "RouteBuilder"; +import { jsCollectionIdURL } from "@appsmith/RouteBuilder"; import type { EntityInfo, IJSPaneNavigationConfig } from "../types"; import { setJsPaneConfigSelectedTab } from "actions/jsPaneActions"; import { JSEditorTab } from "reducers/uiReducers/jsPaneReducer"; diff --git a/app/client/src/pages/Editor/EntityNavigation/PropertyPane/utils.ts b/app/client/src/pages/Editor/EntityNavigation/PropertyPane/utils.ts index 231e8e58cc..4e7b4e5bdf 100644 --- a/app/client/src/pages/Editor/EntityNavigation/PropertyPane/utils.ts +++ b/app/client/src/pages/Editor/EntityNavigation/PropertyPane/utils.ts @@ -78,14 +78,13 @@ export const getSectionId = ( // "boxShadow" and "resetButtonStyles.boxShadow" // The intendened match is "resetButtonStyles.boxShadow". // So we aggregrate matches and find the best match which is the longest string - const bestMatchedSection = matchedSections.reduce(function ( - sectiona, - sectionb, - ) { - return sectiona.propertyName.length > sectionb.propertyName.length - ? sectiona - : sectionb; - }); + const bestMatchedSection = matchedSections.reduce( + function (sectiona, sectionb) { + return sectiona.propertyName.length > sectionb.propertyName.length + ? sectiona + : sectionb; + }, + ); return bestMatchedSection.id; }; diff --git a/app/client/src/pages/Editor/EntityNotFoundPane.tsx b/app/client/src/pages/Editor/EntityNotFoundPane.tsx index c9657595bc..f008c8de4c 100644 --- a/app/client/src/pages/Editor/EntityNotFoundPane.tsx +++ b/app/client/src/pages/Editor/EntityNotFoundPane.tsx @@ -51,9 +51,9 @@ const Wrapper = styled.div` } `; -type Props = { +interface Props { goBackFn?: () => void; // custom function for returning to any declared route. -}; +} function EntityNotFoundPane(props: Props) { const history = useHistory(); diff --git a/app/client/src/pages/Editor/Explorer/Actions/ActionEntity.tsx b/app/client/src/pages/Editor/Explorer/Actions/ActionEntity.tsx index a31039393b..0ce5a5c676 100644 --- a/app/client/src/pages/Editor/Explorer/Actions/ActionEntity.tsx +++ b/app/client/src/pages/Editor/Explorer/Actions/ActionEntity.tsx @@ -31,13 +31,13 @@ const getUpdateActionNameReduxAction = (id: string, name: string) => { return saveActionName({ id, name }); }; -type ExplorerActionEntityProps = { +interface ExplorerActionEntityProps { step: number; searchKeyword?: string; id: string; type: PluginType; isActive: boolean; -}; +} export const ExplorerActionEntity = memo((props: ExplorerActionEntityProps) => { const pageId = useSelector(getCurrentPageId); diff --git a/app/client/src/pages/Editor/Explorer/Actions/ActionEntityContextMenu.tsx b/app/client/src/pages/Editor/Explorer/Actions/ActionEntityContextMenu.tsx index 1d527c7e4b..6b607c032d 100644 --- a/app/client/src/pages/Editor/Explorer/Actions/ActionEntityContextMenu.tsx +++ b/app/client/src/pages/Editor/Explorer/Actions/ActionEntityContextMenu.tsx @@ -24,20 +24,20 @@ import { CONTEXT_SHOW_BINDING, createMessage, } from "@appsmith/constants/messages"; -import { builderURL } from "RouteBuilder"; +import { builderURL } from "@appsmith/RouteBuilder"; import { getCurrentPageId } from "selectors/editorSelectors"; import ContextMenu from "pages/Editor/Explorer/ContextMenu"; import type { TreeDropdownOption } from "pages/Editor/Explorer/ContextMenu"; -type EntityContextMenuProps = { +interface EntityContextMenuProps { id: string; name: string; className?: string; pageId: string; canManageAction?: boolean; canDeleteAction?: boolean; -}; +} export function ActionEntityContextMenu(props: EntityContextMenuProps) { const { canDeleteAction = false, canManageAction = false } = props; const nextEntityName = useNewActionName(); diff --git a/app/client/src/pages/Editor/Explorer/Actions/MoreActionsMenu.tsx b/app/client/src/pages/Editor/Explorer/Actions/MoreActionsMenu.tsx index a52a07e07f..836446f2d4 100644 --- a/app/client/src/pages/Editor/Explorer/Actions/MoreActionsMenu.tsx +++ b/app/client/src/pages/Editor/Explorer/Actions/MoreActionsMenu.tsx @@ -31,14 +31,14 @@ import { } from "design-system"; import { useToggle } from "@mantine/hooks"; -type EntityContextMenuProps = { +interface EntityContextMenuProps { id: string; name: string; className?: string; pageId: string; isChangePermitted?: boolean; isDeletePermitted?: boolean; -}; +} export function MoreActionsMenu(props: EntityContextMenuProps) { const [isMenuOpen, toggleMenuOpen] = useToggle([false, true]); diff --git a/app/client/src/pages/Editor/Explorer/Actions/helpers.tsx b/app/client/src/pages/Editor/Explorer/Actions/helpers.tsx index 5587dab081..84b1e657b1 100644 --- a/app/client/src/pages/Editor/Explorer/Actions/helpers.tsx +++ b/app/client/src/pages/Editor/Explorer/Actions/helpers.tsx @@ -19,12 +19,12 @@ import { apiEditorIdURL, queryEditorIdURL, saasEditorApiIdURL, -} from "RouteBuilder"; +} from "@appsmith/RouteBuilder"; import { getAssetUrl } from "@appsmith/utils/airgapHelpers"; // TODO [new_urls] update would break for existing paths // using a common todo, this needs to be fixed -export type ActionGroupConfig = { +export interface ActionGroupConfig { groupName: string; types: PluginType[]; icon: JSX.Element; @@ -36,7 +36,7 @@ export type ActionGroupConfig = { plugin?: Plugin, ) => string; getIcon: (action: any, plugin: Plugin, remoteIcon?: boolean) => ReactNode; -}; +} // When we have new action plugins, we can just add it to this map // There should be no other place where we refer to the PluginType in entity explorer. @@ -97,8 +97,9 @@ export const ACTION_PLUGIN_MAP: Array = [ ]; export const getActionConfig = (type: PluginType) => - ACTION_PLUGIN_MAP.find((configByType: ActionGroupConfig | undefined) => - configByType?.types.includes(type), + ACTION_PLUGIN_MAP.find( + (configByType: ActionGroupConfig | undefined) => + configByType?.types.includes(type), ); export const useNewActionName = () => { diff --git a/app/client/src/pages/Editor/Explorer/Common/EntityExplorerResizeHandler.tsx b/app/client/src/pages/Editor/Explorer/Common/EntityExplorerResizeHandler.tsx new file mode 100644 index 0000000000..9e4fb680ca --- /dev/null +++ b/app/client/src/pages/Editor/Explorer/Common/EntityExplorerResizeHandler.tsx @@ -0,0 +1,42 @@ +import { tailwindLayers } from "constants/Layers"; +import React from "react"; +import styled from "styled-components"; +import type { CallbackResponseType } from "utils/hooks/useResize"; +import useResize, { DIRECTION } from "utils/hooks/useResize"; + +const ResizeHandler = styled.div` + &:hover { + background-color: var(--ads-v2-color-border); + } +`; + +export const EntityExplorerResizeHandler = ({ + resizeRef, + storedHeightKey, +}: { + resizeRef: React.RefObject; + storedHeightKey: string; +}) => { + const resizeAfterCallback = (data: CallbackResponseType) => { + localStorage.setItem(storedHeightKey, data.height.toString()); + }; + + const { mouseDown, setMouseDown } = useResize( + resizeRef, + DIRECTION.vertical, + resizeAfterCallback, + ); + + return ( +
    setMouseDown(true)} + > + +
    + ); +}; diff --git a/app/client/src/pages/Editor/Explorer/Common/EntityExplorerWrapper.tsx b/app/client/src/pages/Editor/Explorer/Common/EntityExplorerWrapper.tsx new file mode 100644 index 0000000000..2866dc162b --- /dev/null +++ b/app/client/src/pages/Editor/Explorer/Common/EntityExplorerWrapper.tsx @@ -0,0 +1,25 @@ +import React from "react"; +import styled from "styled-components"; + +const Wrapper = styled.div` + height: 100%; + overflow-y: auto; + -ms-overflow-style: none; +`; + +export const EntityExplorerWrapper = (props: { + children: React.ReactNode; + explorerRef: React.RefObject; + isActive: boolean; +}) => { + return ( + + {props.children} + + ); +}; diff --git a/app/client/src/pages/Editor/Explorer/Common/ExplorerWrapper.tsx b/app/client/src/pages/Editor/Explorer/Common/ExplorerWrapper.tsx new file mode 100644 index 0000000000..01c292f6cc --- /dev/null +++ b/app/client/src/pages/Editor/Explorer/Common/ExplorerWrapper.tsx @@ -0,0 +1,10 @@ +import React from "react"; +import { tailwindLayers } from "constants/Layers"; + +export const ExplorerWrapper = (props: { children: React.ReactNode }) => ( +
    + {props.children} +
    +); diff --git a/app/client/src/pages/Editor/Explorer/Common/components.tsx b/app/client/src/pages/Editor/Explorer/Common/components.tsx new file mode 100644 index 0000000000..4e3c9fa099 --- /dev/null +++ b/app/client/src/pages/Editor/Explorer/Common/components.tsx @@ -0,0 +1,35 @@ +import styled from "styled-components"; +import Entity, { EntityClassNames } from "../Entity"; + +export const ENTITY_HEIGHT = 36; +export const MIN_PAGES_HEIGHT = 60; + +export const RelativeContainer = styled.div` + position: relative; +`; + +export const StyledEntity = styled(Entity)<{ entitySize?: number }>` + &.pages > div:not(.t--entity-item) > div > div, + &.query-modules > div:not(.t--entity-item) > div > div { + max-height: 40vh; + min-height: ${({ entitySize }) => + entitySize && entitySize > MIN_PAGES_HEIGHT + ? MIN_PAGES_HEIGHT + : entitySize}px; + height: ${({ entitySize }) => + entitySize && entitySize > 128 ? 128 : entitySize}px; + overflow-y: auto; + } + } + + &.page .${EntityClassNames.PRE_RIGHT_ICON} { + width: 20px; + right: 0; + } + + &.page:hover { + & .${EntityClassNames.PRE_RIGHT_ICON} { + display: none; + } + } +`; diff --git a/app/client/src/pages/Editor/Explorer/ContextMenu.tsx b/app/client/src/pages/Editor/Explorer/ContextMenu.tsx index 3a528a9268..8965dd14a5 100644 --- a/app/client/src/pages/Editor/Explorer/ContextMenu.tsx +++ b/app/client/src/pages/Editor/Explorer/ContextMenu.tsx @@ -17,7 +17,7 @@ import { import { AddButtonWrapper, EntityClassNames } from "./Entity"; import styled from "styled-components"; -export type TreeDropdownOption = { +export interface TreeDropdownOption { label: string; value: string; children?: TreeDropdownOption[]; @@ -26,16 +26,16 @@ export type TreeDropdownOption = { confirmDelete?: boolean; intent?: string; disabled?: boolean; -}; +} type Setter = (value: TreeDropdownOption, defaultVal?: string) => void; -type TreeDropdownProps = { +interface TreeDropdownProps { toggle?: React.ReactNode; optionTree: TreeDropdownOption[]; className?: string; triggerId?: string; setConfirmDelete?: (val: boolean) => void; -}; +} const StyledMenuSubContent = styled(MenuSubContent)` max-height: 350px; diff --git a/app/client/src/pages/Editor/Explorer/Datasources.tsx b/app/client/src/pages/Editor/Explorer/Datasources.tsx index 2a0c508a20..1cb85cc757 100644 --- a/app/client/src/pages/Editor/Explorer/Datasources.tsx +++ b/app/client/src/pages/Editor/Explorer/Datasources.tsx @@ -1,20 +1,6 @@ -import React, { useCallback, useContext } from "react"; -import { - useAppWideAndOtherDatasource, - useDatasourceSuggestions, -} from "./hooks"; -import type { Datasource } from "entities/Datasource"; -import ExplorerDatasourceEntity from "./Datasources/DatasourceEntity"; +import React from "react"; import { useSelector } from "react-redux"; -import { - getCurrentApplicationId, - getCurrentPageId, -} from "selectors/editorSelectors"; -import { getPlugins } from "@appsmith/selectors/entitiesSelector"; -import { keyBy } from "lodash"; import Entity from "./Entity"; -import history from "utils/history"; -import { INTEGRATION_TABS } from "constants/routes"; import { ADD_DATASOURCE_BUTTON, createMessage, @@ -23,45 +9,53 @@ import { EMPTY_DATASOURCE_MAIN_TEXT, } from "@appsmith/constants/messages"; import styled from "styled-components"; -import { - useDatasourceIdFromURL, - getExplorerStatus, - saveExplorerStatus, -} from "@appsmith/pages/Editor/Explorer/helpers"; import { Icon, Button } from "design-system"; import { AddEntity, EmptyComponent } from "./common"; -import { integrationEditorURL } from "RouteBuilder"; import { getCurrentAppWorkspace } from "@appsmith/selectors/workspaceSelectors"; import type { AppState } from "@appsmith/reducers"; import { DatasourceCreateEntryPoints } from "constants/Datasource"; -import AnalyticsUtil from "utils/AnalyticsUtil"; -import WalkthroughContext from "components/featureWalkthrough/walkthroughContext"; import { FEATURE_FLAG } from "@appsmith/entities/FeatureFlag"; import { useFeatureFlag } from "utils/hooks/useFeatureFlag"; import { getHasCreateDatasourcePermission, getHasManageDatasourcePermission, } from "@appsmith/utils/BusinessFeatures/permissionPageHelpers"; +import { + useAppWideAndOtherDatasource, + useDatasourceSuggestions, +} from "./hooks"; +import { getPlugins } from "@appsmith/selectors/entitiesSelector"; +import { keyBy } from "lodash"; +import { useDatasourceIdFromURL } from "@appsmith/pages/Editor/Explorer/helpers"; +import type { Datasource } from "entities/Datasource"; +import ExplorerDatasourceEntity from "./Datasources/DatasourceEntity"; + +interface DatasourcesProps { + isDatasourcesOpen: boolean | null; + addDatasource: (source: string) => void; + onDatasourcesToggle: (isOpen: boolean) => void; + listDatasource: () => void; + entityId: string; +} const ShowAllButton = styled(Button)` margin: 0.25rem 1.5rem; `; -const Datasources = React.memo(() => { +const Datasources = React.memo((props: DatasourcesProps) => { const { appWideDS, otherDS } = useAppWideAndOtherDatasource(); - const pageId = useSelector(getCurrentPageId) || ""; - const plugins = useSelector(getPlugins); - const applicationId = useSelector(getCurrentApplicationId); - const isDatasourcesOpen = getExplorerStatus(applicationId, "datasource"); - const pluginGroups = React.useMemo(() => keyBy(plugins, "id"), [plugins]); - const { isOpened: isWalkthroughOpened, popFeature } = - useContext(WalkthroughContext) || {}; - + const { + addDatasource, + isDatasourcesOpen, + listDatasource, + onDatasourcesToggle, + } = props; const userWorkspacePermissions = useSelector( (state: AppState) => getCurrentAppWorkspace(state).userPermissions ?? [], ); - + const plugins = useSelector(getPlugins); + const pluginGroups = React.useMemo(() => keyBy(plugins, "id"), [plugins]); const isFeatureEnabled = useFeatureFlag(FEATURE_FLAG.license_gac_enabled); const canCreateDatasource = getHasCreateDatasourcePermission( @@ -69,37 +63,9 @@ const Datasources = React.memo(() => { userWorkspacePermissions, ); - const closeWalkthrough = useCallback(() => { - if (isWalkthroughOpened && popFeature) { - popFeature("EXPLORER_DATASOURCE_ADD"); - } - }, [isWalkthroughOpened, popFeature]); - - const addDatasource = (entryPoint: string) => { - history.push( - integrationEditorURL({ - pageId, - selectedTab: INTEGRATION_TABS.NEW, - }), - ); - // Event for datasource creation click - AnalyticsUtil.logEvent("NAVIGATE_TO_CREATE_NEW_DATASOURCE_PAGE", { - entryPoint, - }); - closeWalkthrough(); - }; const activeDatasourceId = useDatasourceIdFromURL(); const datasourceSuggestions = useDatasourceSuggestions(); - const listDatasource = useCallback(() => { - history.push( - integrationEditorURL({ - pageId, - selectedTab: INTEGRATION_TABS.ACTIVE, - }), - ); - }, [pageId]); - const datasourceElements = React.useMemo( () => appWideDS.concat(datasourceSuggestions).map((datasource: Datasource) => { @@ -113,23 +79,16 @@ const Datasources = React.memo(() => { ); }), - [appWideDS, pageId, activeDatasourceId], - ); - - const onDatasourcesToggle = useCallback( - (isOpen: boolean) => { - saveExplorerStatus(applicationId, "datasource", isOpen); - }, - [applicationId], + [appWideDS, props.entityId, activeDatasourceId], ); return ( diff --git a/app/client/src/pages/Editor/Explorer/Datasources/DatasourceEntity.tsx b/app/client/src/pages/Editor/Explorer/Datasources/DatasourceEntity.tsx index 6851110e34..b491af8555 100644 --- a/app/client/src/pages/Editor/Explorer/Datasources/DatasourceEntity.tsx +++ b/app/client/src/pages/Editor/Explorer/Datasources/DatasourceEntity.tsx @@ -24,9 +24,8 @@ import { import { datasourcesEditorIdURL, saasEditorDatasourceIdURL, -} from "RouteBuilder"; +} from "@appsmith/RouteBuilder"; import { inGuidedTour } from "selectors/onboardingSelectors"; -import { getCurrentPageId } from "selectors/editorSelectors"; import AnalyticsUtil from "utils/AnalyticsUtil"; import { useLocation } from "react-router"; import omit from "lodash/omit"; @@ -34,15 +33,15 @@ import { getQueryParams } from "utils/URLUtils"; import { debounce } from "lodash"; import styled from "styled-components"; -type ExplorerDatasourceEntityProps = { +interface ExplorerDatasourceEntityProps { plugin: Plugin; datasource: Datasource; step: number; searchKeyword?: string; - pageId: string; + entityId: string; isActive: boolean; canManageDatasource?: boolean; -}; +} const MAX_HEIGHT_LIST_WRAPPER = 300; @@ -57,16 +56,16 @@ const DataStructureListWrapper = styled.div<{ height: number }>` const ExplorerDatasourceEntity = React.memo( (props: ExplorerDatasourceEntityProps) => { + const { entityId } = props; const guidedTourEnabled = useSelector(inGuidedTour); const dispatch = useDispatch(); - const pageId = useSelector(getCurrentPageId); const icon = getPluginIcon(props.plugin); const location = useLocation(); const switchDatasource = useCallback(() => { let url; if (props.plugin && props.plugin.type === PluginType.SAAS) { url = saasEditorDatasourceIdURL({ - pageId, + pageId: entityId, pluginPackageName: props.plugin.packageName, datasourceId: props.datasource.id, params: { @@ -75,7 +74,7 @@ const ExplorerDatasourceEntity = React.memo( }); } else { url = datasourcesEditorIdURL({ - pageId, + pageId: entityId, datasourceId: props.datasource.id, params: omit(getQueryParams(), "viewMode"), }); @@ -88,7 +87,12 @@ const ExplorerDatasourceEntity = React.memo( name: props.datasource.name, }); history.push(url, { invokedBy: NavigationMethod.EntityExplorer }); - }, [props.datasource.id, props.datasource.name, location.pathname, pageId]); + }, [ + props.datasource.id, + props.datasource.name, + location.pathname, + entityId, + ]); const queryId = getQueryIdFromURL(); const queryAction = useSelector((state: AppState) => diff --git a/app/client/src/pages/Editor/Explorer/Datasources/DatasourceField.tsx b/app/client/src/pages/Editor/Explorer/Datasources/DatasourceField.tsx index a6c7d9c9f0..6c92c40754 100644 --- a/app/client/src/pages/Editor/Explorer/Datasources/DatasourceField.tsx +++ b/app/client/src/pages/Editor/Explorer/Datasources/DatasourceField.tsx @@ -50,10 +50,10 @@ const Content = styled.div` justify-content: space-between; `; -type DatabaseFieldProps = { +interface DatabaseFieldProps { field: DatasourceColumns | DatasourceKeys; step: number; -}; +} export function DatabaseColumns(props: DatabaseFieldProps) { const field = props.field; diff --git a/app/client/src/pages/Editor/Explorer/Datasources/DatasourceStructure.tsx b/app/client/src/pages/Editor/Explorer/Datasources/DatasourceStructure.tsx index 5ecd6fcdf0..a4abb6ba0e 100644 --- a/app/client/src/pages/Editor/Explorer/Datasources/DatasourceStructure.tsx +++ b/app/client/src/pages/Editor/Explorer/Datasources/DatasourceStructure.tsx @@ -29,7 +29,7 @@ export enum DatasourceStructureContext { API_EDITOR = "api-editor", } -type DatasourceStructureItemProps = { +interface DatasourceStructureItemProps { dbStructure: DatasourceTable; step: number; datasourceId: string; @@ -39,7 +39,7 @@ type DatasourceStructureItemProps = { currentActionId: string; onEntityTableClick?: (table: string) => void; tableName?: string; -}; +} const StyledMenuContent = styled(MenuContent)` min-width: 220px; diff --git a/app/client/src/pages/Editor/Explorer/Datasources/DatasourceStructureContainer.tsx b/app/client/src/pages/Editor/Explorer/Datasources/DatasourceStructureContainer.tsx index 0de35525f8..ff27843321 100644 --- a/app/client/src/pages/Editor/Explorer/Datasources/DatasourceStructureContainer.tsx +++ b/app/client/src/pages/Editor/Explorer/Datasources/DatasourceStructureContainer.tsx @@ -25,7 +25,7 @@ import { setFeatureWalkthroughShown } from "utils/storage"; import { FEATURE_WALKTHROUGH_KEYS } from "constants/WalkthroughConstants"; import { SCHEMA_SECTION_ID } from "entities/Action"; -type Props = { +interface Props { datasourceId: string; datasourceStructure?: DatasourceStructureType; step: number; @@ -35,7 +35,7 @@ type Props = { onEntityTableClick?: (table: string) => void; tableName?: string; customEditDatasourceFn?: () => void; -}; +} // leaving out DynamoDB and Firestore because they have a schema but not templates export const SCHEMALESS_PLUGINS: Array = [ diff --git a/app/client/src/pages/Editor/Explorer/Datasources/DatasourceStructureHeader.tsx b/app/client/src/pages/Editor/Explorer/Datasources/DatasourceStructureHeader.tsx index 812f25ef81..5a4283e6a2 100644 --- a/app/client/src/pages/Editor/Explorer/Datasources/DatasourceStructureHeader.tsx +++ b/app/client/src/pages/Editor/Explorer/Datasources/DatasourceStructureHeader.tsx @@ -6,10 +6,10 @@ import { refreshDatasourceStructure } from "actions/datasourceActions"; import { SCHEMA_LABEL, createMessage } from "@appsmith/constants/messages"; import { DatasourceStructureContext } from "./DatasourceStructure"; -type Props = { +interface Props { datasourceId: string; onRefreshCallback?: () => void; -}; +} const HeaderWrapper = styled.div` display: flex; diff --git a/app/client/src/pages/Editor/Explorer/Datasources/DatasourceStructureNotFound.tsx b/app/client/src/pages/Editor/Explorer/Datasources/DatasourceStructureNotFound.tsx index e4e2f43848..4523741dfe 100644 --- a/app/client/src/pages/Editor/Explorer/Datasources/DatasourceStructureNotFound.tsx +++ b/app/client/src/pages/Editor/Explorer/Datasources/DatasourceStructureNotFound.tsx @@ -8,18 +8,18 @@ import AnalyticsUtil from "utils/AnalyticsUtil"; import { DatasourceEditEntryPoints } from "constants/Datasource"; import history from "utils/history"; import { getQueryParams } from "utils/URLUtils"; -import { datasourcesEditorIdURL } from "RouteBuilder"; +import { datasourcesEditorIdURL } from "@appsmith/RouteBuilder"; import { omit } from "lodash"; import { getCurrentPageId } from "selectors/editorSelectors"; import { DatasourceStructureContext } from "./DatasourceStructure"; -export type Props = { +export interface Props { error: APIResponseError | { message: string } | undefined; datasourceId: string; pluginName?: string; customEditDatasourceFn?: () => void; context: DatasourceStructureContext; -}; +} const NotFoundContainer = styled.div` display: flex; diff --git a/app/client/src/pages/Editor/Explorer/Datasources/QueryTemplates.tsx b/app/client/src/pages/Editor/Explorer/Datasources/QueryTemplates.tsx index fba16fbd4d..50abb05202 100644 --- a/app/client/src/pages/Editor/Explorer/Datasources/QueryTemplates.tsx +++ b/app/client/src/pages/Editor/Explorer/Datasources/QueryTemplates.tsx @@ -16,7 +16,7 @@ import { getDatasource, getPlugin, } from "@appsmith/selectors/entitiesSelector"; -import { integrationEditorURL } from "RouteBuilder"; +import { integrationEditorURL } from "@appsmith/RouteBuilder"; import { MenuItem, Tag } from "design-system"; import type { Plugin } from "api/PluginApi"; import { DatasourceStructureContext } from "./DatasourceStructure"; @@ -32,13 +32,13 @@ import { FEATURE_WALKTHROUGH_KEYS } from "constants/WalkthroughConstants"; import { SUGGESTED_TAG, createMessage } from "@appsmith/constants/messages"; import { transformTextToSentenceCase } from "pages/Editor/utils"; -type QueryTemplatesProps = { +interface QueryTemplatesProps { templates: QueryTemplate[]; datasourceId: string; onSelect: () => void; context: DatasourceStructureContext; currentActionId: string; -}; +} enum QueryTemplatesEvent { EXPLORER_TEMPLATE = "explorer-template", diff --git a/app/client/src/pages/Editor/Explorer/Entity/EntityProperty.tsx b/app/client/src/pages/Editor/Explorer/Entity/EntityProperty.tsx index 20f12a2d09..cd3f968084 100644 --- a/app/client/src/pages/Editor/Explorer/Entity/EntityProperty.tsx +++ b/app/client/src/pages/Editor/Explorer/Entity/EntityProperty.tsx @@ -105,12 +105,12 @@ const StyledHighlightedCode = styled(HighlightedCode)` padding-bottom: 4px; `; -export type EntityPropertyProps = { +export interface EntityPropertyProps { propertyName: string; entityName: string; value: string; step?: number; -}; +} /* eslint-disable react/display-name */ export const EntityProperty = memo((props: any) => { diff --git a/app/client/src/pages/Editor/Explorer/Entity/index.tsx b/app/client/src/pages/Editor/Explorer/Entity/index.tsx index baeecc6969..49856c7872 100644 --- a/app/client/src/pages/Editor/Explorer/Entity/index.tsx +++ b/app/client/src/pages/Editor/Explorer/Entity/index.tsx @@ -218,7 +218,7 @@ const SubItemWrapper = styled.div` margin-right: 4px; `; -export type EntityProps = { +export interface EntityProps { entityId: string; showAddButton?: boolean; className?: string; @@ -250,7 +250,7 @@ export type EntityProps = { collapseRef?: RefObject | null; customAddButton?: ReactNode; forceExpand?: boolean; -}; +} export const Entity = forwardRef( (props: EntityProps, ref: React.Ref) => { diff --git a/app/client/src/pages/Editor/Explorer/EntityExplorer.test.tsx b/app/client/src/pages/Editor/Explorer/EntityExplorer.test.tsx index ae8802e60e..72fdb5a1a5 100644 --- a/app/client/src/pages/Editor/Explorer/EntityExplorer.test.tsx +++ b/app/client/src/pages/Editor/Explorer/EntityExplorer.test.tsx @@ -11,7 +11,7 @@ import Datasources from "./Datasources"; import { ReduxActionTypes } from "@appsmith/constants/ReduxActionConstants"; import { mockDatasources } from "./mockTestData"; import { updateCurrentPage } from "actions/pageActions"; -import urlBuilder from "entities/URLRedirect/URLAssembly"; +import urlBuilder from "@appsmith/entities/URLRedirect/URLAssembly"; import * as helpers from "@appsmith/pages/Editor/Explorer/helpers"; import * as explorerSelector from "selectors/explorerSelector"; import * as permissionPageHelpers from "@appsmith/utils/BusinessFeatures/permissionPageHelpers"; @@ -57,6 +57,12 @@ jest .spyOn(explorerSelector, "getExplorerWidth") .mockImplementation(() => DEFAULT_ENTITY_EXPLORER_WIDTH); +const addDatasource = jest.fn(); +const listDatasource = jest.fn(); +const onDatasourcesToggle = jest.fn(); +const isDatasourcesOpen = true; +const entityId = "pageId"; + describe("Entity Explorer tests", () => { beforeAll(() => { runSagaMiddleware(); @@ -89,7 +95,15 @@ describe("Entity Explorer tests", () => { .spyOn(permissionPageHelpers, "getHasCreateDatasourcePermission") .mockReturnValue(true); store.dispatch(updateCurrentPage("pageId")); - const component = render(); + const component = render( + , + ); expect(component.container.getElementsByClassName("t--entity").length).toBe( 5, ); @@ -105,7 +119,15 @@ describe("Entity Explorer tests", () => { const mockExplorerState = jest.spyOn(helpers, "getExplorerStatus"); mockExplorerState.mockImplementationOnce(() => true); store.dispatch(updateCurrentPage("pageId")); - const component = render(); + const component = render( + , + ); expect(component.container.getElementsByClassName("t--entity").length).toBe( 4, ); @@ -114,37 +136,6 @@ describe("Entity Explorer tests", () => { ); expect(addDatasourceEntity).toBeNull(); }); - it("should hide delete & edit of datasource if the user don't have valid permissions", async () => { - store.dispatch({ - type: ReduxActionTypes.FETCH_DATASOURCES_SUCCESS, - payload: mockDatasources, - }); - jest - .spyOn(permissionPageHelpers, "getHasCreateDatasourcePermission") - .mockReturnValue(true); - jest - .spyOn(permissionPageHelpers, "getHasManageDatasourcePermission") - .mockReturnValue(false); - jest - .spyOn(permissionPageHelpers, "getHasDeleteDatasourcePermission") - .mockReturnValue(false); - const mockExplorerState = jest.spyOn(helpers, "getExplorerStatus"); - mockExplorerState.mockImplementationOnce(() => true); - store.dispatch(updateCurrentPage("pageId")); - const { container } = render(); - const target = container.getElementsByClassName("t--context-menu"); - await userEvent.click(target[2]); - const deleteOption = document.getElementsByClassName( - "t--datasource-delete", - ); - const editOption = document.getElementsByClassName("t--datasource-rename"); - const refreshOption = document.getElementsByClassName( - "t--datasource-refresh", - ); - expect(deleteOption.length).toBe(0); - expect(editOption.length).toBe(0); - expect(refreshOption.length).toBe(1); - }); it("Should render Widgets tree in entity explorer", () => { const children: any = buildChildren([{ type: "TABS_WIDGET" }]); const dsl: any = widgetCanvasFactory.build({ @@ -410,4 +401,44 @@ describe("Entity Explorer tests", () => { ); }); }); + + it("should hide delete & edit of datasource if the user don't have valid permissions", async () => { + store.dispatch({ + type: ReduxActionTypes.FETCH_DATASOURCES_SUCCESS, + payload: mockDatasources, + }); + jest + .spyOn(permissionPageHelpers, "getHasCreateDatasourcePermission") + .mockReturnValue(true); + jest + .spyOn(permissionPageHelpers, "getHasManageDatasourcePermission") + .mockReturnValue(false); + jest + .spyOn(permissionPageHelpers, "getHasDeleteDatasourcePermission") + .mockReturnValue(false); + const mockExplorerState = jest.spyOn(helpers, "getExplorerStatus"); + mockExplorerState.mockImplementationOnce(() => true); + store.dispatch(updateCurrentPage("pageId")); + const { container } = render( + , + ); + const target = container.getElementsByClassName("t--context-menu"); + await userEvent.click(target[2]); + const deleteOption = document.getElementsByClassName( + "t--datasource-delete", + ); + const editOption = document.getElementsByClassName("t--datasource-rename"); + const refreshOption = document.getElementsByClassName( + "t--datasource-refresh", + ); + expect(deleteOption.length).toBe(0); + expect(editOption.length).toBe(0); + expect(refreshOption.length).toBe(1); + }); }); diff --git a/app/client/src/pages/Editor/Explorer/EntityExplorer.tsx b/app/client/src/pages/Editor/Explorer/EntityExplorer.tsx index 0df2e113b4..c6063b928b 100644 --- a/app/client/src/pages/Editor/Explorer/EntityExplorer.tsx +++ b/app/client/src/pages/Editor/Explorer/EntityExplorer.tsx @@ -1,4 +1,4 @@ -import React, { useRef, useCallback, useEffect } from "react"; +import React, { useRef, useCallback, useEffect, useContext } from "react"; import styled from "styled-components"; import { NonIdealState, Classes } from "@blueprintjs/core"; import JSDependencies from "./Libraries"; @@ -16,24 +16,27 @@ import { forceOpenWidgetPanel } from "actions/widgetSidebarActions"; import Datasources from "./Datasources"; import Files from "./Files"; import ExplorerWidgetGroup from "./Widgets/WidgetGroup"; -import { builderURL } from "RouteBuilder"; +import { builderURL } from "@appsmith/RouteBuilder"; import history from "utils/history"; import { getCurrentPageId } from "selectors/editorSelectors"; import { fetchWorkspace } from "@appsmith/actions/workspaceActions"; import { getCurrentWorkspaceId } from "@appsmith/selectors/workspaceSelectors"; import { importSvg } from "design-system-old"; import AnalyticsUtil from "utils/AnalyticsUtil"; +import { EntityExplorerWrapper } from "./Common/EntityExplorerWrapper"; +import { getCurrentApplicationId } from "selectors/editorSelectors"; +import { INTEGRATION_TABS } from "constants/routes"; +import { + getExplorerStatus, + saveExplorerStatus, +} from "@appsmith/pages/Editor/Explorer/helpers"; +import { integrationEditorURL } from "@appsmith/RouteBuilder"; +import WalkthroughContext from "components/featureWalkthrough/walkthroughContext"; const NoEntityFoundSvg = importSvg( async () => import("assets/svg/no_entities_found.svg"), ); -const Wrapper = styled.div` - height: 100%; - overflow-y: auto; - -ms-overflow-style: none; -`; - const NoResult = styled(NonIdealState)` &.${Classes.NON_IDEAL_STATE} { height: auto; @@ -87,13 +90,52 @@ function EntityExplorer({ isActive }: { isActive: boolean }) { dispatch(fetchWorkspace(currentWorkspaceId)); }, [currentWorkspaceId]); + const { isOpened: isWalkthroughOpened, popFeature } = + useContext(WalkthroughContext) || {}; + const applicationId = useSelector(getCurrentApplicationId); + const isDatasourcesOpen = getExplorerStatus(applicationId, "datasource"); + + const closeWalkthrough = useCallback(() => { + if (isWalkthroughOpened && popFeature) { + popFeature("EXPLORER_DATASOURCE_ADD"); + } + }, [isWalkthroughOpened, popFeature]); + + const addDatasource = useCallback( + (entryPoint: string) => { + history.push( + integrationEditorURL({ + pageId, + selectedTab: INTEGRATION_TABS.NEW, + }), + ); + // Event for datasource creation click + AnalyticsUtil.logEvent("NAVIGATE_TO_CREATE_NEW_DATASOURCE_PAGE", { + entryPoint, + }); + closeWalkthrough(); + }, + [pageId, closeWalkthrough], + ); + + const listDatasource = useCallback(() => { + history.push( + integrationEditorURL({ + pageId, + selectedTab: INTEGRATION_TABS.ACTIVE, + }), + ); + }, [pageId]); + + const onDatasourcesToggle = useCallback( + (isOpen: boolean) => { + saveExplorerStatus(applicationId, "datasource", isOpen); + }, + [applicationId], + ); + return ( - + )} - + - + ); } diff --git a/app/client/src/pages/Editor/Explorer/ExplorerIcons.tsx b/app/client/src/pages/Editor/Explorer/ExplorerIcons.tsx index 74302035e9..c3fe873fdf 100644 --- a/app/client/src/pages/Editor/Explorer/ExplorerIcons.tsx +++ b/app/client/src/pages/Editor/Explorer/ExplorerIcons.tsx @@ -154,11 +154,11 @@ export const SortFileIcon = ( * Entity Icon components */ -type EntityTextIconProps = { +interface EntityTextIconProps { children: React.ReactNode; textColor?: string; fontSize?: number; -}; +} const EntityTextIconWrapper = styled.div<{ fontSize?: number; color?: string }>` color: ${({ color }) => (color ? color : "var(--ads-v2-color-fg)")}; @@ -213,7 +213,7 @@ const EntityIconWrapper = styled.div<{ } `; -type EntityIconType = { +interface EntityIconType { children: React.ReactNode; borderColor?: string; width?: string; @@ -221,7 +221,7 @@ type EntityIconType = { noBorder?: boolean; noBackground?: boolean; bgColor?: string; -}; +} function EntityIcon(props: EntityIconType): JSX.Element { return ( diff --git a/app/client/src/pages/Editor/Explorer/Files/Submenu.tsx b/app/client/src/pages/Editor/Explorer/Files/Submenu.tsx index 5eec0a7d87..faf77cb149 100644 --- a/app/client/src/pages/Editor/Explorer/Files/Submenu.tsx +++ b/app/client/src/pages/Editor/Explorer/Files/Submenu.tsx @@ -7,10 +7,7 @@ import { SEARCH_ITEM_TYPES, } from "components/editorComponents/GlobalSearch/utils"; import { useDispatch, useSelector } from "react-redux"; -import { - getCurrentPageId, - getPagePermissions, -} from "selectors/editorSelectors"; +import { getCurrentPageId } from "selectors/editorSelectors"; import EntityAddButton from "../Entity/AddButton"; import keyBy from "lodash/keyBy"; import type { AppState } from "@appsmith/reducers"; @@ -32,9 +29,6 @@ import { Text, } from "design-system"; import { DatasourceCreateEntryPoints } from "constants/Datasource"; -import { getHasCreateActionPermission } from "@appsmith/utils/BusinessFeatures/permissionPageHelpers"; -import { useFeatureFlag } from "utils/hooks/useFeatureFlag"; -import { FEATURE_FLAG } from "@appsmith/entities/FeatureFlag"; const SubMenuContainer = styled.div` width: 250px; @@ -46,13 +40,15 @@ const SubMenuContainer = styled.div` } `; -type SubMenuProps = { +interface SubMenuProps { + canCreateActions: boolean; className: string; openMenu: boolean; onMenuClose: () => void; -}; +} export default function ExplorerSubMenu({ + canCreateActions, className, onMenuClose, openMenu, @@ -73,15 +69,6 @@ export default function ExplorerSubMenu({ useEffect(() => handleOpenChange(openMenu), [openMenu]); useCloseMenuOnScroll(SIDEBAR_ID, show, () => handleOpenChange(false)); - const pagePermissions = useSelector(getPagePermissions); - - const isFeatureEnabled = useFeatureFlag(FEATURE_FLAG.license_gac_enabled); - - const canCreateActions = getHasCreateActionPermission( - isFeatureEnabled, - pagePermissions, - ); - useEffect(() => { setQuery(""); }, [show]); diff --git a/app/client/src/pages/Editor/Explorer/Files/SubmenuHotkeys.tsx b/app/client/src/pages/Editor/Explorer/Files/SubmenuHotkeys.tsx index 8d15fc8278..3d1f0751cd 100644 --- a/app/client/src/pages/Editor/Explorer/Files/SubmenuHotkeys.tsx +++ b/app/client/src/pages/Editor/Explorer/Files/SubmenuHotkeys.tsx @@ -2,12 +2,12 @@ import React from "react"; import { Hotkey, Hotkeys, HotkeysTarget } from "@blueprintjs/core"; import type { SelectEvent } from "components/editorComponents/GlobalSearch/utils"; -type Props = { +interface Props { handleUpKey: () => void; handleDownKey: () => void; handleSubmitKey: (e: SelectEvent) => void; children: React.ReactNode; -}; +} @HotkeysTarget class SubmenuHotKeys extends React.Component { diff --git a/app/client/src/pages/Editor/Explorer/Files/index.tsx b/app/client/src/pages/Editor/Explorer/Files/index.tsx index 9ab0f2a651..fb270f8fe4 100644 --- a/app/client/src/pages/Editor/Explorer/Files/index.tsx +++ b/app/client/src/pages/Editor/Explorer/Files/index.tsx @@ -120,6 +120,7 @@ function Files() { className={`group files`} customAddButton={ { return saveJSObjectName({ id, name }); diff --git a/app/client/src/pages/Editor/Explorer/JSActions/MoreJSActionsMenu.tsx b/app/client/src/pages/Editor/Explorer/JSActions/MoreJSActionsMenu.tsx index 328179681d..e58e9d0496 100644 --- a/app/client/src/pages/Editor/Explorer/JSActions/MoreJSActionsMenu.tsx +++ b/app/client/src/pages/Editor/Explorer/JSActions/MoreJSActionsMenu.tsx @@ -34,14 +34,14 @@ import { Text, } from "design-system"; -type EntityContextMenuProps = { +interface EntityContextMenuProps { id: string; name: string; className?: string; pageId: string; isChangePermitted?: boolean; isDeletePermitted?: boolean; -}; +} const prettifyCodeKeyboardShortCut = getAutoIndentShortcutKeyText(); @@ -188,10 +188,10 @@ export function MoreJSCollectionsMenu(props: EntityContextMenuProps) { /> - {options.map((option) => { + {options.map((option, index) => { if (option.children) { return ( - + {option.label} diff --git a/app/client/src/pages/Editor/Explorer/Libraries/index.tsx b/app/client/src/pages/Editor/Explorer/Libraries/index.tsx index 2d3ba566d8..7e502331be 100644 --- a/app/client/src/pages/Editor/Explorer/Libraries/index.tsx +++ b/app/client/src/pages/Editor/Explorer/Libraries/index.tsx @@ -46,10 +46,13 @@ import { useFeatureFlag } from "utils/hooks/useFeatureFlag"; import { FEATURE_FLAG } from "@appsmith/entities/FeatureFlag"; import { getHasCreateActionPermission } from "@appsmith/utils/BusinessFeatures/permissionPageHelpers"; -const docsURLMap = recommendedLibraries.reduce((acc, lib) => { - acc[lib.url] = lib.docsURL; - return acc; -}, {} as Record); +const docsURLMap = recommendedLibraries.reduce( + (acc, lib) => { + acc[lib.url] = lib.docsURL; + return acc; + }, + {} as Record, +); const Library = styled.li` list-style: none; diff --git a/app/client/src/pages/Editor/Explorer/Pages/AddPageContextMenu.tsx b/app/client/src/pages/Editor/Explorer/Pages/AddPageContextMenu.tsx index b41cdc59f9..b61721d129 100644 --- a/app/client/src/pages/Editor/Explorer/Pages/AddPageContextMenu.tsx +++ b/app/client/src/pages/Editor/Explorer/Pages/AddPageContextMenu.tsx @@ -3,7 +3,7 @@ import { AddButtonWrapper, EntityClassNames } from "../Entity"; import EntityAddButton from "../Entity/AddButton"; import styled from "styled-components"; import history from "utils/history"; -import { generateTemplateFormURL } from "RouteBuilder"; +import { generateTemplateFormURL } from "@appsmith/RouteBuilder"; import { useParams } from "react-router"; import { useDispatch } from "react-redux"; import type { ExplorerURLParams } from "@appsmith/pages/Editor/Explorer/helpers"; @@ -40,12 +40,12 @@ const Wrapper = styled.div` } `; -type SubMenuProps = { +interface SubMenuProps { className: string; openMenu: boolean; onMenuClose: () => void; createPageCallback: () => void; -}; +} function AddPageContextMenu({ className, diff --git a/app/client/src/pages/Editor/Explorer/Pages/PageEntity.tsx b/app/client/src/pages/Editor/Explorer/Pages/PageEntity.tsx index e184b5a61e..30278059b6 100644 --- a/app/client/src/pages/Editor/Explorer/Pages/PageEntity.tsx +++ b/app/client/src/pages/Editor/Explorer/Pages/PageEntity.tsx @@ -2,11 +2,11 @@ import React from "react"; import ExplorerWidgetGroup from "../Widgets/WidgetGroup"; import Files from "../Files"; -type ExplorerPageEntityProps = { +interface ExplorerPageEntityProps { step: number; searchKeyword?: string; showWidgetsSidebar: () => void; -}; +} export function ExplorerPageEntity(props: ExplorerPageEntityProps) { return ( diff --git a/app/client/src/pages/Editor/Explorer/Pages/index.tsx b/app/client/src/pages/Editor/Explorer/Pages/index.tsx index 65df2d0d5d..2cff6dfb1c 100644 --- a/app/client/src/pages/Editor/Explorer/Pages/index.tsx +++ b/app/client/src/pages/Editor/Explorer/Pages/index.tsx @@ -11,27 +11,23 @@ import { getCurrentApplicationId, getCurrentPageId, } from "selectors/editorSelectors"; -import Entity, { EntityClassNames } from "../Entity"; +import { EntityClassNames } from "../Entity"; import history, { NavigationMethod } from "utils/history"; import { createNewPageFromEntities, updatePage } from "actions/pageActions"; import { defaultPageIcon, pageIcon } from "../ExplorerIcons"; import { ADD_PAGE_TOOLTIP, createMessage } from "@appsmith/constants/messages"; import type { Page } from "@appsmith/constants/ReduxActionConstants"; import { getNextEntityName } from "utils/AppsmithUtils"; -import styled from "styled-components"; import PageContextMenu from "./PageContextMenu"; import { resolveAsSpaceChar } from "utils/helpers"; import { getExplorerPinned } from "selectors/explorerSelector"; import { setExplorerPinnedAction } from "actions/explorerActions"; import { selectAllPages } from "@appsmith/selectors/entitiesSelector"; -import { builderURL } from "RouteBuilder"; +import { builderURL } from "@appsmith/RouteBuilder"; import { getExplorerStatus, saveExplorerStatus, } from "@appsmith/pages/Editor/Explorer/helpers"; -import { tailwindLayers } from "constants/Layers"; -import type { CallbackResponseType } from "utils/hooks/useResize"; -import useResize, { DIRECTION } from "utils/hooks/useResize"; import AddPageContextMenu from "./AddPageContextMenu"; import AnalyticsUtil from "utils/AnalyticsUtil"; import { useLocation } from "react-router"; @@ -45,45 +41,12 @@ import { getHasCreatePagePermission, getHasManagePagePermission, } from "@appsmith/utils/BusinessFeatures/permissionPageHelpers"; - -const ENTITY_HEIGHT = 36; -const MIN_PAGES_HEIGHT = 60; - -const StyledEntity = styled(Entity)<{ pagesSize?: number }>` - &.pages { - & > div:not(.t--entity-item) > div > div { - max-height: 40vh; - min-height: ${(props) => - props.pagesSize && props.pagesSize > MIN_PAGES_HEIGHT - ? MIN_PAGES_HEIGHT - : props.pagesSize}px; - height: ${(props) => - props.pagesSize && props.pagesSize > 128 ? 128 : props.pagesSize}px; - overflow-y: auto; - } - } - - &.page .${EntityClassNames.PRE_RIGHT_ICON} { - width: 20px; - right: 0; - } - - &.page:hover { - & .${EntityClassNames.PRE_RIGHT_ICON} { - display: none; - } - } -`; - -const RelativeContainer = styled.div` - position: relative; -`; - -const ResizeHandler = styled.div` - &:hover { - background-color: var(--ads-v2-color-border); - } -`; +import { + ENTITY_HEIGHT, + RelativeContainer, + StyledEntity, +} from "../Common/components"; +import { EntityExplorerResizeHandler } from "../Common/EntityExplorerResizeHandler"; function Pages() { const applicationId = useSelector(getCurrentApplicationId); @@ -97,16 +60,6 @@ function Pages() { const storedHeight = localStorage.getItem(storedHeightKey); const location = useLocation(); - const resizeAfterCallback = (data: CallbackResponseType) => { - localStorage.setItem(storedHeightKey, data.height.toString()); - }; - - const { mouseDown, setMouseDown } = useResize( - pageResizeRef, - DIRECTION.vertical, - resizeAfterCallback, - ); - useEffect(() => { if ((isPagesOpen === null ? true : isPagesOpen) && pageResizeRef.current) { pageResizeRef.current.style.height = storedHeight + "px"; @@ -229,11 +182,11 @@ function Pages() { ); return ( - + } entityId="Pages" + entitySize={ENTITY_HEIGHT * pages.length} icon={""} isDefaultExpanded={ isPagesOpen === null || isPagesOpen === undefined ? true : isPagesOpen @@ -251,23 +205,16 @@ function Pages() { name="Pages" onClickPreRightIcon={onPin} onToggle={onPageToggle} - pagesSize={ENTITY_HEIGHT * pages.length} searchKeyword={""} showAddButton={canCreatePages} step={0} > {pageElements} -
    setMouseDown(true)} - > - -
    +
    ); } diff --git a/app/client/src/pages/Editor/Explorer/TreeDropdown.tsx b/app/client/src/pages/Editor/Explorer/TreeDropdown.tsx index 991b29a9eb..a60cd9fbc6 100644 --- a/app/client/src/pages/Editor/Explorer/TreeDropdown.tsx +++ b/app/client/src/pages/Editor/Explorer/TreeDropdown.tsx @@ -32,7 +32,7 @@ export type TreeDropdownOption = DropdownOption & { type Setter = (value: TreeDropdownOption, defaultVal?: string) => void; -type TreeDropdownProps = { +interface TreeDropdownProps { optionTree: TreeDropdownOption[]; selectedValue: string; getDefaults?: (value: any) => any; @@ -52,7 +52,7 @@ type TreeDropdownProps = { icon?: React.ReactNode; editorPage?: boolean; menuWidth?: number; -}; +} export const StyledPopover = styled(Popover)<{ children?: React.ReactNode; diff --git a/app/client/src/pages/Editor/Explorer/Widgets/WidgetEntity.tsx b/app/client/src/pages/Editor/Explorer/Widgets/WidgetEntity.tsx index fdb35922b7..e66d809e30 100644 --- a/app/client/src/pages/Editor/Explorer/Widgets/WidgetEntity.tsx +++ b/app/client/src/pages/Editor/Explorer/Widgets/WidgetEntity.tsx @@ -10,7 +10,7 @@ import { getLastSelectedWidget, getSelectedWidgets } from "selectors/ui"; import { useNavigateToWidget } from "./useNavigateToWidget"; import WidgetIcon from "./WidgetIcon"; import AnalyticsUtil from "utils/AnalyticsUtil"; -import { builderURL } from "RouteBuilder"; +import { builderURL } from "@appsmith/RouteBuilder"; import { useLocation } from "react-router"; import { getPagePermissions } from "selectors/editorSelectors"; import { NavigationMethod } from "utils/history"; @@ -60,7 +60,7 @@ const useWidget = ( }; }; -export type WidgetEntityProps = { +export interface WidgetEntityProps { widgetId: string; widgetName: string; widgetType: WidgetType; @@ -71,7 +71,7 @@ export type WidgetEntityProps = { searchKeyword?: string; isDefaultExpanded?: boolean; widgetsInStep: string[]; -}; +} export const WidgetEntity = memo((props: WidgetEntityProps) => { const widgetsToExpand = useSelector(getEntityExplorerWidgetsToExpand); diff --git a/app/client/src/pages/Editor/Explorer/Widgets/WidgetGroup.tsx b/app/client/src/pages/Editor/Explorer/Widgets/WidgetGroup.tsx index c9c4a82353..87599b5c41 100644 --- a/app/client/src/pages/Editor/Explorer/Widgets/WidgetGroup.tsx +++ b/app/client/src/pages/Editor/Explorer/Widgets/WidgetGroup.tsx @@ -27,11 +27,11 @@ import { useFeatureFlag } from "utils/hooks/useFeatureFlag"; import { FEATURE_FLAG } from "@appsmith/entities/FeatureFlag"; import { getHasManagePagePermission } from "@appsmith/utils/BusinessFeatures/permissionPageHelpers"; -type ExplorerWidgetGroupProps = { +interface ExplorerWidgetGroupProps { step: number; searchKeyword?: string; addWidgetsFn?: () => void; -}; +} export const ExplorerWidgetGroup = memo((props: ExplorerWidgetGroupProps) => { const applicationId = useSelector(getCurrentApplicationId); diff --git a/app/client/src/pages/Editor/Explorer/Widgets/utils.ts b/app/client/src/pages/Editor/Explorer/Widgets/utils.ts index a1438a6f7d..bbe4395106 100644 --- a/app/client/src/pages/Editor/Explorer/Widgets/utils.ts +++ b/app/client/src/pages/Editor/Explorer/Widgets/utils.ts @@ -1,4 +1,4 @@ -import { builderURL } from "RouteBuilder"; +import { builderURL } from "@appsmith/RouteBuilder"; import history from "utils/history"; export const navigateToCanvas = (pageId: string) => { diff --git a/app/client/src/pages/Editor/Explorer/hooks.ts b/app/client/src/pages/Editor/Explorer/hooks.ts index c8a8ff5828..d0068e4bd8 100644 --- a/app/client/src/pages/Editor/Explorer/hooks.ts +++ b/app/client/src/pages/Editor/Explorer/hooks.ts @@ -123,15 +123,17 @@ export const useAppWideAndOtherDatasource = () => { const otherDatasourceInWorkspace = useOtherDatasourcesInWorkspace(); const appWideDS = useMemo( () => - [...datasourcesUsedInApplication].sort((ds1, ds2) => - ds1.name?.toLowerCase()?.localeCompare(ds2.name?.toLowerCase()), + [...datasourcesUsedInApplication].sort( + (ds1, ds2) => + ds1.name?.toLowerCase()?.localeCompare(ds2.name?.toLowerCase()), ), [datasourcesUsedInApplication], ); const otherDS = useMemo( () => - [...otherDatasourceInWorkspace].sort((ds1, ds2) => - ds1.name?.toLowerCase()?.localeCompare(ds2.name?.toLowerCase()), + [...otherDatasourceInWorkspace].sort( + (ds1, ds2) => + ds1.name?.toLowerCase()?.localeCompare(ds2.name?.toLowerCase()), ), [otherDatasourceInWorkspace], ); @@ -249,8 +251,9 @@ export const usePageIds = (searchKeyword?: string) => { }; export const useEntityUpdateState = (entityId: string) => { - return useSelector((state: AppState) => - get(state, "ui.explorer.entity.updatingEntity")?.includes(entityId), + return useSelector( + (state: AppState) => + get(state, "ui.explorer.entity.updatingEntity")?.includes(entityId), ); }; diff --git a/app/client/src/pages/Editor/Explorer/index.tsx b/app/client/src/pages/Editor/Explorer/index.tsx index 8e11e960a7..716f6ef166 100644 --- a/app/client/src/pages/Editor/Explorer/index.tsx +++ b/app/client/src/pages/Editor/Explorer/index.tsx @@ -2,11 +2,10 @@ import React, { useContext, useEffect } from "react"; import { toggleInOnboardingWidgetSelection } from "actions/onboardingActions"; import { forceOpenWidgetPanel } from "actions/widgetSidebarActions"; import { SegmentedControl } from "design-system"; -import { tailwindLayers } from "constants/Layers"; import { useDispatch, useSelector } from "react-redux"; import { useLocation } from "react-router"; import type { AppState } from "@appsmith/reducers"; -import { builderURL } from "RouteBuilder"; +import { builderURL } from "@appsmith/RouteBuilder"; import { getCurrentPageId } from "selectors/editorSelectors"; import { getIsFirstTimeUserOnboardingEnabled } from "selectors/onboardingSelectors"; import AnalyticsUtil from "utils/AnalyticsUtil"; @@ -25,6 +24,7 @@ import { widgetsExistCurrentPage, } from "@appsmith/selectors/entitiesSelector"; import { SignpostingWalkthroughConfig } from "../FirstTimeUserOnboarding/Utils"; +import { ExplorerWrapper } from "./Common/ExplorerWrapper"; const selectForceOpenWidgetPanel = (state: AppState) => state.ui.onBoarding.forceOpenWidgetPanel; @@ -91,6 +91,7 @@ function ExplorerContent() { popFeature, pushFeature, } = useContext(WalkthroughContext) || {}; + const handleCloseWalkthrough = () => { if (isWalkthroughOpened && popFeature) { popFeature(); @@ -128,11 +129,9 @@ function ExplorerContent() { ]); return ( -
    +
    @@ -146,7 +145,7 @@ function ExplorerContent() { -
    +
    ); } diff --git a/app/client/src/pages/Editor/FirstTimeUserOnboarding/Checklist.test.tsx b/app/client/src/pages/Editor/FirstTimeUserOnboarding/Checklist.test.tsx index c3c775b98c..0f594240ec 100644 --- a/app/client/src/pages/Editor/FirstTimeUserOnboarding/Checklist.test.tsx +++ b/app/client/src/pages/Editor/FirstTimeUserOnboarding/Checklist.test.tsx @@ -2,7 +2,7 @@ const history = jest.fn(); const dispatch = jest.fn(); import { bindDataOnCanvas } from "actions/pluginActionActions"; -import { builderURL, integrationEditorURL } from "RouteBuilder"; +import { builderURL, integrationEditorURL } from "@appsmith/RouteBuilder"; import { ReduxActionTypes } from "@appsmith/constants/ReduxActionConstants"; import { INTEGRATION_TABS } from "constants/routes"; import React from "react"; @@ -10,7 +10,7 @@ import { Provider } from "react-redux"; import { fireEvent, render, screen } from "test/testUtils"; import OnboardingChecklist from "./Checklist"; import { getStore, initialState } from "./testUtils"; -import urlBuilder from "entities/URLRedirect/URLAssembly"; +import urlBuilder from "@appsmith/entities/URLRedirect/URLAssembly"; import "@testing-library/jest-dom"; import * as onboardingSelectors from "selectors/onboardingSelectors"; diff --git a/app/client/src/pages/Editor/FirstTimeUserOnboarding/Checklist.tsx b/app/client/src/pages/Editor/FirstTimeUserOnboarding/Checklist.tsx index 3a08512878..c82ab6a603 100644 --- a/app/client/src/pages/Editor/FirstTimeUserOnboarding/Checklist.tsx +++ b/app/client/src/pages/Editor/FirstTimeUserOnboarding/Checklist.tsx @@ -47,7 +47,7 @@ import type { Datasource } from "entities/Datasource"; import type { ActionDataState } from "@appsmith/reducers/entityReducers/actionsReducer"; import type { CanvasWidgetsReduxState } from "reducers/entityReducers/canvasWidgetsReducer"; import { SIGNPOSTING_STEP, SignpostingWalkthroughConfig } from "./Utils"; -import { builderURL, integrationEditorURL } from "RouteBuilder"; +import { builderURL, integrationEditorURL } from "@appsmith/RouteBuilder"; import { DatasourceCreateEntryPoints } from "constants/Datasource"; import classNames from "classnames"; import lazyLottie from "utils/lazyLottie"; diff --git a/app/client/src/pages/Editor/FirstTimeUserOnboarding/HelpMenu.tsx b/app/client/src/pages/Editor/FirstTimeUserOnboarding/HelpMenu.tsx index 4984182786..42c9b327fe 100644 --- a/app/client/src/pages/Editor/FirstTimeUserOnboarding/HelpMenu.tsx +++ b/app/client/src/pages/Editor/FirstTimeUserOnboarding/HelpMenu.tsx @@ -16,12 +16,12 @@ import AnalyticsUtil from "utils/AnalyticsUtil"; import { DOCS_BASE_URL } from "constants/ThirdPartyConstants"; const { appVersion, cloudHosting, intercomAppID } = getAppsmithConfigs(); -type HelpItem = { +interface HelpItem { label: string; link?: string; id?: string; icon: string; -}; +} const HELP_MENU_ITEMS: HelpItem[] = [ { icon: "book-line", @@ -78,7 +78,7 @@ function HelpMenu(props: { > Help & Resources -
    +