Skip to content

Commit 3648c33

Browse files
Merge pull request #15 from vijaythecoder/fix/template-navigation-issues
Fix/template navigation issues
2 parents b9f7226 + 4436c5b commit 3648c33

File tree

6 files changed

+57
-368
lines changed

6 files changed

+57
-368
lines changed

app/Http/Controllers/TemplateController.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,12 @@ public function update(Request $request, Template $template)
101101

102102
public function destroy(Template $template)
103103
{
104-
// Only allow deleting non-system templates
105-
if ($template->is_system) {
106-
return response()->json(['error' => 'Cannot delete system templates'], 403);
104+
// Prevent deletion if this is the last template
105+
$remainingTemplatesCount = Template::where('id', '!=', $template->id)->count();
106+
if ($remainingTemplatesCount === 0) {
107+
return response()->json([
108+
'error' => 'Cannot delete the last remaining template. At least one template must exist.'
109+
], 422);
107110
}
108111

109112
$template->delete();

resources/js/pages/RealtimeAgent/Main.vue

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,11 @@
6969
<div
7070
class="scrollbar-thin scrollbar-thumb-gray-300 scrollbar-track-transparent hover:scrollbar-thumb-gray-400 flex-1 overflow-y-auto"
7171
>
72-
<div v-if="filteredSalesCoachTemplates.length === 0" class="p-3 text-center text-xs text-gray-600 dark:text-gray-400">
72+
<div v-if="filteredTemplates.length === 0" class="p-3 text-center text-xs text-gray-600 dark:text-gray-400">
7373
No templates found
7474
</div>
7575
<div
76-
v-for="template in filteredSalesCoachTemplates"
76+
v-for="template in filteredTemplates"
7777
:key="template.id"
7878
@click="
7979
selectTemplateFromDropdown(template);
@@ -251,11 +251,11 @@
251251
@click.stop
252252
/>
253253
<div class="max-h-36 overflow-y-auto">
254-
<div v-if="filteredSalesCoachTemplates.length === 0" class="p-2 text-center text-xs text-gray-600 dark:text-gray-400">
254+
<div v-if="filteredTemplates.length === 0" class="p-2 text-center text-xs text-gray-600 dark:text-gray-400">
255255
No templates found
256256
</div>
257257
<button
258-
v-for="template in filteredSalesCoachTemplates"
258+
v-for="template in filteredTemplates"
259259
:key="template.id"
260260
@click.stop="
261261
selectTemplateFromDropdown(template);
@@ -902,15 +902,17 @@ const { isOverlayMode, isSupported: isOverlaySupported, toggleOverlayMode } = us
902902
const hasApiKey = ref(false); // Will be checked on mount
903903
// const isDev = computed(() => import.meta.env.DEV)
904904
905-
// Sales coach templates filtered
906-
const salesCoachTemplates = computed(() => templates.value.filter((t) => t.category === 'sales_coach'));
905+
// All available templates (no category filtering)
906+
const allTemplates = computed(() => {
907+
return templates.value;
908+
});
907909
908910
// Filtered templates based on search
909-
const filteredSalesCoachTemplates = computed(() => {
910-
if (!templateSearchQuery.value) return salesCoachTemplates.value;
911+
const filteredTemplates = computed(() => {
912+
if (!templateSearchQuery.value) return allTemplates.value;
911913
912914
const query = templateSearchQuery.value.toLowerCase();
913-
return salesCoachTemplates.value.filter((t) => t.name.toLowerCase().includes(query) || t.description?.toLowerCase().includes(query));
915+
return allTemplates.value.filter((t) => t.name.toLowerCase().includes(query) || t.description?.toLowerCase().includes(query));
914916
});
915917
916918
// New computed properties for intelligence dashboard
@@ -2508,8 +2510,8 @@ const fetchTemplates = async () => {
25082510
25092511
console.log(`✅ Loaded ${templates.value.length} templates`);
25102512
console.log(
2511-
'Sales coach templates:',
2512-
templates.value.filter((t) => t.category === 'sales_coach').map((t) => t.name),
2513+
'Available templates:',
2514+
templates.value.map((t) => t.name),
25132515
);
25142516
25152517
// Load persisted template or select default
@@ -2523,11 +2525,18 @@ const fetchTemplates = async () => {
25232525
}
25242526
25252527
// Select default template if none selected
2526-
if (!selectedTemplate.value && templates.value.length > 0) {
2527-
const defaultTemplate = templates.value.find((t) => t.name === 'Friendly Helper' && t.category === 'sales_coach');
2528-
if (defaultTemplate) {
2529-
selectedTemplate.value = defaultTemplate;
2530-
console.log('📌 Selected default template:', defaultTemplate.name);
2528+
if (!selectedTemplate.value) {
2529+
if (templates.value.length > 0) {
2530+
// Try to find the Sales Discovery Call template as default, otherwise use first available template
2531+
const defaultTemplate = templates.value.find((t) => t.name === 'Sales Discovery Call') || templates.value[0];
2532+
if (defaultTemplate) {
2533+
selectedTemplate.value = defaultTemplate;
2534+
console.log('📌 Selected default template:', defaultTemplate.name);
2535+
}
2536+
} else {
2537+
// Handle case when no templates exist
2538+
console.warn('⚠️ No templates available - cannot select default template');
2539+
// You may want to show a user-friendly message or redirect to template creation
25312540
}
25322541
}
25332542
} catch (error) {

0 commit comments

Comments
 (0)