diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 1015fe997..499e5c120 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,7 +1,2 @@ -## All javascript files should be reviewed by pranav before merging -*.js @pranavrajs -*.vue @pranavrajs - - ## All enterprise related files should be reviewed by sojan before merging /enterprise/* @sojan-official diff --git a/app/controllers/devise_overrides/sessions_controller.rb b/app/controllers/devise_overrides/sessions_controller.rb index e623e52f7..fc7b12767 100644 --- a/app/controllers/devise_overrides/sessions_controller.rb +++ b/app/controllers/devise_overrides/sessions_controller.rb @@ -4,6 +4,10 @@ class DeviseOverrides::SessionsController < DeviseTokenAuth::SessionsController wrap_parameters format: [] before_action :process_sso_auth_token, only: [:create] + def new + redirect_to login_page_url(error: 'access-denied') + end + def create # Authenticate user via the temporary sso auth token if params[:sso_auth_token].present? && @resource.present? @@ -21,6 +25,12 @@ class DeviseOverrides::SessionsController < DeviseTokenAuth::SessionsController private + def login_page_url(error: nil) + frontend_url = ENV.fetch('FRONTEND_URL', nil) + + "#{frontend_url}/app/login?error=#{error}" + end + def authenticate_resource_with_sso_token @token = @resource.create_token @resource.save! diff --git a/app/javascript/dashboard/assets/scss/_layout.scss b/app/javascript/dashboard/assets/scss/_layout.scss index 54a03c403..b9c8a9bf1 100644 --- a/app/javascript/dashboard/assets/scss/_layout.scss +++ b/app/javascript/dashboard/assets/scss/_layout.scss @@ -11,6 +11,7 @@ body { 'Segoe UI', Roboto, 'Helvetica Neue', + Tahoma, Arial, sans-serif !important; -moz-osx-font-smoothing: grayscale; diff --git a/app/javascript/dashboard/assets/scss/widgets/_buttons.scss b/app/javascript/dashboard/assets/scss/widgets/_buttons.scss index 54fc27e25..587b810ca 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_buttons.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_buttons.scss @@ -118,7 +118,7 @@ button { @apply border border-woot-500 bg-transparent dark:bg-transparent dark:border-woot-500 text-woot-500 dark:text-woot-500 hover:bg-woot-50 dark:hover:bg-woot-900; &.secondary { - @apply text-slate-700 border-slate-200 dark:border-slate-600 dark:text-slate-100 hover:bg-slate-50 dark:hover:bg-slate-700; + @apply text-slate-700 border-slate-100 dark:border-slate-800 dark:text-slate-100 hover:bg-slate-50 dark:hover:bg-slate-700; } &.success { diff --git a/app/javascript/dashboard/components/CustomAttribute.vue b/app/javascript/dashboard/components/CustomAttribute.vue index f89579773..b50ad54cb 100644 --- a/app/javascript/dashboard/components/CustomAttribute.vue +++ b/app/javascript/dashboard/components/CustomAttribute.vue @@ -2,23 +2,27 @@

-
+
{{ label }}
-
+
{{ urlValue }}

{{ displayValue || '---' }}

@@ -126,6 +130,7 @@ diff --git a/app/javascript/dashboard/components/widgets/TableFooterPagination.vue b/app/javascript/dashboard/components/widgets/TableFooterPagination.vue new file mode 100644 index 000000000..c048b2eb7 --- /dev/null +++ b/app/javascript/dashboard/components/widgets/TableFooterPagination.vue @@ -0,0 +1,143 @@ + + + diff --git a/app/javascript/dashboard/components/widgets/TableFooterResults.vue b/app/javascript/dashboard/components/widgets/TableFooterResults.vue new file mode 100644 index 000000000..305933059 --- /dev/null +++ b/app/javascript/dashboard/components/widgets/TableFooterResults.vue @@ -0,0 +1,28 @@ + + + diff --git a/app/javascript/dashboard/components/widgets/TableHeaderCell.vue b/app/javascript/dashboard/components/widgets/TableHeaderCell.vue new file mode 100644 index 000000000..8e2cd6326 --- /dev/null +++ b/app/javascript/dashboard/components/widgets/TableHeaderCell.vue @@ -0,0 +1,39 @@ + + diff --git a/app/javascript/dashboard/components/widgets/conversation/conversationCardComponents/CardLabels.vue b/app/javascript/dashboard/components/widgets/conversation/conversationCardComponents/CardLabels.vue index c94e5389b..079d1c7bf 100644 --- a/app/javascript/dashboard/components/widgets/conversation/conversationCardComponents/CardLabels.vue +++ b/app/javascript/dashboard/components/widgets/conversation/conversationCardComponents/CardLabels.vue @@ -46,6 +46,11 @@ export default { type: Number, required: true, }, + conversationLabels: { + type: String, + required: false, + default: '', + }, }, data() { return { diff --git a/app/javascript/dashboard/i18n/locale/en/contact.json b/app/javascript/dashboard/i18n/locale/en/contact.json index 791279899..24483ca1a 100644 --- a/app/javascript/dashboard/i18n/locale/en/contact.json +++ b/app/javascript/dashboard/i18n/locale/en/contact.json @@ -296,6 +296,8 @@ "BUTTON": "Add custom attribute", "NOT_AVAILABLE": "There are no custom attributes available for this contact.", "COPY_SUCCESSFUL": "Copied to clipboard successfully", + "SHOW_MORE": "Show all attributes", + "SHOW_LESS": "Show less attributes", "ACTIONS": { "COPY": "Copy attribute", "DELETE": "Delete attribute", diff --git a/app/javascript/dashboard/i18n/locale/en/general.json b/app/javascript/dashboard/i18n/locale/en/general.json new file mode 100644 index 000000000..25bb4dfb7 --- /dev/null +++ b/app/javascript/dashboard/i18n/locale/en/general.json @@ -0,0 +1,5 @@ +{ + "GENERAL": { + "SHOWING_RESULTS": "Showing {firstIndex}-{lastIndex} of {totalCount} items" + } +} diff --git a/app/javascript/dashboard/i18n/locale/en/index.js b/app/javascript/dashboard/i18n/locale/en/index.js index 75cdb5836..81e0c5763 100644 --- a/app/javascript/dashboard/i18n/locale/en/index.js +++ b/app/javascript/dashboard/i18n/locale/en/index.js @@ -31,6 +31,7 @@ import teamsSettings from './teamsSettings.json'; import whatsappTemplates from './whatsappTemplates.json'; import sla from './sla.json'; import inbox from './inbox.json'; +import general from './general.json'; export default { ...advancedFilters, @@ -66,4 +67,5 @@ export default { ...teamsSettings, ...whatsappTemplates, ...inbox, + ...general, }; diff --git a/app/javascript/dashboard/i18n/locale/en/report.json b/app/javascript/dashboard/i18n/locale/en/report.json index c41e8b8a1..7a4bf60ad 100644 --- a/app/javascript/dashboard/i18n/locale/en/report.json +++ b/app/javascript/dashboard/i18n/locale/en/report.json @@ -508,15 +508,31 @@ }, "SLA_REPORTS": { "HEADER": "SLA Reports", + "NO_RECORDS": "SLA applied conversations are not available.", + "LOADING": "Loading SLA data...", + "DOWNLOAD_SLA_REPORTS": "Download SLA reports", + "DOWNLOAD_FAILED": "Failed to download SLA Reports", "METRICS": { "HIT_RATE": { "LABEL": "Hit Rate", "TOOLTIP": "Percentage of SLAs created were completed successfully" }, - "NO_OF_BREACHES": { - "LABEL": "Number of Breaches", - "TOOLTIP": "The total SLA breaches in a certain period." + "NO_OF_MISSES": { + "LABEL": "Number of Misses", + "TOOLTIP": "Total SLA misses in a certain period" + }, + "NO_OF_CONVERSATIONS": { + "LABEL": "Number of Conversations", + "TOOLTIP": "Total number of conversations with SLA" } + }, + "TABLE": { + "HEADER": { + "POLICY": "Policy", + "CONVERSATION": "Conversation", + "AGENT": "Agent" + }, + "VIEW_DETAILS": "View Details" } } } diff --git a/app/javascript/dashboard/i18n/locale/en/settings.json b/app/javascript/dashboard/i18n/locale/en/settings.json index d9834c545..e9ac56f2a 100644 --- a/app/javascript/dashboard/i18n/locale/en/settings.json +++ b/app/javascript/dashboard/i18n/locale/en/settings.json @@ -240,6 +240,7 @@ "CAMPAIGNS": "Campaigns", "ONGOING": "Ongoing", "ONE_OFF": "One off", + "REPORTS_SLA": "SLA", "REPORTS_BOT": "Bot", "REPORTS_AGENT": "Agents", "REPORTS_LABEL": "Labels", diff --git a/app/javascript/dashboard/i18n/locale/en/sla.json b/app/javascript/dashboard/i18n/locale/en/sla.json index 34f65c8a9..d47e89c05 100644 --- a/app/javascript/dashboard/i18n/locale/en/sla.json +++ b/app/javascript/dashboard/i18n/locale/en/sla.json @@ -65,7 +65,7 @@ }, "ADD": { "TITLE": "Add SLA", - "DESC": "SLAs: Friendly promises for great service!", + "DESC": "Friendly promises for great service!", "API": { "SUCCESS_MESSAGE": "SLA added successfully", "ERROR_MESSAGE": "There was an error, please try again" diff --git a/app/javascript/dashboard/mixins/attributeMixin.js b/app/javascript/dashboard/mixins/attributeMixin.js index 6348067b2..5bc05a4ae 100644 --- a/app/javascript/dashboard/mixins/attributeMixin.js +++ b/app/javascript/dashboard/mixins/attributeMixin.js @@ -29,33 +29,6 @@ export default { conversationId() { return this.currentChat.id; }, - - filteredAttributes() { - return Object.keys(this.customAttributes).map(key => { - const item = this.attributes.find( - attribute => attribute.attribute_key === key - ); - if (item) { - return { - ...item, - value: this.customAttributes[key], - }; - } - - return { - ...item, - value: this.customAttributes[key], - attribute_description: key, - attribute_display_name: key, - attribute_display_type: this.attributeDisplayType( - this.customAttributes[key] - ), - attribute_key: key, - attribute_model: this.attributeType, - id: Math.random(), - }; - }); - }, }, methods: { isAttributeNumber(attributeValue) { diff --git a/app/javascript/dashboard/mixins/conversation/labelMixin.js b/app/javascript/dashboard/mixins/conversation/labelMixin.js index 5d0e17507..6c9e954b6 100644 --- a/app/javascript/dashboard/mixins/conversation/labelMixin.js +++ b/app/javascript/dashboard/mixins/conversation/labelMixin.js @@ -4,6 +4,10 @@ export default { computed: { ...mapGetters({ accountLabels: 'labels/getLabels' }), savedLabels() { + // If conversationLabels is passed as prop, use it + if (this.conversationLabels) + return this.conversationLabels.split(',').map(item => item.trim()); + // Otherwise, get labels from store return this.$store.getters['conversationLabels/getConversationLabels']( this.conversationId ); diff --git a/app/javascript/dashboard/mixins/specs/attributeFixtures.js b/app/javascript/dashboard/mixins/specs/attributeFixtures.js deleted file mode 100644 index 4ade79cde..000000000 --- a/app/javascript/dashboard/mixins/specs/attributeFixtures.js +++ /dev/null @@ -1,26 +0,0 @@ -export default [ - { - attribute_description: 'Product name', - attribute_display_name: 'Product name', - attribute_display_type: 'text', - attribute_key: 'product_name', - attribute_model: 'conversation_attribute', - created_at: '2021-09-03T10:45:09.587Z', - default_value: null, - id: 6, - updated_at: '2021-09-22T10:40:42.511Z', - }, - { - attribute_description: 'Product identifier', - attribute_display_name: 'Product id', - attribute_display_type: 'number', - attribute_key: 'product_id', - attribute_model: 'conversation_attribute', - created_at: '2021-09-16T13:06:47.329Z', - default_value: null, - icon: 'fluent-calculator', - id: 10, - updated_at: '2021-09-22T10:42:25.873Z', - value: 2021, - }, -]; diff --git a/app/javascript/dashboard/mixins/specs/attributeMixin.spec.js b/app/javascript/dashboard/mixins/specs/attributeMixin.spec.js index 9a5efa463..d725f758c 100644 --- a/app/javascript/dashboard/mixins/specs/attributeMixin.spec.js +++ b/app/javascript/dashboard/mixins/specs/attributeMixin.spec.js @@ -1,7 +1,6 @@ import { shallowMount, createLocalVue } from '@vue/test-utils'; import attributeMixin from '../attributeMixin'; import Vuex from 'vuex'; -import attributeFixtures from './attributeFixtures'; const localVue = createLocalVue(); localVue.use(Vuex); @@ -41,43 +40,6 @@ describe('attributeMixin', () => { expect(wrapper.vm.conversationId).toEqual(7165); }); - it('returns filtered attributes from conversation custom attributes', () => { - const Component = { - render() {}, - title: 'TestComponent', - mixins: [attributeMixin], - computed: { - attributes() { - return attributeFixtures; - }, - contact() { - return { - id: 7165, - custom_attributes: { - product_id: 2021, - }, - }; - }, - }, - }; - const wrapper = shallowMount(Component, { store, localVue }); - expect(wrapper.vm.filteredAttributes).toEqual([ - { - attribute_description: 'Product identifier', - attribute_display_name: 'Product id', - attribute_display_type: 'number', - attribute_key: 'product_id', - attribute_model: 'conversation_attribute', - created_at: '2021-09-16T13:06:47.329Z', - default_value: null, - icon: 'fluent-calculator', - id: 10, - updated_at: '2021-09-22T10:42:25.873Z', - value: 2021, - }, - ]); - }); - it('return display type if attribute passed', () => { const Component = { render() {}, diff --git a/app/javascript/dashboard/routes/dashboard/contacts/components/ContactInfoPanel.vue b/app/javascript/dashboard/routes/dashboard/contacts/components/ContactInfoPanel.vue index d87615909..c7bc915b5 100644 --- a/app/javascript/dashboard/routes/dashboard/contacts/components/ContactInfoPanel.vue +++ b/app/javascript/dashboard/routes/dashboard/contacts/components/ContactInfoPanel.vue @@ -38,13 +38,10 @@ :contact-id="contact.id" attribute-type="contact_attribute" attribute-class="conversation--attribute" + attribute-from="contact_panel" :custom-attributes="contact.custom_attributes" class="even" /> -
@@ -85,7 +82,6 @@ import ContactConversations from 'dashboard/routes/dashboard/conversation/Contac import ContactInfo from 'dashboard/routes/dashboard/conversation/contact/ContactInfo.vue'; import ContactLabel from 'dashboard/routes/dashboard/contacts/components/ContactLabels.vue'; import CustomAttributes from 'dashboard/routes/dashboard/conversation/customAttributes/CustomAttributes.vue'; -import CustomAttributeSelector from 'dashboard/routes/dashboard/conversation/customAttributes/CustomAttributeSelector.vue'; import draggable from 'vuedraggable'; import uiSettingsMixin from 'dashboard/mixins/uiSettings'; @@ -96,7 +92,6 @@ export default { ContactInfo, ContactLabel, CustomAttributes, - CustomAttributeSelector, draggable, }, mixins: [uiSettingsMixin], diff --git a/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsView.vue b/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsView.vue index 81973a395..41e0dff56 100644 --- a/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsView.vue +++ b/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsView.vue @@ -25,6 +25,7 @@ @on-sort-change="onSortChange" /> - @@ -142,7 +139,6 @@ import ConversationParticipant from './ConversationParticipant.vue'; import ContactInfo from './contact/ContactInfo.vue'; import ConversationInfo from './ConversationInfo.vue'; import CustomAttributes from './customAttributes/CustomAttributes.vue'; -import CustomAttributeSelector from './customAttributes/CustomAttributeSelector.vue'; import draggable from 'vuedraggable'; import uiSettingsMixin from 'dashboard/mixins/uiSettings'; import MacrosList from './Macros/List.vue'; @@ -154,7 +150,6 @@ export default { ContactInfo, ConversationInfo, CustomAttributes, - CustomAttributeSelector, ConversationAction, ConversationParticipant, draggable, diff --git a/app/javascript/dashboard/routes/dashboard/conversation/ConversationInfo.vue b/app/javascript/dashboard/routes/dashboard/conversation/ConversationInfo.vue index 7609e949e..5f488341d 100644 --- a/app/javascript/dashboard/routes/dashboard/conversation/ConversationInfo.vue +++ b/app/javascript/dashboard/routes/dashboard/conversation/ConversationInfo.vue @@ -1,152 +1,109 @@ - - - + + diff --git a/app/javascript/dashboard/routes/dashboard/conversation/contact/ContactForm.vue b/app/javascript/dashboard/routes/dashboard/conversation/contact/ContactForm.vue index bbe545a3d..b958d4211 100644 --- a/app/javascript/dashboard/routes/dashboard/conversation/contact/ContactForm.vue +++ b/app/javascript/dashboard/routes/dashboard/conversation/contact/ContactForm.vue @@ -125,8 +125,9 @@ > {{ socialProfile.prefixURL }} + {{ socialProfile.prefixURL }} + -
-

- {{ $t('CUSTOM_ATTRIBUTES.FORM.ATTRIBUTE_SELECT.TITLE') }} -

-
- -
-
-
- - - -
- {{ $t('CUSTOM_ATTRIBUTES.FORM.ATTRIBUTE_SELECT.NO_RESULT') }} -
- - {{ $t('CUSTOM_ATTRIBUTES.FORM.ADD.TITLE') }} - -
-
-
- - - - - diff --git a/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributeDropDownItem.vue b/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributeDropDownItem.vue deleted file mode 100644 index 8bae9c1b0..000000000 --- a/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributeDropDownItem.vue +++ /dev/null @@ -1,79 +0,0 @@ - - - - - diff --git a/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributeSelector.vue b/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributeSelector.vue deleted file mode 100644 index 60ef9d860..000000000 --- a/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributeSelector.vue +++ /dev/null @@ -1,138 +0,0 @@ - - - - - diff --git a/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributes.vue b/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributes.vue index ca721d4d8..cf54e7087 100644 --- a/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributes.vue +++ b/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributes.vue @@ -1,23 +1,35 @@ @@ -25,13 +37,14 @@ import CustomAttribute from 'dashboard/components/CustomAttribute.vue'; import alertMixin from 'shared/mixins/alertMixin'; import attributeMixin from 'dashboard/mixins/attributeMixin'; +import uiSettingsMixin from 'dashboard/mixins/uiSettings'; import { copyTextToClipboard } from 'shared/helpers/clipboard'; export default { components: { CustomAttribute, }, - mixins: [alertMixin, attributeMixin], + mixins: [alertMixin, attributeMixin, uiSettingsMixin], props: { attributeType: { type: String, @@ -42,8 +55,67 @@ export default { default: '', }, contactId: { type: Number, default: null }, + attributeFrom: { + type: String, + required: true, + }, + }, + data() { + return { + showAllAttributes: false, + }; + }, + computed: { + toggleButtonText() { + return !this.showAllAttributes + ? this.$t('CUSTOM_ATTRIBUTES.SHOW_MORE') + : this.$t('CUSTOM_ATTRIBUTES.SHOW_LESS'); + }, + filteredAttributes() { + return this.attributes.map(attribute => { + // Check if the attribute key exists in customAttributes + const hasValue = Object.hasOwnProperty.call( + this.customAttributes, + attribute.attribute_key + ); + + const isCheckbox = attribute.attribute_display_type === 'checkbox'; + const defaultValue = isCheckbox ? false : ''; + + return { + ...attribute, + // Set value from customAttributes if it exists, otherwise use default value + value: hasValue + ? this.customAttributes[attribute.attribute_key] + : defaultValue, + }; + }); + }, + displayedAttributes() { + // Show only the first 5 attributes or all depending on showAllAttributes + if (this.showAllAttributes || this.filteredAttributes.length <= 5) { + return this.filteredAttributes; + } + return this.filteredAttributes.slice(0, 5); + }, + showMoreUISettingsKey() { + return `show_all_attributes_${this.attributeFrom}`; + }, + }, + mounted() { + this.initializeSettings(); }, methods: { + initializeSettings() { + this.showAllAttributes = + this.uiSettings[this.showMoreUISettingsKey] || false; + }, + onClickToggle() { + this.showAllAttributes = !this.showAllAttributes; + this.updateUISettings({ + [this.showMoreUISettingsKey]: this.showAllAttributes, + }); + }, async onUpdate(key, value) { const updatedAttributes = { ...this.customAttributes, [key]: value }; try { @@ -96,16 +168,17 @@ export default { }, }; + diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/SLA/SLAReportItem.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/SLA/SLAReportItem.vue new file mode 100644 index 000000000..129265cdf --- /dev/null +++ b/app/javascript/dashboard/routes/dashboard/settings/reports/components/SLA/SLAReportItem.vue @@ -0,0 +1,59 @@ + + + diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/SLA/SLATable.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/SLA/SLATable.vue new file mode 100644 index 000000000..61ac3056f --- /dev/null +++ b/app/javascript/dashboard/routes/dashboard/settings/reports/components/SLA/SLATable.vue @@ -0,0 +1,111 @@ + + + diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/components/SLA/SLAViewDetails.vue b/app/javascript/dashboard/routes/dashboard/settings/reports/components/SLA/SLAViewDetails.vue new file mode 100644 index 000000000..72bc4749a --- /dev/null +++ b/app/javascript/dashboard/routes/dashboard/settings/reports/components/SLA/SLAViewDetails.vue @@ -0,0 +1,55 @@ + + + diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/reports.routes.js b/app/javascript/dashboard/routes/dashboard/settings/reports/reports.routes.js index 5e363553d..3792567da 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/reports/reports.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/reports/reports.routes.js @@ -9,6 +9,7 @@ const TeamReports = () => import('./TeamReports.vue'); const CsatResponses = () => import('./CsatResponses.vue'); const BotReports = () => import('./BotReports.vue'); const LiveReports = () => import('./LiveReports.vue'); +const SLAReports = () => import('./SLAReports.vue'); export default { routes: [ @@ -151,5 +152,22 @@ export default { }, ], }, + { + path: frontendURL('accounts/:accountId/reports'), + component: SettingsContent, + props: { + headerTitle: 'SLA_REPORTS.HEADER', + icon: 'document-list-clock', + keepAlive: false, + }, + children: [ + { + path: 'sla', + name: 'sla_reports', + roles: ['administrator'], + component: SLAReports, + }, + ], + }, ], }; diff --git a/app/javascript/dashboard/routes/dashboard/settings/sla/SlaForm.vue b/app/javascript/dashboard/routes/dashboard/settings/sla/SlaForm.vue index 029e2bda8..bbe0ac7fe 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/sla/SlaForm.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/sla/SlaForm.vue @@ -5,6 +5,11 @@ v-model="name" :class="{ error: $v.name.$error }" class="w-full" + :styles="{ + borderRadius: '12px', + padding: '6px 12px', + fontSize: '14px', + }" :label="$t('SLA.FORM.NAME.LABEL')" :placeholder="$t('SLA.FORM.NAME.PLACEHOLDER')" :error="getSlaNameErrorMessage" @@ -13,6 +18,11 @@ @@ -29,23 +39,29 @@ @isInValid="handleIsInvalid(index, $event)" /> -
- -