diff --git a/cms/src/components/OrderCartPanel.vue b/cms/src/components/OrderCartPanel.vue index d9ad223..e85f19a 100644 --- a/cms/src/components/OrderCartPanel.vue +++ b/cms/src/components/OrderCartPanel.vue @@ -15,7 +15,7 @@ target="_blank" rel="noopener" > - {{ row.productTitle }} + {{ getProductTitle(row.productTitle) }} @@ -113,6 +113,7 @@ import type { OrderExtended } from '@/types/order/OrderExtended'; import { DeliveryMode } from '@/types/product/DeliveryMode'; import { formatDeliveryMode } from '@/utils/product/formatDeliveryMode'; import { formatFiatPrice } from '@/utils/formatFiatPrice'; +import { getProductTitle } from '@/utils/product/getProductTitle'; import { resolveAxiosErrorMessage } from '@/utils/resolveAxiosErrorMessage'; const props = defineProps({ @@ -143,7 +144,7 @@ const openAutoDelivery = (line: OrderLine): void => { const markAsFulfilled = async (line: OrderLine): Promise => { try { await ElMessageBox.confirm( - `Mark "${line.productTitle}" (${line.variantTitle}) as fulfilled? This cannot be undone.`, + `Mark "${getProductTitle(line.productTitle)}" (${line.variantTitle}) as fulfilled? This cannot be undone.`, 'Mark as fulfilled', { type: 'warning', diff --git a/cms/src/components/OrderLineAutoFulfillmentModal.vue b/cms/src/components/OrderLineAutoFulfillmentModal.vue index d5470d0..7c43814 100644 --- a/cms/src/components/OrderLineAutoFulfillmentModal.vue +++ b/cms/src/components/OrderLineAutoFulfillmentModal.vue @@ -70,6 +70,7 @@ import type { OrderLine } from '@/types/order/OrderLine'; import type { OrderLineAutoFulfillmentItem } from '@/types/order/OrderLineAutoFulfillmentItem'; import type { OrderLineAutoFulfillmentItemAttachment } from '@/types/order/OrderLineAutoFulfillmentItemAttachment'; import { formatFileSize } from '@/utils/formatFileSize'; +import { getProductTitle } from '@/utils/product/getProductTitle'; const props = defineProps({ modelValue: { @@ -99,7 +100,7 @@ const lineSummary = computed((): string => { return ''; } - return `${line.productTitle} · ${line.variantTitle}`; + return `${getProductTitle(line.productTitle)} · ${line.variantTitle}`; }); const downloadAttachment = async ( diff --git a/cms/src/consts/untitledBlogPostTitle.ts b/cms/src/consts/untitledBlogPostTitle.ts new file mode 100644 index 0000000..d8ff6c7 --- /dev/null +++ b/cms/src/consts/untitledBlogPostTitle.ts @@ -0,0 +1 @@ +export const UNTITLED_BLOG_POST_TITLE = '(untitled)'; diff --git a/cms/src/utils/blog/getBlogPostTitle.ts b/cms/src/utils/blog/getBlogPostTitle.ts new file mode 100644 index 0000000..5814c40 --- /dev/null +++ b/cms/src/utils/blog/getBlogPostTitle.ts @@ -0,0 +1,3 @@ +import { UNTITLED_BLOG_POST_TITLE } from '@/consts/untitledBlogPostTitle'; + +export const getBlogPostTitle = (title: string | undefined | null): string => title || UNTITLED_BLOG_POST_TITLE; diff --git a/cms/src/views/CmsProductDetailView.vue b/cms/src/views/CmsProductDetailView.vue index fb8afeb..4bcb4e1 100644 --- a/cms/src/views/CmsProductDetailView.vue +++ b/cms/src/views/CmsProductDetailView.vue @@ -131,6 +131,7 @@ import { useCategoriesStore } from '@/stores/categories'; import { useProductsStore } from '@/stores/products'; import type { ProductVariantExtended } from '@/types/product/ProductVariantExtended'; import { formatFiatPrice } from '@/utils/formatFiatPrice'; +import { resolveAxiosErrorMessage } from '@/utils/resolveAxiosErrorMessage'; import { ElMessage, ElMessageBox, type FormInstance, type FormRules } from 'element-plus'; import { storeToRefs } from 'pinia'; import { computed, onBeforeMount, reactive, ref } from 'vue'; @@ -241,8 +242,10 @@ const submitProduct = async (): Promise => { }); ElMessage.success('Product saved'); - } catch { - ElMessage.error('Could not save product'); + } catch (e) { + const message = resolveAxiosErrorMessage(e, 'Could not save product'); + + ElMessage.error(message); } finally { productSaving.value = false; } @@ -288,8 +291,10 @@ const confirmDeleteProduct = async (): Promise => { await productsStore.deleteProduct(pid); ElMessage.success('Product deleted'); router.push({ name: ROUTE_NAMES.Products }); - } catch { - ElMessage.error('Could not delete product'); + } catch (e) { + const message = resolveAxiosErrorMessage(e, 'Could not delete product'); + + ElMessage.error(message); } finally { deleteSaving.value = false; }