mirror of
https://github.com/n8n-io/n8n.git
synced 2025-03-05 20:50:17 -08:00
* ✨ Added history store and mixin * ✨ Implemented node position change undo/redo * ✨ Implemented move nodes bulk command * ⚡ Not clearing the redo stack after pushing the bulk command * 🔨 Implemented commands using classes * 🔥 Removed unnecessary interfaces and actions * 🔥 Removing unused constants * 🔨 Refactoring classes file * ⚡ Adding eventBus to command obects * ✨ Added undo/redo support for adding and removing nodes * ✨ Implemented initial add/remove connections undo support * ⚡ Covering some corner cases with reconnecting nodes * ⚡ Adding undo support for reconnecting nodes * ⚡ Fixing going back and forward between undo and redo * ✨ Implemented async command revert * ⚡ Preventing push to undo if bulk redo/undo is in progress * ⚡ Handling re-connecting nodes and stopped pushing empty bulk actions to undo stack * ✨ Handling adding a node between two connected nodes * ⚡ Handling the case of removing multiple connections on the same index. Adding debounce to undo/redo keyboard calls * ⚡ Removing unnecessary timeouts, adding missing awaits, refactoring * ⚡ Resetting history when opening new workflow, fixing incorrect bulk recording when inserting node * ✔️ Fixing lint error * ⚡ Minor refactoring + some temporary debugging logs * ⚡ Preserving node properties when undoing it's removal, removing some unused repaint code * ✨ Added undo/redo support for import workflow and node enable/disable * 🔥 Removing some unused constant * ✨ Added undo/redo support for renaming nodes * ⚡ Fixing rename history recording * ✨ Added undo/redo support for duplicating nodes * 📈 Implemented telemetry events * 🔨 A bit of refactoring * ⚡ Fixing edgecases in removing connection and moving nodes * ⚡ Handling case of adding duplicate nodes when going back and forward in history * ⚡ Recording connections added directly to store * ⚡ Moving main history reset after wf is opened * 🔨 Simplifying rename recording * 📈 Adding NDV telemetry event, updating existing event name case * 📈 Updating telemetry events * ✅ Added initial undo/redo tests * ⚡ Fixing duplicate connections on undo/redo * ⚡ Stopping undo events from firing constantly on keydown * ✅ Added connection test for undo/redo * 📈 Updated telemetry event for hitting undo in NDV * ⚡ Adding undo support for disabling nodes using keyboard shortcuts * ✅ Added more tests for adding and deleting nodes undo/redo * ⚡ Preventing adding duplicate connection commands to history * 📈 Adding connection assertions to delete node tests * ⚡ Clearing redo stack when new change is added * ⚡ Preventing adding connection actions to undo stack while redoing them * 👌 Addressing PR comments part 1 * 👌 Moving undo logic for disabling nodes to `NodeView` * 👌 Implemented command comparing logic * ⚡ Fix for not clearing redo stack on every user action * ⚡ Fixing recording when moving nodes * ⚡ Fixing undo for moving connections * ⚡ Fixing tracking new nodes after latest merge * ⚡ Fixing broken bulk delete * ✅ Added tests for moving nodes * ✅ Added tests for deleting connections * ✅ Added tests for disabling nodes * ✅ Added node rename tests * ✅ Added tests for duplicating and pasting nodes * ✅ Added multi-step undo/redo tests * ✅ Fixing assertion condition * ✅ Fixing timeout issue between keyboard strokes * ⬆️ Updating pnpm lock file * ✅ Waiting for page load to finish before each test * ✅ Adding proper handling of meta key press * 🚨 Temporarily disabling slack notifications * ✅ Adding check before clicking connection actions * ⚡ Removing comments from other undo tests * 🎨 Fixing a typo
149 lines
2.9 KiB
Vue
149 lines
2.9 KiB
Vue
<template>
|
|
<span :class="$style.container" data-test-id="node-title-container" @click="onEdit">
|
|
<span :class="$style.iconWrapper"><NodeIcon :nodeType="nodeType" :size="18" /></span>
|
|
<n8n-popover placement="right" width="200" :value="editName" :disabled="readOnly">
|
|
<div
|
|
:class="$style.editContainer"
|
|
@keydown.enter="onRename"
|
|
@keydown.stop
|
|
@keydown.esc="editName = false"
|
|
>
|
|
<n8n-text :bold="true" color="text-base" tag="div">{{
|
|
$locale.baseText('ndv.title.renameNode')
|
|
}}</n8n-text>
|
|
<n8n-input ref="input" size="small" v-model="newName" data-test-id="node-rename-input" />
|
|
<div :class="$style.editButtons">
|
|
<n8n-button
|
|
type="secondary"
|
|
size="small"
|
|
@click="editName = false"
|
|
:label="$locale.baseText('ndv.title.cancel')"
|
|
/>
|
|
<n8n-button
|
|
type="primary"
|
|
size="small"
|
|
@click="onRename"
|
|
:label="$locale.baseText('ndv.title.rename')"
|
|
/>
|
|
</div>
|
|
</div>
|
|
<template #reference>
|
|
<div class="ph-no-capture" :class="{ [$style.title]: true, [$style.hoverable]: !readOnly }">
|
|
{{ value }}
|
|
<div :class="$style.editIconContainer">
|
|
<font-awesome-icon :class="$style.editIcon" icon="pencil-alt" v-if="!readOnly" />
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</n8n-popover>
|
|
</span>
|
|
</template>
|
|
|
|
<script lang="ts">
|
|
import Vue from 'vue';
|
|
|
|
export default Vue.extend({
|
|
name: 'NodeTitle',
|
|
props: {
|
|
value: {
|
|
type: String,
|
|
},
|
|
nodeType: {},
|
|
readOnly: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
},
|
|
data() {
|
|
return {
|
|
editName: false,
|
|
newName: '',
|
|
};
|
|
},
|
|
methods: {
|
|
onEdit() {
|
|
this.newName = this.value;
|
|
this.editName = true;
|
|
this.$nextTick(() => {
|
|
const input = this.$refs.input;
|
|
if (input) {
|
|
(input as HTMLInputElement).focus();
|
|
}
|
|
});
|
|
},
|
|
onRename() {
|
|
if (this.newName.trim() !== '') {
|
|
this.$emit('input', this.newName.trim());
|
|
}
|
|
|
|
this.editName = false;
|
|
},
|
|
},
|
|
});
|
|
</script>
|
|
|
|
<style lang="scss" module>
|
|
.container {
|
|
font-weight: var(--font-weight-bold);
|
|
display: flex;
|
|
font-size: var(--font-size-m);
|
|
line-height: var(--font-line-height-compact);
|
|
overflow-wrap: anywhere;
|
|
padding-right: var(--spacing-s);
|
|
overflow: hidden;
|
|
}
|
|
|
|
.title {
|
|
max-height: 100px;
|
|
display: -webkit-box;
|
|
-webkit-line-clamp: 5;
|
|
-webkit-box-orient: vertical;
|
|
color: var(--color-text-dark);
|
|
}
|
|
|
|
.hoverable {
|
|
&:hover {
|
|
cursor: pointer;
|
|
.editIcon {
|
|
display: inline-block;
|
|
}
|
|
}
|
|
}
|
|
|
|
.iconWrapper {
|
|
display: inline-flex;
|
|
margin-right: var(--spacing-2xs);
|
|
}
|
|
|
|
.editIcon {
|
|
display: none;
|
|
font-size: var(--font-size-xs);
|
|
color: var(--color-text-base);
|
|
position: absolute;
|
|
bottom: 0;
|
|
}
|
|
|
|
.editIconContainer {
|
|
display: inline-block;
|
|
position: relative;
|
|
width: 0;
|
|
}
|
|
|
|
.editButtons {
|
|
text-align: right;
|
|
margin-top: var(--spacing-s);
|
|
|
|
> * {
|
|
margin-left: var(--spacing-4xs);
|
|
}
|
|
}
|
|
|
|
.editContainer {
|
|
text-align: left;
|
|
|
|
> *:first-child {
|
|
margin-bottom: var(--spacing-4xs);
|
|
}
|
|
}
|
|
</style>
|