@tager/admin-mail
Advanced tools
Comparing version 0.2.0 to 0.2.1
@@ -0,0 +0,0 @@ # [0.0.2] (2020-06-06) |
@@ -9,4 +9,4 @@ import Vue from 'vue'; | ||
} | ||
function getTemplate(alias) { | ||
return request.get({ path: '/admin/mail/templates', params: { alias } }); | ||
function getTemplate(templateId) { | ||
return request.get({ path: `/admin/mail/templates/${templateId}` }); | ||
} | ||
@@ -303,7 +303,7 @@ function updateTemplate(alias, payload) { | ||
if (!inject) return | ||
inject("data-v-5edcf0f2_0", { source: "\n\n/*# sourceMappingURL=EmailTemplateList.vue.map */", map: {"version":3,"sources":["EmailTemplateList.vue"],"names":[],"mappings":";;AAEA,gDAAgD","file":"EmailTemplateList.vue"}, media: undefined }); | ||
inject("data-v-579c10c8_0", { source: "\n\n/*# sourceMappingURL=EmailTemplateList.vue.map */", map: {"version":3,"sources":["EmailTemplateList.vue"],"names":[],"mappings":";;AAEA,gDAAgD","file":"EmailTemplateList.vue"}, media: undefined }); | ||
}; | ||
/* scoped */ | ||
const __vue_scope_id__ = "data-v-5edcf0f2"; | ||
const __vue_scope_id__ = "data-v-579c10c8"; | ||
/* module identifier */ | ||
@@ -544,7 +544,7 @@ const __vue_module_identifier__ = undefined; | ||
if (!inject) return | ||
inject("data-v-c4fda376_0", { source: ".legend-vars h4[data-v-c4fda376] {\n margin-bottom: 0.5rem;\n}\n.legend-vars ul[data-v-c4fda376] {\n display: inline-block;\n padding-left: 1.2rem;\n list-style-type: decimal;\n}\n.legend-vars ul li[data-v-c4fda376]:not(:last-child) {\n border-bottom: 1px solid #eee;\n}\n.legend-vars button[data-v-c4fda376] {\n margin-left: 0.5rem;\n}\n\n/*# sourceMappingURL=EmailTemplateForm.vue.map */", map: {"version":3,"sources":["D:\\Work\\tager-admin-mail\\src\\views\\EmailTemplateForm.vue","EmailTemplateForm.vue"],"names":[],"mappings":"AA0KA;EACA,qBAAA;ACzKA;AD2KA;EACA,qBAAA;EACA,oBAAA;EACA,wBAAA;ACzKA;AD2KA;EACA,6BAAA;ACzKA;AD6KA;EACA,mBAAA;AC3KA;;AAEA,gDAAgD","file":"EmailTemplateForm.vue","sourcesContent":["<template>\n <page\n :title=\"pageTitle\"\n :is-content-loading=\"isInitialLoading\"\n :footer=\"{\n backHref: templateListRoutePath,\n onSubmit: submitForm,\n isSubmitting: isSubmitting,\n }\"\n >\n <form novalidate @submit.prevent>\n <form-field\n v-model=\"values.subject\"\n name=\"subject\"\n :error=\"errors.subject\"\n label=\"Subject\"\n />\n\n <form-field\n v-model=\"values.recipients\"\n name=\"recipients\"\n :error=\"errors.recipients\"\n label=\"Recipients\"\n />\n\n <form-field-rich-text-input\n v-model=\"values.body\"\n name=\"body\"\n :error=\"errors.body\"\n label=\"Body\"\n />\n\n <div\n v-if=\"emailTemplate && emailTemplate.variables.length > 0\"\n class=\"legend-vars\"\n >\n <h4 class=\"title\">Template variables</h4>\n <ul>\n <li v-for=\"variable of emailTemplate.variables\" :key=\"variable.key\">\n <span>{{ variable.label }}</span> -\n <span>\n {{ getKeyTemplate(variable.key) }}\n </span>\n <base-button\n variant=\"icon\"\n title=\"Copy\"\n @click=\"copyVarTemplate(variable.key)\"\n >\n <svg-icon name=\"contentCopy\" />\n </base-button>\n </li>\n </ul>\n </div>\n </form>\n </page>\n</template>\n\n<script lang=\"ts\">\nimport Vue from 'vue';\nimport { convertRequestErrorToMap, Nullable } from '@tager/admin-services';\n\nimport {\n getTemplate,\n TemplateUpdatePayload,\n updateTemplate,\n} from '../services/requests';\nimport { EmailTemplate } from '../typings/model';\nimport { getEmailTemplateListUrl } from '../utils/paths';\n\ntype FormValues = { subject: string; body: string; recipients: string };\n\nexport default Vue.extend({\n name: 'EmailTemplateForm',\n data(): {\n emailTemplate: Nullable<EmailTemplate>;\n values: FormValues;\n errors: Record<string, string>;\n isSubmitting: boolean;\n isInitialLoading: boolean;\n templateListRoutePath: string;\n } {\n return {\n emailTemplate: null,\n values: { subject: '', body: '', recipients: '' },\n errors: {},\n isSubmitting: false,\n isInitialLoading: false,\n templateListRoutePath: getEmailTemplateListUrl(),\n };\n },\n computed: {\n templateId(): string {\n return this.$route.params.templateId;\n },\n pageTitle(): string {\n return this.emailTemplate\n ? `E-Mail template \"${this.emailTemplate.name}\"`\n : 'E-Mail template';\n },\n },\n mounted(): void {\n this.isInitialLoading = true;\n\n getTemplate(this.templateId)\n .then((response) => {\n this.values = this.convertEmailTemplateToFormValues(response.data);\n this.emailTemplate = response.data;\n })\n .catch(console.error)\n .finally(() => {\n this.isInitialLoading = false;\n });\n },\n methods: {\n convertEmailTemplateToFormValues(template: EmailTemplate): FormValues {\n return {\n subject: template.subject,\n body: template.body,\n recipients: template.recipients.join(','),\n };\n },\n submitForm() {\n this.isSubmitting = true;\n\n const body: TemplateUpdatePayload = {\n ...this.values,\n recipients: this.values.recipients\n .split(',')\n .map((recipient) => recipient.trim())\n .filter(Boolean),\n };\n\n updateTemplate(this.templateId, body)\n .then(() => {\n this.errors = {};\n this.$router.push(getEmailTemplateListUrl());\n\n this.$toast({\n variant: 'success',\n title: 'Success',\n body: 'Template has been successfully updated',\n });\n })\n .catch((error) => {\n console.error(error);\n this.errors = convertRequestErrorToMap(error);\n this.$toast({\n variant: 'danger',\n title: 'Error',\n body: 'Template update has been failed',\n });\n })\n .finally(() => {\n this.isSubmitting = false;\n });\n },\n getKeyTemplate(key: string): string {\n return `{{${key}}}`;\n },\n copyVarTemplate(key: string) {\n navigator.clipboard\n .writeText(this.getKeyTemplate(key))\n .catch(console.error);\n },\n },\n});\n</script>\n\n<style scoped lang=\"scss\">\n.legend-vars {\n h4 {\n margin-bottom: 0.5rem;\n }\n ul {\n display: inline-block;\n padding-left: 1.2rem;\n list-style-type: decimal;\n\n li:not(:last-child) {\n border-bottom: 1px solid #eee;\n }\n }\n\n button {\n margin-left: 0.5rem;\n }\n}\n</style>\n",".legend-vars h4 {\n margin-bottom: 0.5rem;\n}\n.legend-vars ul {\n display: inline-block;\n padding-left: 1.2rem;\n list-style-type: decimal;\n}\n.legend-vars ul li:not(:last-child) {\n border-bottom: 1px solid #eee;\n}\n.legend-vars button {\n margin-left: 0.5rem;\n}\n\n/*# sourceMappingURL=EmailTemplateForm.vue.map */"]}, media: undefined }); | ||
inject("data-v-20871140_0", { source: ".legend-vars h4[data-v-20871140] {\n margin-bottom: 0.5rem;\n}\n.legend-vars ul[data-v-20871140] {\n display: inline-block;\n padding-left: 1.2rem;\n list-style-type: decimal;\n}\n.legend-vars ul li[data-v-20871140]:not(:last-child) {\n border-bottom: 1px solid #eee;\n}\n.legend-vars button[data-v-20871140] {\n margin-left: 0.5rem;\n}\n\n/*# sourceMappingURL=EmailTemplateForm.vue.map */", map: {"version":3,"sources":["C:\\Work\\tager-admin-mail\\src\\views\\EmailTemplateForm.vue","EmailTemplateForm.vue"],"names":[],"mappings":"AA0KA;EACA,qBAAA;ACzKA;AD2KA;EACA,qBAAA;EACA,oBAAA;EACA,wBAAA;ACzKA;AD2KA;EACA,6BAAA;ACzKA;AD6KA;EACA,mBAAA;AC3KA;;AAEA,gDAAgD","file":"EmailTemplateForm.vue","sourcesContent":["<template>\r\n <page\r\n :title=\"pageTitle\"\r\n :is-content-loading=\"isInitialLoading\"\r\n :footer=\"{\r\n backHref: templateListRoutePath,\r\n onSubmit: submitForm,\r\n isSubmitting: isSubmitting,\r\n }\"\r\n >\r\n <form novalidate @submit.prevent>\r\n <form-field\r\n v-model=\"values.subject\"\r\n name=\"subject\"\r\n :error=\"errors.subject\"\r\n label=\"Subject\"\r\n />\r\n\r\n <form-field\r\n v-model=\"values.recipients\"\r\n name=\"recipients\"\r\n :error=\"errors.recipients\"\r\n label=\"Recipients\"\r\n />\r\n\r\n <form-field-rich-text-input\r\n v-model=\"values.body\"\r\n name=\"body\"\r\n :error=\"errors.body\"\r\n label=\"Body\"\r\n />\r\n\r\n <div\r\n v-if=\"emailTemplate && emailTemplate.variables.length > 0\"\r\n class=\"legend-vars\"\r\n >\r\n <h4 class=\"title\">Template variables</h4>\r\n <ul>\r\n <li v-for=\"variable of emailTemplate.variables\" :key=\"variable.key\">\r\n <span>{{ variable.label }}</span> -\r\n <span>\r\n {{ getKeyTemplate(variable.key) }}\r\n </span>\r\n <base-button\r\n variant=\"icon\"\r\n title=\"Copy\"\r\n @click=\"copyVarTemplate(variable.key)\"\r\n >\r\n <svg-icon name=\"contentCopy\" />\r\n </base-button>\r\n </li>\r\n </ul>\r\n </div>\r\n </form>\r\n </page>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport Vue from 'vue';\r\nimport { convertRequestErrorToMap, Nullable } from '@tager/admin-services';\r\n\r\nimport {\r\n getTemplate,\r\n TemplateUpdatePayload,\r\n updateTemplate,\r\n} from '../services/requests';\r\nimport { EmailTemplate } from '../typings/model';\r\nimport { getEmailTemplateListUrl } from '../utils/paths';\r\n\r\ntype FormValues = { subject: string; body: string; recipients: string };\r\n\r\nexport default Vue.extend({\r\n name: 'EmailTemplateForm',\r\n data(): {\r\n emailTemplate: Nullable<EmailTemplate>;\r\n values: FormValues;\r\n errors: Record<string, string>;\r\n isSubmitting: boolean;\r\n isInitialLoading: boolean;\r\n templateListRoutePath: string;\r\n } {\r\n return {\r\n emailTemplate: null,\r\n values: { subject: '', body: '', recipients: '' },\r\n errors: {},\r\n isSubmitting: false,\r\n isInitialLoading: false,\r\n templateListRoutePath: getEmailTemplateListUrl(),\r\n };\r\n },\r\n computed: {\r\n templateId(): string {\r\n return this.$route.params.templateId;\r\n },\r\n pageTitle(): string {\r\n return this.emailTemplate\r\n ? `E-Mail template \"${this.emailTemplate.name}\"`\r\n : 'E-Mail template';\r\n },\r\n },\r\n mounted(): void {\r\n this.isInitialLoading = true;\r\n\r\n getTemplate(this.templateId)\r\n .then((response) => {\r\n this.values = this.convertEmailTemplateToFormValues(response.data);\r\n this.emailTemplate = response.data;\r\n })\r\n .catch(console.error)\r\n .finally(() => {\r\n this.isInitialLoading = false;\r\n });\r\n },\r\n methods: {\r\n convertEmailTemplateToFormValues(template: EmailTemplate): FormValues {\r\n return {\r\n subject: template.subject,\r\n body: template.body,\r\n recipients: template.recipients.join(','),\r\n };\r\n },\r\n submitForm() {\r\n this.isSubmitting = true;\r\n\r\n const body: TemplateUpdatePayload = {\r\n ...this.values,\r\n recipients: this.values.recipients\r\n .split(',')\r\n .map((recipient) => recipient.trim())\r\n .filter(Boolean),\r\n };\r\n\r\n updateTemplate(this.templateId, body)\r\n .then(() => {\r\n this.errors = {};\r\n this.$router.push(getEmailTemplateListUrl());\r\n\r\n this.$toast({\r\n variant: 'success',\r\n title: 'Success',\r\n body: 'Template has been successfully updated',\r\n });\r\n })\r\n .catch((error) => {\r\n console.error(error);\r\n this.errors = convertRequestErrorToMap(error);\r\n this.$toast({\r\n variant: 'danger',\r\n title: 'Error',\r\n body: 'Template update has been failed',\r\n });\r\n })\r\n .finally(() => {\r\n this.isSubmitting = false;\r\n });\r\n },\r\n getKeyTemplate(key: string): string {\r\n return `{{${key}}}`;\r\n },\r\n copyVarTemplate(key: string) {\r\n navigator.clipboard\r\n .writeText(this.getKeyTemplate(key))\r\n .catch(console.error);\r\n },\r\n },\r\n});\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.legend-vars {\r\n h4 {\r\n margin-bottom: 0.5rem;\r\n }\r\n ul {\r\n display: inline-block;\r\n padding-left: 1.2rem;\r\n list-style-type: decimal;\r\n\r\n li:not(:last-child) {\r\n border-bottom: 1px solid #eee;\r\n }\r\n }\r\n\r\n button {\r\n margin-left: 0.5rem;\r\n }\r\n}\r\n</style>\r\n",".legend-vars h4 {\n margin-bottom: 0.5rem;\n}\n.legend-vars ul {\n display: inline-block;\n padding-left: 1.2rem;\n list-style-type: decimal;\n}\n.legend-vars ul li:not(:last-child) {\n border-bottom: 1px solid #eee;\n}\n.legend-vars button {\n margin-left: 0.5rem;\n}\n\n/*# sourceMappingURL=EmailTemplateForm.vue.map */"]}, media: undefined }); | ||
}; | ||
/* scoped */ | ||
const __vue_scope_id__$1 = "data-v-c4fda376"; | ||
const __vue_scope_id__$1 = "data-v-20871140"; | ||
/* module identifier */ | ||
@@ -749,7 +749,7 @@ const __vue_module_identifier__$1 = undefined; | ||
if (!inject) return | ||
inject("data-v-6bdb94c4_0", { source: ".error-cell[data-v-6bdb94c4] {\n cursor: pointer;\n width: 300px;\n}\n.error-cell p[data-v-6bdb94c4] {\n max-width: 250px;\n word-break: break-word;\n}\n\n/*# sourceMappingURL=EmailLogList.vue.map */", map: {"version":3,"sources":["D:\\Work\\tager-admin-mail\\src\\views\\EmailLogList.vue","EmailLogList.vue"],"names":[],"mappings":"AA8HA;EACA,eAAA;EACA,YAAA;AC7HA;AD+HA;EACA,gBAAA;EACA,sBAAA;AC7HA;;AAEA,2CAA2C","file":"EmailLogList.vue","sourcesContent":["<template>\n <page title=\"E-Mail Logs\">\n <template v-slot:content>\n <base-table\n :column-defs=\"columnDefs\"\n :row-data=\"rowData\"\n :loading=\"isRowDataLoading\"\n :error-message=\"errorMessage\"\n >\n <template v-slot:cell(body)=\"{ row }\">\n <p v-html=\"row.body\" />\n </template>\n <template v-slot:cell(error)=\"{ row }\">\n <td class=\"error-cell\" @click=\"toggleError(row.id)\">\n <p\n v-if=\"row.error\"\n :class=\"{ open: rowIdsWithOpenErrors.includes(row.id) }\"\n >\n {{\n formatError(row.error, rowIdsWithOpenErrors.includes(row.id))\n }}\n </p>\n </td>\n </template>\n </base-table>\n </template>\n </page>\n</template>\n\n<script lang=\"ts\">\nimport Vue from 'vue';\nimport { ColumnDefinition, formatBoolean } from '@tager/admin-ui';\nimport { Nullable } from '@tager/admin-services';\n\nimport { EmailLog } from '../typings/model';\nimport { getLogList } from '../services/requests';\nimport { capitalizeWord } from '../utils/common';\n\nconst COLUMN_DEFS: Array<ColumnDefinition<EmailLog>> = [\n {\n id: 1,\n name: 'ID',\n field: 'id',\n style: { width: '50px', textAlign: 'center' },\n headStyle: { width: '50px', textAlign: 'center' },\n },\n { id: 2, name: 'Template', field: 'template' },\n { id: 3, name: 'Recipient', field: 'recipient' },\n { id: 4, name: 'Subject', field: 'subject' },\n { id: 5, name: 'Body', field: 'body' },\n {\n id: 6,\n name: 'Status',\n field: 'status',\n format: ({ row }) => capitalizeWord(row.status),\n },\n { id: 7, name: 'Date', field: 'createdAt', type: 'datetime' },\n {\n id: 8,\n name: 'Is debug?',\n field: 'isDebug',\n format: ({ row }) => formatBoolean(row.isDebug),\n },\n {\n id: 9,\n name: 'Error',\n field: 'error',\n useCustomDataCell: true,\n headStyle: { width: '300px' },\n },\n];\n\nexport default Vue.extend({\n name: 'EmailTemplateList',\n data(): {\n columnDefs: Array<ColumnDefinition<EmailLog>>;\n rowData: Array<EmailLog>;\n isRowDataLoading: boolean;\n errorMessage: Nullable<string>;\n rowIdsWithOpenErrors: Array<number>;\n } {\n return {\n columnDefs: COLUMN_DEFS,\n rowData: [],\n isRowDataLoading: false,\n errorMessage: null,\n rowIdsWithOpenErrors: [],\n };\n },\n mounted(): void {\n this.refreshLogList();\n },\n methods: {\n refreshLogList(): Promise<void> {\n this.isRowDataLoading = true;\n\n return getLogList()\n .then((response) => {\n this.rowData = response.data;\n })\n .catch(console.error)\n .finally(() => {\n this.isRowDataLoading = false;\n });\n },\n toggleError(rowId: number) {\n if (this.rowIdsWithOpenErrors.includes(rowId)) {\n this.rowIdsWithOpenErrors = this.rowIdsWithOpenErrors.filter(\n (id) => id !== rowId\n );\n } else {\n this.rowIdsWithOpenErrors.push(rowId);\n }\n },\n formatError(error: string, isOpen: boolean) {\n if (error.length > 80 && !isOpen) {\n return error.slice(0, 80) + '...';\n }\n\n return error;\n },\n },\n});\n</script>\n\n<style scoped lang=\"scss\">\n.error-cell {\n cursor: pointer;\n width: 300px;\n\n p {\n max-width: 250px;\n word-break: break-word;\n }\n}\n</style>\n",".error-cell {\n cursor: pointer;\n width: 300px;\n}\n.error-cell p {\n max-width: 250px;\n word-break: break-word;\n}\n\n/*# sourceMappingURL=EmailLogList.vue.map */"]}, media: undefined }); | ||
inject("data-v-62078166_0", { source: ".error-cell[data-v-62078166] {\n cursor: pointer;\n width: 300px;\n}\n.error-cell p[data-v-62078166] {\n max-width: 250px;\n word-break: break-word;\n}\n\n/*# sourceMappingURL=EmailLogList.vue.map */", map: {"version":3,"sources":["C:\\Work\\tager-admin-mail\\src\\views\\EmailLogList.vue","EmailLogList.vue"],"names":[],"mappings":"AA8HA;EACA,eAAA;EACA,YAAA;AC7HA;AD+HA;EACA,gBAAA;EACA,sBAAA;AC7HA;;AAEA,2CAA2C","file":"EmailLogList.vue","sourcesContent":["<template>\r\n <page title=\"E-Mail Logs\">\r\n <template v-slot:content>\r\n <base-table\r\n :column-defs=\"columnDefs\"\r\n :row-data=\"rowData\"\r\n :loading=\"isRowDataLoading\"\r\n :error-message=\"errorMessage\"\r\n >\r\n <template v-slot:cell(body)=\"{ row }\">\r\n <p v-html=\"row.body\" />\r\n </template>\r\n <template v-slot:cell(error)=\"{ row }\">\r\n <td class=\"error-cell\" @click=\"toggleError(row.id)\">\r\n <p\r\n v-if=\"row.error\"\r\n :class=\"{ open: rowIdsWithOpenErrors.includes(row.id) }\"\r\n >\r\n {{\r\n formatError(row.error, rowIdsWithOpenErrors.includes(row.id))\r\n }}\r\n </p>\r\n </td>\r\n </template>\r\n </base-table>\r\n </template>\r\n </page>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport Vue from 'vue';\r\nimport { ColumnDefinition, formatBoolean } from '@tager/admin-ui';\r\nimport { Nullable } from '@tager/admin-services';\r\n\r\nimport { EmailLog } from '../typings/model';\r\nimport { getLogList } from '../services/requests';\r\nimport { capitalizeWord } from '../utils/common';\r\n\r\nconst COLUMN_DEFS: Array<ColumnDefinition<EmailLog>> = [\r\n {\r\n id: 1,\r\n name: 'ID',\r\n field: 'id',\r\n style: { width: '50px', textAlign: 'center' },\r\n headStyle: { width: '50px', textAlign: 'center' },\r\n },\r\n { id: 2, name: 'Template', field: 'template' },\r\n { id: 3, name: 'Recipient', field: 'recipient' },\r\n { id: 4, name: 'Subject', field: 'subject' },\r\n { id: 5, name: 'Body', field: 'body' },\r\n {\r\n id: 6,\r\n name: 'Status',\r\n field: 'status',\r\n format: ({ row }) => capitalizeWord(row.status),\r\n },\r\n { id: 7, name: 'Date', field: 'createdAt', type: 'datetime' },\r\n {\r\n id: 8,\r\n name: 'Is debug?',\r\n field: 'isDebug',\r\n format: ({ row }) => formatBoolean(row.isDebug),\r\n },\r\n {\r\n id: 9,\r\n name: 'Error',\r\n field: 'error',\r\n useCustomDataCell: true,\r\n headStyle: { width: '300px' },\r\n },\r\n];\r\n\r\nexport default Vue.extend({\r\n name: 'EmailTemplateList',\r\n data(): {\r\n columnDefs: Array<ColumnDefinition<EmailLog>>;\r\n rowData: Array<EmailLog>;\r\n isRowDataLoading: boolean;\r\n errorMessage: Nullable<string>;\r\n rowIdsWithOpenErrors: Array<number>;\r\n } {\r\n return {\r\n columnDefs: COLUMN_DEFS,\r\n rowData: [],\r\n isRowDataLoading: false,\r\n errorMessage: null,\r\n rowIdsWithOpenErrors: [],\r\n };\r\n },\r\n mounted(): void {\r\n this.refreshLogList();\r\n },\r\n methods: {\r\n refreshLogList(): Promise<void> {\r\n this.isRowDataLoading = true;\r\n\r\n return getLogList()\r\n .then((response) => {\r\n this.rowData = response.data;\r\n })\r\n .catch(console.error)\r\n .finally(() => {\r\n this.isRowDataLoading = false;\r\n });\r\n },\r\n toggleError(rowId: number) {\r\n if (this.rowIdsWithOpenErrors.includes(rowId)) {\r\n this.rowIdsWithOpenErrors = this.rowIdsWithOpenErrors.filter(\r\n (id) => id !== rowId\r\n );\r\n } else {\r\n this.rowIdsWithOpenErrors.push(rowId);\r\n }\r\n },\r\n formatError(error: string, isOpen: boolean) {\r\n if (error.length > 80 && !isOpen) {\r\n return error.slice(0, 80) + '...';\r\n }\r\n\r\n return error;\r\n },\r\n },\r\n});\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.error-cell {\r\n cursor: pointer;\r\n width: 300px;\r\n\r\n p {\r\n max-width: 250px;\r\n word-break: break-word;\r\n }\r\n}\r\n</style>\r\n",".error-cell {\n cursor: pointer;\n width: 300px;\n}\n.error-cell p {\n max-width: 250px;\n word-break: break-word;\n}\n\n/*# sourceMappingURL=EmailLogList.vue.map */"]}, media: undefined }); | ||
}; | ||
/* scoped */ | ||
const __vue_scope_id__$2 = "data-v-6bdb94c4"; | ||
const __vue_scope_id__$2 = "data-v-62078166"; | ||
/* module identifier */ | ||
@@ -756,0 +756,0 @@ const __vue_module_identifier__$2 = undefined; |
@@ -12,4 +12,4 @@ (function (global, factory) { | ||
} | ||
function getTemplate(alias) { | ||
return adminServices.request.get({ path: '/admin/mail/templates', params: { alias } }); | ||
function getTemplate(templateId) { | ||
return adminServices.request.get({ path: `/admin/mail/templates/${templateId}` }); | ||
} | ||
@@ -306,7 +306,7 @@ function updateTemplate(alias, payload) { | ||
if (!inject) return | ||
inject("data-v-5edcf0f2_0", { source: "\n\n/*# sourceMappingURL=EmailTemplateList.vue.map */", map: {"version":3,"sources":["EmailTemplateList.vue"],"names":[],"mappings":";;AAEA,gDAAgD","file":"EmailTemplateList.vue"}, media: undefined }); | ||
inject("data-v-579c10c8_0", { source: "\n\n/*# sourceMappingURL=EmailTemplateList.vue.map */", map: {"version":3,"sources":["EmailTemplateList.vue"],"names":[],"mappings":";;AAEA,gDAAgD","file":"EmailTemplateList.vue"}, media: undefined }); | ||
}; | ||
/* scoped */ | ||
const __vue_scope_id__ = "data-v-5edcf0f2"; | ||
const __vue_scope_id__ = "data-v-579c10c8"; | ||
/* module identifier */ | ||
@@ -547,7 +547,7 @@ const __vue_module_identifier__ = undefined; | ||
if (!inject) return | ||
inject("data-v-c4fda376_0", { source: ".legend-vars h4[data-v-c4fda376] {\n margin-bottom: 0.5rem;\n}\n.legend-vars ul[data-v-c4fda376] {\n display: inline-block;\n padding-left: 1.2rem;\n list-style-type: decimal;\n}\n.legend-vars ul li[data-v-c4fda376]:not(:last-child) {\n border-bottom: 1px solid #eee;\n}\n.legend-vars button[data-v-c4fda376] {\n margin-left: 0.5rem;\n}\n\n/*# sourceMappingURL=EmailTemplateForm.vue.map */", map: {"version":3,"sources":["D:\\Work\\tager-admin-mail\\src\\views\\EmailTemplateForm.vue","EmailTemplateForm.vue"],"names":[],"mappings":"AA0KA;EACA,qBAAA;ACzKA;AD2KA;EACA,qBAAA;EACA,oBAAA;EACA,wBAAA;ACzKA;AD2KA;EACA,6BAAA;ACzKA;AD6KA;EACA,mBAAA;AC3KA;;AAEA,gDAAgD","file":"EmailTemplateForm.vue","sourcesContent":["<template>\n <page\n :title=\"pageTitle\"\n :is-content-loading=\"isInitialLoading\"\n :footer=\"{\n backHref: templateListRoutePath,\n onSubmit: submitForm,\n isSubmitting: isSubmitting,\n }\"\n >\n <form novalidate @submit.prevent>\n <form-field\n v-model=\"values.subject\"\n name=\"subject\"\n :error=\"errors.subject\"\n label=\"Subject\"\n />\n\n <form-field\n v-model=\"values.recipients\"\n name=\"recipients\"\n :error=\"errors.recipients\"\n label=\"Recipients\"\n />\n\n <form-field-rich-text-input\n v-model=\"values.body\"\n name=\"body\"\n :error=\"errors.body\"\n label=\"Body\"\n />\n\n <div\n v-if=\"emailTemplate && emailTemplate.variables.length > 0\"\n class=\"legend-vars\"\n >\n <h4 class=\"title\">Template variables</h4>\n <ul>\n <li v-for=\"variable of emailTemplate.variables\" :key=\"variable.key\">\n <span>{{ variable.label }}</span> -\n <span>\n {{ getKeyTemplate(variable.key) }}\n </span>\n <base-button\n variant=\"icon\"\n title=\"Copy\"\n @click=\"copyVarTemplate(variable.key)\"\n >\n <svg-icon name=\"contentCopy\" />\n </base-button>\n </li>\n </ul>\n </div>\n </form>\n </page>\n</template>\n\n<script lang=\"ts\">\nimport Vue from 'vue';\nimport { convertRequestErrorToMap, Nullable } from '@tager/admin-services';\n\nimport {\n getTemplate,\n TemplateUpdatePayload,\n updateTemplate,\n} from '../services/requests';\nimport { EmailTemplate } from '../typings/model';\nimport { getEmailTemplateListUrl } from '../utils/paths';\n\ntype FormValues = { subject: string; body: string; recipients: string };\n\nexport default Vue.extend({\n name: 'EmailTemplateForm',\n data(): {\n emailTemplate: Nullable<EmailTemplate>;\n values: FormValues;\n errors: Record<string, string>;\n isSubmitting: boolean;\n isInitialLoading: boolean;\n templateListRoutePath: string;\n } {\n return {\n emailTemplate: null,\n values: { subject: '', body: '', recipients: '' },\n errors: {},\n isSubmitting: false,\n isInitialLoading: false,\n templateListRoutePath: getEmailTemplateListUrl(),\n };\n },\n computed: {\n templateId(): string {\n return this.$route.params.templateId;\n },\n pageTitle(): string {\n return this.emailTemplate\n ? `E-Mail template \"${this.emailTemplate.name}\"`\n : 'E-Mail template';\n },\n },\n mounted(): void {\n this.isInitialLoading = true;\n\n getTemplate(this.templateId)\n .then((response) => {\n this.values = this.convertEmailTemplateToFormValues(response.data);\n this.emailTemplate = response.data;\n })\n .catch(console.error)\n .finally(() => {\n this.isInitialLoading = false;\n });\n },\n methods: {\n convertEmailTemplateToFormValues(template: EmailTemplate): FormValues {\n return {\n subject: template.subject,\n body: template.body,\n recipients: template.recipients.join(','),\n };\n },\n submitForm() {\n this.isSubmitting = true;\n\n const body: TemplateUpdatePayload = {\n ...this.values,\n recipients: this.values.recipients\n .split(',')\n .map((recipient) => recipient.trim())\n .filter(Boolean),\n };\n\n updateTemplate(this.templateId, body)\n .then(() => {\n this.errors = {};\n this.$router.push(getEmailTemplateListUrl());\n\n this.$toast({\n variant: 'success',\n title: 'Success',\n body: 'Template has been successfully updated',\n });\n })\n .catch((error) => {\n console.error(error);\n this.errors = convertRequestErrorToMap(error);\n this.$toast({\n variant: 'danger',\n title: 'Error',\n body: 'Template update has been failed',\n });\n })\n .finally(() => {\n this.isSubmitting = false;\n });\n },\n getKeyTemplate(key: string): string {\n return `{{${key}}}`;\n },\n copyVarTemplate(key: string) {\n navigator.clipboard\n .writeText(this.getKeyTemplate(key))\n .catch(console.error);\n },\n },\n});\n</script>\n\n<style scoped lang=\"scss\">\n.legend-vars {\n h4 {\n margin-bottom: 0.5rem;\n }\n ul {\n display: inline-block;\n padding-left: 1.2rem;\n list-style-type: decimal;\n\n li:not(:last-child) {\n border-bottom: 1px solid #eee;\n }\n }\n\n button {\n margin-left: 0.5rem;\n }\n}\n</style>\n",".legend-vars h4 {\n margin-bottom: 0.5rem;\n}\n.legend-vars ul {\n display: inline-block;\n padding-left: 1.2rem;\n list-style-type: decimal;\n}\n.legend-vars ul li:not(:last-child) {\n border-bottom: 1px solid #eee;\n}\n.legend-vars button {\n margin-left: 0.5rem;\n}\n\n/*# sourceMappingURL=EmailTemplateForm.vue.map */"]}, media: undefined }); | ||
inject("data-v-20871140_0", { source: ".legend-vars h4[data-v-20871140] {\n margin-bottom: 0.5rem;\n}\n.legend-vars ul[data-v-20871140] {\n display: inline-block;\n padding-left: 1.2rem;\n list-style-type: decimal;\n}\n.legend-vars ul li[data-v-20871140]:not(:last-child) {\n border-bottom: 1px solid #eee;\n}\n.legend-vars button[data-v-20871140] {\n margin-left: 0.5rem;\n}\n\n/*# sourceMappingURL=EmailTemplateForm.vue.map */", map: {"version":3,"sources":["C:\\Work\\tager-admin-mail\\src\\views\\EmailTemplateForm.vue","EmailTemplateForm.vue"],"names":[],"mappings":"AA0KA;EACA,qBAAA;ACzKA;AD2KA;EACA,qBAAA;EACA,oBAAA;EACA,wBAAA;ACzKA;AD2KA;EACA,6BAAA;ACzKA;AD6KA;EACA,mBAAA;AC3KA;;AAEA,gDAAgD","file":"EmailTemplateForm.vue","sourcesContent":["<template>\r\n <page\r\n :title=\"pageTitle\"\r\n :is-content-loading=\"isInitialLoading\"\r\n :footer=\"{\r\n backHref: templateListRoutePath,\r\n onSubmit: submitForm,\r\n isSubmitting: isSubmitting,\r\n }\"\r\n >\r\n <form novalidate @submit.prevent>\r\n <form-field\r\n v-model=\"values.subject\"\r\n name=\"subject\"\r\n :error=\"errors.subject\"\r\n label=\"Subject\"\r\n />\r\n\r\n <form-field\r\n v-model=\"values.recipients\"\r\n name=\"recipients\"\r\n :error=\"errors.recipients\"\r\n label=\"Recipients\"\r\n />\r\n\r\n <form-field-rich-text-input\r\n v-model=\"values.body\"\r\n name=\"body\"\r\n :error=\"errors.body\"\r\n label=\"Body\"\r\n />\r\n\r\n <div\r\n v-if=\"emailTemplate && emailTemplate.variables.length > 0\"\r\n class=\"legend-vars\"\r\n >\r\n <h4 class=\"title\">Template variables</h4>\r\n <ul>\r\n <li v-for=\"variable of emailTemplate.variables\" :key=\"variable.key\">\r\n <span>{{ variable.label }}</span> -\r\n <span>\r\n {{ getKeyTemplate(variable.key) }}\r\n </span>\r\n <base-button\r\n variant=\"icon\"\r\n title=\"Copy\"\r\n @click=\"copyVarTemplate(variable.key)\"\r\n >\r\n <svg-icon name=\"contentCopy\" />\r\n </base-button>\r\n </li>\r\n </ul>\r\n </div>\r\n </form>\r\n </page>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport Vue from 'vue';\r\nimport { convertRequestErrorToMap, Nullable } from '@tager/admin-services';\r\n\r\nimport {\r\n getTemplate,\r\n TemplateUpdatePayload,\r\n updateTemplate,\r\n} from '../services/requests';\r\nimport { EmailTemplate } from '../typings/model';\r\nimport { getEmailTemplateListUrl } from '../utils/paths';\r\n\r\ntype FormValues = { subject: string; body: string; recipients: string };\r\n\r\nexport default Vue.extend({\r\n name: 'EmailTemplateForm',\r\n data(): {\r\n emailTemplate: Nullable<EmailTemplate>;\r\n values: FormValues;\r\n errors: Record<string, string>;\r\n isSubmitting: boolean;\r\n isInitialLoading: boolean;\r\n templateListRoutePath: string;\r\n } {\r\n return {\r\n emailTemplate: null,\r\n values: { subject: '', body: '', recipients: '' },\r\n errors: {},\r\n isSubmitting: false,\r\n isInitialLoading: false,\r\n templateListRoutePath: getEmailTemplateListUrl(),\r\n };\r\n },\r\n computed: {\r\n templateId(): string {\r\n return this.$route.params.templateId;\r\n },\r\n pageTitle(): string {\r\n return this.emailTemplate\r\n ? `E-Mail template \"${this.emailTemplate.name}\"`\r\n : 'E-Mail template';\r\n },\r\n },\r\n mounted(): void {\r\n this.isInitialLoading = true;\r\n\r\n getTemplate(this.templateId)\r\n .then((response) => {\r\n this.values = this.convertEmailTemplateToFormValues(response.data);\r\n this.emailTemplate = response.data;\r\n })\r\n .catch(console.error)\r\n .finally(() => {\r\n this.isInitialLoading = false;\r\n });\r\n },\r\n methods: {\r\n convertEmailTemplateToFormValues(template: EmailTemplate): FormValues {\r\n return {\r\n subject: template.subject,\r\n body: template.body,\r\n recipients: template.recipients.join(','),\r\n };\r\n },\r\n submitForm() {\r\n this.isSubmitting = true;\r\n\r\n const body: TemplateUpdatePayload = {\r\n ...this.values,\r\n recipients: this.values.recipients\r\n .split(',')\r\n .map((recipient) => recipient.trim())\r\n .filter(Boolean),\r\n };\r\n\r\n updateTemplate(this.templateId, body)\r\n .then(() => {\r\n this.errors = {};\r\n this.$router.push(getEmailTemplateListUrl());\r\n\r\n this.$toast({\r\n variant: 'success',\r\n title: 'Success',\r\n body: 'Template has been successfully updated',\r\n });\r\n })\r\n .catch((error) => {\r\n console.error(error);\r\n this.errors = convertRequestErrorToMap(error);\r\n this.$toast({\r\n variant: 'danger',\r\n title: 'Error',\r\n body: 'Template update has been failed',\r\n });\r\n })\r\n .finally(() => {\r\n this.isSubmitting = false;\r\n });\r\n },\r\n getKeyTemplate(key: string): string {\r\n return `{{${key}}}`;\r\n },\r\n copyVarTemplate(key: string) {\r\n navigator.clipboard\r\n .writeText(this.getKeyTemplate(key))\r\n .catch(console.error);\r\n },\r\n },\r\n});\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.legend-vars {\r\n h4 {\r\n margin-bottom: 0.5rem;\r\n }\r\n ul {\r\n display: inline-block;\r\n padding-left: 1.2rem;\r\n list-style-type: decimal;\r\n\r\n li:not(:last-child) {\r\n border-bottom: 1px solid #eee;\r\n }\r\n }\r\n\r\n button {\r\n margin-left: 0.5rem;\r\n }\r\n}\r\n</style>\r\n",".legend-vars h4 {\n margin-bottom: 0.5rem;\n}\n.legend-vars ul {\n display: inline-block;\n padding-left: 1.2rem;\n list-style-type: decimal;\n}\n.legend-vars ul li:not(:last-child) {\n border-bottom: 1px solid #eee;\n}\n.legend-vars button {\n margin-left: 0.5rem;\n}\n\n/*# sourceMappingURL=EmailTemplateForm.vue.map */"]}, media: undefined }); | ||
}; | ||
/* scoped */ | ||
const __vue_scope_id__$1 = "data-v-c4fda376"; | ||
const __vue_scope_id__$1 = "data-v-20871140"; | ||
/* module identifier */ | ||
@@ -752,7 +752,7 @@ const __vue_module_identifier__$1 = undefined; | ||
if (!inject) return | ||
inject("data-v-6bdb94c4_0", { source: ".error-cell[data-v-6bdb94c4] {\n cursor: pointer;\n width: 300px;\n}\n.error-cell p[data-v-6bdb94c4] {\n max-width: 250px;\n word-break: break-word;\n}\n\n/*# sourceMappingURL=EmailLogList.vue.map */", map: {"version":3,"sources":["D:\\Work\\tager-admin-mail\\src\\views\\EmailLogList.vue","EmailLogList.vue"],"names":[],"mappings":"AA8HA;EACA,eAAA;EACA,YAAA;AC7HA;AD+HA;EACA,gBAAA;EACA,sBAAA;AC7HA;;AAEA,2CAA2C","file":"EmailLogList.vue","sourcesContent":["<template>\n <page title=\"E-Mail Logs\">\n <template v-slot:content>\n <base-table\n :column-defs=\"columnDefs\"\n :row-data=\"rowData\"\n :loading=\"isRowDataLoading\"\n :error-message=\"errorMessage\"\n >\n <template v-slot:cell(body)=\"{ row }\">\n <p v-html=\"row.body\" />\n </template>\n <template v-slot:cell(error)=\"{ row }\">\n <td class=\"error-cell\" @click=\"toggleError(row.id)\">\n <p\n v-if=\"row.error\"\n :class=\"{ open: rowIdsWithOpenErrors.includes(row.id) }\"\n >\n {{\n formatError(row.error, rowIdsWithOpenErrors.includes(row.id))\n }}\n </p>\n </td>\n </template>\n </base-table>\n </template>\n </page>\n</template>\n\n<script lang=\"ts\">\nimport Vue from 'vue';\nimport { ColumnDefinition, formatBoolean } from '@tager/admin-ui';\nimport { Nullable } from '@tager/admin-services';\n\nimport { EmailLog } from '../typings/model';\nimport { getLogList } from '../services/requests';\nimport { capitalizeWord } from '../utils/common';\n\nconst COLUMN_DEFS: Array<ColumnDefinition<EmailLog>> = [\n {\n id: 1,\n name: 'ID',\n field: 'id',\n style: { width: '50px', textAlign: 'center' },\n headStyle: { width: '50px', textAlign: 'center' },\n },\n { id: 2, name: 'Template', field: 'template' },\n { id: 3, name: 'Recipient', field: 'recipient' },\n { id: 4, name: 'Subject', field: 'subject' },\n { id: 5, name: 'Body', field: 'body' },\n {\n id: 6,\n name: 'Status',\n field: 'status',\n format: ({ row }) => capitalizeWord(row.status),\n },\n { id: 7, name: 'Date', field: 'createdAt', type: 'datetime' },\n {\n id: 8,\n name: 'Is debug?',\n field: 'isDebug',\n format: ({ row }) => formatBoolean(row.isDebug),\n },\n {\n id: 9,\n name: 'Error',\n field: 'error',\n useCustomDataCell: true,\n headStyle: { width: '300px' },\n },\n];\n\nexport default Vue.extend({\n name: 'EmailTemplateList',\n data(): {\n columnDefs: Array<ColumnDefinition<EmailLog>>;\n rowData: Array<EmailLog>;\n isRowDataLoading: boolean;\n errorMessage: Nullable<string>;\n rowIdsWithOpenErrors: Array<number>;\n } {\n return {\n columnDefs: COLUMN_DEFS,\n rowData: [],\n isRowDataLoading: false,\n errorMessage: null,\n rowIdsWithOpenErrors: [],\n };\n },\n mounted(): void {\n this.refreshLogList();\n },\n methods: {\n refreshLogList(): Promise<void> {\n this.isRowDataLoading = true;\n\n return getLogList()\n .then((response) => {\n this.rowData = response.data;\n })\n .catch(console.error)\n .finally(() => {\n this.isRowDataLoading = false;\n });\n },\n toggleError(rowId: number) {\n if (this.rowIdsWithOpenErrors.includes(rowId)) {\n this.rowIdsWithOpenErrors = this.rowIdsWithOpenErrors.filter(\n (id) => id !== rowId\n );\n } else {\n this.rowIdsWithOpenErrors.push(rowId);\n }\n },\n formatError(error: string, isOpen: boolean) {\n if (error.length > 80 && !isOpen) {\n return error.slice(0, 80) + '...';\n }\n\n return error;\n },\n },\n});\n</script>\n\n<style scoped lang=\"scss\">\n.error-cell {\n cursor: pointer;\n width: 300px;\n\n p {\n max-width: 250px;\n word-break: break-word;\n }\n}\n</style>\n",".error-cell {\n cursor: pointer;\n width: 300px;\n}\n.error-cell p {\n max-width: 250px;\n word-break: break-word;\n}\n\n/*# sourceMappingURL=EmailLogList.vue.map */"]}, media: undefined }); | ||
inject("data-v-62078166_0", { source: ".error-cell[data-v-62078166] {\n cursor: pointer;\n width: 300px;\n}\n.error-cell p[data-v-62078166] {\n max-width: 250px;\n word-break: break-word;\n}\n\n/*# sourceMappingURL=EmailLogList.vue.map */", map: {"version":3,"sources":["C:\\Work\\tager-admin-mail\\src\\views\\EmailLogList.vue","EmailLogList.vue"],"names":[],"mappings":"AA8HA;EACA,eAAA;EACA,YAAA;AC7HA;AD+HA;EACA,gBAAA;EACA,sBAAA;AC7HA;;AAEA,2CAA2C","file":"EmailLogList.vue","sourcesContent":["<template>\r\n <page title=\"E-Mail Logs\">\r\n <template v-slot:content>\r\n <base-table\r\n :column-defs=\"columnDefs\"\r\n :row-data=\"rowData\"\r\n :loading=\"isRowDataLoading\"\r\n :error-message=\"errorMessage\"\r\n >\r\n <template v-slot:cell(body)=\"{ row }\">\r\n <p v-html=\"row.body\" />\r\n </template>\r\n <template v-slot:cell(error)=\"{ row }\">\r\n <td class=\"error-cell\" @click=\"toggleError(row.id)\">\r\n <p\r\n v-if=\"row.error\"\r\n :class=\"{ open: rowIdsWithOpenErrors.includes(row.id) }\"\r\n >\r\n {{\r\n formatError(row.error, rowIdsWithOpenErrors.includes(row.id))\r\n }}\r\n </p>\r\n </td>\r\n </template>\r\n </base-table>\r\n </template>\r\n </page>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport Vue from 'vue';\r\nimport { ColumnDefinition, formatBoolean } from '@tager/admin-ui';\r\nimport { Nullable } from '@tager/admin-services';\r\n\r\nimport { EmailLog } from '../typings/model';\r\nimport { getLogList } from '../services/requests';\r\nimport { capitalizeWord } from '../utils/common';\r\n\r\nconst COLUMN_DEFS: Array<ColumnDefinition<EmailLog>> = [\r\n {\r\n id: 1,\r\n name: 'ID',\r\n field: 'id',\r\n style: { width: '50px', textAlign: 'center' },\r\n headStyle: { width: '50px', textAlign: 'center' },\r\n },\r\n { id: 2, name: 'Template', field: 'template' },\r\n { id: 3, name: 'Recipient', field: 'recipient' },\r\n { id: 4, name: 'Subject', field: 'subject' },\r\n { id: 5, name: 'Body', field: 'body' },\r\n {\r\n id: 6,\r\n name: 'Status',\r\n field: 'status',\r\n format: ({ row }) => capitalizeWord(row.status),\r\n },\r\n { id: 7, name: 'Date', field: 'createdAt', type: 'datetime' },\r\n {\r\n id: 8,\r\n name: 'Is debug?',\r\n field: 'isDebug',\r\n format: ({ row }) => formatBoolean(row.isDebug),\r\n },\r\n {\r\n id: 9,\r\n name: 'Error',\r\n field: 'error',\r\n useCustomDataCell: true,\r\n headStyle: { width: '300px' },\r\n },\r\n];\r\n\r\nexport default Vue.extend({\r\n name: 'EmailTemplateList',\r\n data(): {\r\n columnDefs: Array<ColumnDefinition<EmailLog>>;\r\n rowData: Array<EmailLog>;\r\n isRowDataLoading: boolean;\r\n errorMessage: Nullable<string>;\r\n rowIdsWithOpenErrors: Array<number>;\r\n } {\r\n return {\r\n columnDefs: COLUMN_DEFS,\r\n rowData: [],\r\n isRowDataLoading: false,\r\n errorMessage: null,\r\n rowIdsWithOpenErrors: [],\r\n };\r\n },\r\n mounted(): void {\r\n this.refreshLogList();\r\n },\r\n methods: {\r\n refreshLogList(): Promise<void> {\r\n this.isRowDataLoading = true;\r\n\r\n return getLogList()\r\n .then((response) => {\r\n this.rowData = response.data;\r\n })\r\n .catch(console.error)\r\n .finally(() => {\r\n this.isRowDataLoading = false;\r\n });\r\n },\r\n toggleError(rowId: number) {\r\n if (this.rowIdsWithOpenErrors.includes(rowId)) {\r\n this.rowIdsWithOpenErrors = this.rowIdsWithOpenErrors.filter(\r\n (id) => id !== rowId\r\n );\r\n } else {\r\n this.rowIdsWithOpenErrors.push(rowId);\r\n }\r\n },\r\n formatError(error: string, isOpen: boolean) {\r\n if (error.length > 80 && !isOpen) {\r\n return error.slice(0, 80) + '...';\r\n }\r\n\r\n return error;\r\n },\r\n },\r\n});\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.error-cell {\r\n cursor: pointer;\r\n width: 300px;\r\n\r\n p {\r\n max-width: 250px;\r\n word-break: break-word;\r\n }\r\n}\r\n</style>\r\n",".error-cell {\n cursor: pointer;\n width: 300px;\n}\n.error-cell p {\n max-width: 250px;\n word-break: break-word;\n}\n\n/*# sourceMappingURL=EmailLogList.vue.map */"]}, media: undefined }); | ||
}; | ||
/* scoped */ | ||
const __vue_scope_id__$2 = "data-v-6bdb94c4"; | ||
const __vue_scope_id__$2 = "data-v-62078166"; | ||
/* module identifier */ | ||
@@ -759,0 +759,0 @@ const __vue_module_identifier__$2 = undefined; |
import { ResponseBody } from '@tager/admin-services'; | ||
import { EmailLog, EmailTemplate } from '../typings/model'; | ||
export declare function getTemplateList(): Promise<ResponseBody<Array<EmailTemplate>>>; | ||
export declare function getTemplate(alias: string): Promise<ResponseBody<EmailTemplate>>; | ||
export declare function getTemplate(templateId: number | string): Promise<ResponseBody<EmailTemplate>>; | ||
export declare type TemplateUpdatePayload = { | ||
@@ -6,0 +6,0 @@ subject: string; |
{ | ||
"name": "@tager/admin-mail", | ||
"version": "0.2.0", | ||
"version": "0.2.1", | ||
"license": "MIT", | ||
@@ -5,0 +5,0 @@ "main": "dist/index.umd.js", |
@@ -0,0 +0,0 @@ { |
@@ -0,0 +0,0 @@ import { MenuItemType } from '@tager/admin-layout'; |
@@ -0,0 +0,0 @@ export const EMAIL_ROUTE_PATHS = { |
@@ -0,0 +0,0 @@ import { CustomRouteConfig } from '@tager/admin-layout'; |
@@ -0,0 +0,0 @@ import Vue from 'vue'; |
const EN = {}; | ||
export default EN; |
const RU = {}; | ||
export default RU; |
@@ -10,5 +10,5 @@ import { request, ResponseBody } from '@tager/admin-services'; | ||
export function getTemplate( | ||
alias: string | ||
templateId: number | string | ||
): Promise<ResponseBody<EmailTemplate>> { | ||
return request.get({ path: '/admin/mail/templates', params: { alias } }); | ||
return request.get({ path: `/admin/mail/templates/${templateId}` }); | ||
} | ||
@@ -15,0 +15,0 @@ |
@@ -0,0 +0,0 @@ import { Nullable } from '@tager/admin-services'; |
@@ -0,0 +0,0 @@ /** Reference: https://stackoverflow.com/a/53999913 */ |
@@ -0,0 +0,0 @@ import Vue, { VNode } from 'vue'; |
@@ -0,0 +0,0 @@ declare module '*.vue' { |
@@ -0,0 +0,0 @@ import { compile } from 'path-to-regexp'; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
100280
37
1998