From 7de7f6ac59c9abf477d1685d6e32757682cabafe Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Mon, 9 Jun 2025 16:49:09 +0530 Subject: [PATCH 01/77] fix: future date is not captured in pretty date (cherry picked from commit dba6dd19836501e595da5d7efe91bf78134de532) --- frontend/src/utils/index.js | 54 ++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/frontend/src/utils/index.js b/frontend/src/utils/index.js index 68a2abe2..f2633b2f 100644 --- a/frontend/src/utils/index.js +++ b/frontend/src/utils/index.js @@ -86,11 +86,32 @@ export function prettyDate(date, mini = false) { let dayDiff = Math.floor(diff / 86400) - if (isNaN(dayDiff) || dayDiff < 0) return '' + if (isNaN(dayDiff)) return '' if (mini) { // Return short format of time difference - if (dayDiff == 0) { + if (dayDiff < 0) { + if (Math.abs(dayDiff) < 1) { + if (diff < 60) { + return __('now') + } else if (diff < 3600) { + return __('in {0} m', [Math.floor(diff / 60)]) + } else if (diff < 86400) { + return __('in {0} h', [Math.floor(diff / 3600)]) + } + } + if (Math.abs(dayDiff) == 1) { + return __('tomorrow') + } else if (Math.abs(dayDiff) < 7) { + return __('in {0} d', [Math.abs(dayDiff)]) + } else if (Math.abs(dayDiff) < 31) { + return __('in {0} w', [Math.floor(Math.abs(dayDiff) / 7)]) + } else if (Math.abs(dayDiff) < 365) { + return __('in {0} M', [Math.floor(Math.abs(dayDiff) / 30)]) + } else { + return __('in {0} y', [Math.floor(Math.abs(dayDiff) / 365)]) + } + } else if (dayDiff == 0) { if (diff < 60) { return __('now') } else if (diff < 3600) { @@ -111,7 +132,34 @@ export function prettyDate(date, mini = false) { } } else { // Return long format of time difference - if (dayDiff == 0) { + if (dayDiff < 0) { + if (Math.abs(dayDiff) < 1) { + if (diff < 60) { + return __('just now') + } else if (diff < 120) { + return __('in 1 minute') + } else if (diff < 3600) { + return __('in {0} minutes', [Math.floor(diff / 60)]) + } else if (diff < 7200) { + return __('in 1 hour') + } else if (diff < 86400) { + return __('in {0} hours', [Math.floor(diff / 3600)]) + } + } + if (Math.abs(dayDiff) == 1) { + return __('tomorrow') + } else if (Math.abs(dayDiff) < 7) { + return __('in {0} days', [Math.abs(dayDiff)]) + } else if (Math.abs(dayDiff) < 31) { + return __('in {0} weeks', [Math.floor(Math.abs(dayDiff) / 7)]) + } else if (Math.abs(dayDiff) < 365) { + return __('in {0} months', [Math.floor(Math.abs(dayDiff) / 30)]) + } else if (Math.abs(dayDiff) < 730) { + return __('in 1 year') + } else { + return __('in {0} years', [Math.floor(Math.abs(dayDiff) / 365)]) + } + } else if (dayDiff == 0) { if (diff < 60) { return __('just now') } else if (diff < 120) { From fb330c26d2ce4ec30126617b5732ef57b19df04c Mon Sep 17 00:00:00 2001 From: mahsem <137205921+mahsem@users.noreply.github.com> Date: Mon, 9 Jun 2025 22:11:22 +0200 Subject: [PATCH 02/77] fix: add context for Integrations (cherry picked from commit 33e6b80d5aa72b6b52fa4991f537e4fa4200e300) --- frontend/src/components/Settings/Settings.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/Settings/Settings.vue b/frontend/src/components/Settings/Settings.vue index e0215463..82b1b86c 100644 --- a/frontend/src/components/Settings/Settings.vue +++ b/frontend/src/components/Settings/Settings.vue @@ -112,7 +112,7 @@ const tabs = computed(() => { ], }, { - label: __('Integrations'), + label: __('Integrations', null, 'FCRM'), items: [ { label: __('Telephony'), From 6c6c6bf872096cedd2489fa339f3bde06bdf5c2a Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Thu, 12 Jun 2025 18:07:07 +0530 Subject: [PATCH 03/77] fix: removed leads organization logo (cherry picked from commit e079980598ecb2e2a2728e6bf213dc5b42e643f3) --- frontend/src/components/ListViews/LeadsListView.vue | 9 --------- 1 file changed, 9 deletions(-) diff --git a/frontend/src/components/ListViews/LeadsListView.vue b/frontend/src/components/ListViews/LeadsListView.vue index 401094ef..a45e9e7d 100644 --- a/frontend/src/components/ListViews/LeadsListView.vue +++ b/frontend/src/components/ListViews/LeadsListView.vue @@ -72,15 +72,6 @@ size="sm" /> -
- -
Date: Wed, 11 Jun 2025 13:00:02 +0530 Subject: [PATCH 04/77] fix: added deal value field (cherry picked from commit 01f0213693d0885228b852bbf852fff254df988f) --- crm/fcrm/doctype/crm_deal/crm_deal.json | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/crm/fcrm/doctype/crm_deal/crm_deal.json b/crm/fcrm/doctype/crm_deal/crm_deal.json index 67f441c3..10e56be4 100644 --- a/crm/fcrm/doctype/crm_deal/crm_deal.json +++ b/crm/fcrm/doctype/crm_deal/crm_deal.json @@ -11,11 +11,14 @@ "naming_series", "organization", "next_step", - "probability", "column_break_ijan", "status", - "close_date", "deal_owner", + "section_break_jgpm", + "probability", + "deal_value", + "column_break_kpxa", + "close_date", "contacts_tab", "contacts", "contact", @@ -91,7 +94,7 @@ { "fieldname": "close_date", "fieldtype": "Date", - "label": "Close Date" + "label": "Expected Closure Date" }, { "fieldname": "next_step", @@ -374,12 +377,26 @@ "label": "Net Total", "options": "currency", "read_only": 1 + }, + { + "fieldname": "section_break_jgpm", + "fieldtype": "Section Break" + }, + { + "fieldname": "deal_value", + "fieldtype": "Currency", + "label": "Deal Value", + "options": "currency" + }, + { + "fieldname": "column_break_kpxa", + "fieldtype": "Column Break" } ], "grid_page_length": 50, "index_web_pages_for_search": 1, "links": [], - "modified": "2025-05-12 12:30:55.415282", + "modified": "2025-06-11 12:58:22.439045", "modified_by": "Administrator", "module": "FCRM", "name": "CRM Deal", From 1c7ea0b44b8a4cafa0107fdddcb17c6268d17f5c Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Wed, 11 Jun 2025 13:01:22 +0530 Subject: [PATCH 05/77] fix: added probability field in deal status (cherry picked from commit fdca27bb81533b45eac0ba9d45c2ca1d094d2fae) --- .../doctype/crm_deal_status/crm_deal_status.json | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/crm/fcrm/doctype/crm_deal_status/crm_deal_status.json b/crm/fcrm/doctype/crm_deal_status/crm_deal_status.json index b0374ca1..ae026c74 100644 --- a/crm/fcrm/doctype/crm_deal_status/crm_deal_status.json +++ b/crm/fcrm/doctype/crm_deal_status/crm_deal_status.json @@ -8,7 +8,8 @@ "field_order": [ "deal_status", "color", - "position" + "position", + "probability" ], "fields": [ { @@ -32,11 +33,17 @@ "fieldtype": "Int", "in_list_view": 1, "label": "Position" + }, + { + "fieldname": "probability", + "fieldtype": "Percent", + "label": "Probability" } ], + "grid_page_length": 50, "index_web_pages_for_search": 1, "links": [], - "modified": "2024-01-19 21:56:44.552134", + "modified": "2025-06-11 13:00:34.518808", "modified_by": "Administrator", "module": "FCRM", "name": "CRM Deal Status", @@ -68,7 +75,8 @@ "write": 1 } ], + "row_format": "Dynamic", "sort_field": "modified", "sort_order": "DESC", "states": [] -} \ No newline at end of file +} From b0474e87644f7849055cbe300effcfc819c462a5 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Wed, 11 Jun 2025 14:18:25 +0530 Subject: [PATCH 06/77] fix: update and reset value in triggerOnChange method (cherry picked from commit 7d79cbf5bdd664e76fb90b994d0d4f5c257c0ed0) --- frontend/src/components/Controls/Grid.vue | 3 +-- frontend/src/components/FieldLayout/Field.vue | 6 ++---- frontend/src/components/SidePanelLayout.vue | 4 +--- frontend/src/data/document.js | 20 ++++++++++++------- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/frontend/src/components/Controls/Grid.vue b/frontend/src/components/Controls/Grid.vue index 54bc29dc..19240a86 100644 --- a/frontend/src/components/Controls/Grid.vue +++ b/frontend/src/components/Controls/Grid.vue @@ -509,8 +509,7 @@ const deleteRows = () => { } function fieldChange(value, field, row) { - row[field.fieldname] = value - triggerOnChange(field.fieldname, row) + triggerOnChange(field.fieldname, value, row) } function getDefaultValue(defaultValue, fieldtype) { diff --git a/frontend/src/components/FieldLayout/Field.vue b/frontend/src/components/FieldLayout/Field.vue index b517d973..07f530cd 100644 --- a/frontend/src/components/FieldLayout/Field.vue +++ b/frontend/src/components/FieldLayout/Field.vue @@ -332,12 +332,10 @@ const getPlaceholder = (field) => { } function fieldChange(value, df) { - data.value[df.fieldname] = value - if (isGridRow) { - triggerOnChange(df.fieldname, data.value) + triggerOnChange(df.fieldname, value, data.value) } else { - triggerOnChange(df.fieldname) + triggerOnChange(df.fieldname, value) } } diff --git a/frontend/src/components/SidePanelLayout.vue b/frontend/src/components/SidePanelLayout.vue index 3fe8fd1a..b9512b46 100644 --- a/frontend/src/components/SidePanelLayout.vue +++ b/frontend/src/components/SidePanelLayout.vue @@ -489,9 +489,7 @@ function parsedField(field) { async function fieldChange(value, df) { if (props.preview) return - document.doc[df.fieldname] = value - - await triggerOnChange(df.fieldname) + await triggerOnChange(df.fieldname, value) document.save.submit(null, { onSuccess: () => { diff --git a/frontend/src/data/document.js b/frontend/src/data/document.js index 7d456676..76e35a9e 100644 --- a/frontend/src/data/document.js +++ b/frontend/src/data/document.js @@ -117,20 +117,26 @@ export function useDocument(doctype, docname) { await trigger(handler) } - async function triggerOnChange(fieldname, row) { + async function triggerOnChange(fieldname, value, row) { + const oldValue = documentsCache[doctype][docname || ''].doc[fieldname] + documentsCache[doctype][docname || ''].doc[fieldname] = value + const handler = async function () { + this.value = value + this.oldValue = oldValue if (row) { this.currentRowIdx = row.idx - this.value = row[fieldname] - this.oldValue = getOldValue(fieldname, row) - } else { - this.value = documentsCache[doctype][docname || ''].doc[fieldname] - this.oldValue = getOldValue(fieldname) } await this[fieldname]?.() } - await trigger(handler, row) + try { + await trigger(handler, row) + } catch (error) { + documentsCache[doctype][docname || ''].doc[fieldname] = oldValue + console.error(handler) + throw error + } } async function triggerOnRowAdd(row) { From 5fff00338a258472f5c86f5c6f09ca56cf2b6022 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Wed, 11 Jun 2025 14:19:16 +0530 Subject: [PATCH 07/77] fix: added throwError global method (cherry picked from commit 9af300bba8a59cb49ecce26fe5e790fdb646cd99) --- frontend/src/data/script.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/frontend/src/data/script.js b/frontend/src/data/script.js index b809f744..47185bab 100644 --- a/frontend/src/data/script.js +++ b/frontend/src/data/script.js @@ -46,6 +46,11 @@ export function getScript(doctype, view = 'Form') { helpers.router = router helpers.call = call + helpers.throwError = (message) => { + toast.error(message || __('An error occurred')) + throw new Error(message || __('An error occurred')) + } + helpers.crm = { makePhoneCall: makeCall, } From 87a38250f6549d1aef2c102a8323c823f36eedda Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Wed, 11 Jun 2025 14:20:11 +0530 Subject: [PATCH 08/77] fix: trigger on change on status change (cherry picked from commit e9e0aa357b1b1596f57d8bda0037f36514972169) --- frontend/src/components/Modals/DealModal.vue | 4 ++-- frontend/src/components/Modals/LeadModal.vue | 4 ++-- frontend/src/pages/Deal.vue | 14 ++++++++++++-- frontend/src/pages/Lead.vue | 15 ++++++++++----- frontend/src/pages/MobileDeal.vue | 14 ++++++++++++-- frontend/src/pages/MobileLead.vue | 14 ++++++++++++-- frontend/src/stores/statuses.js | 13 +++++++++---- 7 files changed, 59 insertions(+), 19 deletions(-) diff --git a/frontend/src/components/Modals/DealModal.vue b/frontend/src/components/Modals/DealModal.vue index 1c516407..e4ce7419 100644 --- a/frontend/src/components/Modals/DealModal.vue +++ b/frontend/src/components/Modals/DealModal.vue @@ -94,7 +94,7 @@ const show = defineModel() const router = useRouter() const error = ref(null) -const { document: deal } = useDocument('CRM Deal') +const { document: deal, triggerOnChange } = useDocument('CRM Deal') const hasOrganizationSections = ref(true) const hasContactSections = ref(true) @@ -164,7 +164,7 @@ const tabs = createResource({ }) const dealStatuses = computed(() => { - let statuses = statusOptions('deal') + let statuses = statusOptions('deal', null, [], triggerOnChange) if (!deal.doc.status) { deal.doc.status = statuses[0].value } diff --git a/frontend/src/components/Modals/LeadModal.vue b/frontend/src/components/Modals/LeadModal.vue index bf1461d1..1976ad3c 100644 --- a/frontend/src/components/Modals/LeadModal.vue +++ b/frontend/src/components/Modals/LeadModal.vue @@ -70,10 +70,10 @@ const router = useRouter() const error = ref(null) const isLeadCreating = ref(false) -const { document: lead } = useDocument('CRM Lead') +const { document: lead, triggerOnChange } = useDocument('CRM Lead') const leadStatuses = computed(() => { - let statuses = statusOptions('lead') + let statuses = statusOptions('lead', null, [], triggerOnChange) if (!lead.doc.status) { lead.doc.status = statuses?.[0]?.value } diff --git a/frontend/src/pages/Deal.vue b/frontend/src/pages/Deal.vue index e3d09fa7..34e06141 100644 --- a/frontend/src/pages/Deal.vue +++ b/frontend/src/pages/Deal.vue @@ -23,7 +23,14 @@ /> diff --git a/frontend/src/components/Modals/ChangePasswordModal.vue b/frontend/src/components/Modals/ChangePasswordModal.vue index 673864cb..d6c03399 100644 --- a/frontend/src/components/Modals/ChangePasswordModal.vue +++ b/frontend/src/components/Modals/ChangePasswordModal.vue @@ -102,23 +102,26 @@ function isStrongPassword(password) { return regex.test(password) } -watch(newPassword, () => { +watch([newPassword, confirmPassword], () => { + confirmPasswordMessage.value = '' newPasswordMessage.value = '' + if (newPassword.value.length < 8) { newPasswordMessage.value = 'Password must be at least 8 characters' } else if (!isStrongPassword(newPassword.value)) { newPasswordMessage.value = 'Password must contain uppercase, lowercase, number, and symbol' } -}) -watch(confirmPassword, () => { - confirmPasswordMessage.value = '' - if (newPassword.value !== confirmPassword.value) { + if ( + confirmPassword.value.length && + newPassword.value !== confirmPassword.value + ) { confirmPasswordMessage.value = 'Passwords do not match' } else if ( newPassword.value === confirmPassword.value && - newPassword.value.length + newPassword.value.length && + confirmPassword.value.length ) { confirmPasswordMessage.value = 'Passwords match' } From c3a89c564b47b5fbe800b6e907e00fdda43b0fcf Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Fri, 20 Jun 2025 15:50:47 +0530 Subject: [PATCH 57/77] fix: get users and crm users (cherry picked from commit 001a3231e1342dabf9a611ecc2e79e4a25182943) --- crm/api/session.py | 9 ++++++++- frontend/src/stores/users.js | 8 ++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/crm/api/session.py b/crm/api/session.py index 278f8b5e..add14c37 100644 --- a/crm/api/session.py +++ b/crm/api/session.py @@ -44,7 +44,14 @@ def get_users(): user.is_agent = frappe.db.exists("CRM Telephony Agent", {"user": user.name}) - return users + crm_users = [] + + # crm users are users with role Sales User or Sales Manager + for user in users: + if "Sales User" in user.roles or "Sales Manager" in user.roles: + crm_users.append(user) + + return users, crm_users @frappe.whitelist() diff --git a/frontend/src/stores/users.js b/frontend/src/stores/users.js index 1cf35ca5..3614bda5 100644 --- a/frontend/src/stores/users.js +++ b/frontend/src/stores/users.js @@ -12,17 +12,17 @@ export const usersStore = defineStore('crm-users', () => { const users = createResource({ url: 'crm.api.session.get_users', - cache: 'Users', + cache: 'crm-users', initialData: [], auto: true, - transform(users) { - for (let user of users) { + transform([allUsers, crmUsers]) { + for (let user of allUsers) { usersByName[user.name] = user if (user.name === 'Administrator') { usersByName[user.email] = user } } - return users + return { allUsers, crmUsers } }, onError(error) { if (error && error.exc_type === 'AuthenticationError') { From 7fbda3ec9c8af782e4c8b4cb6ac3877d31c7f323 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Fri, 20 Jun 2025 16:41:08 +0530 Subject: [PATCH 58/77] fix: use crmUsers in comment box (cherry picked from commit 85191e10c881490ae420156798a320935a9c6fa2) --- frontend/src/components/CommentBox.vue | 2 +- frontend/src/components/Settings/Settings.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/CommentBox.vue b/frontend/src/components/CommentBox.vue index 3fcfc82c..86074750 100644 --- a/frontend/src/components/CommentBox.vue +++ b/frontend/src/components/CommentBox.vue @@ -149,7 +149,7 @@ function removeAttachment(attachment) { const users = computed(() => { return ( - usersList.data + usersList.data?.crmUsers ?.filter((user) => user.enabled) .map((user) => ({ label: user.full_name.trimEnd(), diff --git a/frontend/src/components/Settings/Settings.vue b/frontend/src/components/Settings/Settings.vue index 612e67a2..c81fa5f3 100644 --- a/frontend/src/components/Settings/Settings.vue +++ b/frontend/src/components/Settings/Settings.vue @@ -60,7 +60,7 @@ import { showSettings, activeSettingsPage, } from '@/composables/settings' -import { Dialog, Button, Avatar } from 'frappe-ui' +import { Dialog, Avatar } from 'frappe-ui' import { ref, markRaw, computed, watch, h } from 'vue' const { isManager, isAgent, getUser } = usersStore() From 1810b31647be8f7caeb1808a820b20ce77eb75ac Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Fri, 20 Jun 2025 16:42:45 +0530 Subject: [PATCH 59/77] fix: created multi select user input (cherry picked from commit f818a4c1d6ee4defeacacfbc39c4ef40309d01b1) --- .../Controls/MultiSelectUserInput.vue | 278 ++++++++++++++++++ 1 file changed, 278 insertions(+) create mode 100644 frontend/src/components/Controls/MultiSelectUserInput.vue diff --git a/frontend/src/components/Controls/MultiSelectUserInput.vue b/frontend/src/components/Controls/MultiSelectUserInput.vue new file mode 100644 index 00000000..3a554c2e --- /dev/null +++ b/frontend/src/components/Controls/MultiSelectUserInput.vue @@ -0,0 +1,278 @@ + + + From ffd24933cd6e104bc2de7754edf8b2630c9e2db5 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Fri, 20 Jun 2025 16:43:48 +0530 Subject: [PATCH 60/77] fix: use multi select user input and show already exist error if user with email exist or invited (cherry picked from commit d06ac91052021be38952d9956e418ff868c11af5) --- .../components/Settings/InviteUserPage.vue | 46 +++++++++++++++++-- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/frontend/src/components/Settings/InviteUserPage.vue b/frontend/src/components/Settings/InviteUserPage.vue index 077668ed..77ce8211 100644 --- a/frontend/src/components/Settings/InviteUserPage.vue +++ b/frontend/src/components/Settings/InviteUserPage.vue @@ -11,7 +11,7 @@
-
+
+ {{ userExistMessage || inviteeExistMessage }} +
From c8d165593a45d5ee19011db74feb2ee896b72e96 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Fri, 20 Jun 2025 17:18:36 +0530 Subject: [PATCH 63/77] fix: existingEmail is a list (cherry picked from commit 0f8d484e282a2773c23ca927d3e39d7d9d87707b) --- frontend/src/components/Modals/AddExistingUserModal.vue | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/Modals/AddExistingUserModal.vue b/frontend/src/components/Modals/AddExistingUserModal.vue index 3970436c..db6b2d4d 100644 --- a/frontend/src/components/Modals/AddExistingUserModal.vue +++ b/frontend/src/components/Modals/AddExistingUserModal.vue @@ -28,9 +28,10 @@ :placeholder="__('john@doe.com')" v-model="newUsers" :validate="validateEmail" - :existingEmails=" - users.data.crmUsers.map((user) => user.name) + ['admin@example.com'] - " + :existingEmails="[ + ...users.data.crmUsers.map((user) => user.name), + 'admin@example.com', + ]" :error-message=" (value) => __('{0} is an invalid email address', [value]) " From e267445a80254f07c80ca363d55d8034caeae4af Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Fri, 20 Jun 2025 17:20:12 +0530 Subject: [PATCH 64/77] fix: layout change (cherry picked from commit 0ad65be961ff70f069be78979004820d827a96d0) --- .../components/Settings/EmailAccountList.vue | 37 ++++++++----- .../components/Settings/GeneralSettings.vue | 47 +++++++++------- .../components/Settings/InviteUserPage.vue | 39 +++++++++----- .../src/components/Settings/SettingsPage.vue | 48 +++++++++-------- .../components/Settings/TelephonySettings.vue | 54 ++++++++++--------- frontend/src/components/Settings/Users.vue | 2 +- 6 files changed, 129 insertions(+), 98 deletions(-) diff --git a/frontend/src/components/Settings/EmailAccountList.vue b/frontend/src/components/Settings/EmailAccountList.vue index fe5fe222..192ee910 100644 --- a/frontend/src/components/Settings/EmailAccountList.vue +++ b/frontend/src/components/Settings/EmailAccountList.vue @@ -1,21 +1,30 @@ - - diff --git a/frontend/src/components/Settings/ProfileSettings.vue b/frontend/src/components/Settings/ProfileSettings.vue index 7f19029f..b2899157 100644 --- a/frontend/src/components/Settings/ProfileSettings.vue +++ b/frontend/src/components/Settings/ProfileSettings.vue @@ -1,6 +1,6 @@