Nouvelle interface
This commit is contained in:
44
src/App.vue
44
src/App.vue
@@ -1,15 +1,33 @@
|
||||
<script setup>
|
||||
import TicketList from '@/components/TicketList.vue'
|
||||
import {computed, onMounted, ref, watch} from 'vue';
|
||||
import {computed, nextTick, onMounted, ref, watch} from 'vue';
|
||||
import {Tab} from 'bootstrap'
|
||||
import TicketApi from "@/services/TicketApi.js";
|
||||
import {useGlobalStore} from "@/stores/global";
|
||||
import {storeToRefs} from "pinia";
|
||||
|
||||
const store = useGlobalStore()
|
||||
|
||||
const filter = ref('ALL');
|
||||
|
||||
const tickets = ref({});
|
||||
const apiCounter = ref(0)
|
||||
const waitingPromise = () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
resolve([]);
|
||||
}, 100000);
|
||||
});
|
||||
}
|
||||
|
||||
const openExternalPage = async (script, params = null, features = null) => {
|
||||
if (store.gulliver === null) {
|
||||
await store.registerSession()
|
||||
}
|
||||
window.open(store.url + script + '?NUMC=' + store.numc + (params !== null ? '&' + params : ''), '_blank', features);
|
||||
}
|
||||
|
||||
const newTickets = computed(() => {
|
||||
return tickets.value.hasOwnProperty('new_tickets') ? mapListOfTickets(tickets.value.new_tickets.list, filter.value) : []
|
||||
return tickets.value.hasOwnProperty('new_tickets') ? mapListOfTickets(tickets.value.new_tickets.list, filter.value) : waitingPromise
|
||||
})
|
||||
|
||||
const pendingTickets = computed(() => {
|
||||
@@ -27,11 +45,12 @@ const mapListOfTickets = (tickets, originFilter) => {
|
||||
|
||||
|
||||
onMounted(async () => {
|
||||
|
||||
tickets.value = await TicketApi.getTickets()
|
||||
apiCounter.value++
|
||||
|
||||
const myInterval = setInterval(async function () {
|
||||
tickets.value = await TicketApi.getTickets()
|
||||
apiCounter.value++
|
||||
}, 180000);
|
||||
|
||||
})
|
||||
@@ -58,13 +77,14 @@ onMounted(async () => {
|
||||
fiches</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="#" onclick="alert('Non disponible dans cette version beta')"> <i
|
||||
<a class="nav-link" href="#"
|
||||
@click="openExternalPage('/php-client/pharma/ordo_manager.php', null, 'width=500,height=750')"> <i
|
||||
class="fa-solid fa-file-medical"
|
||||
></i> Livraisons
|
||||
ordonnances</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="#" onclick="alert('Non disponible dans cette version beta')"><i
|
||||
<a class="nav-link" href="#" @click="openExternalPage('/php/parameters.php', 'SEE=CUSTOMERS3&APPLI=1')"><i
|
||||
class="fa-solid fa-bell-concierge"
|
||||
></i> Accueil
|
||||
Comptoir</a>
|
||||
@@ -75,7 +95,8 @@ onMounted(async () => {
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/interface/ase_home.php?prj=pharmamp&config=TA&lang=fr_FR"><i class="fa-solid fa-shuffle"></i> Retourner sur la version de production
|
||||
<a class="nav-link" href="/interface/ase_home.php?prj=pharmamp&config=TA&lang=fr_FR"><i
|
||||
class="fa-solid fa-shuffle"></i> Retourner sur la version de production
|
||||
</a>
|
||||
</li>
|
||||
|
||||
@@ -114,16 +135,13 @@ onMounted(async () => {
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab-pane show active" id="new" role="tabpanel" tabindex="0">
|
||||
<ticket-list :rows="newTickets" v-if="newTickets.length >0" :key="'new_'+filter"></ticket-list>
|
||||
<div class="alert alert-success" v-else>Aucune fiche</div>
|
||||
<ticket-list :rows="newTickets" :key="'new_'+filter+'_'+apiCounter"></ticket-list>
|
||||
</div>
|
||||
<div class="tab-pane" id="pending" role="tabpanel" tabindex="0">
|
||||
<ticket-list :rows="pendingTickets" v-if="pendingTickets.length >0" :key="'pending_'+filter"></ticket-list>
|
||||
<div class="alert alert-success" v-else>Aucune fiche</div>
|
||||
<ticket-list :rows="pendingTickets" :key="'new_'+filter+'_'+apiCounter"></ticket-list>
|
||||
</div>
|
||||
<div class="tab-pane" id="my" role="tabpanel" tabindex="0">
|
||||
<ticket-list :rows="myTickets" v-if="myTickets.length >0" :key="'my_'+filter"></ticket-list>
|
||||
<div class="alert alert-success" v-else>Aucune fiche</div>
|
||||
<ticket-list :rows="myTickets" :key="'new_'+filter+'_'+apiCounter"></ticket-list>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
|
||||
$font-size-root : '16px';
|
||||
$body-bg: #f6f9ff;
|
||||
$tooltip-max-width: 400px;
|
||||
$tooltip-opacity: 1;
|
||||
|
||||
@import "bootstrap/scss/variables";
|
||||
@import "bootstrap/scss/maps";
|
||||
@@ -50,6 +52,14 @@ $body-bg: #f6f9ff;
|
||||
}
|
||||
|
||||
@import "bootstrap/scss/tooltip";
|
||||
|
||||
.custom-tooltip {
|
||||
--bs-tooltip-bg: var(--bs-primary);
|
||||
.tooltip-inner{
|
||||
text-align: left;
|
||||
}
|
||||
}
|
||||
|
||||
// Helpers
|
||||
@import "bootstrap/scss/helpers";
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ import {Grid, html} from "gridjs";
|
||||
import {Tooltip} from 'bootstrap'
|
||||
|
||||
const props = defineProps({
|
||||
rows: Array,
|
||||
rows: { type : [Array, Function]},
|
||||
})
|
||||
|
||||
const gridWrapper = ref(null)
|
||||
@@ -49,13 +49,21 @@ const grid = new Grid({
|
||||
}, {
|
||||
name: 'Derniers messages',
|
||||
formatter: (cell, row) => {
|
||||
return html('<span data-bs-toggle="tooltip" data-bs-html="true" title="<strong>'+row.cells[4].data.txt1+'</strong>'+ ( (row.cells[4].data.txt2 !== null) ? '<hr/>'+row.cells[4].data.txt2 : '')+'">' + cell + '</span>')
|
||||
return html('<span style="cursor: pointer" data-bs-toggle="tooltip" data-bs-custom-class="custom-tooltip" data-bs-html="true" title="<strong>'+row.cells[4].data.txt1.replaceAll('"', '')+'</strong>'+ ( (row.cells[4].data.txt2 !== null) ? '<hr/>'+row.cells[4].data.txt2.replaceAll("\n", "<br\>").replaceAll('"', '') : '')+'"><i class="fa-regular fa-comment-dots fa-flip-horizontal text-primary"></i> ' + cell + '</span>')
|
||||
}
|
||||
}, 'Interlocuteur', {name: 'Client', width: '120px'}],
|
||||
}, 'Interlocuteur',
|
||||
{
|
||||
name: 'Client',
|
||||
width: '120px',
|
||||
formatter: (cell) => {
|
||||
return html(cell === 'oui' ? '<i class="fa-regular fa-circle-check text-success"></i>' : '<i class="fa-regular fa-circle-xmark text-danger"></i>')
|
||||
}
|
||||
|
||||
}],
|
||||
data: props.rows,
|
||||
sort: true,
|
||||
pagination: {
|
||||
limit: 100,
|
||||
limit: 15,
|
||||
summary: false
|
||||
},
|
||||
language: {
|
||||
@@ -87,11 +95,11 @@ const grid = new Grid({
|
||||
onMounted(() => {
|
||||
grid.render(gridWrapper.value)
|
||||
|
||||
|
||||
|
||||
setTimeout(function () {
|
||||
let tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
|
||||
let tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
|
||||
return new Tooltip(tooltipTriggerEl)
|
||||
})
|
||||
const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]')
|
||||
const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new Tooltip(tooltipTriggerEl))
|
||||
}, 1000);
|
||||
|
||||
})
|
||||
|
||||
11
src/main.js
11
src/main.js
@@ -1,6 +1,7 @@
|
||||
import { createApp } from 'vue'
|
||||
|
||||
import App from './App.vue'
|
||||
import { createPinia } from 'pinia'
|
||||
|
||||
import './assets/style.scss'
|
||||
import './style.css'
|
||||
@@ -11,4 +12,12 @@ import '@fortawesome/fontawesome-free/css/solid.css'
|
||||
import '@fortawesome/fontawesome-free/css/regular.css'
|
||||
import "gridjs/dist/theme/mermaid.css";
|
||||
|
||||
createApp(App).mount('#app')
|
||||
const pinia = createPinia()
|
||||
|
||||
const app = createApp(App)
|
||||
//app.use(router);
|
||||
app.use(pinia)
|
||||
//app.component('Datepicker', Datepicker);
|
||||
app.mount("#app");
|
||||
|
||||
|
||||
|
||||
17
src/services/Api.js
Normal file
17
src/services/Api.js
Normal file
@@ -0,0 +1,17 @@
|
||||
export default {
|
||||
async call(controller, method) {
|
||||
const apiUrl = '/App/api.php?prj=pharmamp&controller='+controller+'&method='+method
|
||||
|
||||
if (import.meta.env.DEV) {
|
||||
console.log(apiUrl)
|
||||
}
|
||||
|
||||
const response = await fetch(apiUrl)
|
||||
|
||||
if (import.meta.env.DEV) {
|
||||
console.log(response.clone().text())
|
||||
}
|
||||
|
||||
return response.json();
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
export default {
|
||||
async getNew() {
|
||||
|
||||
const apiUrl = '/App/api.php?prj=pharmamp';
|
||||
async getSessionData() {
|
||||
const apiUrl = '/App/api.php?prj=pharmamp&controller=AdminController&method=getSession'
|
||||
|
||||
if (import.meta.env.DEV) {
|
||||
console.log(apiUrl)
|
||||
@@ -14,6 +13,5 @@ export default {
|
||||
}
|
||||
|
||||
return response.json();
|
||||
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
export default {
|
||||
async getTickets() {
|
||||
const apiUrl = '/App/api.php?prj=pharmamp'
|
||||
const apiUrl = '/App/api.php?prj=pharmamp&controller=TicketingController&method=getTickets'
|
||||
|
||||
if (import.meta.env.DEV) {
|
||||
console.log(apiUrl)
|
||||
|
||||
17
src/stores/global.js
Normal file
17
src/stores/global.js
Normal file
@@ -0,0 +1,17 @@
|
||||
import {defineStore} from 'pinia'
|
||||
import Api from "@/services/Api.js";
|
||||
|
||||
export const useGlobalStore = defineStore('global', {
|
||||
state: () => ({
|
||||
gulliver: null
|
||||
}),
|
||||
getters: {
|
||||
numc: (state) => state.gulliver.numc,
|
||||
url : (state) => state.gulliver.url,
|
||||
},
|
||||
actions: {
|
||||
async registerSession(){
|
||||
this.gulliver = await Api.call('AdminController', 'getSession')
|
||||
}
|
||||
},
|
||||
})
|
||||
Reference in New Issue
Block a user