diff --git a/app/javascript/dashboard/components-next/Contacts/ContactLabels/ContactLabels.vue b/app/javascript/dashboard/components-next/Contacts/ContactLabels/ContactLabels.vue index 6f1c5f11a..255c1b113 100644 --- a/app/javascript/dashboard/components-next/Contacts/ContactLabels/ContactLabels.vue +++ b/app/javascript/dashboard/components-next/Contacts/ContactLabels/ContactLabels.vue @@ -3,8 +3,8 @@ import { computed, watch, onMounted, ref } from 'vue'; import { useRoute } from 'vue-router'; import { useMapGetter, useStore } from 'dashboard/composables/store'; -import LabelItem from 'dashboard/components-next/label/LabelItem.vue'; -import AddLabel from 'dashboard/components-next/label/AddLabel.vue'; +import LabelItem from 'dashboard/components-next/Label/LabelItem.vue'; +import AddLabel from 'dashboard/components-next/Label/AddLabel.vue'; const props = defineProps({ contactId: { diff --git a/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticleEditorPage/ArticleEditor.vue b/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticleEditorPage/ArticleEditor.vue index f15135737..f5b925fbe 100644 --- a/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticleEditorPage/ArticleEditor.vue +++ b/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticleEditorPage/ArticleEditor.vue @@ -27,6 +27,7 @@ const props = defineProps({ const emit = defineEmits([ 'saveArticle', + 'saveArticleAsync', 'goBack', 'setAuthor', 'setCategory', @@ -35,19 +36,37 @@ const emit = defineEmits([ const { t } = useI18n(); -const saveArticle = debounce(value => emit('saveArticle', value), 600, false); +const saveAndSync = value => { + emit('saveArticle', value); +}; + +// this will only send the data to the backend +// but will not update the local state preventing unnecessary re-renders +// since the data is already saved and we keep the editor text as the source of truth +const quickSave = debounce( + value => emit('saveArticleAsync', value), + 400, + false +); + +// 2.5 seconds is enough to know that the user has stopped typing and is taking a pause +// so we can save the data to the backend and retrieve the updated data +// this will update the local state with response data +const saveAndSyncDebounced = debounce(saveAndSync, 2500, false); const articleTitle = computed({ get: () => props.article.title, set: value => { - saveArticle({ title: value }); + quickSave({ title: value }); + saveAndSyncDebounced({ title: value }); }, }); const articleContent = computed({ get: () => props.article.content, set: content => { - saveArticle({ content }); + quickSave({ content }); + saveAndSyncDebounced({ content }); }, }); @@ -93,7 +112,7 @@ const previewArticle = () => { /> diff --git a/app/javascript/dashboard/components-next/label/AddLabel.vue b/app/javascript/dashboard/components-next/label/AddLabel.vue deleted file mode 100644 index c9571e771..000000000 --- a/app/javascript/dashboard/components-next/label/AddLabel.vue +++ /dev/null @@ -1,49 +0,0 @@ - - - diff --git a/app/javascript/dashboard/components-next/label/LabelItem.vue b/app/javascript/dashboard/components-next/label/LabelItem.vue deleted file mode 100644 index b96b9b368..000000000 --- a/app/javascript/dashboard/components-next/label/LabelItem.vue +++ /dev/null @@ -1,22 +0,0 @@ - - - diff --git a/app/javascript/dashboard/components-next/label/story/AddLabel.story.vue b/app/javascript/dashboard/components-next/label/story/AddLabel.story.vue deleted file mode 100644 index ea6466feb..000000000 --- a/app/javascript/dashboard/components-next/label/story/AddLabel.story.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - diff --git a/app/javascript/dashboard/components-next/label/story/Label.story.vue b/app/javascript/dashboard/components-next/label/story/Label.story.vue deleted file mode 100644 index 5319d56ae..000000000 --- a/app/javascript/dashboard/components-next/label/story/Label.story.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - diff --git a/app/javascript/dashboard/components-next/label/story/fixtures.js b/app/javascript/dashboard/components-next/label/story/fixtures.js deleted file mode 100644 index 980ba8c0d..000000000 --- a/app/javascript/dashboard/components-next/label/story/fixtures.js +++ /dev/null @@ -1,62 +0,0 @@ -export const label = { - id: 1, - title: 'delivery', - color: '#A2FDD5', -}; - -export const labelMenuItems = [ - { - label: 'delivery', - value: 3, - thumbnail: { - color: '#A2FDD5', - }, - isSelected: true, - action: 'addLabel', - }, - { - label: 'lead', - value: 6, - thumbnail: { - color: '#F161C8', - }, - isSelected: false, - action: 'addLabel', - }, - { - label: 'ops-handover', - value: 4, - thumbnail: { - color: '#A53326', - }, - isSelected: false, - action: 'addLabel', - }, - { - label: 'billing', - value: 1, - thumbnail: { - color: '#28AD21', - }, - isSelected: false, - action: 'addLabel', - }, - { - label: 'premium-customer', - value: 5, - thumbnail: { - color: '#6FD4EF', - }, - isSelected: false, - action: 'addLabel', - }, - { - label: 'software', - value: 2, - thumbnail: { - color: '#8F6EF2', - }, - isSelected: false, - action: 'addLabel', - }, -]; diff --git a/app/javascript/dashboard/routes/dashboard/helpcenter/pages/PortalsArticlesEditPage.vue b/app/javascript/dashboard/routes/dashboard/helpcenter/pages/PortalsArticlesEditPage.vue index 736b34096..3bb868a58 100644 --- a/app/javascript/dashboard/routes/dashboard/helpcenter/pages/PortalsArticlesEditPage.vue +++ b/app/javascript/dashboard/routes/dashboard/helpcenter/pages/PortalsArticlesEditPage.vue @@ -34,10 +34,11 @@ const portalLink = computed(() => { ); }); -const saveArticle = async ({ ...values }) => { +const saveArticle = async ({ ...values }, isAsync = false) => { + const actionToDispatch = isAsync ? 'articles/updateAsync' : 'articles/update'; isUpdating.value = true; try { - await store.dispatch('articles/update', { + await store.dispatch(actionToDispatch, { portalSlug, articleId: articleSlug, ...values, @@ -55,6 +56,10 @@ const saveArticle = async ({ ...values }) => { } }; +const saveArticleAsync = async ({ ...values }) => { + saveArticle({ ...values }, true); +}; + const isCategoryArticles = computed(() => { return ( route.name === 'portals_categories_articles_index' || @@ -92,9 +97,7 @@ const previewArticle = () => { }); }; -onMounted(() => { - fetchArticleDetails(); -}); +onMounted(fetchArticleDetails);