PHP Classes

File: resources/js/Pages/Create.vue

Recommend this page to a friend!
  Classes of Robert Devenyi   Iceburg SAAS PHP CRM Open Source   resources/js/Pages/Create.vue   Download  
File: resources/js/Pages/Create.vue
Role: Auxiliary data
Content type: text/plain
Description: Auxiliary data
Class: Iceburg SAAS PHP CRM Open Source
Application to manage the contacts of customers
Author: By
Last change:
Date: 1 year ago
Size: 16,867 bytes
 

Contents

Class file image Download
<template> <AppLayout title="Create CRM"> <template #header> <div class="grid grid-flow-col auto-cols-auto place-content-between"> <h2 class="font-semibold text-xl text-gray-800 leading-tight"> Create a CRM </h2> <button class="btn btn-primary">Create</button> </div> </template> <div class="py-12 grid justify-items-center"> <div class="p-10 w-full md:w-3/4 bg-base-200"> <div class="card w-full bg-base-100 shadow-xl gap-4 text-center"> <Alert :message="alert.alert_text" :is_successful="alert.success_alert" :is_error="alert.error_alert" /> <div class="card-body w-full items-center text-center"> <h2 class="card-title">What kind of CRM?</h2> <p><select v-model="new_crm_data.type" class="input input-bordered select-xl select w-full"> <option value="" disabled selected>Select type</option> <option value="default">IceburgCRM</option> <option value="uploadschema">Schema Upload</option> <option value="connection">Connect MySQL Database</option> </select></p> <hr /> <div v-if="new_crm_data.type === 'default'"> <div class="alert shadow-lg mt-10 mb-10"> <div> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="stroke-info flex-shrink-0 w-6 h-6"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg> <span>Create a CRM based on the IceburgCRM framework. </span> </div> <div class="flex-none"> <a href="https://www.iceburg.ca" target="_blank" class="btn btn-sm btn-accent text-accent-content">Learn More</a> </div> </div> </div> <div v-if="new_crm_data.type === 'uploadschema'"> <div class="alert shadow-lg mt-10"> <div> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="stroke-info flex-shrink-0 w-6 h-6"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg> <span>Upload your own MySQL schema. Take any MySQL dump and upload it and we will create a crm from it. </span> </div> <div class="flex-none"> <a href="/mysqlsampledatabase.sql" target="_blank" class="btn btn-sm btn-accent text-accent-content">Sample Schema File</a> <a href="/MySQL-Sample-Database-Diagram.pdf" target="_blank" class="btn btn-sm btn-grey text-accent-content">Schema Diagram</a> </div> </div> <div class="bg-base-500 mt-10 mb-10 border-primary"> </div> <input type="file" id="file-input" @change="onFileChanged($event)" name="file" class="file-input file-input-primary mb-10 mt-5 w-full max-w-xs" /> </div> <div v-if="new_crm_data.type === 'connection'" class="alert shadow-lg mt-10 mb-10"> <div> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="stroke-info flex-shrink-0 w-6 h-6"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg> <span>Create a CRM from your existing MySQL database. Enter in your connection settings and we'll create a CRM using your databases as modules and database fields as CRM module fields. <br /><br />The connection information you enter will not be saved </span> </div> </div> <div v-if="new_crm_data.type === 'connection'" class="bg-base-300 mb-10 p-10 rounded-2xl"><h4 class="text-sm font-semibold mt-5">Connection</h4> <div class="grid grid-flow-col colspan-1 md:colspan-2 gap-4"> <div class="ml-5"> <div class="form-control max-w-xs"> <label class="label"> <span class="label-text">Database Name</span> </label> <input type="text" v-model="connection.db_name" placeholder="Host ip or dns address" class="input input-bordered w-full max-w-xs" /> </div> <div class="form-control max-w-xs"> <label class="label"> <span class="label-text">Host</span> </label> <input type="text" v-model="connection.host" placeholder="Host ip or dns address" class="input input-bordered w-full max-w-xs" /> </div> <div class="form-control max-w-xs"> <label class="label"> <span class="label-text">Username</span> </label> <input type="text" v-model="connection.username" placeholder="MySQL username" class="input input-bordered w-full max-w-xs" /> </div> <div class="form-control max-w-xs"> <label class="label"> <span class="label-text">Password</span> </label> <input type="password" v-model="connection.password" class="input input-bordered w-full max-w-xs" /> </div> </div> <div> <div class="form-control max-w-xs"> <label class="label"> <span class="label-text">Port</span> </label> <input type="text" v-model="connection.port" placeholder="Port Number" class="input input-bordered w-full max-w-xs" /> </div> <div class="form-control max-w-xs"> <label class="label"> <span class="label-text">Charset</span> </label> <input type="text" v-model="connection.character_set" placeholder="Character Set" class="input input-bordered w-full max-w-xs" /> </div> <div class="form-control max-w-xs"> <label class="label"> <span class="label-text">Collation</span> </label> <input type="text" v-model="connection.collation" placeholder="Select a name for your CRM" class="input input-bordered w-full max-w-xs" /> </div> </div> </div> </div> <div v-if="new_crm_data.type != ''" class="w-full md:w-1/2 p-10 rounded-2xl bg-gray-200"><h4 class="text-sm font-semibold">Options</h4> <div class="form-control max-w-xs"> <label class="label"> <span class="label-text">Name</span> </label> <input type="text" v-model="new_crm_data.name" placeholder="Select a name for your CRM" class="input input-bordered w-full max-w-xs" /> </div> <div class="form-control max-w-xs"> <label class="label"> <span class="label-text">Description</span> </label> <textarea v-model="new_crm_data.description" class="textarea textarea-bordered h-24 input w-full max-w-xs" placeholder="Set the CRM description. Will be shown on login page" /> </div> <div class="form-control w-full max-w-xs"> <label class="label"> <span class="label-text">Theme</span> </label> <select name="theme" v-model="new_crm_data.theme" class="select select-bordered"> <option v-for="item in $page.props.themes" :value="item.name">{{item.name}}</option> </select> </div> </div> <div v-if="new_crm_data.type != ''" class="card card-compact w-full md:w-3/4 bg-base-100 mt-10 shadow-xl"> <div class="card-body"> <h2 class="card-title place-content-center text-center">Default usernames and passwords</h2> <p>admin@iceburg.ca:admin<br /> user@iceburg.ca:user<br /> sales@iceburg.ca:sales<br /> accounting@iceburg.ca:accounting<br /> marketing@iceburg.ca:marketing<br /></p> </div> </div> <div v-if="new_crm_data.type != ''" class="card-actions"> <button @click="create" class="mt-10 btn btn-primary">{{create_title}}</button> </div> </div> </div> </div> </div> </AppLayout> </template> <script setup> console.log('start'); import AppLayout from '@/Layouts/AppLayout.vue'; import { ref, reactive } from 'vue'; import { Head, usePage } from '@inertiajs/inertia-vue3'; import Alert from "@/Components/Alert.vue"; import axios from "axios"; const type = ref(''); const file = ref(); const form = ref(); const create_title = ref('Create'); const themes = ref(usePage().props.value.themes); const new_crm_data = reactive({ type: ref(''), 'name': ref(''), 'theme': ref('light'), 'description': ref(''), 'login_email': ref(usePage().props.value.user.email), 'login_password': ref(''), 'login_name': ref(usePage().props.value.user.name) }); const alert = reactive({ success_alert : ref(0), error_alert : ref(0), alert_text : ref('') }); const preview_data = reactive({ fields: {}, row: {}, show: ref(false) }); const connections = ref( usePage().props.value.connections) const data = reactive({ preview: ref(true) }); const connection = reactive({ character_set: ref('utf8mb4'), collation: ref('utf8mb4_unicode_ci'), username: ref(''), password: ref(''), host: ref(''), port: ref('3306'), db_name: ref(''), save_connection: ref(true), connection_id: ref('') }); const onFileChanged = function($event) { preview_data.show=false; console.log('in prefi'); const target = $event.target; if (target && target.files) { console.log('in prefi2'); file.value = target.files[0]; } } const process = function(){ data.preview=false; upload(); } let fieldValueData = {}; const create = async function () { create_title.value='Create'; const formData = new FormData(); if(new_crm_data.type == 'uploadschema'){ formData.append('input_file', file.value); //create_title.value='Creating... This will take 2 minutes. Please stay on this page'; } else if(new_crm_data.type == 'connection'){ formData.append('character_set', connection.character_set); formData.append('collation', connection.collation); formData.append('username', connection.username); formData.append('db_name', connection.db_name); formData.append('password', connection.password); formData.append('host', connection.host); formData.append('port', connection.port); formData.append('save_connection', connection.save_connection); } formData.append('login_name', new_crm_data.login_name); formData.append('login_email', new_crm_data.login_email); formData.append('login_password', new_crm_data.login_password); formData.append('type', new_crm_data.type); formData.append('name', new_crm_data.name); formData.append('theme', new_crm_data.theme); formData.append('description', new_crm_data.description); console.log('in create'); const headers = {'Content-Type': 'multipart/form-data'}; //axios.post('/data/import', formData, {headers}).then((res) => { axios.post('/create', formData, {headers}).then(response => { if(response.data) { if(response.data.status == 1) { //window.scrollTo(0, 'top'); alert.alert_text="Your CRM has been queued for creation. You will be forwarded to the dashboard."; alert.success_alert=true; setTimeout(() => { window.location = '/dashboard'; }, 2000); } else { alert.error_alert=1; alert.alert_text=response.data.message; window.scrollTo(0, top); setTimeout(() => { alert.error_alert=null; alert.alert_text=''; }, 5000); } //window.location = '/module/' + usePage().props.value.module.name + '/view/' + response.data; } }) .catch(error => { alert.error_alert=1; alert.alert_text=error.response.data.errors; window.scrollTo(0, top); setTimeout(() => { alert.error_alert=null; alert.alert_text=''; }, 5000); }); } async function upload() { if (file.value) { data.alert_text = ''; data.success_alert = false; data.error_alert = false; const formData = new FormData(); formData.append('input_file', file.value); formData.append('module_id', data.module_id); formData.append('module_name', data.module_name); formData.append('preview', data.preview); formData.append('first_row_header', data.first_row_header); const headers = {'Content-Type': 'multipart/form-data'}; axios.post('/data/import', formData, {headers}).then((res) => { if (data.preview === false) { data.alert_text = "Records have been imported"; window.scrollTo(0, 'top'); data.success_alert = true; data.preview = false; setTimeout(() => { window.location = '/import?success=1&records='; }, 2000); } else { preview_data.fields = res.data.fields; preview_data.row = res.data.row; preview_data.show = true; data.preview = true; } }).catch(function (error) { alert.error_alert=1; alert.alert_text=error.response.data.errors; window.scrollTo(0, top); setTimeout(() => { alert.error_alert=null; alert.alert_text=''; }, 5000); }); } } </script>