2024-07-03 12:11:40 -07:00
|
|
|
import * as onboardingApi from '@/api/workflow-webhooks';
|
2022-11-04 06:04:31 -07:00
|
|
|
import {
|
|
|
|
ABOUT_MODAL_KEY,
|
2023-10-02 08:33:43 -07:00
|
|
|
CHAT_EMBED_MODAL_KEY,
|
2022-11-04 06:04:31 -07:00
|
|
|
CHANGE_PASSWORD_MODAL_KEY,
|
|
|
|
COMMUNITY_PACKAGE_CONFIRM_MODAL_KEY,
|
|
|
|
COMMUNITY_PACKAGE_INSTALL_MODAL_KEY,
|
|
|
|
COMMUNITY_PACKAGE_MANAGE_ACTIONS,
|
|
|
|
CONTACT_PROMPT_MODAL_KEY,
|
|
|
|
CREDENTIAL_EDIT_MODAL_KEY,
|
|
|
|
CREDENTIAL_SELECT_MODAL_KEY,
|
|
|
|
DELETE_USER_MODAL_KEY,
|
|
|
|
DUPLICATE_MODAL_KEY,
|
|
|
|
FAKE_DOOR_FEATURES,
|
|
|
|
IMPORT_CURL_MODAL_KEY,
|
|
|
|
INVITE_USER_MODAL_KEY,
|
2023-01-04 00:47:48 -08:00
|
|
|
LOG_STREAM_MODAL_KEY,
|
2023-08-23 19:59:16 -07:00
|
|
|
MFA_SETUP_MODAL_KEY,
|
2022-11-04 06:04:31 -07:00
|
|
|
PERSONALIZATION_MODAL_KEY,
|
|
|
|
STORES,
|
|
|
|
TAGS_MANAGER_MODAL_KEY,
|
2024-09-02 06:20:08 -07:00
|
|
|
ANNOTATION_TAGS_MANAGER_MODAL_KEY,
|
2024-06-11 01:23:30 -07:00
|
|
|
NPS_SURVEY_MODAL_KEY,
|
2022-11-04 06:04:31 -07:00
|
|
|
VERSIONS_MODAL_KEY,
|
|
|
|
VIEWS,
|
|
|
|
WORKFLOW_ACTIVE_MODAL_KEY,
|
2023-10-02 08:33:43 -07:00
|
|
|
WORKFLOW_LM_CHAT_MODAL_KEY,
|
2022-11-15 04:25:04 -08:00
|
|
|
WORKFLOW_SETTINGS_MODAL_KEY,
|
|
|
|
WORKFLOW_SHARE_MODAL_KEY,
|
2023-08-25 01:33:46 -07:00
|
|
|
EXTERNAL_SECRETS_PROVIDER_MODAL_KEY,
|
2023-06-20 10:13:18 -07:00
|
|
|
SOURCE_CONTROL_PUSH_MODAL_KEY,
|
2023-06-28 04:59:07 -07:00
|
|
|
SOURCE_CONTROL_PULL_MODAL_KEY,
|
2023-08-25 00:39:14 -07:00
|
|
|
DEBUG_PAYWALL_MODAL_KEY,
|
2023-10-06 04:16:27 -07:00
|
|
|
N8N_PRICING_PAGE_URL,
|
2023-10-09 04:50:08 -07:00
|
|
|
WORKFLOW_HISTORY_VERSION_RESTORE,
|
2024-01-05 08:07:57 -08:00
|
|
|
SETUP_CREDENTIALS_MODAL_KEY,
|
2024-06-11 05:21:16 -07:00
|
|
|
PROJECT_MOVE_RESOURCE_MODAL,
|
|
|
|
PROJECT_MOVE_RESOURCE_CONFIRM_MODAL,
|
2024-08-14 05:59:11 -07:00
|
|
|
NEW_ASSISTANT_SESSION_MODAL,
|
2024-08-13 05:56:54 -07:00
|
|
|
PROMPT_MFA_CODE_MODAL_KEY,
|
2022-11-04 06:04:31 -07:00
|
|
|
} from '@/constants';
|
2023-04-24 03:18:24 -07:00
|
|
|
import type {
|
2023-07-14 06:36:17 -07:00
|
|
|
CloudUpdateLinkSourceType,
|
2022-11-04 06:04:31 -07:00
|
|
|
IFakeDoorLocation,
|
|
|
|
INodeUi,
|
2023-07-14 06:36:17 -07:00
|
|
|
UTMCampaign,
|
2022-11-04 06:04:31 -07:00
|
|
|
XYPosition,
|
feat(editor): Ask AI in Code node (#6672)
* feat(editor): Ask AI tab and CLi connection
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Remove old getSchema util method
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Increase CSS specificity of the CodeNodeEditor global overrides
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* feat(editor): Magic Connect
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Improve AI controller, load conditionally, UX modal imporvements
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Extract-out AI curl
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Move loading phrases to locale, add support for ask ai experiment
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix build
* adjust communication
* fix: Remove duplicate source control preferences fetching (no-changelog) (#6675)
fix: remove duplicate source control preferences fetching (no-changelog)
* fix(Slack Node): Add UTM params to n8n reference in Slack message (no-changelog) (#6668)
fix(Slack Node): Add UTM params to n8n reference in Slack message
* fix(FileMaker Node): Improve returned error responses (#6585)
* fix(Microsoft Outlook Node): Fix issue with category not correctly applying (#6583)
* feat(Airtable Node): Overhaul (#6200)
* fix(core): Deleting manual executions should defer deleting binary data (#6680)
deleting manual executions should defer deleting binary data
* fix(editor): Add paywall state to non owner users for Variables (#6679)
* fix(editor): Add paywall state to non owner users for Variables
* fix(editor): Add variables view tests
* fix(editor): remove link from paywall state for non owner
* fix(editor): fix displaying logic
* refactor(core): Refactor WorkflowStatistics code (no-changelog) (#6617)
refactor(core): Refactor WorkflowStatistics code
* fix(editor): Hide Execute Node button for unknown nodes (#6684)
* feat: Allow hiding credential params on cloud (#6687)
* fix: Stop n8n from complaining about credentials when saving a new workflow form a template (#6671)
* fix(core): Upgrade semver to address CVE-2022-25883 (#6689)
* fix(core): Upgrade semver to address CVE-2022-25883
[GH Advisory](https://github.com/advisories/GHSA-c2qf-rxjj-qqgw)
* enforce the patched version of semver everywhere in the dev setup
* ci: Fix test checker glob (no changelog) (#6682)
ci: Fix test checker glob
* fix(API): Do not add starting node on workflow creation (#6686)
* fix(API): Do not add starting node on workflow creation
* chore: Remove comment
* fix(core): Filter out workflows that failed to activate on startup (#6676)
* fix(core): Deactivate on init workflow that should not be retried
* fix(core): Filter out workflows with activation errors
* fix(core): Load SAML libraries dynamically (#6690)
load SAML dynamically
* fix(crowd.dev Node): Fix documentation urls for crowd.dev credentials and nodes (#6696)
* feat(Read PDF Node): Replace pdf-parse with pdfjs, and add support for streaming and encrypted PDFs (#6640)
* feat: Allow `eslint-config` to be externally consumable (#6694)
* feat: Allow `eslint-config` to be externally consumable
* refactor: Adjust import styles
* fix(Contentful Node): Fix typo in credential name (no-changelog) (#6692)
* fix(editor): Ensure default credential values are not detected as dirty state (#6677)
* fix(editor): Ensure default credential values are not detected as dirty state
* chore: Remove logging
* refactor: Improve comment
* feat(Google Cloud Storage Node): Use streaming for file uploads (#6462)
fix(Google Cloud Storage Node): Use streaming for file uploads
* fix(editor): Prevent RMC from loading schema if it's already cached (#6695)
* fix(editor): Prevent RMC from loading schema if it's already cached
* ✅ Adding new tests for RMC
* 👕 Fixing lint errors
* 👌 Updating inline loader styling
* fix(API): Fix issue with workflow setting not supporting newer nanoids (#6699)
* ci: Fix test workflows (no-changelog) (#6698)
* ci: Fix test workflows (no-changelog)
We removed `pdf-parse` in #6640, so we need to get these test PDF files from the `test-workflows` repo instead ([which has been updated to include these files](https://github.com/n8n-io/test-workflows/commit/0f6ef1c804e3f1e919b097bdf061ea9ea095b1e2))
* remove `\n` from ids and skipList text files
* fix(core): Banner dismissal should also work for users migrating to v1 (no-changelog) (#6700)
* fix(Postgres Node): For select queries, empty result should be be replaced with `{"success":true}` (#6703)
* fix(Postgres Node): For select queries, empty result should be be replaced with `{"success":true}`
* :zap: less checks
---------
Co-authored-by: Michael Kret <michael.k@radency.com>
* feat(editor): Removing `ph-no-capture` class from some elements (#6674)
* feat(editor): Remove `.ph-no-capture` class from some of the fields
* ✔️ Updating test snapshots
* ⚡ Redacting expressions preview in credentials form
* 🔧 Disable posthog input masking
* 🚨 Testing PostHog iFrame settings
* Reverting iframe test
* ⚡ Hiding API key in PostHog recordings
* ✅ Added tests for redacted values
* ✔️ Updating checkbox snapshots after label component update
* ✔️ Updating test snapshots in editor-ui
* 👕 Fix lint errors
* fix(editor): Remove global link styling in v1 banner (#6705)
* fix: Add missing indices on sqlite (#6673)
* fix: enforce tag name uniqueness on sqlite
* rename migration and add other missing indices
* add tags tests
* test: Move test timeout to `/cli` (no-changelog) (#6712)
* fix(core): Redirect user to previous url after SSO signin (#6710)
redirect user to previous url after SSO signin
* fix(FTP Node): List recursive ignore . and .. to prevent infinite loops (#6707)
ignore . and .. to prevent infinite loop
Co-authored-by: Michael Kret <michael.k@radency.com>
* ci: Fix running e2e tests in dev mode (no-changelog) (#6717)
* fix(Google BigQuery Node): Error description improvement (#6715)
* fix(GitLab Trigger Node): Fix trigger activation 404 error (#6711)
* fix webhook checkExists not deleting static data
* improve webhook checkExists not deleting static data
* fix(core): Support redis cluster in queue mode (#6708)
* support redis cluster
* cleanup, fix config schema
* set default prefix to bull
* fix(editor): Skip error line highlighting if out of range (#6721)
* fix(AwsS3 Node): Fix issue if bucket name contains a '.' (#6542)
* test(editor): Add canvas actions E2E tests (#6723)
* test(editor): Add canvas actions E2E tests
* test(editor): Open category items in node creator when category dropped on canvas
* test(editor): Have new position counted only once in drag
* test(editor): rename test
* feat(Rundeck Node): Add support for node filters (#5633)
* fix(Gmail Trigger Node): Early returns in case of no data (#6727)
* fix(core): Use JWT as reset password token (#6714)
* use jwt to reset password
* increase expiration time to 1d
* drop user id query string
* refactor
* use service instead of package in tests
* sqlite migration
* postgres migration
* mysql migration
* remove unused properties
* remove userId from FE
* fix test for users.api
* move migration to the common folder
* move type assertion to the jwt.service
* Add jwt secret as a readonly property
* use signData instead of sign in user.controller
* remove base class
* remove base class
* add tests
* ci: Fix tests on postgres (no-changelog)
* refactor(core): Prevent community packages queries if feature is disabled (#6728)
* feat(core): Add cache service (#6729)
* add cache service
* PR adjustments
* switch to maxSize for memory cache
* Revert "test(editor): Add canvas actions E2E tests" (#6736)
Revert "test(editor): Add canvas actions E2E tests (#6723)"
This reverts commit 052d82b2208c1b2e6f62c6004822c6278c15278b.
* fix(Postgres Node): Arrays in query replacement fix (#6718)
* fix(Telegram Trigger Node): Add guard to 'include' call on null or undefined (#6730)
* fix(core): Use `exec` in docker images to forward signals correctly (#6732)
* refactor(core): Move webhook DB access to repository (no-changelog) (#6706)
* refactor(core): Move webhook DB access to repository (no-changelog)
* make sure `DataSource` is initialized before it's dependencies
at some point I hope to replace `DataSource` with a custom `DatabaseConnection` service class that can then disconnect and reconnect from DB without having to update all repositories.
---------
Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ <aditya@netroy.in>
* feat: Environments release using source control (#6653)
* initial telemetry setup and adjusted pull return
* quicksave before merge
* feat: add conflicting workflow list to pull modal
* feat: update source control pull modal
* fix: fix linting issue
* feat: add Enter keydown event for submitting source control push modal (no-changelog)
feat: add Enter keydown event for submitting source control push modal
* quicksave
* user workflow table for export
* improve telemetry data
* pull api telemetry
* fix lint
* Copy tweaks.
* remove authorName and authorEmail and pick from user
* rename owners.json to workflow_owners.json
* ignore credential conflicts on pull
* feat: several push/pull flow changes and design update
* pull and push return same data format
* fix: add One last step toast for successful pull
* feat: add up to date pull toast
* fix: add proper Learn more link for push and pull modals
* do not await tracking being sent
* fix import
* fix await
* add more sourcecontrolfile status
* Minor copy tweak for "More info".
* Minor copy tweak for "More info".
* ignore variable_stub conflicts on pull
* ignore whitespace differences
* do not show remote workflows that are not yet created
* fix telemetry
* fix toast when pulling deleted wf
* lint fix
* refactor and make some imports dynamic
* fix variable edit validation
* fix telemetry response
* improve telemetry
* fix unintenional delete commit
* fix status unknown issue
* fix up to date toast
* do not export active state and reapply versionid
* use update instead of upsert
* fix: show all workflows when clicking push to git
* feat: update Up to date pull translation
* fix: update read only env checks
* do not update versionid of only active flag changes
* feat: prevent access to new workflow and templates import when read only env
* feat: send only active state and version if workflow state is not dirty
* fix: Detect when only active state has changed and prevent generation a new version ID
* feat: improve readonly env messages
* make getPreferences public
* fix telemetry issue
* fix: add partial workflow update based on dirty state when changing active state
* update unit tests
* fix: remove unsaved changes check in readOnlyEnv
* fix: disable push to git button when read onyl env
* fix: update readonly toast duration
* fix: fix pinning and title input in protected mode
* initial commit (NOT working)
* working push
* cleanup and implement pull
* fix getstatus
* update import to new method
* var and tag diffs are no conflicts
* only show pull conflict for workflows
* refactor and ignore faulty credentials
* add sanitycheck for missing git folder
* prefer fetch over pull and limit depth to 1
* back to pull...
* fix setting branch on initial connect
* fix test
* remove clean workfolder
* refactor: Remove some unnecessary code
* Fixed links to docs.
* fix getstatus query params
* lint fix
* dialog to show local and remote name on conflict
* only show remote name on conflict
* fix credential expression export
* fix: Broken test
* dont show toast on pull with empty var/tags and refactor
* apply frontend changes from old branch
* fix tag with same name import
* fix buttons shown for non instance owners
* prepare local storage key for removal
* refactor: Change wording on pushing and pulling
* refactor: Change menu item
* test: Fix broken test
* Update packages/cli/src/environments/sourceControl/types/sourceControlPushWorkFolder.ts
Co-authored-by: Iván Ovejero <ivov.src@gmail.com>
---------
Co-authored-by: Alex Grozav <alex@grozav.com>
Co-authored-by: Giulio Andreini <g.andreini@gmail.com>
Co-authored-by: Omar Ajoue <krynble@gmail.com>
Co-authored-by: Iván Ovejero <ivov.src@gmail.com>
* fix(core): Fix RemoveResetPasswordColumns migration for sqlite (no-changelog) (#6739)
* ci: Update changelog generation to work with node 18
* refactor: Remove webhook from `IDatabaseCollections` (no-changelog) (#6745)
* refactor: Remove webhook from `IDatabaseCollections`
* refactor: Remove also from `collections`
* :rocket: Release 1.1.0 (#6746)
Co-authored-by: netroy <netroy@users.noreply.github.com>
* fix(Lemlist Node): Fix pagination issues with campaigns and activities (#6734)
* ci: Fix linting issues (no-changelog) (#6747)
* fix(core): Allow ignoring SSL issues on generic oauth2 credentials (#6702)
* refactor: Remove all references to the resetPasswordToken field (no-changelog) (#6751)
refactor: remove all references to the resetPasswordToken field (no-changelog)
* refactor(core): Use mixins to delete redundant code between Entity classes (no-changelog) (#6616)
* db entities don't need an ID before they are inserted
* don't define constructors on entity classes, use repository.create instead
* use mixins to reduce duplicate code in db entity classes
* fix: Display source control buttons properly (#6756)
* feat(editor): Migrate Design System and Editor UI to Vue 3 (#6476)
* feat: remove vue-fragment (no-changelog)
* feat: partial design-system migration
* feat: migrate info-accordion and info-tip components
* feat: migrate several components to vue 3
* feat: migrated several components
* feat: migrate several components
* feat: migrate several components
* feat: migrate several components
* feat: re-exported all design system components
* fix: fix design for popper components
* fix: editor kind of working, lots of issues to fix
* fix: fix several vue 3 migration issues
* fix: replace @change with @update:modelValue in several places
* fix: fix translation linking
* fix: fix inline-edit input
* fix: fix ndv and dialog design
* fix: update parameter input event bindings
* fix: rename deprecated lifecycle methods
* fix: fix json view mapping
* build: update lock file
* fix(editor): revisit last conflict with master and fix issues
* fix(editor): revisit last conflict with master and fix issues
* fix: fix expression editor bug causing code mirror to no longer be reactive
* fix: fix resource locator bug
* fix: fix vue-agile integration
* fix: remove global import for vue-agile
* fix: replace element-plus buttons with n8n-buttons everywhere
* fix(editor): Fix various element-plus styles (#6571)
* fix(editor): Fix various element-plus styles
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Remove debugging code
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Address PR comments
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix(editor): Fix loading in production mode [Vue 3] (#6578)
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix(editor): First round of e2e tests fixes with Vue 3 (#6579)
* fix(editor): Fix broken smoke and workflow list e2e tests
* ✔️ Fix failing canvas action tests. Updating some selectors used in credentials and workflow tests
* feat: add vue 3 eslint rules and fix issues
* fix: fix tags-dropdown
* fix: fix white-space issues caused by i18n-t
* fix: rename non-generic click events
* fix: fix search in resources list layout
* fix: fix datatable paginator
* fix: fix popper select caret and dropdown size
* fix: add width to action-dropdown
* fix: fix workflow settings icon not being hidden
* fix: refactor newly added code
* fix: fix merge issue
* fix: fix ndv credentials watcher
* fix: fix workflow saving and grabber notch
* fix: fix nodes list panel transition
* fix: fix node title visibility
* fix: fix data unpinning
* fix: fix value access
* fix: show input panel only if trigger panel enabled or not trigger node
* fix: fix tags dropdown and executions status spcing
* fix(editor): Prevent execution list to load back when leaving the route (#6697)
fix(editor): prevent execution list to load back when leaving the route
* fix: fix drawer visibility
* fix: fix expression toggle padding
* fix: fix expressions editor styling
* chore: prepare for testing
* fix: fix styling for el-button without patching
* test: fix unit tests in design-system
* test: fix most unit tests
* fix: remove import cycle.
* fix: fix personalization modal tests
* fix further resource mapper test adjustments
* fix: fix multiple tests and n8n-route attr duplication
* fix: fix source control tets
* fix: fixed remaining unit tests
* fix: fix workflows and credentials e2e tests
* fix: fix localizeNodeNames
* fix: update ndv e2e tests
* fix: fix popper left placement arrow
* fix: fix 5-ndv e2e tests
* fix: fix 6-code-node e2e tests
* fix(editor): Drop click outside directive from NodeCreator (#6716)
* fix(editor): Drop click outside directive from NodeCreator
* fix(editor): make sure mouseup outside is unbound at least before the component is unmounted
* fix: fix 10-settings-log-streaming e2e tests
* fix: fix node redrawing
* fix: fix tooltip buttons styling
* fix: fix varous e2e suites
* fix: fix 15-scheduler-node e2e suite
* fix: fix route watcher
* fix: fixed param name update and credential edit
* feat: update event names
* refactor: Remove deprecated `$data` (#6576)
Co-authored-by: Alex Grozav <alex@grozav.com>
* fix: fix 17-sharing e2e suite
* fix: fix tags dropdown
* fix: fix tags manager
* fix(editor): move :deep selectors to a separate scoped style block
* fix: fix sticky component and inline text edit
* fix: update e2e tests
* fix: remove button override references
* fix(editor): Adjust spacing in templates for Vue 3 (#6744)
* fix(editor): Adjust spacing in templates
* fix: Undo unneeded change
* fix: Undo unneeded change
* fix(editor): Adjust NDV height for Vue 3 (#6742)
fix(editor): Adjust NDV height
* fix(editor): Restore collapsed sidebar items for Vue 3 (#6743)
fix(editor): Restore collapsed sidebar items
* fix: fix linting issues
* fix: fix design-system deps
* fix: post-merge fixes
* fix: update tests
* fix: increase timeout for executionslist tets
* chore: fix linting issue
* fix: fix 14-mapping e2e tests in ci
* fix: re-enable tests
* fix: fix workflow duplication e2e tests after tags update
* fix(editor): Change component prop to be typed
* fix: fix tags dropdown in duplicate wf modal
* fix: fix focus behaviour in tags selector
* fix: fix tag creation
* fix: fix log streaming e2e race condition
* fix(editor): Fix Vue 3 linting issues (#6748)
* fix(editor): Fix Vue 3 linting issues
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix MainSidebar linter issues
* revert pnpm lock
* update pnpm lock file
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
Co-authored-by: Alex Grozav <alex@grozav.com>
* fix(editor): Some css fixes for vue3 branch (#6749)
* ✨ Fixing filter button height
* ✨ Update input modal button position
* ✨ Updating tags styling
* ✨ Fix event logging settings spacing
* 👕 Fixing lint errors
* fix: fix linting issues
* Revert to `// eslint-disable-next-line @typescript-eslint/no-misused-promises` disabling of mixins init
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix: fix css issue
* fix(editor): Lint fix
* fix(editor): Fix settings initialisation (#6750)
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix: fix initial settings loading
* fix: replace realClick with click force
* fix: fix randomly failing mapping e2e tests
* fix(editor): Fix menu item event handling
* fix: fix resource filters dropdown events (#6752)
* fix: fix resource filters dropdown events
* fix: remove teleported:false
* fix: fix event selection event naming (#6753)
* fix: removed console.log (#6754)
* fix: rever await nextTick changes
* fix: redo linting changes
* fix(editor): Redraw node connections if adding more than one node to canvas (#6755)
* fix(editor): Redraw node connections if adding more than one node to canvas
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Update position before connection two nodes
* Lint fix
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
Co-authored-by: Alex Grozav <alex@grozav.com>
* fix(editor): Fix `ResourceMapper` unit tests (#6758)
* ✔️ Fix matching columns test
* ✔️ Fix multiple matching columns test
* ✔️ Removing `skip` from the last test
* fix: Allow pasting a big workflow (#6760)
* fix: pasting a big workflow
* chore: update comment
* refactor: move try/catch to function
* refactor: move try/catch to function
* fix(editor): Fix modal layer width
* fix: fix position changes
* fix: undo it.only
* fix: make undo/redo multiple steps more verbose
* fix: Fix value survey styles (#6764)
* fix: fix value survey styles
* fix: lint
* Revert "fix: lint"
72869c431f1448861df021be041b61c62f1e3118
* fix: lint
* fix(editor): Fix collapsed sub menu
* fix: Fix drawer animation (#6767)
fix: drawer animation
* fix(editor): Fix source control buttons (#6769)
* fix(editor): Fix App loading & auth (#6768)
* fix(editor): Fix App loading & auth
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Await promises
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Fix eslint error
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
Co-authored-by: Csaba Tuncsik <csaba@n8n.io>
Co-authored-by: OlegIvaniv <me@olegivaniv.com>
Co-authored-by: Milorad FIlipović <milorad@n8n.io>
Co-authored-by: Iván Ovejero <ivov.src@gmail.com>
Co-authored-by: Mutasem Aldmour <4711238+mutdmour@users.noreply.github.com>
* perf(editor): Memoize locale translate calls during actions generation (#6773)
performance(editor): Memoize locale translate calls during actions generation
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix(editor): Close tags dropdown when modal is opened (#6766)
* feat: remove vue-fragment (no-changelog)
* feat: partial design-system migration
* feat: migrate info-accordion and info-tip components
* feat: migrate several components to vue 3
* feat: migrated several components
* feat: migrate several components
* feat: migrate several components
* feat: migrate several components
* feat: re-exported all design system components
* fix: fix design for popper components
* fix: editor kind of working, lots of issues to fix
* fix: fix several vue 3 migration issues
* fix: replace @change with @update:modelValue in several places
* fix: fix translation linking
* fix: fix inline-edit input
* fix: fix ndv and dialog design
* fix: update parameter input event bindings
* fix: rename deprecated lifecycle methods
* fix: fix json view mapping
* build: update lock file
* fix(editor): revisit last conflict with master and fix issues
* fix(editor): revisit last conflict with master and fix issues
* fix: fix expression editor bug causing code mirror to no longer be reactive
* fix: fix resource locator bug
* fix: fix vue-agile integration
* fix: remove global import for vue-agile
* fix: replace element-plus buttons with n8n-buttons everywhere
* fix(editor): Fix various element-plus styles (#6571)
* fix(editor): Fix various element-plus styles
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Remove debugging code
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Address PR comments
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix(editor): Fix loading in production mode [Vue 3] (#6578)
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix(editor): First round of e2e tests fixes with Vue 3 (#6579)
* fix(editor): Fix broken smoke and workflow list e2e tests
* ✔️ Fix failing canvas action tests. Updating some selectors used in credentials and workflow tests
* feat: add vue 3 eslint rules and fix issues
* fix: fix tags-dropdown
* fix: fix white-space issues caused by i18n-t
* fix: rename non-generic click events
* fix: fix search in resources list layout
* fix: fix datatable paginator
* fix: fix popper select caret and dropdown size
* fix: add width to action-dropdown
* fix: fix workflow settings icon not being hidden
* fix: refactor newly added code
* fix: fix merge issue
* fix: fix ndv credentials watcher
* fix: fix workflow saving and grabber notch
* fix: fix nodes list panel transition
* fix: fix node title visibility
* fix: fix data unpinning
* fix: fix value access
* fix: show input panel only if trigger panel enabled or not trigger node
* fix: fix tags dropdown and executions status spcing
* fix(editor): Prevent execution list to load back when leaving the route (#6697)
fix(editor): prevent execution list to load back when leaving the route
* fix: fix drawer visibility
* fix: fix expression toggle padding
* fix: fix expressions editor styling
* chore: prepare for testing
* fix: fix styling for el-button without patching
* test: fix unit tests in design-system
* test: fix most unit tests
* fix: remove import cycle.
* fix: fix personalization modal tests
* fix further resource mapper test adjustments
* fix: fix multiple tests and n8n-route attr duplication
* fix: fix source control tets
* fix: fixed remaining unit tests
* fix: fix workflows and credentials e2e tests
* fix: fix localizeNodeNames
* fix: update ndv e2e tests
* fix: fix popper left placement arrow
* fix: fix 5-ndv e2e tests
* fix: fix 6-code-node e2e tests
* fix(editor): Drop click outside directive from NodeCreator (#6716)
* fix(editor): Drop click outside directive from NodeCreator
* fix(editor): make sure mouseup outside is unbound at least before the component is unmounted
* fix: fix 10-settings-log-streaming e2e tests
* fix: fix node redrawing
* fix: fix tooltip buttons styling
* fix: fix varous e2e suites
* fix: fix 15-scheduler-node e2e suite
* fix: fix route watcher
* fix: fixed param name update and credential edit
* feat: update event names
* refactor: Remove deprecated `$data` (#6576)
Co-authored-by: Alex Grozav <alex@grozav.com>
* fix: fix 17-sharing e2e suite
* fix: fix tags dropdown
* fix: fix tags manager
* fix(editor): move :deep selectors to a separate scoped style block
* fix: fix sticky component and inline text edit
* fix: update e2e tests
* fix: remove button override references
* fix(editor): Adjust spacing in templates for Vue 3 (#6744)
* fix(editor): Adjust spacing in templates
* fix: Undo unneeded change
* fix: Undo unneeded change
* fix(editor): Adjust NDV height for Vue 3 (#6742)
fix(editor): Adjust NDV height
* fix(editor): Restore collapsed sidebar items for Vue 3 (#6743)
fix(editor): Restore collapsed sidebar items
* fix: fix linting issues
* fix: fix design-system deps
* fix: post-merge fixes
* fix: update tests
* fix: increase timeout for executionslist tets
* chore: fix linting issue
* fix: fix 14-mapping e2e tests in ci
* fix: re-enable tests
* fix: fix workflow duplication e2e tests after tags update
* fix(editor): Change component prop to be typed
* fix: fix tags dropdown in duplicate wf modal
* fix: fix focus behaviour in tags selector
* fix: fix tag creation
* fix: fix log streaming e2e race condition
* fix(editor): Fix Vue 3 linting issues (#6748)
* fix(editor): Fix Vue 3 linting issues
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix MainSidebar linter issues
* revert pnpm lock
* update pnpm lock file
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
Co-authored-by: Alex Grozav <alex@grozav.com>
* fix(editor): Some css fixes for vue3 branch (#6749)
* ✨ Fixing filter button height
* ✨ Update input modal button position
* ✨ Updating tags styling
* ✨ Fix event logging settings spacing
* 👕 Fixing lint errors
* fix: fix linting issues
* Revert to `// eslint-disable-next-line @typescript-eslint/no-misused-promises` disabling of mixins init
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix: fix css issue
* fix(editor): Lint fix
* fix(editor): Fix settings initialisation (#6750)
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix: fix initial settings loading
* fix: replace realClick with click force
* fix: fix randomly failing mapping e2e tests
* fix(editor): Fix menu item event handling
* fix: fix resource filters dropdown events (#6752)
* fix: fix resource filters dropdown events
* fix: remove teleported:false
* fix: fix event selection event naming (#6753)
* fix: removed console.log (#6754)
* fix: rever await nextTick changes
* fix: redo linting changes
* fix(editor): Redraw node connections if adding more than one node to canvas (#6755)
* fix(editor): Redraw node connections if adding more than one node to canvas
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Update position before connection two nodes
* Lint fix
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
Co-authored-by: Alex Grozav <alex@grozav.com>
* fix(editor): Fix `ResourceMapper` unit tests (#6758)
* ✔️ Fix matching columns test
* ✔️ Fix multiple matching columns test
* ✔️ Removing `skip` from the last test
* fix: Allow pasting a big workflow (#6760)
* fix: pasting a big workflow
* chore: update comment
* refactor: move try/catch to function
* refactor: move try/catch to function
* fix(editor): Fix modal layer width
* fix: fix position changes
* fix: undo it.only
* fix: make undo/redo multiple steps more verbose
* fix: Fix value survey styles (#6764)
* fix: fix value survey styles
* fix: lint
* Revert "fix: lint"
72869c431f1448861df021be041b61c62f1e3118
* fix: lint
* fix(editor): Close tags dropdown when modal is opened
* ✔️ Updating tag selectors in e2e tests
* ✔️ Using tab to blur dropdown after adding tags
* ✔️ Clicking on the New Tab button instead of the tags dropdown to open it
* Reverting merge changes added by mistake
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
Co-authored-by: Alex Grozav <alex@grozav.com>
Co-authored-by: Csaba Tuncsik <csaba@n8n.io>
Co-authored-by: OlegIvaniv <me@olegivaniv.com>
Co-authored-by: Iván Ovejero <ivov.src@gmail.com>
Co-authored-by: Mutasem Aldmour <4711238+mutdmour@users.noreply.github.com>
* fix: Show NodeIcon tooltips by removing pointer-events: none (#6777)
fix: show NodeIcon tooltips by removing pointer-events: none
* fix: Respect set modal widths (#6771)
* feat: remove vue-fragment (no-changelog)
* feat: partial design-system migration
* feat: migrate info-accordion and info-tip components
* feat: migrate several components to vue 3
* feat: migrated several components
* feat: migrate several components
* feat: migrate several components
* feat: migrate several components
* feat: re-exported all design system components
* fix: fix design for popper components
* fix: editor kind of working, lots of issues to fix
* fix: fix several vue 3 migration issues
* fix: replace @change with @update:modelValue in several places
* fix: fix translation linking
* fix: fix inline-edit input
* fix: fix ndv and dialog design
* fix: update parameter input event bindings
* fix: rename deprecated lifecycle methods
* fix: fix json view mapping
* build: update lock file
* fix(editor): revisit last conflict with master and fix issues
* fix(editor): revisit last conflict with master and fix issues
* fix: fix expression editor bug causing code mirror to no longer be reactive
* fix: fix resource locator bug
* fix: fix vue-agile integration
* fix: remove global import for vue-agile
* fix: replace element-plus buttons with n8n-buttons everywhere
* fix(editor): Fix various element-plus styles (#6571)
* fix(editor): Fix various element-plus styles
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Remove debugging code
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Address PR comments
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix(editor): Fix loading in production mode [Vue 3] (#6578)
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix(editor): First round of e2e tests fixes with Vue 3 (#6579)
* fix(editor): Fix broken smoke and workflow list e2e tests
* ✔️ Fix failing canvas action tests. Updating some selectors used in credentials and workflow tests
* feat: add vue 3 eslint rules and fix issues
* fix: fix tags-dropdown
* fix: fix white-space issues caused by i18n-t
* fix: rename non-generic click events
* fix: fix search in resources list layout
* fix: fix datatable paginator
* fix: fix popper select caret and dropdown size
* fix: add width to action-dropdown
* fix: fix workflow settings icon not being hidden
* fix: refactor newly added code
* fix: fix merge issue
* fix: fix ndv credentials watcher
* fix: fix workflow saving and grabber notch
* fix: fix nodes list panel transition
* fix: fix node title visibility
* fix: fix data unpinning
* fix: fix value access
* fix: show input panel only if trigger panel enabled or not trigger node
* fix: fix tags dropdown and executions status spcing
* fix(editor): Prevent execution list to load back when leaving the route (#6697)
fix(editor): prevent execution list to load back when leaving the route
* fix: fix drawer visibility
* fix: fix expression toggle padding
* fix: fix expressions editor styling
* chore: prepare for testing
* fix: fix styling for el-button without patching
* test: fix unit tests in design-system
* test: fix most unit tests
* fix: remove import cycle.
* fix: fix personalization modal tests
* fix further resource mapper test adjustments
* fix: fix multiple tests and n8n-route attr duplication
* fix: fix source control tets
* fix: fixed remaining unit tests
* fix: fix workflows and credentials e2e tests
* fix: fix localizeNodeNames
* fix: update ndv e2e tests
* fix: fix popper left placement arrow
* fix: fix 5-ndv e2e tests
* fix: fix 6-code-node e2e tests
* fix(editor): Drop click outside directive from NodeCreator (#6716)
* fix(editor): Drop click outside directive from NodeCreator
* fix(editor): make sure mouseup outside is unbound at least before the component is unmounted
* fix: fix 10-settings-log-streaming e2e tests
* fix: fix node redrawing
* fix: fix tooltip buttons styling
* fix: fix varous e2e suites
* fix: fix 15-scheduler-node e2e suite
* fix: fix route watcher
* fix: fixed param name update and credential edit
* feat: update event names
* refactor: Remove deprecated `$data` (#6576)
Co-authored-by: Alex Grozav <alex@grozav.com>
* fix: fix 17-sharing e2e suite
* fix: fix tags dropdown
* fix: fix tags manager
* fix(editor): move :deep selectors to a separate scoped style block
* fix: fix sticky component and inline text edit
* fix: update e2e tests
* fix: remove button override references
* fix(editor): Adjust spacing in templates for Vue 3 (#6744)
* fix(editor): Adjust spacing in templates
* fix: Undo unneeded change
* fix: Undo unneeded change
* fix(editor): Adjust NDV height for Vue 3 (#6742)
fix(editor): Adjust NDV height
* fix(editor): Restore collapsed sidebar items for Vue 3 (#6743)
fix(editor): Restore collapsed sidebar items
* fix: fix linting issues
* fix: fix design-system deps
* fix: post-merge fixes
* fix: update tests
* fix: increase timeout for executionslist tets
* chore: fix linting issue
* fix: fix 14-mapping e2e tests in ci
* fix: re-enable tests
* fix: fix workflow duplication e2e tests after tags update
* fix(editor): Change component prop to be typed
* fix: fix tags dropdown in duplicate wf modal
* fix: fix focus behaviour in tags selector
* fix: fix tag creation
* fix: fix log streaming e2e race condition
* fix(editor): Fix Vue 3 linting issues (#6748)
* fix(editor): Fix Vue 3 linting issues
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix MainSidebar linter issues
* revert pnpm lock
* update pnpm lock file
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
Co-authored-by: Alex Grozav <alex@grozav.com>
* fix(editor): Some css fixes for vue3 branch (#6749)
* ✨ Fixing filter button height
* ✨ Update input modal button position
* ✨ Updating tags styling
* ✨ Fix event logging settings spacing
* 👕 Fixing lint errors
* fix: fix linting issues
* Revert to `// eslint-disable-next-line @typescript-eslint/no-misused-promises` disabling of mixins init
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix: fix css issue
* fix(editor): Lint fix
* fix(editor): Fix settings initialisation (#6750)
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix: fix initial settings loading
* fix: replace realClick with click force
* fix: fix randomly failing mapping e2e tests
* fix(editor): Fix menu item event handling
* fix: fix resource filters dropdown events (#6752)
* fix: fix resource filters dropdown events
* fix: remove teleported:false
* fix: fix event selection event naming (#6753)
* fix: removed console.log (#6754)
* fix: rever await nextTick changes
* fix: redo linting changes
* fix(editor): Redraw node connections if adding more than one node to canvas (#6755)
* fix(editor): Redraw node connections if adding more than one node to canvas
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Update position before connection two nodes
* Lint fix
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
Co-authored-by: Alex Grozav <alex@grozav.com>
* fix(editor): Fix `ResourceMapper` unit tests (#6758)
* ✔️ Fix matching columns test
* ✔️ Fix multiple matching columns test
* ✔️ Removing `skip` from the last test
* fix: Allow pasting a big workflow (#6760)
* fix: pasting a big workflow
* chore: update comment
* refactor: move try/catch to function
* refactor: move try/catch to function
* fix(editor): Fix modal layer width
* fix: fix position changes
* fix: undo it.only
* fix: make undo/redo multiple steps more verbose
* fix: Fix value survey styles (#6764)
* fix: fix value survey styles
* fix: lint
* Revert "fix: lint"
72869c431f1448861df021be041b61c62f1e3118
* fix: lint
* fix(editor): Fix collapsed sub menu
* fix: Fix drawer animation (#6767)
fix: drawer animation
* fix(editor): Fix source control buttons (#6769)
* fix: Respect modal width
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
Co-authored-by: Alex Grozav <alex@grozav.com>
Co-authored-by: Csaba Tuncsik <csaba@n8n.io>
Co-authored-by: OlegIvaniv <me@olegivaniv.com>
Co-authored-by: Milorad FIlipović <milorad@n8n.io>
Co-authored-by: Iván Ovejero <ivov.src@gmail.com>
* fix(editor): Fix tooltip opening delay prop name (#6776)
fix(editor): fix tooltip opening delay prop name
* fix(editor): Fix collapsed sub menu elements (#6778)
* fix: Remove number input arrows (no-changelog) (#6782)
fix: remove number input arrows
* ci: Update most of the dev tooling (no-changelog) (#6780)
* fix(TheHive Node): Treat `ApiKey` as a secret (#6786)
* test(editor): Prevent node view unload by default in e2e run (#6787)
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix(editor): Resolve vue 3 related console-warnings (#6779)
* fix(editor): Resolve vue 3 related console-warnings
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Use span as component wrapper instead of div
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Wrap popover component in span
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix(editor): Vue3 - Fix modal positioning and multi-select tag sizing (#6783)
* ✨ Updating modals positioning within the overlay
* 💄 Implemented multi-select variant with small tabs
* ✔️ Removing password link clicks while modal is open in e2e tests
* Set generous timeout for $paramter resolve
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
Co-authored-by: Oleg Ivaniv <me@olegivaniv.com>
* ci: Fix linting issues (no-changelog) (#6788)
* ci: Fix linting (no-changelog)
* lintfix for nodes-base as well
* fix(editor): Fix code node highlight error (#6791)
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* feat(core): Credentials for popular SecOps services, Part 1 (#6775)
* refactor: Clear unused ESLint directives from BE packages (no-changelog) (#6798)
* refactor(core): Cache workflow ownership (#6738)
* refactor: Set up ownership service
* refactor: Specify cache keys and values
* refactor: Replace util with service calls
* test: Mock service in tests
* refactor: Use dependency injection
* test: Write tests
* refactor: Apply feedback from Omar and Micha
* test: Fix tests
* test: Fix missing spot
* refactor: Return user entity from cache
* refactor: More dependency injection!
* fix(editor): Prevent text edit dialog from re-opening in same tick (#6781)
* fix: prevent reopenning textedit dialog in same tick
* fix: add same logic for code edit dialog
* fix: remove stop modifier
* fix: blur input field when closing modal, removing default element-plus behaviour
* test(editor): Do not chain invoke calls after assertions in 24-ndv-paired-item e2e spec (no-changelog) (#6800)
* test(editor): Do not chaing invoke calls after assertions in 24-ndv-paired-item e2e spec
* Do not chaing realHover after assertion
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Remove .only
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix(Todoist Node): Fix issue with section id being ignored (#6799)
* test(editor): Add canvas actions E2E tests (#6723) (#6790)
* test(editor): Add canvas actions E2E tests (#6723)
* test(editor): Add canvas actions E2E tests
* test(editor): Open category items in node creator when category dropped on canvas
* test(editor): Have new position counted only once in drag
* test(editor): rename test
(cherry picked from commit 052d82b2208c1b2e6f62c6004822c6278c15278b)
* test: fix drag positioning
* fix(core): Add missing primary key on the `execution_data` table on postgres (#6797)
* fix: Review fixes
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* fix: Fin locales
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Fix merging errors
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Map erros based on statusCode
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Fix code replacing
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Fix code formatting
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Address review points
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Optionally access total_tokens
* Clean-up Ask AI modal
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Store prompt in sessionStorage
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Improve schema generation, only get parent nodes
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Send error messages to telemetry, aske before switching tabs
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Add locale
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Post-merge cleanup
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Move Ask AI into separate folder
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Lint fix
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Constants lint fix
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Add Ask AI e2e tests and fix linting issues
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Move CircleLoader to design-lib
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Replace circle-lodaer and move el-tabs styles to n8n theme
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Fix placeholder & e2e tests
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
* Remove old CircleLoader
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
---------
Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
Co-authored-by: ricardo <ricardoespinoza105@gmail.com>
Co-authored-by: Alex Grozav <alex@grozav.com>
Co-authored-by: Romain Dunand <romain@1-more-thing.com>
Co-authored-by: Jon <jonathan.bennetts@gmail.com>
Co-authored-by: Michael Kret <88898367+michael-radency@users.noreply.github.com>
Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ <netroy@users.noreply.github.com>
Co-authored-by: Csaba Tuncsik <csaba@n8n.io>
Co-authored-by: Iván Ovejero <ivov.src@gmail.com>
Co-authored-by: Omar Ajoue <krynble@gmail.com>
Co-authored-by: Michael Auerswald <michael.auerswald@gmail.com>
Co-authored-by: Milorad FIlipović <milorad@n8n.io>
Co-authored-by: Michael Kret <michael.k@radency.com>
Co-authored-by: Val <68596159+valya@users.noreply.github.com>
Co-authored-by: Marcus <56945030+maspio@users.noreply.github.com>
Co-authored-by: Jordan Hall <Jordan@libertyware.co.uk>
Co-authored-by: qg-horie <36725144+qg-horie@users.noreply.github.com>
Co-authored-by: Ricardo Espinoza <ricardo@n8n.io>
Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ <aditya@netroy.in>
Co-authored-by: Ali Afsharzadeh <afsharzadeh8@gmail.com>
Co-authored-by: Giulio Andreini <g.andreini@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Mutasem Aldmour <4711238+mutdmour@users.noreply.github.com>
2023-08-16 04:08:10 -07:00
|
|
|
Modals,
|
|
|
|
NewCredentialsModal,
|
2023-11-01 05:33:36 -07:00
|
|
|
ThemeOption,
|
2024-02-26 06:05:12 -08:00
|
|
|
NotificationOptions,
|
|
|
|
ModalState,
|
2024-06-11 01:23:30 -07:00
|
|
|
ModalKey,
|
2024-07-03 12:11:40 -07:00
|
|
|
IFakeDoor,
|
2022-11-04 06:04:31 -07:00
|
|
|
} from '@/Interface';
|
|
|
|
import { defineStore } from 'pinia';
|
2024-06-18 10:15:12 -07:00
|
|
|
import { useRootStore } from '@/stores/root.store';
|
2024-07-03 12:11:40 -07:00
|
|
|
import * as curlParserApi from '@/api/curlHelper';
|
2023-08-17 04:57:40 -07:00
|
|
|
import { useCloudPlanStore } from '@/stores/cloudPlan.store';
|
2023-11-28 03:15:08 -08:00
|
|
|
import { useWorkflowsStore } from '@/stores/workflows.store';
|
|
|
|
import { useSettingsStore } from '@/stores/settings.store';
|
2024-06-06 06:30:17 -07:00
|
|
|
import { hasPermission } from '@/utils/rbac/permissions';
|
2023-05-30 06:49:27 -07:00
|
|
|
import { useTelemetryStore } from '@/stores/telemetry.store';
|
2024-02-27 00:21:16 -08:00
|
|
|
import { useUsersStore } from '@/stores/users.store';
|
2023-07-14 06:36:17 -07:00
|
|
|
import { dismissBannerPermanently } from '@/api/ui';
|
2023-08-17 05:00:17 -07:00
|
|
|
import type { BannerName } from 'n8n-workflow';
|
2023-11-02 08:06:33 -07:00
|
|
|
import {
|
|
|
|
addThemeToBody,
|
|
|
|
getPreferredTheme,
|
|
|
|
getThemeOverride,
|
|
|
|
isValidTheme,
|
|
|
|
updateTheme,
|
|
|
|
} from './ui.utils';
|
2024-07-03 12:11:40 -07:00
|
|
|
import { computed, ref } from 'vue';
|
2024-07-11 07:05:51 -07:00
|
|
|
import type { Connection } from '@vue-flow/core';
|
2022-11-04 06:04:31 -07:00
|
|
|
|
2023-11-01 05:33:36 -07:00
|
|
|
let savedTheme: ThemeOption = 'system';
|
|
|
|
try {
|
2023-11-02 08:06:33 -07:00
|
|
|
const value = getThemeOverride();
|
|
|
|
if (isValidTheme(value)) {
|
2023-11-01 05:33:36 -07:00
|
|
|
savedTheme = value;
|
|
|
|
addThemeToBody(value);
|
|
|
|
}
|
|
|
|
} catch (e) {}
|
|
|
|
|
2024-07-03 12:11:40 -07:00
|
|
|
type UiStore = ReturnType<typeof useUIStore>;
|
|
|
|
|
|
|
|
type Draggable = {
|
|
|
|
isDragging: boolean;
|
|
|
|
type: string;
|
|
|
|
data: string;
|
|
|
|
canDrop: boolean;
|
|
|
|
stickyPosition: null | XYPosition;
|
|
|
|
};
|
|
|
|
|
|
|
|
export const useUIStore = defineStore(STORES.UI, () => {
|
|
|
|
const activeActions = ref<string[]>([]);
|
|
|
|
const activeCredentialType = ref<string | null>(null);
|
|
|
|
const theme = ref<ThemeOption>(savedTheme);
|
|
|
|
const modalsById = ref<Record<string, ModalState>>({
|
|
|
|
...Object.fromEntries(
|
|
|
|
[
|
|
|
|
ABOUT_MODAL_KEY,
|
|
|
|
CHAT_EMBED_MODAL_KEY,
|
|
|
|
CHANGE_PASSWORD_MODAL_KEY,
|
|
|
|
CONTACT_PROMPT_MODAL_KEY,
|
|
|
|
CREDENTIAL_SELECT_MODAL_KEY,
|
|
|
|
DUPLICATE_MODAL_KEY,
|
|
|
|
PERSONALIZATION_MODAL_KEY,
|
|
|
|
INVITE_USER_MODAL_KEY,
|
|
|
|
TAGS_MANAGER_MODAL_KEY,
|
2024-09-02 06:20:08 -07:00
|
|
|
ANNOTATION_TAGS_MANAGER_MODAL_KEY,
|
2024-07-03 12:11:40 -07:00
|
|
|
NPS_SURVEY_MODAL_KEY,
|
|
|
|
VERSIONS_MODAL_KEY,
|
|
|
|
WORKFLOW_LM_CHAT_MODAL_KEY,
|
|
|
|
WORKFLOW_SETTINGS_MODAL_KEY,
|
|
|
|
WORKFLOW_SHARE_MODAL_KEY,
|
|
|
|
WORKFLOW_ACTIVE_MODAL_KEY,
|
|
|
|
COMMUNITY_PACKAGE_INSTALL_MODAL_KEY,
|
|
|
|
MFA_SETUP_MODAL_KEY,
|
2024-08-13 05:56:54 -07:00
|
|
|
PROMPT_MFA_CODE_MODAL_KEY,
|
2024-07-03 12:11:40 -07:00
|
|
|
SOURCE_CONTROL_PUSH_MODAL_KEY,
|
|
|
|
SOURCE_CONTROL_PULL_MODAL_KEY,
|
|
|
|
EXTERNAL_SECRETS_PROVIDER_MODAL_KEY,
|
|
|
|
DEBUG_PAYWALL_MODAL_KEY,
|
|
|
|
WORKFLOW_HISTORY_VERSION_RESTORE,
|
|
|
|
SETUP_CREDENTIALS_MODAL_KEY,
|
|
|
|
PROJECT_MOVE_RESOURCE_MODAL,
|
|
|
|
PROJECT_MOVE_RESOURCE_CONFIRM_MODAL,
|
2024-08-14 05:59:11 -07:00
|
|
|
NEW_ASSISTANT_SESSION_MODAL,
|
2024-07-03 12:11:40 -07:00
|
|
|
].map((modalKey) => [modalKey, { open: false }]),
|
|
|
|
),
|
|
|
|
[DELETE_USER_MODAL_KEY]: {
|
|
|
|
open: false,
|
|
|
|
activeId: null,
|
|
|
|
},
|
|
|
|
[COMMUNITY_PACKAGE_CONFIRM_MODAL_KEY]: {
|
|
|
|
open: false,
|
|
|
|
mode: '',
|
|
|
|
activeId: null,
|
|
|
|
},
|
|
|
|
[IMPORT_CURL_MODAL_KEY]: {
|
|
|
|
open: false,
|
|
|
|
data: {
|
|
|
|
curlCommand: '',
|
2023-01-04 00:47:48 -08:00
|
|
|
},
|
2022-11-04 06:04:31 -07:00
|
|
|
},
|
2024-07-03 12:11:40 -07:00
|
|
|
[LOG_STREAM_MODAL_KEY]: {
|
|
|
|
open: false,
|
|
|
|
data: undefined,
|
2023-11-01 05:33:36 -07:00
|
|
|
},
|
2024-07-03 12:11:40 -07:00
|
|
|
[CREDENTIAL_EDIT_MODAL_KEY]: {
|
|
|
|
open: false,
|
|
|
|
mode: '',
|
|
|
|
activeId: null,
|
|
|
|
showAuthSelector: false,
|
|
|
|
} as ModalState,
|
|
|
|
});
|
|
|
|
|
|
|
|
const modalStack = ref<string[]>([]);
|
|
|
|
const sidebarMenuCollapsed = ref<boolean>(true);
|
|
|
|
const currentView = ref<string>('');
|
|
|
|
const fakeDoorFeatures = ref<IFakeDoor[]>([
|
|
|
|
{
|
|
|
|
id: FAKE_DOOR_FEATURES.SSO,
|
|
|
|
featureName: 'fakeDoor.settings.sso.name',
|
|
|
|
icon: 'key',
|
|
|
|
actionBoxTitle: 'fakeDoor.settings.sso.actionBox.title',
|
|
|
|
actionBoxDescription: 'fakeDoor.settings.sso.actionBox.description',
|
|
|
|
linkURL: 'https://n8n-community.typeform.com/to/l7QOrERN#f=sso',
|
|
|
|
uiLocations: ['settings/users'],
|
|
|
|
},
|
|
|
|
]);
|
|
|
|
|
|
|
|
const draggable = ref<Draggable>({
|
|
|
|
isDragging: false,
|
|
|
|
type: '',
|
|
|
|
data: '',
|
|
|
|
canDrop: false,
|
|
|
|
stickyPosition: null,
|
|
|
|
});
|
|
|
|
|
|
|
|
const stateIsDirty = ref<boolean>(false);
|
|
|
|
const lastSelectedNode = ref<string | null>(null);
|
|
|
|
const lastSelectedNodeOutputIndex = ref<number | null>(null);
|
|
|
|
const lastSelectedNodeEndpointUuid = ref<string | null>(null);
|
|
|
|
const nodeViewOffsetPosition = ref<[number, number]>([0, 0]);
|
|
|
|
const nodeViewMoveInProgress = ref<boolean>(false);
|
|
|
|
const selectedNodes = ref<INodeUi[]>([]);
|
|
|
|
const nodeViewInitialized = ref<boolean>(false);
|
|
|
|
const addFirstStepOnLoad = ref<boolean>(false);
|
|
|
|
const bannersHeight = ref<number>(0);
|
|
|
|
const bannerStack = ref<BannerName[]>([]);
|
|
|
|
const pendingNotificationsForViews = ref<{ [key in VIEWS]?: NotificationOptions[] }>({});
|
|
|
|
const isCreateNodeActive = ref<boolean>(false);
|
|
|
|
|
2024-08-28 05:01:05 -07:00
|
|
|
const appGridWidth = ref<number>(0);
|
|
|
|
|
2024-07-18 01:59:11 -07:00
|
|
|
// Last interacted with - Canvas v2 specific
|
|
|
|
const lastInteractedWithNodeConnection = ref<Connection | null>(null);
|
|
|
|
const lastInteractedWithNodeHandle = ref<string | null>(null);
|
|
|
|
const lastInteractedWithNodeId = ref<string | null>(null);
|
2024-09-03 05:11:44 -07:00
|
|
|
const lastCancelledConnectionPosition = ref<XYPosition | null>(null);
|
2024-07-18 01:59:11 -07:00
|
|
|
|
2024-07-03 12:11:40 -07:00
|
|
|
const settingsStore = useSettingsStore();
|
|
|
|
const workflowsStore = useWorkflowsStore();
|
|
|
|
const rootStore = useRootStore();
|
|
|
|
const telemetryStore = useTelemetryStore();
|
|
|
|
const cloudPlanStore = useCloudPlanStore();
|
|
|
|
const userStore = useUsersStore();
|
|
|
|
|
|
|
|
const appliedTheme = computed(() => {
|
|
|
|
return theme.value === 'system' ? getPreferredTheme() : theme.value;
|
|
|
|
});
|
|
|
|
|
|
|
|
const logo = computed(() => {
|
|
|
|
const { releaseChannel } = settingsStore.settings;
|
|
|
|
const suffix = appliedTheme.value === 'dark' ? '-dark.svg' : '.svg';
|
|
|
|
return `static/logo/${
|
|
|
|
releaseChannel === 'stable' ? 'expanded' : `channel/${releaseChannel}`
|
|
|
|
}${suffix}`;
|
|
|
|
});
|
2022-12-21 07:42:07 -08:00
|
|
|
|
2024-07-03 12:11:40 -07:00
|
|
|
const contextBasedTranslationKeys = computed(() => {
|
|
|
|
const deploymentType = settingsStore.deploymentType;
|
|
|
|
|
|
|
|
let contextKey: '' | '.cloud' | '.desktop' = '';
|
|
|
|
if (deploymentType === 'cloud') {
|
|
|
|
contextKey = '.cloud';
|
|
|
|
} else if (deploymentType === 'desktop_mac' || deploymentType === 'desktop_win') {
|
|
|
|
contextKey = '.desktop';
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
|
|
|
feature: {
|
|
|
|
unavailable: {
|
|
|
|
title: `contextual.feature.unavailable.title${contextKey}`,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
credentials: {
|
|
|
|
sharing: {
|
2023-08-25 00:39:14 -07:00
|
|
|
unavailable: {
|
2024-07-03 12:11:40 -07:00
|
|
|
title: `contextual.credentials.sharing.unavailable.title${contextKey}`,
|
|
|
|
description: `contextual.credentials.sharing.unavailable.description${contextKey}`,
|
|
|
|
action: `contextual.credentials.sharing.unavailable.action${contextKey}`,
|
|
|
|
button: `contextual.credentials.sharing.unavailable.button${contextKey}`,
|
2023-08-25 00:39:14 -07:00
|
|
|
},
|
|
|
|
},
|
2024-07-03 12:11:40 -07:00
|
|
|
},
|
|
|
|
workflows: {
|
|
|
|
sharing: {
|
|
|
|
title: 'contextual.workflows.sharing.title',
|
|
|
|
unavailable: {
|
|
|
|
title: `contextual.workflows.sharing.unavailable.title${contextKey}`,
|
|
|
|
description: {
|
|
|
|
modal: `contextual.workflows.sharing.unavailable.description.modal${contextKey}`,
|
|
|
|
tooltip: `contextual.workflows.sharing.unavailable.description.tooltip${contextKey}`,
|
2022-12-21 07:42:07 -08:00
|
|
|
},
|
2024-07-03 12:11:40 -07:00
|
|
|
action: `contextual.workflows.sharing.unavailable.action${contextKey}`,
|
|
|
|
button: `contextual.workflows.sharing.unavailable.button${contextKey}`,
|
2022-12-21 07:42:07 -08:00
|
|
|
},
|
|
|
|
},
|
2024-07-03 12:11:40 -07:00
|
|
|
},
|
|
|
|
variables: {
|
|
|
|
unavailable: {
|
|
|
|
title: `contextual.variables.unavailable.title${contextKey}`,
|
|
|
|
description: 'contextual.variables.unavailable.description',
|
|
|
|
action: `contextual.variables.unavailable.action${contextKey}`,
|
|
|
|
button: `contextual.variables.unavailable.button${contextKey}`,
|
2022-12-21 07:42:07 -08:00
|
|
|
},
|
2024-07-03 12:11:40 -07:00
|
|
|
},
|
|
|
|
users: {
|
|
|
|
settings: {
|
2023-04-18 03:41:55 -07:00
|
|
|
unavailable: {
|
2024-07-03 12:11:40 -07:00
|
|
|
title: `contextual.users.settings.unavailable.title${contextKey}`,
|
|
|
|
description: `contextual.users.settings.unavailable.description${contextKey}`,
|
|
|
|
button: `contextual.users.settings.unavailable.button${contextKey}`,
|
2023-02-08 01:42:22 -08:00
|
|
|
},
|
|
|
|
},
|
2024-07-03 12:11:40 -07:00
|
|
|
},
|
|
|
|
} as const;
|
|
|
|
});
|
2023-10-06 04:16:27 -07:00
|
|
|
|
2024-07-03 12:11:40 -07:00
|
|
|
const getLastSelectedNode = computed(() => {
|
|
|
|
if (lastSelectedNode.value) {
|
|
|
|
return workflowsStore.getNodeByName(lastSelectedNode.value);
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
});
|
2023-04-19 02:00:09 -07:00
|
|
|
|
2024-07-18 01:59:11 -07:00
|
|
|
const lastInteractedWithNode = computed(() => {
|
|
|
|
if (lastInteractedWithNodeId.value) {
|
|
|
|
return workflowsStore.getNodeById(lastInteractedWithNodeId.value);
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
});
|
|
|
|
|
2024-07-03 12:11:40 -07:00
|
|
|
const isVersionsOpen = computed(() => {
|
|
|
|
return modalsById.value[VERSIONS_MODAL_KEY].open;
|
|
|
|
});
|
|
|
|
|
|
|
|
const isModalActiveById = computed(() =>
|
|
|
|
Object.keys(modalsById.value).reduce((acc: { [key: string]: boolean }, name) => {
|
|
|
|
acc[name] = name === modalStack.value[0];
|
|
|
|
return acc;
|
|
|
|
}, {}),
|
|
|
|
);
|
|
|
|
|
|
|
|
const fakeDoorsByLocation = computed(() =>
|
|
|
|
fakeDoorFeatures.value.reduce((acc: { [uiLocation: string]: IFakeDoor }, fakeDoor) => {
|
|
|
|
fakeDoor.uiLocations.forEach((uiLocation: IFakeDoorLocation) => {
|
|
|
|
acc[uiLocation] = fakeDoor;
|
2022-11-04 06:04:31 -07:00
|
|
|
});
|
2024-07-03 12:11:40 -07:00
|
|
|
return acc;
|
|
|
|
}, {}),
|
|
|
|
);
|
|
|
|
|
|
|
|
const fakeDoorsById = computed(() =>
|
|
|
|
fakeDoorFeatures.value.reduce((acc: { [id: string]: IFakeDoor }, fakeDoor) => {
|
|
|
|
acc[fakeDoor.id.toString()] = fakeDoor;
|
|
|
|
return acc;
|
|
|
|
}, {}),
|
|
|
|
);
|
|
|
|
|
|
|
|
const isReadOnlyView = computed(() => {
|
|
|
|
return ![
|
|
|
|
VIEWS.WORKFLOW.toString(),
|
|
|
|
VIEWS.NEW_WORKFLOW.toString(),
|
|
|
|
VIEWS.EXECUTION_DEBUG.toString(),
|
|
|
|
].includes(currentView.value);
|
|
|
|
});
|
|
|
|
|
|
|
|
const isActionActive = computed(() =>
|
|
|
|
activeActions.value.reduce((acc: { [action: string]: boolean }, action) => {
|
|
|
|
acc[action] = true;
|
|
|
|
return acc;
|
|
|
|
}, {}),
|
|
|
|
);
|
|
|
|
|
|
|
|
const getSelectedNodes = computed(() => {
|
|
|
|
const seen = new Set();
|
|
|
|
return selectedNodes.value.filter((node) => {
|
|
|
|
// dedupe for instances when same node is selected in different ways
|
|
|
|
if (!seen.has(node)) {
|
|
|
|
seen.add(node);
|
|
|
|
return true;
|
2022-11-04 06:04:31 -07:00
|
|
|
}
|
2024-07-03 12:11:40 -07:00
|
|
|
return false;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
const isNodeSelected = computed(() =>
|
|
|
|
selectedNodes.value.reduce((acc: { [nodeName: string]: true }, node) => {
|
|
|
|
acc[node.name] = true;
|
|
|
|
return acc;
|
|
|
|
}, {}),
|
|
|
|
);
|
|
|
|
|
|
|
|
const headerHeight = computed(() => {
|
|
|
|
const style = getComputedStyle(document.body);
|
|
|
|
return Number(style.getPropertyValue('--header-height'));
|
|
|
|
});
|
|
|
|
|
|
|
|
const isAnyModalOpen = computed(() => {
|
|
|
|
return modalStack.value.length > 0;
|
|
|
|
});
|
|
|
|
|
|
|
|
// Methods
|
|
|
|
|
|
|
|
const setTheme = (newTheme: ThemeOption): void => {
|
|
|
|
theme.value = newTheme;
|
|
|
|
updateTheme(newTheme);
|
|
|
|
};
|
|
|
|
|
|
|
|
const setMode = (name: keyof Modals, mode: string): void => {
|
|
|
|
modalsById.value[name] = {
|
|
|
|
...modalsById.value[name],
|
|
|
|
mode,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
const setActiveId = (name: keyof Modals, activeId: string | null): void => {
|
|
|
|
modalsById.value[name] = {
|
|
|
|
...modalsById.value[name],
|
|
|
|
activeId,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
const setShowAuthSelector = (name: keyof Modals, showAuthSelector: boolean): void => {
|
|
|
|
modalsById.value[name] = {
|
|
|
|
...modalsById.value[name],
|
|
|
|
showAuthSelector,
|
|
|
|
} as NewCredentialsModal;
|
|
|
|
};
|
|
|
|
|
|
|
|
const setModalData = (payload: { name: keyof Modals; data: Record<string, unknown> }) => {
|
|
|
|
modalsById.value[payload.name] = {
|
|
|
|
...modalsById.value[payload.name],
|
|
|
|
data: payload.data,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
const openModal = (name: ModalKey) => {
|
|
|
|
modalsById.value[name] = {
|
|
|
|
...modalsById.value[name],
|
|
|
|
open: true,
|
|
|
|
};
|
|
|
|
modalStack.value = [name].concat(modalStack.value) as string[];
|
|
|
|
};
|
|
|
|
|
|
|
|
const openModalWithData = (payload: { name: ModalKey; data: Record<string, unknown> }) => {
|
|
|
|
setModalData(payload);
|
|
|
|
openModal(payload.name);
|
|
|
|
};
|
|
|
|
|
|
|
|
const closeModal = (name: ModalKey) => {
|
|
|
|
modalsById.value[name] = {
|
|
|
|
...modalsById.value[name],
|
|
|
|
open: false,
|
|
|
|
};
|
|
|
|
modalStack.value = modalStack.value.filter((openModalName) => name !== openModalName);
|
|
|
|
};
|
|
|
|
|
|
|
|
const draggableStartDragging = (type: string, data: string) => {
|
|
|
|
draggable.value = {
|
|
|
|
isDragging: true,
|
|
|
|
type,
|
|
|
|
data,
|
|
|
|
canDrop: false,
|
|
|
|
stickyPosition: null,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
const draggableStopDragging = () => {
|
|
|
|
draggable.value = {
|
|
|
|
isDragging: false,
|
|
|
|
type: '',
|
|
|
|
data: '',
|
|
|
|
canDrop: false,
|
|
|
|
stickyPosition: null,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
const setDraggableStickyPos = (position: XYPosition) => {
|
|
|
|
draggable.value = {
|
|
|
|
...draggable.value,
|
|
|
|
stickyPosition: position,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
const setDraggableCanDrop = (canDrop: boolean) => {
|
|
|
|
draggable.value = {
|
|
|
|
...draggable.value,
|
|
|
|
canDrop,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
const openDeleteUserModal = (id: string) => {
|
|
|
|
setActiveId(DELETE_USER_MODAL_KEY, id);
|
|
|
|
openModal(DELETE_USER_MODAL_KEY);
|
|
|
|
};
|
|
|
|
|
|
|
|
const openExistingCredential = (id: string) => {
|
|
|
|
setActiveId(CREDENTIAL_EDIT_MODAL_KEY, id);
|
|
|
|
setMode(CREDENTIAL_EDIT_MODAL_KEY, 'edit');
|
|
|
|
openModal(CREDENTIAL_EDIT_MODAL_KEY);
|
|
|
|
};
|
|
|
|
|
|
|
|
const openNewCredential = (type: string, showAuthOptions = false) => {
|
|
|
|
setActiveId(CREDENTIAL_EDIT_MODAL_KEY, type);
|
|
|
|
setShowAuthSelector(CREDENTIAL_EDIT_MODAL_KEY, showAuthOptions);
|
|
|
|
setMode(CREDENTIAL_EDIT_MODAL_KEY, 'new');
|
|
|
|
openModal(CREDENTIAL_EDIT_MODAL_KEY);
|
|
|
|
};
|
|
|
|
|
|
|
|
const submitContactEmail = async (email: string, agree: boolean) => {
|
|
|
|
const instanceId = rootStore.instanceId;
|
|
|
|
const { currentUser } = userStore;
|
|
|
|
if (currentUser) {
|
|
|
|
return await onboardingApi.submitEmailOnSignup(
|
|
|
|
instanceId,
|
|
|
|
currentUser,
|
|
|
|
email ?? currentUser.email,
|
|
|
|
agree,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
};
|
|
|
|
|
|
|
|
const openCommunityPackageUninstallConfirmModal = (packageName: string) => {
|
2024-07-23 02:25:56 -07:00
|
|
|
setMode(COMMUNITY_PACKAGE_CONFIRM_MODAL_KEY, COMMUNITY_PACKAGE_MANAGE_ACTIONS.UNINSTALL);
|
|
|
|
setActiveId(COMMUNITY_PACKAGE_CONFIRM_MODAL_KEY, packageName);
|
2024-07-03 12:11:40 -07:00
|
|
|
openModal(COMMUNITY_PACKAGE_CONFIRM_MODAL_KEY);
|
|
|
|
};
|
|
|
|
|
|
|
|
const openCommunityPackageUpdateConfirmModal = (packageName: string) => {
|
2024-07-23 02:25:56 -07:00
|
|
|
setMode(COMMUNITY_PACKAGE_CONFIRM_MODAL_KEY, COMMUNITY_PACKAGE_MANAGE_ACTIONS.UPDATE);
|
|
|
|
setActiveId(COMMUNITY_PACKAGE_CONFIRM_MODAL_KEY, packageName);
|
2024-07-03 12:11:40 -07:00
|
|
|
openModal(COMMUNITY_PACKAGE_CONFIRM_MODAL_KEY);
|
|
|
|
};
|
|
|
|
|
|
|
|
const addActiveAction = (action: string) => {
|
|
|
|
if (!activeActions.value.includes(action)) {
|
|
|
|
activeActions.value.push(action);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const removeActiveAction = (action: string) => {
|
|
|
|
const actionIndex = activeActions.value.indexOf(action);
|
|
|
|
if (actionIndex !== -1) {
|
|
|
|
activeActions.value.splice(actionIndex, 1);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const addSelectedNode = (node: INodeUi) => {
|
|
|
|
const isAlreadySelected = selectedNodes.value.some((n) => n.name === node.name);
|
|
|
|
if (!isAlreadySelected) {
|
|
|
|
selectedNodes.value.push(node);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const removeNodeFromSelection = (node: INodeUi) => {
|
|
|
|
for (const [index] of selectedNodes.value.entries()) {
|
|
|
|
if (selectedNodes.value[index].name === node.name) {
|
|
|
|
selectedNodes.value.splice(Number(index), 1);
|
|
|
|
break;
|
2024-05-02 03:52:15 -07:00
|
|
|
}
|
2024-07-03 12:11:40 -07:00
|
|
|
}
|
|
|
|
};
|
2024-05-02 03:52:15 -07:00
|
|
|
|
2024-07-03 12:11:40 -07:00
|
|
|
const resetSelectedNodes = () => {
|
|
|
|
selectedNodes.value = [];
|
|
|
|
};
|
|
|
|
|
|
|
|
const setCurlCommand = (payload: { name: string; command: string }) => {
|
|
|
|
modalsById.value[payload.name] = {
|
|
|
|
...modalsById.value[payload.name],
|
|
|
|
curlCommand: payload.command,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
const toggleSidebarMenuCollapse = () => {
|
|
|
|
sidebarMenuCollapsed.value = !sidebarMenuCollapsed.value;
|
|
|
|
};
|
|
|
|
|
|
|
|
const getCurlToJson = async (curlCommand: string) => {
|
|
|
|
const parameters = await curlParserApi.getCurlToJson(rootStore.restApiContext, curlCommand);
|
|
|
|
|
|
|
|
// Normalize placeholder values
|
|
|
|
if (parameters['parameters.url']) {
|
|
|
|
parameters['parameters.url'] = parameters['parameters.url']
|
|
|
|
.replaceAll('%7B', '{')
|
|
|
|
.replaceAll('%7D', '}');
|
|
|
|
}
|
|
|
|
|
|
|
|
return parameters;
|
|
|
|
};
|
|
|
|
|
|
|
|
const goToUpgrade = async (
|
|
|
|
source: CloudUpdateLinkSourceType,
|
|
|
|
utm_campaign: UTMCampaign,
|
|
|
|
mode: 'open' | 'redirect' = 'open',
|
|
|
|
) => {
|
|
|
|
const { usageLeft, trialDaysLeft, userIsTrialing } = cloudPlanStore;
|
|
|
|
const { executionsLeft, workflowsLeft } = usageLeft;
|
|
|
|
const deploymentType = settingsStore.deploymentType;
|
|
|
|
|
|
|
|
telemetryStore.track('User clicked upgrade CTA', {
|
|
|
|
source,
|
|
|
|
isTrial: userIsTrialing,
|
|
|
|
deploymentType,
|
|
|
|
trialDaysLeft,
|
|
|
|
executionsLeft,
|
|
|
|
workflowsLeft,
|
|
|
|
});
|
|
|
|
|
|
|
|
const upgradeLink = await generateUpgradeLinkUrl(source, utm_campaign, deploymentType);
|
|
|
|
|
|
|
|
if (mode === 'open') {
|
|
|
|
window.open(upgradeLink, '_blank');
|
|
|
|
} else {
|
|
|
|
location.href = upgradeLink;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const removeBannerFromStack = (name: BannerName) => {
|
|
|
|
bannerStack.value = bannerStack.value.filter((bannerName) => bannerName !== name);
|
|
|
|
};
|
|
|
|
|
|
|
|
const dismissBanner = async (name: BannerName, type: 'temporary' | 'permanent' = 'temporary') => {
|
|
|
|
if (type === 'permanent') {
|
|
|
|
await dismissBannerPermanently(rootStore.restApiContext, {
|
|
|
|
bannerName: name,
|
|
|
|
dismissedBanners: settingsStore.permanentlyDismissedBanners,
|
2023-05-30 06:49:27 -07:00
|
|
|
});
|
2024-07-03 12:11:40 -07:00
|
|
|
removeBannerFromStack(name);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
removeBannerFromStack(name);
|
|
|
|
};
|
2023-10-06 04:16:27 -07:00
|
|
|
|
2024-07-03 12:11:40 -07:00
|
|
|
const updateBannersHeight = (newHeight: number) => {
|
|
|
|
bannersHeight.value = newHeight;
|
|
|
|
};
|
2023-10-06 04:16:27 -07:00
|
|
|
|
2024-07-03 12:11:40 -07:00
|
|
|
const pushBannerToStack = (name: BannerName) => {
|
|
|
|
if (bannerStack.value.includes(name)) return;
|
|
|
|
bannerStack.value.push(name);
|
|
|
|
};
|
|
|
|
|
|
|
|
const clearBannerStack = () => {
|
|
|
|
bannerStack.value = [];
|
|
|
|
};
|
|
|
|
|
|
|
|
const setNotificationsForView = (view: VIEWS, notifications: NotificationOptions[]) => {
|
|
|
|
pendingNotificationsForViews.value[view] = notifications;
|
|
|
|
};
|
|
|
|
|
|
|
|
const deleteNotificationsForView = (view: VIEWS) => {
|
|
|
|
delete pendingNotificationsForViews.value[view];
|
|
|
|
};
|
|
|
|
|
2024-07-18 01:59:11 -07:00
|
|
|
function resetLastInteractedWith() {
|
|
|
|
lastInteractedWithNodeConnection.value = null;
|
|
|
|
lastInteractedWithNodeHandle.value = null;
|
|
|
|
lastInteractedWithNodeId.value = null;
|
2024-09-03 05:11:44 -07:00
|
|
|
lastCancelledConnectionPosition.value = null;
|
2024-07-18 01:59:11 -07:00
|
|
|
}
|
|
|
|
|
2024-07-03 12:11:40 -07:00
|
|
|
return {
|
2024-08-28 05:01:05 -07:00
|
|
|
appGridWidth,
|
2024-07-03 12:11:40 -07:00
|
|
|
appliedTheme,
|
|
|
|
logo,
|
|
|
|
contextBasedTranslationKeys,
|
|
|
|
getLastSelectedNode,
|
|
|
|
isVersionsOpen,
|
|
|
|
isModalActiveById,
|
|
|
|
fakeDoorsByLocation,
|
|
|
|
isReadOnlyView,
|
|
|
|
isActionActive,
|
|
|
|
activeActions,
|
|
|
|
getSelectedNodes,
|
|
|
|
isNodeSelected,
|
|
|
|
headerHeight,
|
|
|
|
stateIsDirty,
|
|
|
|
lastSelectedNodeOutputIndex,
|
|
|
|
activeCredentialType,
|
|
|
|
lastSelectedNode,
|
|
|
|
selectedNodes,
|
|
|
|
bannersHeight,
|
|
|
|
lastSelectedNodeEndpointUuid,
|
2024-07-18 01:59:11 -07:00
|
|
|
lastInteractedWithNodeConnection,
|
|
|
|
lastInteractedWithNodeHandle,
|
|
|
|
lastInteractedWithNodeId,
|
|
|
|
lastInteractedWithNode,
|
2024-09-03 05:11:44 -07:00
|
|
|
lastCancelledConnectionPosition,
|
2024-07-03 12:11:40 -07:00
|
|
|
nodeViewOffsetPosition,
|
|
|
|
nodeViewMoveInProgress,
|
|
|
|
nodeViewInitialized,
|
|
|
|
addFirstStepOnLoad,
|
|
|
|
isCreateNodeActive,
|
|
|
|
sidebarMenuCollapsed,
|
|
|
|
fakeDoorFeatures,
|
|
|
|
bannerStack,
|
|
|
|
theme,
|
|
|
|
modalsById,
|
|
|
|
currentView,
|
|
|
|
isAnyModalOpen,
|
|
|
|
fakeDoorsById,
|
|
|
|
pendingNotificationsForViews,
|
|
|
|
setTheme,
|
|
|
|
setMode,
|
|
|
|
setActiveId,
|
|
|
|
setShowAuthSelector,
|
|
|
|
setModalData,
|
|
|
|
openModalWithData,
|
|
|
|
openModal,
|
|
|
|
closeModal,
|
|
|
|
draggableStartDragging,
|
|
|
|
draggableStopDragging,
|
|
|
|
setDraggableStickyPos,
|
|
|
|
setDraggableCanDrop,
|
|
|
|
openDeleteUserModal,
|
|
|
|
openExistingCredential,
|
|
|
|
openNewCredential,
|
|
|
|
submitContactEmail,
|
|
|
|
openCommunityPackageUninstallConfirmModal,
|
|
|
|
openCommunityPackageUpdateConfirmModal,
|
|
|
|
addActiveAction,
|
|
|
|
removeActiveAction,
|
|
|
|
addSelectedNode,
|
|
|
|
removeNodeFromSelection,
|
|
|
|
resetSelectedNodes,
|
|
|
|
setCurlCommand,
|
|
|
|
toggleSidebarMenuCollapse,
|
|
|
|
getCurlToJson,
|
|
|
|
goToUpgrade,
|
|
|
|
removeBannerFromStack,
|
|
|
|
dismissBanner,
|
|
|
|
updateBannersHeight,
|
|
|
|
pushBannerToStack,
|
|
|
|
clearBannerStack,
|
|
|
|
setNotificationsForView,
|
|
|
|
deleteNotificationsForView,
|
2024-07-18 01:59:11 -07:00
|
|
|
resetLastInteractedWith,
|
2024-07-03 12:11:40 -07:00
|
|
|
};
|
2022-11-04 06:04:31 -07:00
|
|
|
});
|
2024-01-05 08:07:57 -08:00
|
|
|
|
|
|
|
/**
|
2024-08-13 05:56:54 -07:00
|
|
|
* Helper function for listening to model opening and closings in the store
|
2024-01-05 08:07:57 -08:00
|
|
|
*/
|
|
|
|
export const listenForModalChanges = (opts: {
|
|
|
|
store: UiStore;
|
|
|
|
onModalOpened?: (name: keyof Modals) => void;
|
|
|
|
onModalClosed?: (name: keyof Modals) => void;
|
2024-01-08 03:56:16 -08:00
|
|
|
}) => {
|
2024-01-05 08:07:57 -08:00
|
|
|
const { store, onModalClosed, onModalOpened } = opts;
|
|
|
|
const listeningForActions = ['openModal', 'openModalWithData', 'closeModal'];
|
|
|
|
|
2024-01-08 03:56:16 -08:00
|
|
|
return store.$onAction((result) => {
|
2024-01-05 08:07:57 -08:00
|
|
|
const { name, after, args } = result;
|
|
|
|
after(async () => {
|
|
|
|
if (!listeningForActions.includes(name)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (name) {
|
|
|
|
case 'openModal': {
|
|
|
|
const modalName = args[0];
|
|
|
|
onModalOpened?.(modalName);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 'openModalWithData': {
|
|
|
|
const { name: modalName } = args[0] ?? {};
|
|
|
|
onModalOpened?.(modalName);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 'closeModal': {
|
|
|
|
const modalName = args[0];
|
|
|
|
onModalClosed?.(modalName);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
2024-07-03 12:11:40 -07:00
|
|
|
|
|
|
|
export const generateUpgradeLinkUrl = async (
|
|
|
|
source: string,
|
|
|
|
utm_campaign: string,
|
|
|
|
deploymentType: string,
|
|
|
|
) => {
|
|
|
|
let linkUrl = '';
|
|
|
|
|
|
|
|
const searchParams = new URLSearchParams();
|
|
|
|
|
|
|
|
const cloudPlanStore = useCloudPlanStore();
|
|
|
|
|
|
|
|
if (deploymentType === 'cloud' && hasPermission(['instanceOwner'])) {
|
|
|
|
const adminPanelHost = new URL(window.location.href).host.split('.').slice(1).join('.');
|
|
|
|
const { code } = await cloudPlanStore.getAutoLoginCode();
|
|
|
|
linkUrl = `https://${adminPanelHost}/login`;
|
|
|
|
searchParams.set('code', code);
|
|
|
|
searchParams.set('returnPath', '/account/change-plan');
|
|
|
|
} else {
|
|
|
|
linkUrl = N8N_PRICING_PAGE_URL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (utm_campaign) {
|
|
|
|
searchParams.set('utm_campaign', utm_campaign);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (source) {
|
|
|
|
searchParams.set('source', source);
|
|
|
|
}
|
|
|
|
return `${linkUrl}?${searchParams.toString()}`;
|
|
|
|
};
|