attachments work

This commit is contained in:
abdul-wahab12345 2024-09-12 11:56:53 +00:00
parent 412ffc0e87
commit 203d845825
31 changed files with 61968 additions and 649 deletions

3
.gitignore vendored
View File

@ -6,6 +6,9 @@
/storage/*.key /storage/*.key
/vendor /vendor
.env .env
.zip
/chat.kundesone.no
/mailgun.kundesone.no
.env.backup .env.backup
.env.production .env.production
.phpunit.result.cache .phpunit.result.cache

View File

@ -43,6 +43,11 @@ RewriteRule ^(/)?$ public/index.php [L]
php_flag zlib.output_compression Off php_flag zlib.output_compression Off
</IfModule> </IfModule>
# END cPanel-generated php ini directives, do not edit # END cPanel-generated php ini directives, do not edit
# Deny access to .env files
<Files .env>
Order allow,deny
Deny from all
</Files>
# php -- BEGIN cPanel-generated handler, do not edit # php -- BEGIN cPanel-generated handler, do not edit
# Set the “ea-php81” package as the default “PHP” programming language. # Set the “ea-php81” package as the default “PHP” programming language.

View File

@ -11,6 +11,7 @@
use App\Models\Company; use App\Models\Company;
use App\Models\ChatGroup; use App\Models\ChatGroup;
use App\Models\Message; use App\Models\Message;
use App\Models\Tag;
use App\Models\CompanyUser; use App\Models\CompanyUser;
function get_company_users($company_id){ function get_company_users($company_id){
@ -19,6 +20,11 @@ function get_company_users($company_id){
} }
function getCompanyTags($companyId) {
$tags = Tag::where('company_id', $companyId)->get();
return $tags;
}
function get_company($key,$value){ function get_company($key,$value){
return Company::where($key,$value)->first(); return Company::where($key,$value)->first();
@ -280,10 +286,26 @@ function getMessagesByChatId($chatId)
function setTicketMeta(int $ticketId, string $key, $value, string $type = 'string') function setTicketMeta(int $ticketId, string $key, $value, string $type = 'string')
{ {
return TicketMeta::updateOrCreate( $ticket_metas = [];
['ticket_id' => $ticketId, 'key' => $key], // return TicketMeta::updateOrCreate(
['value' => json_encode($value), 'type' => $type] // ['ticket_id' => $ticketId, 'key' => $key],
); // ['value' => json_encode($value), 'type' => $type]
// );
foreach($value as $tag)
{
$ticket_meta = TicketMeta::updateOrCreate([
'ticket_id' => $ticketId,
'key' => $key
],[
'value' => $tag,
'type' => $type
]);
$ticket_metas[] = $ticket_meta;
}
return $ticket_metas;
} }
/** /**
@ -299,9 +321,9 @@ function getTicketMeta(int $ticketId, string $key)
return $meta ? json_decode($meta->value) : null; return $meta ? json_decode($meta->value) : null;
} }
function getChatSetting($key) function getChatSetting($key, $company_id = null)
{ {
$companyId = getSelectedCompany(); $companyId = $company_id??getSelectedCompany();
$get_chat_setting = CompanyMeta::where('company_id', $companyId)->where('key', $key)->where('type', 'Chat Setting')->first(); $get_chat_setting = CompanyMeta::where('company_id', $companyId)->where('key', $key)->where('type', 'Chat Setting')->first();
return $get_chat_setting; return $get_chat_setting;
} }

View File

@ -14,6 +14,10 @@
class ChatController extends Controller class ChatController extends Controller
{ {
public function chatDemo(Request $request){
return view('chat.demo');
}
public function CloseChat(Request $request){ public function CloseChat(Request $request){
$chat_id = $request->chat_id; $chat_id = $request->chat_id;
@ -66,13 +70,13 @@ public function startChat(Request $request)
$company_id = $request->company_id; $company_id = $request->company_id;
$user_id = $this->select_user($company_id); $user = $this->select_user($company_id);
if($user_id){ if($user){
$data = [ $data = [
'company_id' => $company_id, 'company_id' => $company_id,
'user_id' => $user_id, 'user_id' => $user->user_id,
'customer_id' => $request->customer_id, 'customer_id' => $request->customer_id,
'name' => $request->name, 'name' => $request->name,
'email' => $request->email, 'email' => $request->email,
@ -139,7 +143,8 @@ public function select_user($company_id){
$access = json_decode($user->access); $access = json_decode($user->access);
if(in_array('chat',$access)){ if(in_array('chat',$access)){
$selected = $user->user_id; $selected = $user;
break;
} }
} }
@ -171,12 +176,16 @@ public function checkChat(Request $request){
// Str::contains('This is my name', 'my') // Str::contains('This is my name', 'my')
if( $company->domain == $domain ){ if( $company->domain == $domain ){
$user_id = $this->select_user($company_id); $start_message = getChatSetting('start_message',$company_id)?getChatSetting('start_message',$company_id)->value:"What can we help you with?"; //welcome message
$message_when_chat_is_closed = getChatSetting('message_when_chat_is_closed',$company_id)?getChatSetting('message_when_chat_is_closed',$company_id)->value:"No user is availble right now! Try later.";
$wellcome_text = getChatSetting('wellcome_text',$company_id)?getChatSetting('wellcome_text',$company_id)->value:"Hi, welcome how i can help you today?";
if($user_id){ $user = $this->select_user($company_id);
return response()->json(['status' => 'success']);
if($user){
return response()->json(['status' => 'success','data' => ['welcome' => $wellcome_text, 'start_message' => $start_message, 'user' => $user->user->name] ]);
}else{ }else{
return response()->json(['status' => 'error', 'message' => "No user is availble right now!"]); return response()->json(['status' => 'error', 'message' => $message_when_chat_is_closed]);
} }

View File

@ -33,13 +33,14 @@ public function storeFlowSetting(Request $request)
'logout_editor_who_missed_chat' => $request->logout_editor_who_missed_chat, 'logout_editor_who_missed_chat' => $request->logout_editor_who_missed_chat,
'logout_everyone_automatically' => $request->logout_everyone_automatically, 'logout_everyone_automatically' => $request->logout_everyone_automatically,
'chat_assistant_show_suggestion_form' => $request->chat_assistant_show_suggestion_form, 'chat_assistant_show_suggestion_form' => $request->chat_assistant_show_suggestion_form,
'message_sent_to' => $request->message_sent_to,
]; ];
foreach($flow_setting as $key => $value) { foreach($flow_setting as $key => $value) {
if(!is_null($value)) { if(!is_null($value)) {
CompanyMeta::updateOrCreate([ CompanyMeta::updateOrCreate([
'key' => $key, 'key' => $key,
'value' => $value 'company_id' => $companyId,
],[ ],[
'company_id' => $companyId, 'company_id' => $companyId,
'key' => $key, 'key' => $key,
@ -290,4 +291,24 @@ public function settingAllChat(Request $request)
]); ]);
return redirect()->back()->with('success', 'Chat Setting Updated Successfully'); return redirect()->back()->with('success', 'Chat Setting Updated Successfully');
} }
public function blockIpAdresses(Request $request)
{
$this->validate($request, [
'ip_addresses' => 'required'
]);
$companyId = getSelectedCompany();
CompanyMeta::updateOrCreate([
'key' => 'ip_addresses',
'company_id' => $companyId,
],[
'company_id' => $companyId,
'key' => 'ip_addresses',
'value' => $request->ip_addresses,
'type' => 'Chat Setting'
]);
return redirect()->back()->with('success', 'Chat Setting Updated Successfully');
}
} }

View File

@ -15,7 +15,9 @@ class DashboardController extends Controller
public function dashboard() public function dashboard()
{ {
$tickets = get_current_company_tickets(['type' => 'inbox']); $tickets = get_current_company_tickets(['type' => 'inbox']);
return view('index', ['tickets' => $tickets]); $companyId = getSelectedCompany();
$tags = getCompanyTags($companyId);
return view('index', ['tickets' => $tickets, 'tags' => $tags]);
} }
public function profile() public function profile()

View File

@ -9,6 +9,8 @@
use App\Models\Comment; use App\Models\Comment;
use App\Models\Response; use App\Models\Response;
use App\Models\Language; use App\Models\Language;
use App\Models\Tag;
use App\Models\Rule;
use App\Models\CompanyMeta; use App\Models\CompanyMeta;
use App\Models\CompanyUser; use App\Models\CompanyUser;
use Carbon\Carbon; use Carbon\Carbon;
@ -33,10 +35,14 @@ public function inboxSetting()
$canned_response = $this->get_canned_responses(); $canned_response = $this->get_canned_responses();
$spam_handling = CompanyMeta::where('company_id', $companyId)->where('type', 'Spam Handling')->first(); $spam_handling = CompanyMeta::where('company_id', $companyId)->where('type', 'Spam Handling')->first();
$email_signature = CompanyMeta::where('company_id', $companyId)->where('type', 'Email Signature')->first(); $email_signature = CompanyMeta::where('company_id', $companyId)->where('type', 'Email Signature')->first();
$company_users = get_company_users($companyId);
$tags = Tag::where('company_id', $companyId)->get();
$rule = Rule::where('company_id', $companyId)->first();
return view('inbox-setting', ['timezones' => $timezones, 'basic_setting' => $basic_setting, 'spam_handling' => $spam_handling, return view('inbox-setting', ['timezones' => $timezones, 'basic_setting' => $basic_setting, 'spam_handling' => $spam_handling,
'email_signature' => $email_signature, 'canned_response' => $canned_response, 'languages' => $languages, 'company' => get_company('id',$companyId)]); 'email_signature' => $email_signature, 'canned_response' => $canned_response, 'languages' => $languages, 'company' => get_company('id',$companyId),
'company_users' => $company_users, 'tags' => $tags, 'rule' => $rule]);
} }
public function basicSetting(Request $request) public function basicSetting(Request $request)
@ -429,4 +435,30 @@ public function deleteComment($commentId)
return response()->json(['message' => 'Comment Deleted Successfully']); return response()->json(['message' => 'Comment Deleted Successfully']);
} }
public function updateRule(Request $request)
{
$companyId = getSelectedCompany();
//Update Rule
Rule::updateOrCreate([
'company_id' => $companyId,
],[
'company_id' => $companyId,
'from' => $request->from,
'to' => $request->to,
'subject_contains' => $request->subject_contains,
'text_contains' => $request->text_contains,
'subject1_contains' => $request->subject1_contains,
'tag_id' => $request->tag_id,
'name' => $request->name,
'assign_to' => $request->assign_to,
'status' => $request->status,
'priority' => $request->priority,
'message_to_assigned_editor' => $request->message_to_assigned_editor,
'all_emails_automatically_mark_as_spam' => $request->all_emails_automatically_mark_as_spam,
]);
return redirect()->back()->with('success', 'Setting Updated successfully.');
}
} }

View File

@ -5,14 +5,14 @@
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
class EmailController extends Controller class EmailController extends Controller
{ {
public function saveEmail(Request $request){ public function saveEmail(Request $request){
DB::beginTransaction(); // DB::beginTransaction();
try { // try {
$token = $request->input('token'); $token = $request->input('token');
$timestamp = $request->input('timestamp'); $timestamp = $request->input('timestamp');
@ -36,18 +36,40 @@ public function saveEmail(Request $request){
if($company){ if($company){
$ticket = insertTicket($data['from_email'], $company->email, $data['subject'], $message,'inbox',$data['from_name'] ); $ticket = insertTicket($data['from_email'], $company->email, $data['subject'], $message,'inbox',$data['from_name'] );
if($ticket) if($ticket){
$response = createResponse($ticket->id,$message); $response = createResponse($ticket->id,$message);
$attachmentCount = $request->input('attachment-count', 0);
update_setting('aw_test',$attachmentCount);
for ($i = 1; $i <= $attachmentCount; $i++) {
$attachment = $request->file("attachment-$i");
update_setting('aw_test',$attachment->getClientOriginalName());
if ($attachment && $attachment->isValid()) {
// Define a unique filename, possibly using the original filename and appending a timestamp or a unique id
$filename = time() . '_' . $attachment->getClientOriginalName();
// Save the attachment to the local or specific disk
$filePath = $attachment->storeAs('tickets/' . $ticket->id, $filename, 'public');
$fileUrl = url(Storage::url($filePath));
update_setting('aw_test',$fileUrl);
}
}
}
}else{} }else{}
// update_setting('aw_test',json_encode($request->all())); // update_setting('aw_test',json_encode($request->all()));
DB::commit(); // DB::commit();
} catch (\Exception $e) { // } catch (\Exception $e) {
update_setting('aw_test',$e->getMessage());
DB::rollBack(); // DB::rollBack();
// Handle the exception // update_setting('aw_test',json_encode($e->getMessage()));
} // sendEmailViaMailgun( 'ai.rapidev.tech', 'support@ai.rapidev.tech', '16bsse18212@gmail.com', 'error', json_encode($e->getMessage()));
// // Handle the exception
// }
} }
@ -60,7 +82,7 @@ public function extractMailgunData($data) {
'to_email' => $data['To'], 'to_email' => $data['To'],
'from_name' => '', // This will be extracted from the 'from' field 'from_name' => '', // This will be extracted from the 'from' field
'subject' => $data['subject'], 'subject' => $data['subject'],
'message' => $data['body-plain'], 'message' => $data['body-html'],
'mime_version' => $data['Mime-Version'], 'mime_version' => $data['Mime-Version'],
'dkim_signature' => $data['Dkim-Signature'] 'dkim_signature' => $data['Dkim-Signature']
]; ];

View File

@ -4,6 +4,8 @@
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Models\Ticket; use App\Models\Ticket;
use App\Models\TicketMeta;
use App\Models\TicketNote;
use App\Models\Comment; use App\Models\Comment;
use App\Models\Response; use App\Models\Response;
use App\Models\Company; use App\Models\Company;
@ -16,14 +18,16 @@
class TicketController extends Controller class TicketController extends Controller
{ {
public function get_canned_responses(){ public function get_canned_responses(){
$companyId = getSelectedCompany();; $companyId = getSelectedCompany();
return CompanyMeta::where('company_id', $companyId)->where('key', 'canned_responses')->get(); return CompanyMeta::where('company_id', $companyId)->where('key', 'canned_responses')->get();
} }
public function allTickets() public function allTickets()
{ {
$companyId = getSelectedCompany();
$tickets = get_current_company_tickets(); $tickets = get_current_company_tickets();
return view('all-tickets', ['tickets' => $tickets]); $tags = Tag::where('company_id', $companyId)->get();
return view('all-tickets', ['tickets' => $tickets, 'tags' => $tags]);
} }
public function waiting() public function waiting()
@ -118,4 +122,185 @@ public function storeTags(Request $request)
return response()->json(['success' => true, 'message' => 'Tags Added Successfully']); return response()->json(['success' => true, 'message' => 'Tags Added Successfully']);
} }
public function AssignTicket(Request $request)
{
$this->validate($request, [
'user_assigned' => 'required|integer',
'message' => 'required|string',
'ticket_ids' => 'required|string',
]);
$companyId = getSelectedCompany();
$ticketIds = explode(',', $request->ticket_ids);
foreach ($ticketIds as $ticket_id) {
$ticket = Ticket::find($ticket_id);
if ($ticket) {
// Update Ticket
$ticket->user_assigned = $request->user_assigned;
$ticket->save();
//Send Mail
$company = Company::find($companyId);
sendEmailViaMailgun($company->domain, $company->email, $ticket->from_email, $ticket->subject, $request->message);
//Create Response
$formattedMessage = '<p>' . $request->message . '</p>';
createResponse($ticket_id,$formattedMessage,auth()->id());
}
}
return response()->json(['success' => true, 'message' => 'Post Assigned Successfully']);
}
public function deleteTickets(Request $request)
{
$this->validate($request, [
'ticket_ids' => 'required|string',
]);
$ticketIds = explode(',', $request->ticket_ids);
foreach ($ticketIds as $ticket_id) {
$ticket = Ticket::find($ticket_id);
if ($ticket) {
// Delete Ticket
Comment::where('ticket_id', $ticket_id)->delete();
TicketMeta::where('ticket_id', $ticket_id)->delete();
Response::where('ticket_id', $ticket_id)->delete();
TicketNote::where('ticket_id', $ticket_id)->delete();
$ticket->delete();
}
}
return response()->json(['success' => true, 'message' => 'Tickets Deleted Successfully']);
}
public function updateTicketStatus(Request $request)
{
$this->validate($request, [
'ticket_ids' => 'required|string',
'status' => 'required|string'
]);
$ticketIds = explode(',', $request->ticket_ids);
foreach ($ticketIds as $ticket_id) {
$ticket = Ticket::find($ticket_id);
if ($ticket) {
// Delete Ticket
$ticket->status = $request->status;
$ticket->save();
}
}
return response()->json(['success' => true, 'message' => 'Tickets Status Updated Successfully']);
}
public function filter(Request $request)
{
$this->validate($request, [
'filter' => 'required|string',
'status' => 'required|string',
]);
$companyId = getSelectedCompany();
$company = get_company('id',$companyId);
$now = \Carbon\Carbon::now();
if(isset($request->type)) {
$tickets = Ticket::where('to_email', $company->email)->where('type', $request->type)->where('status', '!=', 'done')->orderBy('created_at','desc');
} else {
$tickets = Ticket::where('to_email', $company->email)->where('status', '!=', 'done')->orderBy('created_at','desc');
}
if($request->filter == 'Assigned to') {
$all_tickets = $tickets->where('user_assigned', $request->status)->get();
return response()->json(['tickets' => $all_tickets]);
} elseif($request->filter == 'With activity') {
if ($request->status === 'last 24 hours') {
$all_tickets = $tickets->where('updated_at', '>=', $now->subDay());
} elseif ($request->status === 'last 3 days') {
$all_tickets = $tickets->where('updated_at', '>=', $now->subDays(3));
} elseif ($request->status === 'last week') {
$all_tickets = $tickets->where('updated_at', '>=', $now->subWeek());
} elseif ($request->status === 'last month') {
$all_tickets = $tickets->where('updated_at', '>=', $now->subMonth());
} elseif ($request->status === 'last 3 months') {
$all_tickets = $tickets->where('updated_at', '>=', $now->subMonths(3));
} elseif ($request->status === 'last 6 months') {
$all_tickets = $tickets->where('updated_at', '>=', $now->subMonths(6));
} elseif ($request->status === 'last year') {
$all_tickets = $tickets->where('updated_at', '>=', $now->subYear());
} elseif ($request->status === 'the past 2 years') {
$all_tickets = $tickets->where('updated_at', '>=', $now->subYears(2));
} elseif ($request->status === 'the past 3 years') {
$all_tickets = $tickets->where('updated_at', '>=', $now->subYears(3));
} elseif ($request->status === 'the past 4 years') {
$all_tickets = $tickets->where('updated_at', '>=', $now->subYears(4));
} elseif ($request->status === 'the past 5 years') {
$all_tickets = $tickets->where('updated_at', '>=', $now->subYears(5));
}
$activity_tickets = $all_tickets->get();
return response()->json(['tickets' => $activity_tickets]);
} elseif($request->filter == 'No activity') {
if ($request->status === 'last 24 hours') {
$all_tickets = $tickets->where('updated_at', '<=', $now->subDay());
} elseif ($request->status === 'last 3 days') {
$all_tickets = $tickets->where('updated_at', '<=', $now->subDays(3));
} elseif ($request->status === 'last week') {
$all_tickets = $tickets->where('updated_at', '<=', $now->subWeek());
} elseif ($request->status === 'last month') {
$all_tickets = $tickets->where('updated_at', '<=', $now->subMonth());
} elseif ($request->status === 'last 3 months') {
$all_tickets = $tickets->where('updated_at', '<=', $now->subMonths(3));
} elseif ($request->status === 'last 6 months') {
$all_tickets = $tickets->where('updated_at', '<=', $now->subMonths(6));
} elseif ($request->status === 'last year') {
$all_tickets = $tickets->where('updated_at', '<=', $now->subYear());
} elseif ($request->status === 'the past 2 years') {
$all_tickets = $tickets->where('updated_at', '<=', $now->subYears(2));
} elseif ($request->status === 'the past 3 years') {
$all_tickets = $tickets->where('updated_at', '<=', $now->subYears(3));
} elseif ($request->status === 'the past 4 years') {
$all_tickets = $tickets->where('updated_at', '<=', $now->subYears(4));
} elseif ($request->status === 'the past 5 years') {
$all_tickets = $tickets->where('updated_at', '<=', $now->subYears(5));
}
$no_activity_tickets = $all_tickets->get();
return response()->json(['tickets' => $no_activity_tickets]);
} elseif($request->filter == 'Spam') {
$all_tickets = $tickets->where('status', $request->status)->get();
return response()->json(['tickets' => $all_tickets]);
} elseif($request->filter == 'Status') {
$all_tickets = $tickets->where('status', $request->status)->get();
return response()->json(['tickets' => $all_tickets]);
} elseif($request->filter == 'Tags') {
$ticket_meta = TicketMeta::where('value', $request->status)->pluck('ticket_id')->toArray();
if(isset($request->type)) {
$all_tickets = Ticket::where('to_email', $company->email)->where('type', $request->type)->where('status', '!=', 'done')->orderBy('created_at','desc')->whereIn('id', $ticket_meta)->get();
} else {
$all_tickets = Ticket::where('to_email', $company->email)->orderBy('created_at','desc')->where('status', '!=', 'done')->whereIn('id', $ticket_meta)->get();
}
return response()->json(['tickets' => $all_tickets]);
}
}
public function defaultAllTickets(Request $request)
{
$companyId = getSelectedCompany();
$company = get_company('id',$companyId);
if(isset($request->type)) {
$tickets = get_current_company_tickets(['type' => $request->type]);
} else {
$tickets = get_current_company_tickets();
}
return response()->json(['tickets' => $tickets]);
}
} }

View File

@ -6,6 +6,8 @@
use App\Models\User; use App\Models\User;
use App\Models\CompanyUser; use App\Models\CompanyUser;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;
class UserController extends Controller class UserController extends Controller
{ {
@ -44,4 +46,31 @@ public function deleteUser($id)
$user->delete(); $user->delete();
return redirect()->back()->with('success', 'User Deleted Successfully'); return redirect()->back()->with('success', 'User Deleted Successfully');
} }
public function updateChatAvailability(Request $request)
{
$user = Auth::user();
//update user
if($request->status == "on") {
$user->is_available = 1;
$user->save();
} else {
$user->is_available = 0;
$user->save();
}
return response()->json(['success' => 'Updated Successfully']);
}
public function updateLastOnline()
{
$user = Auth::user();
//update last online
$user->last_online = Carbon::now();
$user->save();
return response()->json(['success' => true]);
}
} }

13
app/Models/Rule.php Normal file
View File

@ -0,0 +1,13 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Rule extends Model
{
use HasFactory;
protected $guarded = [];
}

View File

@ -0,0 +1,29 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->string('last_online')->nullable();
$table->boolean('is_available')->default(true);
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
//
});
}
};

View File

@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('rules', function (Blueprint $table) {
$table->id();
$table->foreignId('company_id')->constrained('companies')->onDelete('cascade');
$table->integer('tag_id')->nullable();
$table->string('name')->nullable();
$table->string('from')->nullable();
$table->string('to')->nullable();
$table->string('subject_contains')->nullable();
$table->string('text_contains')->nullable();
$table->string('subject1_contains')->nullable();
$table->string('assign_to')->nullable();
$table->string('message_to_assigned_editor')->nullable();
$table->string('all_emails_automatically_mark_as_spam')->nullable();
$table->string('status');
$table->string('priority');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('rules');
}
};

60157
error_log

File diff suppressed because it is too large Load Diff

View File

@ -4,6 +4,29 @@
@section('content') @section('content')
<script>
$(document).ready(function(){
$('.side-bar-links a').removeClass('bg-light-color');
$('.aw-a-inbox').addClass('bg-light-color');
});
</script>
<!-- Toastr CSS -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.css" rel="stylesheet">
<!-- Toastr JS -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.js"></script>
<!-- SweetAlert2 CSS -->
<link href="https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.min.css" rel="stylesheet">
<!-- SweetAlert2 JS -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.all.min.js"></script>
@php
$companyId = getSelectedCompany();
$company_users = get_company_users($companyId);
@endphp
<script> <script>
$(document).ready(function() { $(document).ready(function() {
// Toggle filter dropdown on button click // Toggle filter dropdown on button click
@ -24,13 +47,13 @@
$('.handle_multiple__options .tags button').prop('disabled', true); $('.handle_multiple__options .tags button').prop('disabled', true);
// Enable/disable buttons based on the select all checkbox // Enable/disable buttons based on the select all checkbox
$('#select-all').change(function() { // $('#select-all').change(function() {
if ($(this).is(':checked')) { // if ($(this).is(':checked')) {
$('.handle_multiple__options .tags button').prop('disabled', false); // $('.handle_multiple__options .tags button').prop('disabled', false);
} else { // } else {
$('.handle_multiple__options .tags button').prop('disabled', true); // $('.handle_multiple__options .tags button').prop('disabled', true);
} // }
}); // });
// Show the modal when "Assign post" button is clicked // Show the modal when "Assign post" button is clicked
$('.handle_multiple__options .tags button:contains("Assign post")').click(function(e) { $('.handle_multiple__options .tags button:contains("Assign post")').click(function(e) {
@ -75,33 +98,58 @@ function updateStatusOptions(selectedFilter) {
console.log("Updating status options for:", selectedFilter); // Debugging log console.log("Updating status options for:", selectedFilter); // Debugging log
switch (selectedFilter) { switch (selectedFilter) {
case 'Assigned to': case 'Assigned to':
$('#status-select').html(` // $('#status-select').html(`
<option disabled value="">Select assigned to</option> // <option disabled value="">Select assigned to</option>
<option value="Assigned">Assigned</option> // <option value="Assigned">Assigned</option>
<option value="Unassigned">Unassigned</option> // <option value="Unassigned">Unassigned</option>
<option value="Margin">Margin</option> // <option value="Margin">Margin</option>
`); // `);
var options = '<option value="">Select assigned to</option>';
// Loop through the company_users array
@foreach($company_users as $company_user)
options += '<option value="{{ $company_user->user->id }}">{{ $company_user->user->name }}</option>';
@endforeach
$('#status-select').html(options);
$('.filter_based__data').show(); $('.filter_based__data').show();
break; break;
case 'Which activity': case 'With activity':
$('#status-select').html(` $('#status-select').html(`
<option disabled value="">Select activity</option> <option value="">Select No activity</option>
<option value="Marked as spam">Marked as spam</option> <option value="last 24 hours">Last 24 hours</option>
<option value="Not spam">Not spam</option> <option value="last 3 days">Last 3 days</option>
<option value="last week">Last week</option>
<option value="last month">Last month</option>
<option value="last 3 months">Last 3 months</option>
<option value="last 6 months">Last 6 months</option>
<option value="last year">Last year</option>
<option value="the past 2 years">The past 2 years</option>
<option value="the past 3 years">The past 3 years</option>
<option value="the past 4 years">The past 4 years</option>
<option value="the past 5 years">The past 5 years</option>
`); `);
$('.filter_based__data').show(); $('.filter_based__data').show();
break; break;
case 'No activity': case 'No activity':
$('#status-select').html(` $('#status-select').html(`
<option disabled value="">Select No activity</option> <option value="">Select No activity</option>
<option value="Exercise">Exercise</option> <option value="last 24 hours">Last 24 hours</option>
<option value="Not Yoga">Not Yoga</option> <option value="last 3 days">Last 3 days</option>
<option value="last week">Last week</option>
<option value="last month">Last month</option>
<option value="last 3 months">Last 3 months</option>
<option value="last 6 months">Last 6 months</option>
<option value="last year">Last year</option>
<option value="the past 2 years">The past 2 years</option>
<option value="the past 3 years">The past 3 years</option>
<option value="the past 4 years">The past 4 years</option>
<option value="the past 5 years">The past 5 years</option>
`); `);
$('.filter_based__data').show(); $('.filter_based__data').show();
break; break;
case 'Editor': case 'Editor':
$('#status-select').html(` $('#status-select').html(`
<option disabled value="">Select Editor</option> <option value="">Select Editor</option>
<option value="Computer tool">Computer tool</option> <option value="Computer tool">Computer tool</option>
<option value="Direct editor">Direct editor</option> <option value="Direct editor">Direct editor</option>
`); `);
@ -109,34 +157,47 @@ function updateStatusOptions(selectedFilter) {
break; break;
case 'Spam': case 'Spam':
$('#status-select').html(` $('#status-select').html(`
<option disabled>Select Spam</option> <option value="">Select Spam</option>
<option value="Marked as spam">Marked as spam</option> <option value="marked as spam">Marked as spam</option>
<option value="Not spam">Not spam</option> <option value="marked as not spam">Marked as not spam</option>
`); `);
$('.filter_based__data').show(); $('.filter_based__data').show();
break; break;
case 'Status': case 'Status':
$('#status-select').html(` $('#status-select').html(`
<option disabled value="">Select status</option> <option value="">Select status</option>
<option value="Completed">Completed</option> <option value="open">Open</option>
<option value="Not Completed">Not Completed</option> <option value="waiting">Waiting</option>
<option value="done">Done</option>
`); `);
$('.filter_based__data').show(); $('.filter_based__data').show();
break; break;
case 'Tags': case 'Tags':
$('#status-select').html(`
<option disabled value="">Select Tags</option> var options = '<option value="">Select Tags</option>';
<option value="Target">Target</option> @foreach($tags as $tag)
<option value="Mustafa">Mustafa</option> options += '<option value="{{$tag->name}}">{{$tag->name}}</option>';
`); @endforeach
$('#status-select').html(options);
$('.filter_based__data').show(); $('.filter_based__data').show();
break; break;
case 'Users': case 'Users':
$('#status-select').html(`
<option disabled value="">Select Users</option> var options = '<option value="">Select Users</option>';
<option value="Merrs">Merrs</option> // Loop through the company_users array
<option value="Abdullah">Abdullah</option> @foreach($company_users as $company_user)
`); options += '<option value="{{ $company_user->user->id }}">{{ $company_user->user->name }}</option>';
@endforeach
// $('#status-select').html(`
// <option disabled value="">Select Users</option>`
// @foreah($company_users as $company_user)
// `<option value="`{{$company_user->user->id}}`">`{{$company_user->user->name}}`</option>
// <option value="Abdullah">Abdullah</option>
// `);
// Update the select element with the generated options
$('#status-select').html(options);
$('.filter_based__data').show(); $('.filter_based__data').show();
break; break;
default: default:
@ -270,6 +331,15 @@ function updateStatusOptions(selectedFilter) {
border-radius: 5px; border-radius: 5px;
border: 1px solid #ccc; border: 1px solid #ccc;
} }
/* Hide checkboxes initially */
.checkbox-wrapper {
display: none;
}
/* Show checkboxes when 'Handle Multiple' is active */
.handle-multiple-active .checkbox-wrapper {
display: block;
}
@ -297,15 +367,15 @@ function updateStatusOptions(selectedFilter) {
<div class="filter"> <div class="filter">
<span> <b>Filter on:</b> &nbsp;</span> <span> <b>Filter on:</b> &nbsp;</span>
<select id="filter-select" name=""> <select id="filter-select" name="">
<option disabled >Select filter</option> <option value="select_filter_default">Select filter</option>
<option value="Assigned to">Assigned to</option> <option value="Assigned to">Assigned to</option>
<option value="Which activity">Which activity</option> <option value="With activity">With activity</option>
<option value="No activity">No activity</option> <option value="No activity">No activity</option>
<option value="Editor">Editor</option> <!--<option value="Editor">Editor</option>-->
<option value="Spam">Spam</option> <option value="Spam">Spam</option>
<option value="Status">Status</option> <option value="Status">Status</option>
<option value="Tags">Tags</option> <option value="Tags">Tags</option>
<option value="Users">Users</option> <!--<option value="Users">Users</option>-->
</select> </select>
<div class="filter_based__data"> <div class="filter_based__data">
<select id="status-select" name=""> <select id="status-select" name="">
@ -320,13 +390,13 @@ function updateStatusOptions(selectedFilter) {
<label for="select-all"> <input type="checkbox" name="" id="select-all"> Select all</label> <label for="select-all"> <input type="checkbox" name="" id="select-all"> Select all</label>
<div class="tags"> <div class="tags">
<button>Assign post</button> <button>Assign post</button>
<button>Delete</button> <button id="delete-posts">Delete</button>
<button>Move</button> <!--<button>Move</button>-->
<button>Open</button> <button data-status="open" class="update-posts-status">Open</button>
<button>Waiting</button> <button data-status="waiting" class="update-posts-status">Waiting</button>
<button>Done</button> <button data-status="done" class="update-posts-status">Done</button>
<button>Tag</button> <!--<button>Tag</button>-->
<button>Not spam</button> <!--<button>Not spam</button>-->
<button>Reply to multiple</button> <button>Reply to multiple</button>
</div> </div>
</div> </div>
@ -336,6 +406,9 @@ function updateStatusOptions(selectedFilter) {
@foreach($tickets as $ticket) @foreach($tickets as $ticket)
<li> <li>
<a href="{{ route('show.ticket', $ticket->id) }}" class="chat-detail-item d-flex align-items-center"> <a href="{{ route('show.ticket', $ticket->id) }}" class="chat-detail-item d-flex align-items-center">
<div class="checkbox-wrapper">
<input type="checkbox" class="ticket-checkbox" id="ticket-{{$ticket->id}}">
</div>
<div class="chat-user-img all-tickets position-relative"> <div class="chat-user-img all-tickets position-relative">
<img src="{{ asset('images/Avatar.png') }}" alt="User"> <img src="{{ asset('images/Avatar.png') }}" alt="User">
<div <div
@ -370,52 +443,133 @@ class="chat-status-icon rounded-circle text-center align-content-center position
</div> </div>
</div> </div>
<!-- Custom Modal post -->
<div id="customModal" class="modal">
<div class="modal-content">
<span class="modal-close">&times;</span>
<h5>Assign Post</h5>
<form>
<div class="mb-3">
<label for="recipient-name" class="col-form-label">Recipient:</label>
<input type="text" class="form-control" id="recipient-name">
</div>
<div class="mb-3">
<label for="message-text" class="col-form-label">Message:</label>
<textarea class="form-control" id="message-text"></textarea>
</div>
</form>
<button type="button" class="btn btn-primary">Send</button>
</div>
</div>
<!-- Custom Modal move-->
<div id="customModal2" class="modal">
<div class="modal-content">
<span class="modal-close">&times;</span>
<h5>Move</h5>
<form>
<div class="mb-3">
<label for="recipient-name" class="col-form-label">Conversation moved:</label>
<input type="text" class="form-control" id="recipient-name" placeholder="Inbox">
</div>
</form> <!--Filter Status Code-->
<button type="button" class="btn btn-primary">Confirm</button> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</div> <script>
</div> $(document).ready(function() {
<!-- Custom Modal Replay to multiple--> const filterSelect = $('#filter-select');
<div id="customModal3" class="modal"> const statusSelect = $('#status-select');
<div class="modal-content"> const statusOptions = $('#status-options');
<span class="modal-close">&times;</span> const chatDetails = $('.chat-details');
<h5>Replay to multiple</h5>
<form>
<div class="mb-3 mt-4">
<p>Please choose only email conversations and try again</p>
</div>
</form> // Handle status change
$('#status-select').change(function() {
fetchTickets();
});
// Fetch tickets based on filter
function fetchTickets() {
const filter = filterSelect.val();
const status = $('#status-select').val();
$.ajax({
url: '/filter',
method: 'POST',
headers: {
'X-CSRF-TOKEN': "{{ csrf_token() }}"
},
data: {
filter: filter,
status: status,
},
success: function(data) {
chatDetails.empty();
$.each(data.tickets, function(index, ticket) {
chatDetails.append(`
<li>
<a href="{{ route('show.ticket', $ticket->id) }}" class="chat-detail-item d-flex align-items-center">
<div class="checkbox-wrapper">
<input type="checkbox" class="ticket-checkbox" id="ticket-${ticket.id}">
</div>
<div class="chat-user-img">
<img src="/images/Avatar.png" alt="User">
</div>
<div class="chat-message-info d-flex align-self-baseline">
<div class="chat-ticket-row d-flex justify-content-between">
<div class="ticket-status d-flex">
<p class="color-light-green">#${ticket.id}</p>
<div class="ui tiny label bg-dark-green-color color-light">
${ticket.status}
</div> </div>
</div> </div>
<p class="color-dark-green">${new Date(ticket.created_at).toLocaleDateString()}</p>
</div>
<div class="chat-ticket-row d-flex justify-content-between">
<div class="ticket-status d-flex">
<p class="color-dark-green receiver-name">${ticket.sender_name}</p>
<p class="receiver-message"> - ${ticket.subject}</p>
</div>
<p class="color-dark-green bold message-time">${new Date(ticket.created_at).toLocaleTimeString()}</p>
</div>
</div>
</a>
</li>
`);
});
}
});
}
});
</script>
<script>
$(document).ready(function(){
const chatDetails = $('.chat-details');
const filterSelect = $('#filter-select');
filterSelect.change(function() {
const selectedFilter = $(this).val();
if (selectedFilter === 'select_filter_default') {
$.ajax({
url: 'default/all-tickets',
method: 'POST',
headers: {
'X-CSRF-TOKEN': "{{ csrf_token() }}"
},
success: function(data) {
chatDetails.empty();
$.each(data.tickets, function(index, ticket) {
chatDetails.append(`
<li>
<a href="{{ route('show.ticket', $ticket->id) }}" class="chat-detail-item d-flex align-items-center">
<div class="checkbox-wrapper">
<input type="checkbox" class="ticket-checkbox" id="ticket-${ticket.id}">
</div>
<div class="chat-user-img">
<img src="/images/Avatar.png" alt="User">
</div>
<div class="chat-message-info d-flex align-self-baseline">
<div class="chat-ticket-row d-flex justify-content-between">
<div class="ticket-status d-flex">
<p class="color-light-green">#${ticket.id}</p>
<div class="ui tiny label bg-dark-green-color color-light">
${ticket.status}
</div>
</div>
<p class="color-dark-green">${new Date(ticket.created_at).toLocaleDateString()}</p>
</div>
<div class="chat-ticket-row d-flex justify-content-between">
<div class="ticket-status d-flex">
<p class="color-dark-green receiver-name">${ticket.sender_name}</p>
<p class="receiver-message"> - ${ticket.subject}</p>
</div>
<p class="color-dark-green bold message-time">${new Date(ticket.created_at).toLocaleTimeString()}</p>
</div>
</div>
</a>
</li>
`);
});
}
});
}
});
});
</script>
<x-custom-modals />
@endsection @endsection

View File

@ -14,7 +14,7 @@
<button type="button">Abuse</button> <button type="button">Abuse</button>
<button type="button">Canned Responses</button> <button type="button">Canned Responses</button>
<button type="button">Personal Data & Policy</button> <button type="button">Personal Data & Policy</button>
<button type="button">Tags</button> <!--<button type="button">Tags</button>-->
<button type="button">Chat Button</button> <button type="button">Chat Button</button>
</div> </div>
@ -74,7 +74,7 @@
</div> </div>
</div> </div>
<div class="dev-input-group"> <!-- <div class="dev-input-group">
<label class="dev-checkbox-wrapper"> Allow visitors to send messages <label class="dev-checkbox-wrapper"> Allow visitors to send messages
@php @php
$allow_visitor_to_send_messages = getChatSetting('allow_visitor_to_send_messages') $allow_visitor_to_send_messages = getChatSetting('allow_visitor_to_send_messages')
@ -87,13 +87,15 @@
<span>When no editor is available, visitors can still send <span>When no editor is available, visitors can still send
messages.</span> messages.</span>
</div> </div>
</div> </div> -->
<div class="dev-input-group"> <div class="dev-input-group">
<label>Email address that messages should be sent to</label> <label>Email address that messages should be sent to
@php @php
$message_sent_to = getChatSetting('message_sent_to') $message_sent_to = getChatSetting('message_sent_to')
@endphp @endphp
<input type="email" name"message_sent_to" placeholder="Please enter your email" value="{{$message_sent_to->value ?? ''}}"> <input type="email" name="message_sent_to" placeholder="Please enter your email" value="{{$message_sent_to->value ?? ''}}">
</label>
</div> </div>
@ -115,7 +117,7 @@
<div class="dev-input-group dev-input-group-input-info"> <!-- <div class="dev-input-group dev-input-group-input-info">
<label>Log everyone out automatically</label> <label>Log everyone out automatically</label>
@php @php
$logout_everyone_automatically = getChatSetting('logout_everyone_automatically') $logout_everyone_automatically = getChatSetting('logout_everyone_automatically')
@ -133,7 +135,7 @@
of of
day.</span> day.</span>
</div> </div>
</div> </div> -->
<div class="dev-input-group"> <div class="dev-input-group">
<label class="dev-checkbox-wrapper"> Log out editor who has missed a <label class="dev-checkbox-wrapper"> Log out editor who has missed a
chat chat
@ -166,7 +168,7 @@
<span>Editors can always send images and files.</span> <span>Editors can always send images and files.</span>
</div> </div>
</div> </div>
<div class="dev-input-group"> <!-- <div class="dev-input-group">
<label class="dev-checkbox-wrapper"> Guest must write Name and Email to <label class="dev-checkbox-wrapper"> Guest must write Name and Email to
chat chat
@php @php
@ -183,7 +185,7 @@
anonymously. Cross this out if the chat will be started anonymously. Cross this out if the chat will be started
automatically.</span> automatically.</span>
</div> </div>
</div> </div> -->
<div class="dev-input-group"> <div class="dev-input-group">
<label class="dev-checkbox-wrapper"> Save email address for anonymous <label class="dev-checkbox-wrapper"> Save email address for anonymous
chats chats
@ -227,7 +229,7 @@
</span> </span>
</div> </div>
</div> </div>
<div class="dev-input-group dev-input-group-input-info"> <!-- <div class="dev-input-group dev-input-group-input-info">
<label>The chat assistant shows suggestions from:</label> <label>The chat assistant shows suggestions from:</label>
@php @php
$chat_assistant_show_suggestion_form = getChatSetting('chat_assistant_show_suggestion_form') $chat_assistant_show_suggestion_form = getChatSetting('chat_assistant_show_suggestion_form')
@ -247,13 +249,13 @@
chat. The chat code must be entered in the forum or knowledge chat. The chat code must be entered in the forum or knowledge
base.</span> base.</span>
</div> </div>
</div> </div> -->
<div class="dev-input-group dev-input-group-input-info"> <div class="dev-input-group dev-input-group-input-info">
<label>Delay for automatic deletion</label> <label>Delay for automatic deletion</label>
@php @php
$delay_for_automatic_deletion = getChatSetting('delay_for_automatic_deletion') $delay_for_automatic_deletion = getChatSetting('delay_for_automatic_deletion')
@endphp @endphp
<input type="text" name="delay_for_automatic_deletion" placeholder="Type here..." value="{{$delay_for_automatic_deletion->value ?? '' }}"> <input type="number" name="delay_for_automatic_deletion" placeholder="Type here..." value="{{$delay_for_automatic_deletion->value ?? '' }}">
<div class="dev-input-info"> <div class="dev-input-info">
<img src="{{ asset('images/info.svg') }}" alt="info"> <img src="{{ asset('images/info.svg') }}" alt="info">
<span>The number of days a conversation should be stored in Kundo <span>The number of days a conversation should be stored in Kundo
@ -488,13 +490,13 @@ class="form-control input-reply-textarea message_when_chat_is_closed">{!! $messa
</div> </div>
<form> <form>
<div class="col col-left"> <div class="col col-left">
<div class="dev-input-group dev-input-group-input-info"> <!--<div class="dev-input-group dev-input-group-input-info">-->
<label>Test in the answer box</label> <!-- <label>Test in the answer box</label>-->
@php @php
$test_in_answer_box = getChatSetting('test_in_answer_box') $test_in_answer_box = getChatSetting('test_in_answer_box')
@endphp @endphp
<input type="text" placeholder="What can i help you with!" name="test_in_answer_box" class="test_in_answer_box" value="{{$test_in_answer_box->value ?? ''}}"> <input type="hidden" placeholder="What can i help you with!" name="test_in_answer_box" class="test_in_answer_box" value="{{$test_in_answer_box->value ?? ''}}">
</div> <!--</div>-->
<div class="dev-input-group dev-input-group-input-info"> <div class="dev-input-group dev-input-group-input-info">
<label>Start message</label> <label>Start message</label>
@php @php
@ -565,7 +567,7 @@ class="form-control input-reply-textarea message_when_chat_is_closed">{!! $messa
</div> </div>
<script src="https://cdn.ckeditor.com/4.16.0/standard/ckeditor.js"></script> <script src="https://cdn.ckeditor.com/4.16.0/standard/ckeditor.js"></script>
<script> <script>
CKEDITOR.replace('editor1'); //CKEDITOR.replace('editor1');
</script> </script>
<!-- --> <!-- -->
<div class="dev-tabcontent dev-tabcontent-style"> <div class="dev-tabcontent dev-tabcontent-style">
@ -695,22 +697,26 @@ class="form-control input-reply-textarea message_when_chat_is_closed">{!! $messa
</div> </div>
<div class="dev-content-inner"> <div class="dev-content-inner">
<h2>Block IP addresses</h2> <h2>Block IP addresses</h2>
<form> <form method="POST" action="{{ route('block.ip.addresses') }}">
@csrf
<div class="dev-input-group dev-input-group-input-info"> <div class="dev-input-group dev-input-group-input-info">
<label>IP address *</label> <label>IP address *</label>
<input type="text" placeholder="Enter here"> @php
$ip_addresses = getChatSetting('ip_addresses');
@endphp
<input type="text" name="ip_addresses" placeholder="Enter here" value="{{ $ip_addresses->value ?? '' }}">
<div class="dev-input-info"> <div class="dev-input-info">
<img src="{{ asset('images/info.svg') }}" alt="info"> <img src="{{ asset('images/info.svg') }}" alt="info">
<span>A full or partial IP address. E.g. 127.0.0.1 or 127.0.0</span> <span>A full or partial IP address. E.g. 127.0.0.1 or 127.0.0</span>
</div> </div>
</div> </div>
<div class="dev-input-group"> <!--<div class="dev-input-group">-->
<label class="dev-checkbox-wrapper">Delete <!-- <label class="dev-checkbox-wrapper">Delete-->
<input type="checkbox"> <!-- <input type="checkbox">-->
<span class="checkmark"></span> <!-- <span class="checkmark"></span>-->
</label> <!-- </label>-->
</div> <!--</div>-->
<button type="button" class="dev-form-submit-btn">Save</button> <button type="submit" class="dev-form-submit-btn">Save</button>
</form> </form>
</div> </div>
</div> </div>
@ -755,9 +761,9 @@ class="form-control input-reply-textarea message_when_chat_is_closed">{!! $messa
<h3>{{ $result->name }}</h3> <h3>{{ $result->name }}</h3>
<span>{{ $result->text }}</span> <span>{{ $result->text }}</span>
</div> </div>
<div class="dev-icon"> <!--<div class="dev-icon">-->
<img src="{{ asset('images/settingss.svg') }}" alt=""> <!-- <img src="{{ asset('images/settingss.svg') }}" alt="">-->
</div> <!--</div>-->
<div class="dev-icon"> <div class="dev-icon">
<a style="cursor:pointer;" href="{{ route('delete.chat.canned.responses', $value->id) }}" class="delete-display-chat"><img src="{{ asset('images/binn.svg') }}" alt=""></a> <a style="cursor:pointer;" href="{{ route('delete.chat.canned.responses', $value->id) }}" class="delete-display-chat"><img src="{{ asset('images/binn.svg') }}" alt=""></a>
</div> </div>
@ -823,55 +829,55 @@ class="form-control input-reply-textarea message_when_chat_is_closed">{!! $messa
</div> </div>
</div> </div>
<!-- --> <!-- -->
<div class="dev-tabcontent dev-tabcontent-tags"> <!--<div class="dev-tabcontent dev-tabcontent-tags">-->
<div class="dev-tabcontent-outers"> <!-- <div class="dev-tabcontent-outers">-->
<div class="dev-title-row"> <!-- <div class="dev-title-row">-->
<h2>Tags</h2> <!-- <h2>Tags</h2>-->
</div> <!-- </div>-->
<div class="dev-content-inner"> <!-- <div class="dev-content-inner">-->
<form method="POST" action="{{ route('store.tags') }}"> <!-- <form method="POST" action="{{ route('store.tags') }}">-->
@csrf @csrf
<div class="dev-input-group"> <!-- <div class="dev-input-group">-->
<label class="dev-checkbox-wrapper">Allow new tags to be created when <!-- <label class="dev-checkbox-wrapper">Allow new tags to be created when-->
tagging <!-- tagging-->
@php @php
$new_tags_to_be_created_when_tagging = getChatSetting('new_tags_to_be_created_when_tagging') $new_tags_to_be_created_when_tagging = getChatSetting('new_tags_to_be_created_when_tagging')
@endphp @endphp
<input type="checkbox" name="new_tags_to_be_created_when_tagging" @if($new_tags_to_be_created_when_tagging) checked @endif> <!-- <input type="checkbox" name="new_tags_to_be_created_when_tagging" @if($new_tags_to_be_created_when_tagging) checked @endif>-->
<span class="checkmark"></span> <!-- <span class="checkmark"></span>-->
</label> <!-- </label>-->
</div> <!-- </div>-->
<button type="submit" class="dev-form-submit-btn">Save</button> <!-- <button type="submit" class="dev-form-submit-btn">Save</button>-->
</form> <!-- </form>-->
</div> <!-- </div>-->
</div> <!-- </div>-->
</div> <!--</div>-->
<!-- --> <!-- -->
<div class="dev-tabcontent dev-tabcontent-chats"> <div class="dev-tabcontent dev-tabcontent-chats">
<div class="dev-tabcontent-outers"> <!--<div class="dev-tabcontent-outers">-->
<div class="dev-title-row"> <!-- <div class="dev-title-row">-->
<h2>Settings for all chats</h2> <!-- <h2>Settings for all chats</h2>-->
</div> <!-- </div>-->
<div class="dev-content-inner"> <!-- <div class="dev-content-inner">-->
<form method="POST" action="{{ route('setting.all.chat') }}"> <!-- <form method="POST" action="{{ route('setting.all.chat') }}">-->
@csrf @csrf
<div class="dev-input-group dev-input-group-input-info"> <!-- <div class="dev-input-group dev-input-group-input-info">-->
<label>Heading when selecting chat flow</label> <!-- <label>Heading when selecting chat flow</label>-->
@php @php
$heading_for_chat_flow = getChatSetting('heading_for_chat_flow'); $heading_for_chat_flow = getChatSetting('heading_for_chat_flow');
@endphp @endphp
<textarea rows="6" required name="heading_for_chat_flow">{{$heading_for_chat_flow->value ?? ''}}</textarea> <!-- <textarea rows="6" required name="heading_for_chat_flow">{{$heading_for_chat_flow->value ?? ''}}</textarea>-->
<div class="dev-input-info"> <!-- <div class="dev-input-info">-->
<img src="{{ asset('images/info.svg') }}" alt="info"> <!-- <img src="{{ asset('images/info.svg') }}" alt="info">-->
<span>Displayed when the visitor can choose between different chat <!-- <span>Displayed when the visitor can choose between different chat-->
flows.</span> <!-- flows.</span>-->
</div> <!-- </div>-->
</div> <!-- </div>-->
<button type="submit" class="dev-form-submit-btn">Save</button> <!-- <button type="submit" class="dev-form-submit-btn">Save</button>-->
</form> <!-- </form>-->
</div> <!-- </div>-->
</div> <!--</div>-->
<div class="dev-tabcontent-outers"> <div class="dev-tabcontent-outers">
<div class="dev-title-row"> <div class="dev-title-row">
<div> <div>
@ -880,8 +886,16 @@ class="form-control input-reply-textarea message_when_chat_is_closed">{!! $messa
you. you.
</p> </p>
</div> </div>
<button type="button" class="dev-form-submit-btn">DEMO <img
src="{{ asset('images/Arrow_right_stop.svg') }}" alt=""></button> <?php
$comp = get_company('id',getSelectedCompany());
?>
<a href="{{route('chat.demo')}}?aw_domain={{$comp->domain}}" type="button" class="dev-form-submit-btn">DEMO <img
src="{{ asset('images/Arrow_right_stop.svg') }}" alt=""></a>
</div> </div>
<div class="dev-content-inner"> <div class="dev-content-inner">
<h2>Add the code to your website</h2> <h2>Add the code to your website</h2>
@ -890,16 +904,9 @@ class="form-control input-reply-textarea message_when_chat_is_closed">{!! $messa
pages where the chat should be visible.</p> pages where the chat should be visible.</p>
<form> <form>
<div class="dev-input-group dev-input-group-input-info"> <div class="dev-input-group dev-input-group-input-info">
<textarea rows="11"> &lt;script&gt; <textarea readonly rows="11"><link rel="stylesheet" href="https://chat.rapidev.tech/chat/chat.css">
(function (w) { <div id="aw-root-chat" data-company="{{getSelectedCompany()}}"></div>
w.$kundo_chat = w.$kundo_chat || {}; <script src="https://chat.rapidev.tech/chat/chat.js"></script> </textarea>
w.$kundo_chat.custom_texts = {
START_TEXT: 'Chat with us',
};
}(this));
&lt;/script&gt;
&lt;script src="https://static-chat.kundo.se/chat-js/org/1779/widget.js" async defer&gt;&lt;/script&gt;
</textarea>
<div class="dev-input-info"> <div class="dev-input-info">
<img src="{{ asset('images/info.svg') }}" alt="info"> <img src="{{ asset('images/info.svg') }}" alt="info">
<span>Displayed when the visitor can choose between different chat <span>Displayed when the visitor can choose between different chat
@ -907,23 +914,23 @@ class="form-control input-reply-textarea message_when_chat_is_closed">{!! $messa
</div> </div>
</div> </div>
</form> </form>
<h2>Customized chat</h2> <!--<h2>Customized chat</h2>-->
<p>It's possible to customize how the chat works on your website. The code below can <!--<p>It's possible to customize how the chat works on your website. The code below can-->
be <!-- be-->
used to automatically <!-- used to automatically-->
fill out the users name and email when the chat is started. It can be added <!-- fill out the users name and email when the chat is started. It can be added-->
anywhere <!-- anywhere-->
on the page where the chat is loaded. <!-- on the page where the chat is loaded.-->
</p> <!--</p>-->
<form> <!--<form>-->
<div class="dev-input-group dev-input-group-input-info"> <!-- <div class="dev-input-group dev-input-group-input-info">-->
<textarea rows="6"> window.$kundo_chat=window.$kundo_chat <!-- <textarea rows="6"> window.$kundo_chat=window.$kundo_chat-->
||{};window.$kundo_chat.user={ <!-- ||{};window.$kundo_chat.user={-->
"name": "Användare Användarsson","email": <!-- "name": "Användare Användarsson","email":-->
"anvandare@example.com",}; <!-- "anvandare@example.com",};-->
</textarea> <!-- </textarea>-->
</div> <!-- </div>-->
</form> <!--</form>-->
</div> </div>
</div> </div>
</div> </div>
@ -969,7 +976,7 @@ class="form-control input-reply-textarea message_when_chat_is_closed">{!! $messa
const start_message = $('.start_message').val(); const start_message = $('.start_message').val();
const test_in_answer_box = $('.test_in_answer_box').val(); const test_in_answer_box = $('.test_in_answer_box').val();
// Get the value from CKEditor // Get the value from CKEditor
const message_when_chat_is_closed = CKEDITOR.instances.editor1.getData(); const message_when_chat_is_closed = $('#editor1').val();// CKEDITOR.instances.editor1.getData();
$.ajax({ $.ajax({
url: '/store/text', url: '/store/text',

View File

@ -0,0 +1,3 @@
<link rel="stylesheet" href="https://chat.rapidev.tech/chat/chat.css">
<div id="aw-root-chat" data-company="{{getSelectedCompany()}}"></div>
<script src="https://chat.rapidev.tech/chat/chat.js"></script>

View File

@ -285,6 +285,10 @@ function loadChats(){
success: function(response) { success: function(response) {
console.log(response); console.log(response);
socket.emit('chat_closed',
{ customer_id:activeChat.customer_id, chat_id: activeChat.id }
);
Swal.fire({ Swal.fire({
title: 'Success', title: 'Success',
text: "Chat is closed.", text: "Chat is closed.",
@ -497,17 +501,37 @@ function loadChats(){
} }
socket.on('chat_created',function(data){
loadChats();
console.log(data);
playMessageSound();
});
socket.on('chat message', function(msg) { socket.on('chat message', function(msg) {
playMessageSound(); playMessageSound();
if(msg.id == activeChat.id){ if(msg.id == activeChat.id){
var sms = msg;
var content = sms.sms;
if(sms.type == 'image'){
content = '<img src="'+content+'"/>';
}
if(sms.type == 'file'){
content = '<a target="_blank" href="'+content+'"> View File </a>';
}
//<img class="align-self-end" src="{{ asset('images/Avatar.png') }}" alt="Dummy User"> //<img class="align-self-end" src="{{ asset('images/Avatar.png') }}" alt="Dummy User">
inbox.append(` <div class="item"> inbox.append(` <div class="item">
<div class="single-user-content d-flex"> <div class="single-user-content d-flex">
<div class="chat-user-img-box receiver-message-box d-flex"> <div class="chat-user-img-box receiver-message-box d-flex">
<p>${msg.sms}</p> <p>${content}</p>
</div> </div>
</div> </div>
</div>`); </div>`);

View File

@ -0,0 +1,280 @@
<!-- Custom Modal post -->
<div id="customModal" class="modal">
<div class="modal-content">
<span class="modal-close">&times;</span>
<h5>Assign Post</h5>
<form id="assignForm">
<input type="hidden" id="ticket-ids" name="ticket_ids">
<div class="mb-3">
<label for="recipient-name" class="col-form-label">Recipient:</label>
@php
$companyId = getSelectedCompany();
$company_users = get_company_users($companyId);
@endphp
<select name="user_assigned" class="form-control" required>
<option>Select User</option>
@foreach($company_users as $company_user)
<option value="{{$company_user->user->id}}">{{$company_user->user->name}}</option>
@endforeach
</select>
</div>
<div class="mb-3">
<label for="message-text" class="col-form-label">Message:</label>
<textarea class="form-control" id="message-text" name="message" required></textarea>
</div>
</form>
<button type="button" class="btn btn-primary assign-post">Send</button>
</div>
</div>
<!-- Custom Modal move-->
<div id="customModal2" class="modal">
<div class="modal-content">
<span class="modal-close">&times;</span>
<h5>Move</h5>
<form>
<div class="mb-3">
<label for="recipient-name" class="col-form-label">Conversation moved:</label>
<input type="text" class="form-control" id="recipient-name" placeholder="Inbox">
</div>
</form>
<button type="button" class="btn btn-primary">Confirm</button>
</div>
</div>
<!-- Custom Modal Replay to multiple-->
<div id="customModal3" class="modal">
<div class="modal-content">
<span class="modal-close">&times;</span>
<h5>Replay to multiple</h5>
<form>
<div class="mb-3 mt-4">
<p>Please choose only email conversations and try again</p>
</div>
</form>
</div>
</div>
<script>
$(document).ready(function() {
var $handleMultipleButton = $('.handle-multiple-btn');
var $selectAllCheckbox = $('#select-all');
var $ticketCheckboxes = $('.ticket-checkbox');
var $actionButtons = $('.handle_multiple__options .tags button');
// Function to toggle button states
function updateButtonStates() {
var selectedCount = $ticketCheckboxes.filter(':checked').length;
$actionButtons.prop('disabled', selectedCount === 0);
}
// Toggle checkboxes visibility
$handleMultipleButton.on('click', function() {
$('.content').toggleClass('handle-multiple-active');
});
// Toggle all checkboxes based on 'Select all'
$selectAllCheckbox.on('change', function() {
$ticketCheckboxes.prop('checked', $selectAllCheckbox.prop('checked'));
updateButtonStates();
});
// Toggle button states when individual checkboxes change
$ticketCheckboxes.on('change', function() {
updateButtonStates();
});
// Initialize button states
updateButtonStates();
});
</script>
<!--Assigned Post Start-->
<script>
$(document).ready(function() {
$('.assign-post').on('click', function() {
var selectedTickets = [];
$('.ticket-checkbox:checked').each(function() {
selectedTickets.push($(this).attr('id').replace('ticket-', ''));
});
$('#ticket-ids').val(selectedTickets.join(','));
// SweetAlert2 confirmation dialog
Swal.fire({
title: 'Are you sure?',
text: 'You are about to send this message.',
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Yes, send it!',
cancelButtonText: 'Cancel'
}).then((result) => {
if (result.isConfirmed) {
// Get form data
var formData = $('#assignForm').serialize();
// AJAX request to submit the form
$.ajax({
url: 'assign/ticket',
method: 'POST',
headers: {
'X-CSRF-TOKEN': "{{ csrf_token() }}"
},
data: formData,
success: function(response) {
// Show success notification
Swal.fire(
'Assigned!',
'Post Assigned Successfully!',
'success'
);
location.reload();
// Hide the modal
$('#customModal').modal('hide');
},
error: function(xhr) {
// Show error notification
Swal.fire(
'Error!',
'An error occurred. Please try again.',
'error'
);
}
});
}
});
});
});
</script>
<!--Assigned Post End-->
<!--Delete Post Start-->
<script>
$(document).ready(function() {
$('#delete-posts').on('click', function() {
var selectedTickets = [];
$('.ticket-checkbox:checked').each(function() {
selectedTickets.push($(this).attr('id').replace('ticket-', ''));
});
var ticket_ids = selectedTickets.join(',');
// SweetAlert2 confirmation dialog
Swal.fire({
title: 'Are you sure?',
text: 'You are about to delete selected tickets.',
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Yes, delete them!',
cancelButtonText: 'Cancel'
}).then((result) => {
if (result.isConfirmed) {
// AJAX request to delete the tickets
$.ajax({
url: 'delete/tickets',
method: 'POST',
headers: {
'X-CSRF-TOKEN': "{{ csrf_token() }}"
},
data: {
ticket_ids: ticket_ids
},
success: function(response) {
// Show success notification
Swal.fire(
'Deleted!',
'Tickets have been deleted successfully.',
'success'
);
// Reload the page or update the UI as needed
location.reload();
},
error: function(xhr) {
// Show error notification
Swal.fire(
'Error!',
'An error occurred. Please try again.',
'error'
);
}
});
}
});
});
});
</script>
<!--Delete Post End-->
<!--Update Status Start-->
<script>
$(document).ready(function() {
$('.update-posts-status').on('click', function() {
var status = $(this).data('status');
var selectedTickets = [];
$('.ticket-checkbox:checked').each(function() {
selectedTickets.push($(this).attr('id').replace('ticket-', ''));
});
var ticket_ids = selectedTickets.join(',');
// SweetAlert2 confirmation dialog
Swal.fire({
title: 'Are you sure?',
text: 'You are about to update the status of selected tickets.',
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Yes, update it!',
cancelButtonText: 'Cancel'
}).then((result) => {
if (result.isConfirmed) {
// AJAX request to submit the form
$.ajax({
url: 'update/ticket/status',
method: 'POST',
headers: {
'X-CSRF-TOKEN': "{{ csrf_token() }}"
},
data: {
ticket_ids: ticket_ids,
status: status
},
success: function(response) {
// Show success notification
Swal.fire(
'Updated!',
'Tickets status has been updated successfully.',
'success'
);
// Optionally reload or update the page
location.reload();
},
error: function(xhr) {
// Show error notification
Swal.fire(
'Error!',
'An error occurred. Please try again.',
'error'
);
}
});
}
});
});
});
</script>
<!--Update Status End-->

View File

@ -0,0 +1,88 @@
<script>
$(document).ready(function() {
// Toggle filter dropdown on button click
$('.list-filter-btn').click(function() {
$('.filter-options').toggle();
});
// Initial hide for handle_multiple__options
$('.filter-options').hide();
$('.handle_multiple__options').hide();
// Toggle visibility of handle_multiple__options on button click
$('.handle-multiple-btn').click(function() {
$('.handle_multiple__options').toggle();
});
// Initially disable all the buttons
$('.handle_multiple__options .tags button').prop('disabled', true);
// Enable/disable buttons based on the select all checkbox
// $('#select-all').change(function() {
// if ($(this).is(':checked')) {
// $('.handle_multiple__options .tags button').prop('disabled', false);
// } else {
// $('.handle_multiple__options .tags button').prop('disabled', true);
// }
// });
// Show the modal when "Assign post" button is clicked
$('.handle_multiple__options .tags button:contains("Assign post")').click(function(e) {
e.preventDefault();
$('#customModal').show();
});
// Show the modal when "Move" button is clicked
$('.handle_multiple__options .tags button:contains("Move")').click(function(e) {
e.preventDefault();
$('#customModal2').show();
});
// Show the modal when "Reply to multiple" button is clicked
$('.handle_multiple__options .tags button:contains("Reply to multiple")').click(function(e) {
e.preventDefault();
$('#customModal3').show();
});
// Close the modal when the close button or outside the modal is clicked
$('.modal-close, .modal').click(function() {
$('.modal').hide();
});
// Prevent modal content from closing the modal when clicked
$('.modal-content').click(function(e) {
e.stopPropagation();
});
});
</script>
<div class="content chat-card-header d-flex align-items-center justify-content-between">
<div class="header">Chats</div>
<div class="data-actions d-flex justify-content-end">
<button class="action-button bg-dark-green-color color-light handle-multiple-btn">
<img src="{{ asset('images/icons/Add_Plus.png') }}" alt="Plus Icon">
<span>Handle Multiple</span>
</button>
</div>
</div>
<div class="handle_multiple__options">
<div class="common_shre">
<label for="select-all"> <input type="checkbox" name="" id="select-all"> Select all</label>
<div class="tags">
<button>Assign post</button>
<button id="delete-posts">Delete</button>
<!--<button>Move</button>-->
<button data-status="open" class="update-posts-status">Open</button>
<button data-status="waiting" class="update-posts-status">Waiting</button>
<button data-status="done" class="update-posts-status">Done</button>
<!--<button>Tag</button>-->
<!--<button>Not spam</button>-->
<button>Reply to multiple</button>
</div>
</div>
</div>

View File

@ -1,3 +1,67 @@
<style>
/* The switch - the box around the slider */
.switch {
position: relative;
display: inline-block;
width: 60px;
height: 34px;
}
/* Hide default HTML checkbox */
.switch input {
opacity: 0;
width: 0;
height: 0;
}
/* The slider */
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
-webkit-transition: .4s;
transition: .4s;
}
.slider:before {
position: absolute;
content: "";
height: 26px;
width: 26px;
left: 4px;
bottom: 4px;
background-color: white;
-webkit-transition: .4s;
transition: .4s;
}
input:checked + .slider {
background-color: #2196F3;
}
input:focus + .slider {
box-shadow: 0 0 1px #2196F3;
}
input:checked + .slider:before {
-webkit-transform: translateX(26px);
-ms-transform: translateX(26px);
transform: translateX(26px);
}
/* Rounded sliders */
.slider.round {
border-radius: 34px;
}
.slider.round:before {
border-radius: 50%;
}
</style>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@10"></script> <script src="https://cdn.jsdelivr.net/npm/sweetalert2@10"></script>
<header> <header>
<div class="row"> <div class="row">
@ -13,6 +77,10 @@
<input type="text" class="color-dark-green" placeholder="Search..."> <input type="text" class="color-dark-green" placeholder="Search...">
</div> </div>
<div class="nav-links d-flex align-items-center"> <div class="nav-links d-flex align-items-center">
<label class="switch">
<input type="checkbox" id="toggleSwitch" @if(auth()->user()->is_available == 1) checked @endif>
<span class="slider round"></span>
</label>
<form method="POST" action="{{route('logout')}}"> <form method="POST" action="{{route('logout')}}">
@csrf @csrf
<button class="nav-btn bg-dark-green-color"> <button class="nav-btn bg-dark-green-color">
@ -100,6 +168,8 @@ class="ui secondary basic button shadow-none setting-btn text-white align-conten
</div> </div>
</header> </header>
<script src="https://cdn.ckeditor.com/4.16.0/standard/ckeditor.js"></script> <script src="https://cdn.ckeditor.com/4.16.0/standard/ckeditor.js"></script>
<!-- Toastr JS -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.js"></script>
<style> <style>
@ -108,3 +178,64 @@ class="ui secondary basic button shadow-none setting-btn text-white align-conten
} }
</style> </style>
<script>
document.getElementById('toggleButton').addEventListener('click', function() {
this.classList.toggle('btn-success');
this.classList.toggle('btn-primary');
this.textContent = this.classList.contains('btn-success') ? 'On' : 'Off';
});
</script>
<!--chat avialability ajax-->
<script>
$(document).ready(function() {
$('#toggleSwitch').on('change', function() {
const isChecked = $(this).is(':checked');
if (isChecked) {
// Call route when toggle is ON
$.ajax({
url: 'update/chat-availability',
method: 'POST',
headers: {
'X-CSRF-TOKEN': "{{ csrf_token() }}"
},
data: {
status: 'on'
},
success: function(response) {
console.log('Success:', response);
if(response.success) {
toastr.success('Chat Availability Updated Successfully');
}
},
error: function(xhr, status, error) {
console.error('Error:', error);
}
});
} else {
// Call route when toggle is OFF
$.ajax({
url: 'update/chat-availability',
method: 'POST',
headers: {
'X-CSRF-TOKEN': "{{ csrf_token() }}"
},
data: {
status: 'off'
},
success: function(response) {
console.log('Success:', response);
if(response.success) {
toastr.success('Chat Availability Updated Successfully');
}
},
error: function(xhr, status, error) {
console.error('Error:', error);
}
});
}
});
});
</script>

View File

@ -505,9 +505,9 @@ function toggleClosed(day) {
<h3>{{ $result->name }}</h3> <h3>{{ $result->name }}</h3>
<span>{{ $result->text }}</span> <span>{{ $result->text }}</span>
</div> </div>
<div class="dev-icon"> <!--<div class="dev-icon">-->
<img src="{{ asset('images/settingss.svg') }}" alt=""> <!-- <img src="{{ asset('images/settingss.svg') }}" alt="">-->
</div> <!--</div>-->
<div class="dev-icon"> <div class="dev-icon">
<a style="cursor:pointer;" href="{{ route('delete.canned.response', $value->id) }}" class="delete-user"><img src="{{ asset('images/binn.svg') }}" alt=""></a> <a style="cursor:pointer;" href="{{ route('delete.canned.response', $value->id) }}" class="delete-user"><img src="{{ asset('images/binn.svg') }}" alt=""></a>
</div> </div>
@ -669,16 +669,16 @@ class="form-control input-reply-textarea">{!! $automatic_reply_text->value ?? ''
</p> </p>
</div> </div>
<h2>Create a new rule</h2> <h2>Create a new rule</h2>
<form> <form method="POST" action="{{ route('update.rule') }}">
@csrf
<div class="dev-input-group dev-input-group-input-info"> <div class="dev-input-group dev-input-group-input-info">
<label>Name</label> <label>Name</label>
<input type="text" placeholder="Type here.."> <input name="name" type="text" placeholder="Type here.." value="{{$rule->name ?? ''}}">
<div class="dev-input-info"> <div class="dev-input-info">
<img src="{{ asset('images/info.svg') }}" alt="info"> <img src="{{ asset('images/info.svg') }}" alt="info">
<span>Tag everything from the sales department</span> <span>Tag everything from the sales department</span>
</div> </div>
</div> </div>
</form>
<h3>Filter</h3> <h3>Filter</h3>
<p>If you complete the From, To, and Subject fields, they must all match an email for <p>If you complete the From, To, and Subject fields, they must all match an email for
the rule to be activated. Leave any field empty to avoid having to match that part. the rule to be activated. Leave any field empty to avoid having to match that part.
@ -692,12 +692,11 @@ class="form-control input-reply-textarea">{!! $automatic_reply_text->value ?? ''
If you want to activate a rule for all emails that come from a group of email If you want to activate a rule for all emails that come from a group of email
addresses, you can write *@kundo.se in the "from" field. addresses, you can write *@kundo.se in the "from" field.
</p> </p>
<form>
<div class="dev-form-inner"> <div class="dev-form-inner">
<div class="col-left"> <div class="col-left">
<div class="dev-input-group dev-input-group-input-info"> <div class="dev-input-group dev-input-group-input-info">
<label>From</label> <label>From</label>
<input type="text" placeholder="Type here.."> <input type="email" name="from" placeholder="Type here.." value="{{$rule->from ?? ''}}">
<div class="dev-input-info"> <div class="dev-input-info">
<img src="{{ asset('images/info.svg') }}" alt="info"> <img src="{{ asset('images/info.svg') }}" alt="info">
<span>E.g. example@example.com or *@example.com</span> <span>E.g. example@example.com or *@example.com</span>
@ -705,7 +704,7 @@ class="form-control input-reply-textarea">{!! $automatic_reply_text->value ?? ''
</div> </div>
<div class="dev-input-group dev-input-group-input-info"> <div class="dev-input-group dev-input-group-input-info">
<label>To</label> <label>To</label>
<input type="text" placeholder="Type here.."> <input type="email" name="to" placeholder="Type here.." value="{{$rule->to ?? ''}}">
<div class="dev-input-info"> <div class="dev-input-info">
<img src="{{ asset('images/info.svg') }}" alt="info"> <img src="{{ asset('images/info.svg') }}" alt="info">
<span>E.g. test@example.com</span> <span>E.g. test@example.com</span>
@ -715,7 +714,7 @@ class="form-control input-reply-textarea">{!! $automatic_reply_text->value ?? ''
<div class="col-right"> <div class="col-right">
<div class="dev-input-group dev-input-group-input-info"> <div class="dev-input-group dev-input-group-input-info">
<label>Subject Contains</label> <label>Subject Contains</label>
<input type="text" placeholder="Type here.."> <input type="text" name="subject_contains" placeholder="Type here.." value="{{$rule->subject_contains ?? ''}}">
<div class="dev-input-info"> <div class="dev-input-info">
<img src="{{ asset('images/info.svg') }}" alt="info"> <img src="{{ asset('images/info.svg') }}" alt="info">
<span>E.g. Great deals!</span> <span>E.g. Great deals!</span>
@ -723,7 +722,7 @@ class="form-control input-reply-textarea">{!! $automatic_reply_text->value ?? ''
</div> </div>
<div class="dev-input-group dev-input-group-input-info"> <div class="dev-input-group dev-input-group-input-info">
<label>Text Contains</label> <label>Text Contains</label>
<input type="text" placeholder="Type here.."> <input type="text" name="text_contains" placeholder="Type here.." value="{{$rule->text_contains ?? ''}}">
<div class="dev-input-info"> <div class="dev-input-info">
<img src="{{ asset('images/info.svg') }}" alt="info"> <img src="{{ asset('images/info.svg') }}" alt="info">
<span>E.g. Great deals!</span> <span>E.g. Great deals!</span>
@ -733,107 +732,101 @@ class="form-control input-reply-textarea">{!! $automatic_reply_text->value ?? ''
</div> </div>
<div class="dev-input-group"> <div class="dev-input-group">
<label class="dev-checkbox-wrapper">All e-mails automatically marked as spam <label class="dev-checkbox-wrapper">All e-mails automatically marked as spam
<input type="checkbox"> <input name="all_emails_automatically_mark_as_spam" type="checkbox" @if($rule && !is_null($rule->all_emails_automatically_mark_as_spam)) checked @endif>
<span class="checkmark"></span> <span class="checkmark"></span>
</label> </label>
</div> </div>
</form>
<h3>Exceptions</h3> <h3>Exceptions</h3>
<p>Email that matches the filter above but for which the rule should not be activated. <p>Email that matches the filter above but for which the rule should not be activated.
</p> </p>
<form>
<div class="dev-form-inner"> <div class="dev-form-inner">
<div class="col-left"> <div class="col-left">
<div class="dev-input-group dev-input-group-input-info"> <div class="dev-input-group dev-input-group-input-info">
<label>Subject Contains</label> <label>Subject Contains</label>
<textarea rows="6">Type here..</textarea> <textarea rows="6" name="subject1_contains">{{$rule->subject1_contains ?? ''}}</textarea>
<div class="dev-input-info"> <div class="dev-input-info">
<img src="{{ asset('images/info.svg') }}" alt="info"> <img src="{{ asset('images/info.svg') }}" alt="info">
<span>Order Confirmation</span> <span>Order Confirmation</span>
</div> </div>
</div> </div>
</div> </div>
<div class="col-right"> <!--<div class="col-right">-->
<div class="dev-input-group dev-input-group-input-info"> <!-- <div class="dev-input-group dev-input-group-input-info">-->
<label>Text Contains</label> <!-- <label>Text Contains</label>-->
<textarea rows="6">Type here..</textarea> <!-- <textarea rows="6">Type here..</textarea>-->
<div class="dev-input-info"> <!-- <div class="dev-input-info">-->
<img src="{{ asset('images/info.svg') }}" alt="info"> <!-- <img src="{{ asset('images/info.svg') }}" alt="info">-->
<span>Your Order</span> <!-- <span>Your Order</span>-->
<!-- </div>-->
<!-- </div>-->
<!--</div>-->
</div> </div>
</div>
</div>
</div>
</form>
<h3>Effect</h3> <h3>Effect</h3>
<p>The effect describes what should happen when the filter above matches. It happens <p>The effect describes what should happen when the filter above matches. It happens
automatically, before the e-mail shows up in automatically, before the e-mail shows up in
the dashboard.</p> the dashboard.</p>
<form>
<div class="dev-content-schedule"> <div class="dev-content-schedule">
<label>Monday</label> <label>Assign To</label>
<div class="schedule-box"> <div class="schedule-box">
<input type="text" placeholder="08:00"> <select name="assign_to">
<img src="{{ asset('images/downn.svg') }}" alt=""> @foreach($company_users as $company_user)
<option value="{{$company_user->user->id}}" @if($rule && !is_null($rule->assign_to) && $rule->assign_to == $company_user->user->id) selected @endif>{{$company_user->user->name}}</option>
@endforeach
</select>
</div> </div>
</div> </div>
<div class="dev-form-inner"> <div class="dev-form-inner">
<div class="col-left"> <div class="col-left">
<div class="dev-input-group dev-input-group-input-info"> <div class="dev-input-group dev-input-group-input-info">
<label>Message to assigned editor</label> <label>Message to assigned editor</label>
<textarea rows="6">Hi! Feel free to contact us via chat if you are wondering about anything. <textarea rows="6" name="message_to_assigned_editor">{{$rule->message_to_assigned_editor ?? ''}}</textarea>
</textarea>
</div>
<div class="dev-input-group">
<label class="dev-checkbox-wrapper">Remove and hide from the statistics 
<input type="checkbox">
<span class="checkmark"></span>
</label>
</div> </div>
<!--<div class="dev-input-group">-->
<!-- <label class="dev-checkbox-wrapper">Remove and hide from the statistics -->
<!-- <input type="checkbox">-->
<!-- <span class="checkmark"></span>-->
<!-- </label>-->
<!--</div>-->
</div> </div>
<div class="col-right"> <div class="col-right">
<div class="dev-content-schedule"> <div class="dev-content-schedule">
<label>Add tags</label> <label>Add tags</label>
<div class="schedule-box"> <div class="schedule-box">
<input type="text" placeholder="Add tags"> <select name="tag_id">
<img src="{{ asset('images/downn.svg') }}" alt=""> @foreach($tags as $tag)
<option value="{{$tag->id}}" @if($rule && !is_null($rule->tag_id) && $rule->tag_id == $tag->id) selected @endif>{{$tag->name}}</option>
@endforeach
</select>
</div> </div>
</div> </div>
<div class="checkbox-box"> <div class="checkbox-box">
<div class="dev-input-group"> <div class="dev-input-group">
<label class="dev-checkbox-wrapper">Set as done <input type="radio" value="set as done" name="status" @if($rule && !is_null($rule->status) && $rule->status == 'set as done') checked @endif>
<input type="checkbox"> <label class="dev-checkbox-wrapper">Set as done</label>
<span class="checkmark"></span>
</label>
</div> </div>
<div class="dev-input-group"> <div class="dev-input-group">
<label class="dev-checkbox-wrapper">Set highest priority <label class="dev-checkbox-wrapper">Set highest priority</label>
<input type="checkbox"> <input type="radio" value="Set highest priority" name="priority" @if($rule && !is_null($rule->priority) && $rule->priority == 'Set highest priority') checked @endif>
<span class="checkmark"></span>
</label>
</div> </div>
<div class="dev-input-group"> <div class="dev-input-group">
<label class="dev-checkbox-wrapper">Mark as spam <label class="dev-checkbox-wrapper">Mark as spam</label>
<input type="checkbox"> <input type="radio" value="mask as spam" name="status" @if($rule && !is_null($rule->status) && $rule->status == 'mask as spam') checked @endif>
<span class="checkmark"></span>
</label>
</div> </div>
<div class="dev-input-group"> <div class="dev-input-group">
<label class="dev-checkbox-wrapper">Set lowest priority <label class="dev-checkbox-wrapper">Set lowest priority</label>
<input type="checkbox"> <input type="radio" value="Set lowest priority" name="priority" @if($rule && !is_null($rule->priority) && $rule->priority == 'Set lowest priority') checked @endif>
<span class="checkmark"></span>
</label>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<button type="submit" class="dev-form-submit-btn">Save</button>
</form> </form>
<button type="button" class="dev-form-submit-btn">Save</button>
</div> </div>
</div> </div>
@ -885,9 +878,9 @@ class="form-control input-reply-textarea">{!! $automatic_reply_text->value ?? ''
<h3>{{ $values->spam_email }}</h3> <h3>{{ $values->spam_email }}</h3>
<span>{{ $values->marking_radio }}</span> <span>{{ $values->marking_radio }}</span>
</div> </div>
<div class="dev-icon"> <!--<div class="dev-icon">-->
<img src="{{ asset('images/settingss.svg') }}" alt=""> <!-- <img src="{{ asset('images/settingss.svg') }}" alt="">-->
</div> <!--</div>-->
<div class="dev-icon"> <div class="dev-icon">
<a href="{{ route('delete.spam.handling', $index) }}" style="cursor:pointer;" class="delete-user"><img src="{{ asset('images/binn.svg') }}" alt=""></a> <a href="{{ route('delete.spam.handling', $index) }}" style="cursor:pointer;" class="delete-user"><img src="{{ asset('images/binn.svg') }}" alt=""></a>
</div> </div>

View File

@ -13,6 +13,20 @@
</script> </script>
<!-- Toastr CSS -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.css" rel="stylesheet">
<!-- Toastr JS -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.js"></script>
<!-- SweetAlert2 CSS -->
<link href="https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.min.css" rel="stylesheet">
<!-- SweetAlert2 JS -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.all.min.js"></script>
@php
$companyId = getSelectedCompany();
$company_users = get_company_users($companyId);
@endphp
<script> <script>
$(document).ready(function() { $(document).ready(function() {
// Toggle filter dropdown on button click // Toggle filter dropdown on button click
@ -33,13 +47,13 @@
$('.handle_multiple__options .tags button').prop('disabled', true); $('.handle_multiple__options .tags button').prop('disabled', true);
// Enable/disable buttons based on the select all checkbox // Enable/disable buttons based on the select all checkbox
$('#select-all').change(function() { // $('#select-all').change(function() {
if ($(this).is(':checked')) { // if ($(this).is(':checked')) {
$('.handle_multiple__options .tags button').prop('disabled', false); // $('.handle_multiple__options .tags button').prop('disabled', false);
} else { // } else {
$('.handle_multiple__options .tags button').prop('disabled', true); // $('.handle_multiple__options .tags button').prop('disabled', true);
} // }
}); // });
// Show the modal when "Assign post" button is clicked // Show the modal when "Assign post" button is clicked
$('.handle_multiple__options .tags button:contains("Assign post")').click(function(e) { $('.handle_multiple__options .tags button:contains("Assign post")').click(function(e) {
@ -84,33 +98,58 @@ function updateStatusOptions(selectedFilter) {
console.log("Updating status options for:", selectedFilter); // Debugging log console.log("Updating status options for:", selectedFilter); // Debugging log
switch (selectedFilter) { switch (selectedFilter) {
case 'Assigned to': case 'Assigned to':
$('#status-select').html(` // $('#status-select').html(`
<option disabled value="">Select assigned to</option> // <option disabled value="">Select assigned to</option>
<option value="Assigned">Assigned</option> // <option value="Assigned">Assigned</option>
<option value="Unassigned">Unassigned</option> // <option value="Unassigned">Unassigned</option>
<option value="Margin">Margin</option> // <option value="Margin">Margin</option>
`); // `);
var options = '<option value="">Select assigned to</option>';
// Loop through the company_users array
@foreach($company_users as $company_user)
options += '<option value="{{ $company_user->user->id }}">{{ $company_user->user->name }}</option>';
@endforeach
$('#status-select').html(options);
$('.filter_based__data').show(); $('.filter_based__data').show();
break; break;
case 'Which activity': case 'With activity':
$('#status-select').html(` $('#status-select').html(`
<option disabled value="">Select activity</option> <option value="">Select No activity</option>
<option value="Marked as spam">Marked as spam</option> <option value="last 24 hours">Last 24 hours</option>
<option value="Not spam">Not spam</option> <option value="last 3 days">Last 3 days</option>
<option value="last week">Last week</option>
<option value="last month">Last month</option>
<option value="last 3 months">Last 3 months</option>
<option value="last 6 months">Last 6 months</option>
<option value="last year">Last year</option>
<option value="the past 2 years">The past 2 years</option>
<option value="the past 3 years">The past 3 years</option>
<option value="the past 4 years">The past 4 years</option>
<option value="the past 5 years">The past 5 years</option>
`); `);
$('.filter_based__data').show(); $('.filter_based__data').show();
break; break;
case 'No activity': case 'No activity':
$('#status-select').html(` $('#status-select').html(`
<option disabled value="">Select No activity</option> <option value="">Select No activity</option>
<option value="Exercise">Exercise</option> <option value="last 24 hours">Last 24 hours</option>
<option value="Not Yoga">Not Yoga</option> <option value="last 3 days">Last 3 days</option>
<option value="last week">Last week</option>
<option value="last month">Last month</option>
<option value="last 3 months">Last 3 months</option>
<option value="last 6 months">Last 6 months</option>
<option value="last year">Last year</option>
<option value="the past 2 years">The past 2 years</option>
<option value="the past 3 years">The past 3 years</option>
<option value="the past 4 years">The past 4 years</option>
<option value="the past 5 years">The past 5 years</option>
`); `);
$('.filter_based__data').show(); $('.filter_based__data').show();
break; break;
case 'Editor': case 'Editor':
$('#status-select').html(` $('#status-select').html(`
<option disabled value="">Select Editor</option> <option value="">Select Editor</option>
<option value="Computer tool">Computer tool</option> <option value="Computer tool">Computer tool</option>
<option value="Direct editor">Direct editor</option> <option value="Direct editor">Direct editor</option>
`); `);
@ -118,34 +157,47 @@ function updateStatusOptions(selectedFilter) {
break; break;
case 'Spam': case 'Spam':
$('#status-select').html(` $('#status-select').html(`
<option disabled>Select Spam</option> <option value="">Select Spam</option>
<option value="Marked as spam">Marked as spam</option> <option value="marked as spam">Marked as spam</option>
<option value="Not spam">Not spam</option> <option value="marked as not spam">Marked as not spam</option>
`); `);
$('.filter_based__data').show(); $('.filter_based__data').show();
break; break;
case 'Status': case 'Status':
$('#status-select').html(` $('#status-select').html(`
<option disabled value="">Select status</option> <option value="">Select status</option>
<option value="Completed">Completed</option> <option value="open">Open</option>
<option value="Not Completed">Not Completed</option> <option value="waiting">Waiting</option>
<option value="done">Done</option>
`); `);
$('.filter_based__data').show(); $('.filter_based__data').show();
break; break;
case 'Tags': case 'Tags':
$('#status-select').html(`
<option disabled value="">Select Tags</option> var options = '<option value="">Select Tags</option>';
<option value="Target">Target</option> @foreach($tags as $tag)
<option value="Mustafa">Mustafa</option> options += '<option value="{{$tag->name}}">{{$tag->name}}</option>';
`); @endforeach
$('#status-select').html(options);
$('.filter_based__data').show(); $('.filter_based__data').show();
break; break;
case 'Users': case 'Users':
$('#status-select').html(`
<option disabled value="">Select Users</option> var options = '<option value="">Select Users</option>';
<option value="Merrs">Merrs</option> // Loop through the company_users array
<option value="Abdullah">Abdullah</option> @foreach($company_users as $company_user)
`); options += '<option value="{{ $company_user->user->id }}">{{ $company_user->user->name }}</option>';
@endforeach
// $('#status-select').html(`
// <option disabled value="">Select Users</option>`
// @foreah($company_users as $company_user)
// `<option value="`{{$company_user->user->id}}`">`{{$company_user->user->name}}`</option>
// <option value="Abdullah">Abdullah</option>
// `);
// Update the select element with the generated options
$('#status-select').html(options);
$('.filter_based__data').show(); $('.filter_based__data').show();
break; break;
default: default:
@ -159,6 +211,58 @@ function updateStatusOptions(selectedFilter) {
}); });
</script> </script>
<!--chat avialability ajax-->
<script>
$(document).ready(function() {
$('#toggleSwitch').on('change', function() {
const isChecked = $(this).is(':checked');
if (isChecked) {
// Call route when toggle is ON
$.ajax({
url: 'update/chat-availability',
method: 'POST',
headers: {
'X-CSRF-TOKEN': "{{ csrf_token() }}"
},
data: {
status: 'on'
},
success: function(response) {
console.log('Success:', response);
if(response.success) {
toastr.success('Chat Availability Updated Successfully');
}
},
error: function(xhr, status, error) {
console.error('Error:', error);
}
});
} else {
// Call route when toggle is OFF
$.ajax({
url: 'update/chat-availability',
method: 'POST',
headers: {
'X-CSRF-TOKEN': "{{ csrf_token() }}"
},
data: {
status: 'off'
},
success: function(response) {
console.log('Success:', response);
if(response.success) {
toastr.success('Chat Availability Updated Successfully');
}
},
error: function(xhr, status, error) {
console.error('Error:', error);
}
});
}
});
});
</script>
<style> <style>
@ -279,6 +383,15 @@ function updateStatusOptions(selectedFilter) {
border-radius: 5px; border-radius: 5px;
border: 1px solid #ccc; border: 1px solid #ccc;
} }
/* Hide checkboxes initially */
.checkbox-wrapper {
display: none;
}
/* Show checkboxes when 'Handle Multiple' is active */
.handle-multiple-active .checkbox-wrapper {
display: block;
}
@ -289,13 +402,13 @@ function updateStatusOptions(selectedFilter) {
<div class="content chat-card-header d-flex align-items-center justify-content-between"> <div class="content chat-card-header d-flex align-items-center justify-content-between">
<div class="header">Chats</div> <div class="header">Chats</div>
<div class="data-actions d-flex justify-content-end"> <div class="data-actions d-flex justify-content-end">
<div class="date-filter d-flex align-items-center"> <!--<div class="date-filter d-flex align-items-center">-->
<img src="{{ asset('images/icons/calendar.png') }}" alt="Calendar"> <!-- <img src="{{ asset('images/icons/calendar.png') }}" alt="Calendar">-->
<select class="date-filter-selectbox" name=""> <!-- <select class="date-filter-selectbox" name="">-->
<option value="">Last 7 Days</option> <!-- <option value="">Last 7 Days</option>-->
</select> <!-- </select>-->
</div> <!--</div>-->
<button class="action-button d-flex align-items-center list-filter-btn"> <button class="action-button d-flex align-items-center list-filter-btn">
<img src="{{ asset('images/icons/list-filter.png') }}" alt=""> <img src="{{ asset('images/icons/list-filter.png') }}" alt="">
</button> </button>
@ -312,15 +425,15 @@ function updateStatusOptions(selectedFilter) {
<div class="filter"> <div class="filter">
<span> <b>Filter on:</b> &nbsp;</span> <span> <b>Filter on:</b> &nbsp;</span>
<select id="filter-select" name=""> <select id="filter-select" name="">
<option disabled >Select filter</option> <option value="select_filter_default">Select filter</option>
<option value="Assigned to">Assigned to</option> <option value="Assigned to">Assigned to</option>
<option value="Which activity">Which activity</option> <option value="With activity">With activity</option>
<option value="No activity">No activity</option> <option value="No activity">No activity</option>
<option value="Editor">Editor</option> <!--<option value="Editor">Editor</option>-->
<option value="Spam">Spam</option> <option value="Spam">Spam</option>
<option value="Status">Status</option> <option value="Status">Status</option>
<option value="Tags">Tags</option> <option value="Tags">Tags</option>
<option value="Users">Users</option> <!--<option value="Users">Users</option>-->
</select> </select>
<div class="filter_based__data"> <div class="filter_based__data">
<select id="status-select" name=""> <select id="status-select" name="">
@ -335,13 +448,13 @@ function updateStatusOptions(selectedFilter) {
<label for="select-all"> <input type="checkbox" name="" id="select-all"> Select all</label> <label for="select-all"> <input type="checkbox" name="" id="select-all"> Select all</label>
<div class="tags"> <div class="tags">
<button>Assign post</button> <button>Assign post</button>
<button>Delete</button> <button id="delete-posts">Delete</button>
<button>Move</button> <!--<button>Move</button>-->
<button>Open</button> <button data-status="open" class="update-posts-status">Open</button>
<button>Waiting</button> <button data-status="waiting" class="update-posts-status">Waiting</button>
<button>Done</button> <button data-status="done" class="update-posts-status">Done</button>
<button>Tag</button> <!--<button>Tag</button>-->
<button>Not spam</button> <!--<button>Not spam</button>-->
<button>Reply to multiple</button> <button>Reply to multiple</button>
</div> </div>
</div> </div>
@ -351,6 +464,9 @@ function updateStatusOptions(selectedFilter) {
@foreach($tickets as $ticket) @foreach($tickets as $ticket)
<li> <li>
<a href="{{ route('show.ticket', $ticket->id) }}" class="chat-detail-item d-flex align-items-center"> <a href="{{ route('show.ticket', $ticket->id) }}" class="chat-detail-item d-flex align-items-center">
<div class="checkbox-wrapper">
<input type="checkbox" class="ticket-checkbox" id="ticket-{{$ticket->id}}">
</div>
<div class="chat-user-img"> <div class="chat-user-img">
<img src="{{ asset('images/Avatar.png') }}" alt="User"> <img src="{{ asset('images/Avatar.png') }}" alt="User">
</div> </div>
@ -381,51 +497,137 @@ function updateStatusOptions(selectedFilter) {
</div> </div>
</div> </div>
<!-- Custom Modal post --> <!--Filter Status Code-->
<div id="customModal" class="modal"> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<div class="modal-content"> <script>
<span class="modal-close">&times;</span> $(document).ready(function() {
<h5>Assign Post</h5> const filterSelect = $('#filter-select');
<form> const statusSelect = $('#status-select');
<div class="mb-3"> const statusOptions = $('#status-options');
<label for="recipient-name" class="col-form-label">Recipient:</label> const chatDetails = $('.chat-details');
<input type="text" class="form-control" id="recipient-name">
</div>
<div class="mb-3">
<label for="message-text" class="col-form-label">Message:</label>
<textarea class="form-control" id="message-text"></textarea>
</div>
</form>
<button type="button" class="btn btn-primary">Send</button>
</div>
</div>
<!-- Custom Modal move-->
<div id="customModal2" class="modal">
<div class="modal-content">
<span class="modal-close">&times;</span>
<h5>Move</h5>
<form>
<div class="mb-3">
<label for="recipient-name" class="col-form-label">Conversation moved:</label>
<input type="text" class="form-control" id="recipient-name" placeholder="Inbox">
</div>
</form> // Handle status change
<button type="button" class="btn btn-primary">Confirm</button> $('#status-select').change(function() {
</div> fetchTickets();
</div> });
<!-- Custom Modal Replay to multiple-->
<div id="customModal3" class="modal">
<div class="modal-content">
<span class="modal-close">&times;</span>
<h5>Replay to multiple</h5>
<form>
<div class="mb-3 mt-4">
<p>Please choose only email conversations and try again</p>
</div>
</form> // Fetch tickets based on filter
function fetchTickets() {
const filter = filterSelect.val();
const status = $('#status-select').val();
$.ajax({
url: '/filter',
method: 'POST',
headers: {
'X-CSRF-TOKEN': "{{ csrf_token() }}"
},
data: {
filter: filter,
status: status,
type: 'inbox',
},
success: function(data) {
chatDetails.empty();
$.each(data.tickets, function(index, ticket) {
chatDetails.append(`
<li>
<a href="{{ route('show.ticket', $ticket->id) }}" class="chat-detail-item d-flex align-items-center">
<div class="checkbox-wrapper">
<input type="checkbox" class="ticket-checkbox" id="ticket-${ticket.id}">
</div>
<div class="chat-user-img">
<img src="/images/Avatar.png" alt="User">
</div>
<div class="chat-message-info d-flex align-self-baseline">
<div class="chat-ticket-row d-flex justify-content-between">
<div class="ticket-status d-flex">
<p class="color-light-green">#${ticket.id}</p>
<div class="ui tiny label bg-dark-green-color color-light">
${ticket.status}
</div> </div>
</div> </div>
<p class="color-dark-green">${new Date(ticket.created_at).toLocaleDateString()}</p>
</div>
<div class="chat-ticket-row d-flex justify-content-between">
<div class="ticket-status d-flex">
<p class="color-dark-green receiver-name">${ticket.sender_name}</p>
<p class="receiver-message"> - ${ticket.subject}</p>
</div>
<p class="color-dark-green bold message-time">${new Date(ticket.created_at).toLocaleTimeString()}</p>
</div>
</div>
</a>
</li>
`);
});
}
});
}
});
</script>
<script>
$(document).ready(function(){
const chatDetails = $('.chat-details');
const filterSelect = $('#filter-select');
filterSelect.change(function() {
const selectedFilter = $(this).val();
if (selectedFilter === 'select_filter_default') {
$.ajax({
url: 'default/all-tickets',
method: 'POST',
headers: {
'X-CSRF-TOKEN': "{{ csrf_token() }}"
},
data: {
type: 'inbox'
},
success: function(data) {
chatDetails.empty();
$.each(data.tickets, function(index, ticket) {
chatDetails.append(`
<li>
<a href="{{ route('show.ticket', $ticket->id) }}" class="chat-detail-item d-flex align-items-center">
<div class="checkbox-wrapper">
<input type="checkbox" class="ticket-checkbox" id="ticket-${ticket.id}">
</div>
<div class="chat-user-img">
<img src="/images/Avatar.png" alt="User">
</div>
<div class="chat-message-info d-flex align-self-baseline">
<div class="chat-ticket-row d-flex justify-content-between">
<div class="ticket-status d-flex">
<p class="color-light-green">#${ticket.id}</p>
<div class="ui tiny label bg-dark-green-color color-light">
${ticket.status}
</div>
</div>
<p class="color-dark-green">${new Date(ticket.created_at).toLocaleDateString()}</p>
</div>
<div class="chat-ticket-row d-flex justify-content-between">
<div class="ticket-status d-flex">
<p class="color-dark-green receiver-name">${ticket.sender_name}</p>
<p class="receiver-message"> - ${ticket.subject}</p>
</div>
<p class="color-dark-green bold message-time">${new Date(ticket.created_at).toLocaleTimeString()}</p>
</div>
</div>
</a>
</li>
`);
});
}
});
}
});
});
</script>
<x-custom-modals />
@endsection @endsection

View File

@ -30,5 +30,29 @@
crossorigin="anonymous"></script> crossorigin="anonymous"></script>
</body> </body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
$(document).ready(function() {
function updateLastOnline() {
$.ajax({
url: '/update-last-online',
method: 'GET',
success: function(response) {
if (response.success) {
console.log('Last online updated successfully.');
}
},
error: function(xhr) {
console.error('An error occurred:', xhr.responseText);
}
});
}
// Update last online every minute (60000 milliseconds)
setInterval(updateLastOnline, 60000);
});
</script>
</html> </html>

View File

@ -4,6 +4,8 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- CSRF Token Meta Tag -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>Inbox</title> <title>Inbox</title>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js"></script>
@ -109,4 +111,27 @@
</style> </style>
</body> </body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
$(document).ready(function() {
function updateLastOnline() {
$.ajax({
url: '/update-last-online',
method: 'GET',
success: function(response) {
if (response.success) {
console.log('Last online updated successfully.');
}
},
error: function(xhr) {
console.error('An error occurred:', xhr.responseText);
}
});
}
// Update last online every minute (60000 milliseconds)
setInterval(updateLastOnline, 60000);
});
</script>
</html> </html>

View File

@ -129,6 +129,27 @@ class="side-bar-link bg-light-color d-flex align-items-center justify-content-be
@endif @endif
}); });
</script> </script>
<script>
$(document).ready(function() {
function updateLastOnline() {
$.ajax({
url: '/update-last-online',
method: 'GET',
success: function(response) {
if (response.success) {
console.log('Last online updated successfully.');
}
},
error: function(xhr) {
console.error('An error occurred:', xhr.responseText);
}
});
}
// Update last online every minute (60000 milliseconds)
setInterval(updateLastOnline, 60000);
});
</script>
<!-- Main Custom Js --> <!-- Main Custom Js -->
<script src="{{ asset('assets/script.js') }}"></script> <script src="{{ asset('assets/script.js') }}"></script>
</body> </body>

View File

@ -132,11 +132,14 @@
$tags = []; $tags = [];
$db_tags = getTicketMeta($ticket->id,'tags'); $db_tags = getTicketMeta($ticket->id,'tags');
if($db_tags){
foreach($db_tags as $tag){ foreach($db_tags as $tag){
$tags[] = $tag->value; $tags[] = $tag->value;
} }
}
?> ?>
<input type="text" name="tags" id="tags" value="{{implode(',',$tags)}}" placeholder="Type and press Enter" <input type="text" name="tags" id="tags" value="{{implode(',',$tags)}}" placeholder="Type and press Enter"
@ -223,10 +226,10 @@ class="form-control input-reply-textarea input-comment-textarea" id="add-comment
<p class="response-comment-user-name">{{ $comment->user->name }}</p> <p class="response-comment-user-name">{{ $comment->user->name }}</p>
</div> </div>
<div class="right-area d-flex"> <div class="right-area d-flex">
<button <!--<button-->
class="ui button comment--btn bg-dark-green-color color-light comment-edit-btn "> <!-- class="ui button comment--btn bg-dark-green-color color-light comment-edit-btn ">-->
<i class="edit outline icon"></i> <!-- <i class="edit outline icon"></i>-->
</button> <!--</button>-->
<button <button
class="ui button comment--btn bg-light-green-color color-light comment-delete-btn" data-comment-id="{{ $comment->id }}"> class="ui button comment--btn bg-light-green-color color-light comment-delete-btn" data-comment-id="{{ $comment->id }}">
<i class="trash alternate outline icon"></i> <i class="trash alternate outline icon"></i>

View File

@ -6,7 +6,7 @@
<img src="{{ asset('images/Avatar.png') }}" alt="User"> <img src="{{ asset('images/Avatar.png') }}" alt="User">
</div> </div>
<div class="single-message-chat"> <div class="single-message-chat">
<p class="user-message">{!!$message->message!!}</p> <div class="user-message">{!!$message->message!!}</div>
<p class="message-time">{{ \Carbon\Carbon::parse($message->created_at)->format('h:i A') }}</p> <p class="message-time">{{ \Carbon\Carbon::parse($message->created_at)->format('h:i A') }}</p>
</div> </div>
</div> </div>

View File

@ -12,6 +12,10 @@
.receiver-message{ .receiver-message{
word-break: break-all; word-break: break-all;
} }
.single-message-chat img{
width: 100% !important;
height: auto !important;
}
</style> </style>
<input type="hidden" value="{{$single_ticket->id}}" id="aw-ticket_id"/> <input type="hidden" value="{{$single_ticket->id}}" id="aw-ticket_id"/>
@ -75,7 +79,7 @@
<!-- </div>--> <!-- </div>-->
<!--</div>--> <!--</div>-->
@if($single_ticket->status != 'done') @if($single_ticket->type != 'chat')
<div class="content d-flex align-items-end flex-column message-writing-content-area"> <div class="content d-flex align-items-end flex-column message-writing-content-area">
<textarea rows="7" placeholder="Your Message" <textarea rows="7" placeholder="Your Message"

View File

@ -13,153 +13,14 @@
</script> </script>
<!-- Toastr CSS -->
<script> <link href="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.css" rel="stylesheet">
$(document).ready(function() { <!-- Toastr JS -->
// Toggle filter dropdown on button click <script src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.js"></script>
$('.list-filter-btn').click(function() { <!-- SweetAlert2 CSS -->
$('.filter-options').toggle(); <link href="https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.min.css" rel="stylesheet">
}); <!-- SweetAlert2 JS -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.all.min.js"></script>
// Initial hide for handle_multiple__options
$('.filter-options').hide();
$('.handle_multiple__options').hide();
// Toggle visibility of handle_multiple__options on button click
$('.handle-multiple-btn').click(function() {
$('.handle_multiple__options').toggle();
});
// Initially disable all the buttons
$('.handle_multiple__options .tags button').prop('disabled', true);
// Enable/disable buttons based on the select all checkbox
$('#select-all').change(function() {
if ($(this).is(':checked')) {
$('.handle_multiple__options .tags button').prop('disabled', false);
} else {
$('.handle_multiple__options .tags button').prop('disabled', true);
}
});
// Show the modal when "Assign post" button is clicked
$('.handle_multiple__options .tags button:contains("Assign post")').click(function(e) {
e.preventDefault();
$('#customModal').show();
});
// Show the modal when "Move" button is clicked
$('.handle_multiple__options .tags button:contains("Move")').click(function(e) {
e.preventDefault();
$('#customModal2').show();
});
// Show the modal when "Reply to multiple" button is clicked
$('.handle_multiple__options .tags button:contains("Reply to multiple")').click(function(e) {
e.preventDefault();
$('#customModal3').show();
});
// Close the modal when the close button or outside the modal is clicked
$('.modal-close, .modal').click(function() {
$('.modal').hide();
});
// Prevent modal content from closing the modal when clicked
$('.modal-content').click(function(e) {
e.stopPropagation();
});
// Update Select status options based on Select filter selection
$('#filter-select').change(function() {
var selectedFilter = $(this).val();
console.log("Selected filter:", selectedFilter); // Debugging log
updateStatusOptions(selectedFilter);
});
// Initially hide filter based data section
$('.filter_based__data').hide();
// Function to update status options based on selectedFilter
function updateStatusOptions(selectedFilter) {
console.log("Updating status options for:", selectedFilter); // Debugging log
switch (selectedFilter) {
case 'Assigned to':
$('#status-select').html(`
<option disabled value="">Select assigned to</option>
<option value="Assigned">Assigned</option>
<option value="Unassigned">Unassigned</option>
<option value="Margin">Margin</option>
`);
$('.filter_based__data').show();
break;
case 'Which activity':
$('#status-select').html(`
<option disabled value="">Select activity</option>
<option value="Marked as spam">Marked as spam</option>
<option value="Not spam">Not spam</option>
`);
$('.filter_based__data').show();
break;
case 'No activity':
$('#status-select').html(`
<option disabled value="">Select No activity</option>
<option value="Exercise">Exercise</option>
<option value="Not Yoga">Not Yoga</option>
`);
$('.filter_based__data').show();
break;
case 'Editor':
$('#status-select').html(`
<option disabled value="">Select Editor</option>
<option value="Computer tool">Computer tool</option>
<option value="Direct editor">Direct editor</option>
`);
$('.filter_based__data').show();
break;
case 'Spam':
$('#status-select').html(`
<option disabled>Select Spam</option>
<option value="Marked as spam">Marked as spam</option>
<option value="Not spam">Not spam</option>
`);
$('.filter_based__data').show();
break;
case 'Status':
$('#status-select').html(`
<option disabled value="">Select status</option>
<option value="Completed">Completed</option>
<option value="Not Completed">Not Completed</option>
`);
$('.filter_based__data').show();
break;
case 'Tags':
$('#status-select').html(`
<option disabled value="">Select Tags</option>
<option value="Target">Target</option>
<option value="Mustafa">Mustafa</option>
`);
$('.filter_based__data').show();
break;
case 'Users':
$('#status-select').html(`
<option disabled value="">Select Users</option>
<option value="Merrs">Merrs</option>
<option value="Abdullah">Abdullah</option>
`);
$('.filter_based__data').show();
break;
default:
$('#status-select').html(`
<option disabled value="">Select status</option>
`);
$('.filter_based__data').show();
break;
}
}
});
</script>
@ -281,6 +142,15 @@ function updateStatusOptions(selectedFilter) {
border-radius: 5px; border-radius: 5px;
border: 1px solid #ccc; border: 1px solid #ccc;
} }
/* Hide checkboxes initially */
.checkbox-wrapper {
display: none;
}
/* Show checkboxes when 'Handle Multiple' is active */
.handle-multiple-active .checkbox-wrapper {
display: block;
}
@ -288,65 +158,18 @@ function updateStatusOptions(selectedFilter) {
<div class="content-wrapper"> <div class="content-wrapper">
<div class="ui card chat-card waiting-chat-card"> <div class="ui card chat-card waiting-chat-card">
<div class="content chat-card-header d-flex align-items-center justify-content-between"> <!--handle multiple-->
<div class="header">Waiting</div> <x-handle-filter />
<div class="data-actions d-flex justify-content-end">
<button class="action-button d-flex align-items-center list-filter-btn">
<img src="{{ asset('images/icons/list-filter.png') }}" alt="">
</button>
<button class="action-button bg-dark-green-color color-light handle-multiple-btn">
<img src="{{ asset('images/icons/Add_Plus.png') }}" alt="Plus Icon">
<span>Handle Multiple</span>
</button>
</div>
</div>
<div class="filter-options">
<div class="filter">
<span> <b>Filter on:</b> &nbsp;</span>
<select id="filter-select" name="">
<option disabled >Select filter</option>
<option value="Assigned to">Assigned to</option>
<option value="Which activity">Which activity</option>
<option value="No activity">No activity</option>
<option value="Editor">Editor</option>
<option value="Spam">Spam</option>
<option value="Status">Status</option>
<option value="Tags">Tags</option>
<option value="Users">Users</option>
</select>
<div class="filter_based__data">
<select id="status-select" name="">
<option disabled>Select status</option>
<!-- Options will be dynamically updated based on selected filter -->
</select>
</div>
</div>
</div>
<div class="handle_multiple__options">
<div class="common_shre">
<label for="select-all"> <input type="checkbox" name="" id="select-all"> Select all</label>
<div class="tags">
<button>Assign post</button>
<button>Delete</button>
<button>Move</button>
<button>Open</button>
<button>Waiting</button>
<button>Done</button>
<button>Tag</button>
<button>Not spam</button>
<button>Reply to multiple</button>
</div>
</div>
</div>
@if(count($tickets) > 0) @if(count($tickets) > 0)
<div class="content chat-content"> <div class="content chat-content">
<ul class="chat-details"> <ul class="chat-details">
@foreach($tickets as $ticket) @foreach($tickets as $ticket)
<li> <li>
<a href="{{ route('show.ticket', $ticket->id) }}" class="chat-detail-item d-flex align-items-center"> <a href="{{ route('show.ticket', $ticket->id) }}" class="chat-detail-item d-flex align-items-center">
<div class="checkbox-wrapper">
<input type="checkbox" class="ticket-checkbox" id="ticket-{{$ticket->id}}">
</div>
<div class="chat-user-img"> <div class="chat-user-img">
<img src="{{ asset('images/Avatar.png') }}" alt="User"> <img src="{{ asset('images/Avatar.png') }}" alt="User">
</div> </div>
@ -382,51 +205,5 @@ function updateStatusOptions(selectedFilter) {
</div> </div>
</div> </div>
<!-- Custom Modal post --> <x-custom-modals />
<div id="customModal" class="modal">
<div class="modal-content">
<span class="modal-close">&times;</span>
<h5>Assign Post</h5>
<form>
<div class="mb-3">
<label for="recipient-name" class="col-form-label">Recipient:</label>
<input type="text" class="form-control" id="recipient-name">
</div>
<div class="mb-3">
<label for="message-text" class="col-form-label">Message:</label>
<textarea class="form-control" id="message-text"></textarea>
</div>
</form>
<button type="button" class="btn btn-primary">Send</button>
</div>
</div>
<!-- Custom Modal move-->
<div id="customModal2" class="modal">
<div class="modal-content">
<span class="modal-close">&times;</span>
<h5>Move</h5>
<form>
<div class="mb-3">
<label for="recipient-name" class="col-form-label">Conversation moved:</label>
<input type="text" class="form-control" id="recipient-name" placeholder="Inbox">
</div>
</form>
<button type="button" class="btn btn-primary">Confirm</button>
</div>
</div>
<!-- Custom Modal Replay to multiple-->
<div id="customModal3" class="modal">
<div class="modal-content">
<span class="modal-close">&times;</span>
<h5>Replay to multiple</h5>
<form>
<div class="mb-3 mt-4">
<p>Please choose only email conversations and try again</p>
</div>
</form>
</div>
</div>
@endsection @endsection

View File

@ -38,6 +38,9 @@
// In routes/web.php // In routes/web.php
Route::get('/chatgroups', [ChatController::class, 'getChatGroupsByCompany'])->name('chatgroups.get'); Route::get('/chatgroups', [ChatController::class, 'getChatGroupsByCompany'])->name('chatgroups.get');
Route::get('/chat-demo', [ChatController::class, 'chatDemo'])->name('chat.demo');
Route::post('/close-chat', [ChatController::class, 'CloseChat'])->name('CloseChat'); Route::post('/close-chat', [ChatController::class, 'CloseChat'])->name('CloseChat');
@ -47,6 +50,11 @@
Route::post('/verify-domain', [MailgunController::class, 'verifyDomain'])->name('verifyDomain'); Route::post('/verify-domain', [MailgunController::class, 'verifyDomain'])->name('verifyDomain');
//Filter Route
Route::post('filter', [TicketController::class, 'filter']);
Route::post('default/all-tickets', [TicketController::class, 'defaultAllTickets']);
Route::get('update-last-online', [UserController::class, 'updateLastOnline']);
Route::get('/dashboard', [DashboardController::class, 'dashboard'])->name('index')->middleware('verifyDomain');; Route::get('/dashboard', [DashboardController::class, 'dashboard'])->name('index')->middleware('verifyDomain');;
Route::get('/profile', [DashboardController::class, 'profile'])->name('profile'); Route::get('/profile', [DashboardController::class, 'profile'])->name('profile');
Route::get('company-info', [CompanyController::class, 'getCompanyInfo'])->name('get.company.info'); Route::get('company-info', [CompanyController::class, 'getCompanyInfo'])->name('get.company.info');
@ -63,6 +71,11 @@
Route::post('store-comment', [InboxController::class, 'storeComment']); Route::post('store-comment', [InboxController::class, 'storeComment']);
Route::get('delete-comment/{commentId}', [InboxController::class, 'deleteComment']); Route::get('delete-comment/{commentId}', [InboxController::class, 'deleteComment']);
Route::post('store/response', [InboxController::class, 'storeResponse'])->name('store.response'); Route::post('store/response', [InboxController::class, 'storeResponse'])->name('store.response');
Route::post('update/chat-availability', [UserController::class, 'updateChatAvailability']);
Route::post('assign/ticket', [TicketController::class, 'AssignTicket']);
Route::post('delete/tickets', [TicketController::class, 'deleteTickets']);
Route::post('update/ticket/status', [TicketController::class, 'updateTicketStatus']);
Route::post('update/rule', [InboxController::class, 'updateRule'])->name('update.rule');
//Basic Setting Route //Basic Setting Route
Route::post('inbox/basic-setting', [InboxController::class, 'basicSetting'])->name('inbox.basic.setting'); Route::post('inbox/basic-setting', [InboxController::class, 'basicSetting'])->name('inbox.basic.setting');
//User Routes //User Routes
@ -93,6 +106,7 @@
Route::post('store/personal-data', [ChatSettingController::class, 'storePersonalData'])->name('store.personal.data'); Route::post('store/personal-data', [ChatSettingController::class, 'storePersonalData'])->name('store.personal.data');
Route::post('store/tags', [ChatSettingController::class, 'storeTags'])->name('store.tags'); Route::post('store/tags', [ChatSettingController::class, 'storeTags'])->name('store.tags');
Route::post('setting/all-chat', [ChatSettingController::class, 'settingAllChat'])->name('setting.all.chat'); Route::post('setting/all-chat', [ChatSettingController::class, 'settingAllChat'])->name('setting.all.chat');
Route::post('block/ip-addresses', [ChatSettingController::class, 'blockIpAdresses'])->name('block.ip.addresses');
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home'); Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
Route::post('logout', [LoginController::class, 'logout'])->name('logout'); Route::post('logout', [LoginController::class, 'logout'])->name('logout');