chore: Migrate to next Switch component (#12005)

This commit is contained in:
Sivin Varghese
2025-07-23 13:56:17 +05:30
committed by GitHub
parent ab1ba1c4c7
commit 6fb762f96c
12 changed files with 54 additions and 165 deletions

View File

@@ -6,7 +6,7 @@ import DropdownBody from './base/DropdownBody.vue';
import DropdownSection from './base/DropdownSection.vue'; import DropdownSection from './base/DropdownSection.vue';
import DropdownItem from './base/DropdownItem.vue'; import DropdownItem from './base/DropdownItem.vue';
import DropdownSeparator from './base/DropdownSeparator.vue'; import DropdownSeparator from './base/DropdownSeparator.vue';
import WootSwitch from 'components/ui/Switch.vue'; import ToggleSwitch from 'dashboard/components-next/switch/Switch.vue';
const currentUserAutoOffline = ref(false); const currentUserAutoOffline = ref(false);
@@ -61,7 +61,7 @@ const menuItems = ref([
<DropdownItem label="Contact Support" class="justify-between"> <DropdownItem label="Contact Support" class="justify-between">
<span>{{ $t('SIDEBAR.SET_AUTO_OFFLINE.TEXT') }}</span> <span>{{ $t('SIDEBAR.SET_AUTO_OFFLINE.TEXT') }}</span>
<div class="flex-shrink-0"> <div class="flex-shrink-0">
<WootSwitch v-model="currentUserAutoOffline" /> <ToggleSwitch v-model="currentUserAutoOffline" />
</div> </div>
</DropdownItem> </DropdownItem>
</DropdownSection> </DropdownSection>

View File

@@ -14,6 +14,7 @@ import {
} from 'next/dropdown-menu/base'; } from 'next/dropdown-menu/base';
import Icon from 'next/icon/Icon.vue'; import Icon from 'next/icon/Icon.vue';
import Button from 'next/button/Button.vue'; import Button from 'next/button/Button.vue';
import ToggleSwitch from 'dashboard/components-next/switch/Switch.vue';
const { t } = useI18n(); const { t } = useI18n();
const store = useStore(); const store = useStore();
@@ -48,6 +49,16 @@ const activeStatus = computed(() => {
return availabilityStatuses.value.find(status => status.active); return availabilityStatuses.value.find(status => status.active);
}); });
const autoOfflineToggle = computed({
get: () => currentUserAutoOffline.value,
set: autoOffline => {
store.dispatch('updateAutoOffline', {
accountId: currentAccountId.value,
autoOffline,
});
},
});
function changeAvailabilityStatus(availability) { function changeAvailabilityStatus(availability) {
if (isImpersonating.value) { if (isImpersonating.value) {
useAlert(t('PROFILE_SETTINGS.FORM.AVAILABILITY.IMPERSONATING_ERROR')); useAlert(t('PROFILE_SETTINGS.FORM.AVAILABILITY.IMPERSONATING_ERROR'));
@@ -62,13 +73,6 @@ function changeAvailabilityStatus(availability) {
useAlert(t('PROFILE_SETTINGS.FORM.AVAILABILITY.SET_AVAILABILITY_ERROR')); useAlert(t('PROFILE_SETTINGS.FORM.AVAILABILITY.SET_AVAILABILITY_ERROR'));
} }
} }
function updateAutoOffline(autoOffline) {
store.dispatch('updateAutoOffline', {
accountId: currentAccountId.value,
autoOffline,
});
}
</script> </script>
<template> <template>
@@ -118,11 +122,7 @@ function updateAutoOffline(autoOffline) {
class="size-4 text-n-slate-10" class="size-4 text-n-slate-10"
/> />
</div> </div>
<woot-switch <ToggleSwitch v-model="autoOfflineToggle" />
class="flex-shrink-0"
:model-value="currentUserAutoOffline"
@input="updateAutoOffline"
/>
</DropdownItem> </DropdownItem>
</div> </div>
</DropdownSection> </DropdownSection>

View File

@@ -19,8 +19,8 @@ const updateValue = () => {
<template> <template>
<button <button
type="button" type="button"
class="relative h-4 transition-colors duration-200 ease-in-out rounded-full w-7 focus:outline-none focus:ring-1 focus:ring-n-brand focus:ring-offset-n-slate-2 focus:ring-offset-2" class="relative h-4 transition-colors duration-200 ease-in-out rounded-full w-7 focus:outline-none focus:ring-1 focus:ring-n-brand focus:ring-offset-n-slate-2 focus:ring-offset-2 flex-shrink-0"
:class="modelValue ? 'bg-n-brand' : 'bg-n-alpha-1 dark:bg-n-alpha-2'" :class="modelValue ? 'bg-n-brand' : 'bg-n-slate-6 disabled:bg-n-slate-6/60'"
role="switch" role="switch"
:aria-checked="modelValue" :aria-checked="modelValue"
@click="updateValue" @click="updateValue"

View File

@@ -1,83 +0,0 @@
<script>
export default {
props: {
modelValue: { type: Boolean, default: false },
size: { type: String, default: '' },
},
emits: ['update:modelValue', 'input'],
methods: {
onClick() {
this.$emit('update:modelValue', !this.modelValue);
this.$emit('input', !this.modelValue);
},
},
};
</script>
<template>
<button
type="button"
class="toggle-button p-0"
:class="{ active: modelValue, small: size === 'small' }"
role="switch"
:aria-checked="modelValue.toString()"
@click="onClick"
>
<span aria-hidden="true" :class="{ active: modelValue }" />
</button>
</template>
<style lang="scss" scoped>
.toggle-button {
@apply bg-n-slate-5;
--toggle-button-box-shadow: rgb(255, 255, 255) 0px 0px 0px 0px,
rgba(59, 130, 246, 0.5) 0px 0px 0px 0px, rgba(0, 0, 0, 0.1) 0px 1px 3px 0px,
rgba(0, 0, 0, 0.06) 0px 1px 2px 0px;
border-radius: 0.5625rem;
border: 2px solid transparent;
cursor: pointer;
display: flex;
flex-shrink: 0;
height: 1.188rem;
position: relative;
transition-duration: 200ms;
transition-property: background-color;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
width: 2.125rem;
&.active {
@apply bg-n-brand;
}
&.small {
width: 1.375rem;
height: 0.875rem;
span {
@apply size-2.5;
&.active {
@apply ltr:translate-x-[0.5rem] ltr:translate-y-0 rtl:translate-x-[-0.5rem] rtl:translate-y-0;
}
}
}
span {
@apply bg-n-background;
border-radius: 100%;
box-shadow: var(--toggle-button-box-shadow);
display: inline-block;
height: 0.9375rem;
transform: translate(0, 0);
transition-duration: 200ms;
transition-property: transform;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
width: 0.9375rem;
&.active {
@apply ltr:translate-x-[0.9375rem] ltr:translate-y-0 rtl:translate-x-[-0.9375rem] rtl:translate-y-0;
}
}
}
</style>

View File

@@ -1,6 +1,8 @@
<script setup> <script setup>
import { computed } from 'vue';
import { messageStamp } from 'shared/helpers/timeHelper'; import { messageStamp } from 'shared/helpers/timeHelper';
import Button from 'dashboard/components-next/button/Button.vue'; import Button from 'dashboard/components-next/button/Button.vue';
import ToggleSwitch from 'dashboard/components-next/switch/Switch.vue';
const props = defineProps({ const props = defineProps({
automation: { automation: {
@@ -19,14 +21,17 @@ const readableDate = date => messageStamp(new Date(date), 'LLL d, yyyy');
const readableDateWithTime = date => const readableDateWithTime = date =>
messageStamp(new Date(date), 'LLL d, yyyy hh:mm a'); messageStamp(new Date(date), 'LLL d, yyyy hh:mm a');
const toggle = () => { const automationActive = computed({
const { id, name, active } = props.automation; get: () => props.automation.active,
emit('toggle', { set: active => {
id, const { id, name } = props.automation;
name, emit('toggle', {
status: active, id,
}); name,
}; status: !active,
});
},
});
</script> </script>
<template> <template>
@@ -34,7 +39,7 @@ const toggle = () => {
<td class="py-4 ltr:pr-4 rtl:pl-4 min-w-[200px]">{{ automation.name }}</td> <td class="py-4 ltr:pr-4 rtl:pl-4 min-w-[200px]">{{ automation.name }}</td>
<td class="py-4 ltr:pr-4 rtl:pl-4">{{ automation.description }}</td> <td class="py-4 ltr:pr-4 rtl:pl-4">{{ automation.description }}</td>
<td class="py-4 ltr:pr-4 rtl:pl-4"> <td class="py-4 ltr:pr-4 rtl:pl-4">
<woot-switch :model-value="automation.active" @input="toggle" /> <ToggleSwitch v-model="automationActive" />
</td> </td>
<td <td
class="py-4 ltr:pr-4 rtl:pl-4 min-w-[12px]" class="py-4 ltr:pr-4 rtl:pl-4 min-w-[12px]"

View File

@@ -1,8 +1,9 @@
<script> <script>
import Draggable from 'vuedraggable'; import Draggable from 'vuedraggable';
import ToggleSwitch from 'dashboard/components-next/switch/Switch.vue';
export default { export default {
components: { Draggable }, components: { Draggable, ToggleSwitch },
props: { props: {
preChatFields: { preChatFields: {
type: Array, type: Array,
@@ -45,9 +46,9 @@ export default {
<tr class="border-b border-n-weak"> <tr class="border-b border-n-weak">
<td class="pre-chat-field"><fluent-icon icon="drag" /></td> <td class="pre-chat-field"><fluent-icon icon="drag" /></td>
<td class="pre-chat-field"> <td class="pre-chat-field">
<woot-switch <ToggleSwitch
:model-value="item['enabled']" :model-value="item['enabled']"
@input="handlePreChatFieldOptions($event, 'enabled', item)" @change="handlePreChatFieldOptions($event, 'enabled', item)"
/> />
</td> </td>
<td <td

View File

@@ -9,13 +9,13 @@ import {
verifyServiceWorkerExistence, verifyServiceWorkerExistence,
} from 'dashboard/helper/pushHelper.js'; } from 'dashboard/helper/pushHelper.js';
import { FEATURE_FLAGS } from 'dashboard/featureFlags'; import { FEATURE_FLAGS } from 'dashboard/featureFlags';
import FormSwitch from 'v3/components/Form/Switch.vue'; import ToggleSwitch from 'dashboard/components-next/switch/Switch.vue';
import { NOTIFICATION_TYPES } from './constants'; import { NOTIFICATION_TYPES } from './constants';
export default { export default {
components: { components: {
TableHeaderCell, TableHeaderCell,
FormSwitch, ToggleSwitch,
CheckBox, CheckBox,
}, },
data() { data() {
@@ -284,9 +284,9 @@ export default {
{{ $t('PROFILE_SETTINGS.FORM.NOTIFICATIONS.BROWSER_PERMISSION') }} {{ $t('PROFILE_SETTINGS.FORM.NOTIFICATIONS.BROWSER_PERMISSION') }}
</span> </span>
</div> </div>
<FormSwitch <ToggleSwitch
:model-value="hasEnabledPushPermissions" v-model="hasEnabledPushPermissions"
@update:model-value="onRequestPermissions" @change="onRequestPermissions"
/> />
</div> </div>
</div> </div>

View File

@@ -10,6 +10,7 @@ import ReportsFiltersRatings from './Filters/Ratings.vue';
import subDays from 'date-fns/subDays'; import subDays from 'date-fns/subDays';
import { DATE_RANGE_OPTIONS } from '../constants'; import { DATE_RANGE_OPTIONS } from '../constants';
import { getUnixStartOfDay, getUnixEndOfDay } from 'helpers/DateHelper'; import { getUnixStartOfDay, getUnixEndOfDay } from 'helpers/DateHelper';
import ToggleSwitch from 'dashboard/components-next/switch/Switch.vue';
export default { export default {
components: { components: {
@@ -21,6 +22,7 @@ export default {
ReportsFiltersInboxes, ReportsFiltersInboxes,
ReportsFiltersTeams, ReportsFiltersTeams,
ReportsFiltersRatings, ReportsFiltersRatings,
ToggleSwitch,
}, },
props: { props: {
showGroupByFilter: { showGroupByFilter: {
@@ -106,11 +108,6 @@ export default {
return this.validGroupOptions[0]; return this.validGroupOptions[0];
}, },
}, },
watch: {
businessHoursSelected() {
this.emitChange();
},
},
mounted() { mounted() {
this.emitChange(); this.emitChange();
}, },
@@ -224,7 +221,7 @@ export default {
{{ $t('REPORT.BUSINESS_HOURS') }} {{ $t('REPORT.BUSINESS_HOURS') }}
</span> </span>
<span> <span>
<woot-switch v-model="businessHoursSelected" /> <ToggleSwitch v-model="businessHoursSelected" @change="emitChange" />
</span> </span>
</div> </div>
</div> </div>

View File

@@ -5,6 +5,7 @@ import startOfDay from 'date-fns/startOfDay';
import subDays from 'date-fns/subDays'; import subDays from 'date-fns/subDays';
import Thumbnail from 'dashboard/components/widgets/Thumbnail.vue'; import Thumbnail from 'dashboard/components/widgets/Thumbnail.vue';
import WootDateRangePicker from 'dashboard/components/ui/DateRangePicker.vue'; import WootDateRangePicker from 'dashboard/components/ui/DateRangePicker.vue';
import ToggleSwitch from 'dashboard/components-next/switch/Switch.vue';
import { GROUP_BY_FILTER } from '../constants'; import { GROUP_BY_FILTER } from '../constants';
const CUSTOM_DATE_RANGE_ID = 5; const CUSTOM_DATE_RANGE_ID = 5;
@@ -13,6 +14,7 @@ export default {
components: { components: {
WootDateRangePicker, WootDateRangePicker,
Thumbnail, Thumbnail,
ToggleSwitch,
}, },
props: { props: {
currentFilter: { currentFilter: {
@@ -125,9 +127,6 @@ export default {
groupByFilterItemsList() { groupByFilterItemsList() {
this.currentSelectedGroupByFilter = this.selectedGroupByFilter; this.currentSelectedGroupByFilter = this.selectedGroupByFilter;
}, },
businessHoursSelected() {
this.$emit('businessHoursToggle', this.businessHoursSelected);
},
}, },
mounted() { mounted() {
this.onDateRangeChange(); this.onDateRangeChange();
@@ -140,6 +139,9 @@ export default {
groupBy: this.groupBy, groupBy: this.groupBy,
}); });
}, },
onBusinessHoursToggle() {
this.$emit('businessHoursToggle', this.businessHoursSelected);
},
fromCustomDate(date) { fromCustomDate(date) {
return getUnixTime(startOfDay(date)); return getUnixTime(startOfDay(date));
}, },
@@ -303,7 +305,10 @@ export default {
{{ $t('REPORT.BUSINESS_HOURS') }} {{ $t('REPORT.BUSINESS_HOURS') }}
</span> </span>
<span> <span>
<woot-switch v-model="businessHoursSelected" /> <ToggleSwitch
v-model="businessHoursSelected"
@change="onBusinessHoursToggle"
/>
</span> </span>
</div> </div>

View File

@@ -5,11 +5,13 @@ import validations from './validations';
import SlaTimeInput from './SlaTimeInput.vue'; import SlaTimeInput from './SlaTimeInput.vue';
import NextButton from 'dashboard/components-next/button/Button.vue'; import NextButton from 'dashboard/components-next/button/Button.vue';
import { useVuelidate } from '@vuelidate/core'; import { useVuelidate } from '@vuelidate/core';
import ToggleSwitch from 'dashboard/components-next/switch/Switch.vue';
export default { export default {
components: { components: {
SlaTimeInput, SlaTimeInput,
NextButton, NextButton,
ToggleSwitch,
}, },
props: { props: {
selectedResponse: { selectedResponse: {
@@ -203,7 +205,7 @@ export default {
<span for="sla_bh" class="text-n-slate-11"> <span for="sla_bh" class="text-n-slate-11">
{{ $t('SLA.FORM.BUSINESS_HOURS.PLACEHOLDER') }} {{ $t('SLA.FORM.BUSINESS_HOURS.PLACEHOLDER') }}
</span> </span>
<woot-switch id="sla_bh" v-model="onlyDuringBusinessHours" /> <ToggleSwitch id="sla_bh" v-model="onlyDuringBusinessHours" />
</div> </div>
<div class="flex items-center justify-end w-full gap-2 mt-8"> <div class="flex items-center justify-end w-full gap-2 mt-8">

View File

@@ -7,7 +7,6 @@ import hljsVuePlugin from '@highlightjs/vue-plugin';
import Multiselect from 'vue-multiselect'; import Multiselect from 'vue-multiselect';
import { plugin, defaultConfig } from '@formkit/vue'; import { plugin, defaultConfig } from '@formkit/vue';
import WootSwitch from 'components/ui/Switch.vue';
import WootWizard from 'components/ui/Wizard.vue'; import WootWizard from 'components/ui/Wizard.vue';
import FloatingVue from 'floating-vue'; import FloatingVue from 'floating-vue';
import WootUiKit from 'dashboard/components'; import WootUiKit from 'dashboard/components';
@@ -90,7 +89,6 @@ app.use(FloatingVue, {
app.use(hljsVuePlugin); app.use(hljsVuePlugin);
app.component('multiselect', Multiselect); app.component('multiselect', Multiselect);
app.component('woot-switch', WootSwitch);
app.component('woot-wizard', WootWizard); app.component('woot-wizard', WootWizard);
app.component('fluent-icon', FluentIcon); app.component('fluent-icon', FluentIcon);

View File

@@ -1,36 +0,0 @@
<script>
export default {
props: {
modelValue: { type: Boolean, default: false },
},
emits: ['update:modelValue'],
methods: {
onClick() {
this.$emit('update:modelValue', !this.modelValue);
},
},
};
</script>
<template>
<button
type="button"
class="relative flex-shrink-0 h-4 p-0 border-none shadow-inner w-7 rounded-3xl"
:class="
modelValue ? 'bg-n-brand shadow-n-brand' : 'shadow-n-slate-6 bg-n-slate-5'
"
role="switch"
:aria-checked="modelValue.toString()"
@click="onClick"
>
<span
aria-hidden="true"
class="rounded-full bg-n-background top-0.5 absolute w-3 h-3 translate-y-0 duration-200 transition-transform ease-in-out"
:class="
modelValue
? 'ltr:translate-x-0 rtl:translate-x-[0.75rem]'
: 'ltr:-translate-x-[0.75rem] rtl:translate-x-0'
"
/>
</button>
</template>