%PDF- %PDF-
Direktori : /var/www/pjold/vendor/laravel/telescope/resources/js/components/ |
Current File : /var/www/pjold/vendor/laravel/telescope/resources/js/components/RelatedEntries.vue |
<script type="text/ecmascript-6"> import StylesMixin from './../mixins/entriesStyles'; export default { props: ['entry', 'batch'], mixins: [ StylesMixin, ], /** * The component's data. */ data(){ return { currentTab: 'exceptions' }; }, /** * Prepare the component. */ mounted(){ this.activateFirstTab(); }, watch: { entry(){ this.activateFirstTab(); } }, methods: { activateFirstTab(){ if (window.location.hash) { this.currentTab = window.location.hash.substring(1); } else if (this.exceptions.length) { this.currentTab = 'exceptions' } else if (this.logs.length) { this.currentTab = 'logs' } else if (this.views.length) { this.currentTab = 'views' } else if (this.queries.length) { this.currentTab = 'queries' } else if (this.models.length) { this.currentTab = 'models' } else if (this.jobs.length) { this.currentTab = 'jobs' } else if (this.mails.length) { this.currentTab = 'mails' } else if (this.notifications.length) { this.currentTab = 'notifications' } else if (this.events.length) { this.currentTab = 'events' } else if (this.cache.length) { this.currentTab = 'cache' } else if (this.gates.length) { this.currentTab = 'gates' } else if (this.redis.length) { this.currentTab = 'redis' } }, activateTab(tab){ this.currentTab = tab; if(window.history.replaceState) { window.history.replaceState(null, null, '#' + this.currentTab); } } }, computed: { hasRelatedEntries(){ return !!_.reject(this.batch, entry => { return _.includes(['request', 'command'], entry.type); }).length; }, entryTypesAvailable(){ return _.uniqBy(this.batch, 'type').length; }, exceptions() { return _.filter(this.batch, {type: 'exception'}); }, gates() { return _.filter(this.batch, {type: 'gate'}); }, logs() { return _.filter(this.batch, {type: 'log'}); }, queries() { return _.filter(this.batch, {type: 'query'}); }, models() { return _.filter(this.batch, {type: 'model'}); }, jobs() { return _.filter(this.batch, {type: 'job'}); }, events() { return _.filter(this.batch, {type: 'event'}); }, cache() { return _.filter(this.batch, {type: 'cache'}); }, redis() { return _.filter(this.batch, {type: 'redis'}); }, mails() { return _.filter(this.batch, {type: 'mail'}); }, notifications() { return _.filter(this.batch, {type: 'notification'}); }, views() { return _.filter(this.batch, {type: 'view'}); }, queriesSummary() { return { time: _.reduce(this.queries, (time, q) => { return time + parseFloat(q.content.time) }, 0.00).toFixed(2), duplicated: this.queries.length - _.size(_.groupBy(this.queries, (q) => { return q.content.hash })), }; }, tabs(){ return _.filter([ {title: "Exceptions", type: "exceptions", count: this.exceptions.length}, {title: "Logs", type: "logs", count: this.logs.length}, {title: "Views", type: "views", count: this.views.length}, {title: "Queries", type: "queries", count: this.queries.length}, {title: "Models", type: "models", count: this.models.length}, {title: "Gates", type: "gates", count: this.gates.length}, {title: "Jobs", type: "jobs", count: this.jobs.length}, {title: "Mail", type: "mails", count: this.mails.length}, {title: "Notifications", type: "notifications", count: this.notifications.length}, {title: "Events", type: "events", count: this.events.length}, {title: "Cache", type: "cache", count: this.cache.length}, {title: "Redis", type: "redis", count: this.redis.length}, ], tab => tab.count > 0); }, separateTabs(){ return _.slice(this.tabs, 0, 7); }, dropdownTabs(){ return _.slice(this.tabs, 7, 10); }, dropdownTabSelected(){ return _.includes(_.map(this.dropdownTabs, 'type'), this.currentTab); } } } </script> <template> <div class="card mt-5" v-if="hasRelatedEntries"> <ul class="nav nav-pills"> <li class="nav-item" v-for="tab in separateTabs"> <a class="nav-link" :class="{active: currentTab==tab.type}" href="#" v-on:click.prevent="activateTab(tab.type)" v-if="tab.count"> {{tab.title}} ({{tab.count}}) </a> </li> <li class="nav-item dropdown" v-if="dropdownTabs.length"> <a class="nav-link dropdown-toggle" :class="{active: dropdownTabSelected}" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">More</a> <div class="dropdown-menu"> <a class="dropdown-item" :class="{active: currentTab==tab.type}" href="#" v-for="tab in dropdownTabs" v-on:click.prevent="activateTab(tab.type)">{{tab.title}} ({{tab.count}})</a> </div> </li> </ul> <div> <!-- Related Exceptions --> <table class="table table-hover table-sm mb-0" v-show="currentTab=='exceptions' && exceptions.length"> <thead> <tr> <th>Message</th> <th></th> </tr> </thead> <tbody> <tr v-for="entry in exceptions"> <td :title="entry.content.class"> {{truncate(entry.content.class, 70)}}<br> <small class="text-muted">{{truncate(entry.content.message, 100)}}</small> </td> <td class="table-fit"> <router-link :to="{name:'exception-preview', params:{id: entry.id}}" class="control-action"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 16"> <path d="M16.56 13.66a8 8 0 0 1-11.32 0L.3 8.7a1 1 0 0 1 0-1.42l4.95-4.95a8 8 0 0 1 11.32 0l4.95 4.95a1 1 0 0 1 0 1.42l-4.95 4.95-.01.01zm-9.9-1.42a6 6 0 0 0 8.48 0L19.38 8l-4.24-4.24a6 6 0 0 0-8.48 0L2.4 8l4.25 4.24h.01zM10.9 12a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-2a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"></path> </svg> </router-link> </td> </tr> </tbody> </table> <!-- Related Logs --> <table class="table table-hover table-sm mb-0" v-show="currentTab=='logs' && logs.length"> <thead> <tr> <th>Message</th> <th scope="col">Level</th> <th></th> </tr> </thead> <tbody> <tr v-for="entry in logs"> <td :title="entry.content.message">{{truncate(entry.content.message, 90)}}</td> <td class="table-fit"> <span class="badge font-weight-light" :class="'badge-'+logLevelClass(entry.content.level)"> {{entry.content.level}} </span> </td> <td class="table-fit"> <router-link :to="{name:'log-preview', params:{id: entry.id}}" class="control-action"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 16"> <path d="M16.56 13.66a8 8 0 0 1-11.32 0L.3 8.7a1 1 0 0 1 0-1.42l4.95-4.95a8 8 0 0 1 11.32 0l4.95 4.95a1 1 0 0 1 0 1.42l-4.95 4.95-.01.01zm-9.9-1.42a6 6 0 0 0 8.48 0L19.38 8l-4.24-4.24a6 6 0 0 0-8.48 0L2.4 8l4.25 4.24h.01zM10.9 12a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-2a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"></path> </svg> </router-link> </td> </tr> </tbody> </table> <!-- Related Queries --> <table class="table table-hover table-sm mb-0" v-show="currentTab=='queries' && queries.length"> <thead> <tr> <th>Query<br/><small>{{ queries.length }} queries, {{ queriesSummary.duplicated }} of which are duplicated.</small></th> <th>Duration<br/><small>{{ queriesSummary.time }}ms</small></th> <th></th> </tr> </thead> <tbody> <tr v-for="entry in queries"> <td :title="entry.content.sql">{{truncate(entry.content.sql, 110)}}</td> <td class="table-fit"> <span class="badge badge-danger font-weight-light" v-if="entry.content.slow"> {{entry.content.time}}ms </span> <span v-else> {{entry.content.time}}ms </span> </td> <td class="table-fit"> <router-link :to="{name:'query-preview', params:{id: entry.id}}" class="control-action"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 16"> <path d="M16.56 13.66a8 8 0 0 1-11.32 0L.3 8.7a1 1 0 0 1 0-1.42l4.95-4.95a8 8 0 0 1 11.32 0l4.95 4.95a1 1 0 0 1 0 1.42l-4.95 4.95-.01.01zm-9.9-1.42a6 6 0 0 0 8.48 0L19.38 8l-4.24-4.24a6 6 0 0 0-8.48 0L2.4 8l4.25 4.24h.01zM10.9 12a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-2a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"></path> </svg> </router-link> </td> </tr> </tbody> </table> <!-- Related Model Actions --> <table class="table table-hover table-sm mb-0" v-show="currentTab=='models' && models.length"> <thead> <tr> <th>Model</th> <th>Action</th> <th></th> </tr> </thead> <tbody> <tr v-for="entry in models"> <td :title="entry.content.model">{{truncate(entry.content.model, 100)}}</td> <td class="table-fit"> <span class="badge font-weight-light" :class="'badge-'+modelActionClass(entry.content.action)"> {{entry.content.action}} </span> </td> <td class="table-fit"> <router-link :to="{name:'model-preview', params:{id: entry.id}}" class="control-action"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 16"> <path d="M16.56 13.66a8 8 0 0 1-11.32 0L.3 8.7a1 1 0 0 1 0-1.42l4.95-4.95a8 8 0 0 1 11.32 0l4.95 4.95a1 1 0 0 1 0 1.42l-4.95 4.95-.01.01zm-9.9-1.42a6 6 0 0 0 8.48 0L19.38 8l-4.24-4.24a6 6 0 0 0-8.48 0L2.4 8l4.25 4.24h.01zM10.9 12a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-2a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"></path> </svg> </router-link> </td> </tr> </tbody> </table> <!-- Related Gates --> <table class="table table-hover table-sm mb-0" v-show="currentTab=='gates' && gates.length"> <thead> <tr> <th>Ability</th> <th>Result</th> <th></th> </tr> </thead> <tbody> <tr v-for="entry in gates"> <td :title="entry.content.ability">{{truncate(entry.content.ability, 80)}}</td> <td class="table-fit"> <span class="badge font-weight-light" :class="'badge-'+gateResultClass(entry.content.result)"> {{entry.content.result}} </span> </td> <td class="table-fit"> <router-link :to="{name:'gate-preview', params:{id: entry.id}}" class="control-action"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 16"> <path d="M16.56 13.66a8 8 0 0 1-11.32 0L.3 8.7a1 1 0 0 1 0-1.42l4.95-4.95a8 8 0 0 1 11.32 0l4.95 4.95a1 1 0 0 1 0 1.42l-4.95 4.95-.01.01zm-9.9-1.42a6 6 0 0 0 8.48 0L19.38 8l-4.24-4.24a6 6 0 0 0-8.48 0L2.4 8l4.25 4.24h.01zM10.9 12a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-2a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"></path> </svg> </router-link> </td> </tr> </tbody> </table> <!-- Related Jobs --> <table class="table table-hover table-sm mb-0" v-show="currentTab=='jobs' && jobs.length"> <thead> <tr> <th>Job</th> <th scope="col">Status</th> <th></th> </tr> </thead> <tbody> <tr v-for="entry in jobs"> <td> <span :title="entry.content.name">{{truncate(entry.content.name, 68)}}</span><br> <small class="text-muted"> Connection: {{entry.content.connection}} | Queue: {{entry.content.queue}} </small> </td> <td class="table-fit"> <span class="badge font-weight-light" :class="'badge-'+jobStatusClass(entry.content.status)"> {{entry.content.status}} </span> </td> <td class="table-fit"> <router-link :to="{name:'job-preview', params:{id: entry.id}}" class="control-action"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 16"> <path d="M16.56 13.66a8 8 0 0 1-11.32 0L.3 8.7a1 1 0 0 1 0-1.42l4.95-4.95a8 8 0 0 1 11.32 0l4.95 4.95a1 1 0 0 1 0 1.42l-4.95 4.95-.01.01zm-9.9-1.42a6 6 0 0 0 8.48 0L19.38 8l-4.24-4.24a6 6 0 0 0-8.48 0L2.4 8l4.25 4.24h.01zM10.9 12a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-2a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"></path> </svg> </router-link> </td> </tr> </tbody> </table> <!-- Related Events --> <table class="table table-hover table-sm mb-0" v-show="currentTab=='events' && events.length"> <thead> <tr> <th>Name</th> <th>Listeners</th> <th></th> </tr> </thead> <tbody> <tr v-for="entry in events"> <td :title="entry.content.name"> {{truncate(entry.content.name, 80)}} <span class="badge badge-info font-weight-light ml-2" v-if="entry.content.broadcast"> Broadcast </span> </td> <td class="table-fit">{{entry.content.listeners.length}}</td> <td class="table-fit"> <router-link :to="{name:'event-preview', params:{id: entry.id}}" class="control-action"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 16"> <path d="M16.56 13.66a8 8 0 0 1-11.32 0L.3 8.7a1 1 0 0 1 0-1.42l4.95-4.95a8 8 0 0 1 11.32 0l4.95 4.95a1 1 0 0 1 0 1.42l-4.95 4.95-.01.01zm-9.9-1.42a6 6 0 0 0 8.48 0L19.38 8l-4.24-4.24a6 6 0 0 0-8.48 0L2.4 8l4.25 4.24h.01zM10.9 12a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-2a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"></path> </svg> </router-link> </td> </tr> </tbody> </table> <!-- Related Cache --> <table class="table table-hover table-sm mb-0" v-show="currentTab=='cache' && cache.length"> <thead> <tr> <th>Key</th> <th>Action</th> <th></th> </tr> </thead> <tbody> <tr v-for="entry in cache"> <td :title="entry.content.key">{{truncate(entry.content.key, 100)}}</td> <td class="table-fit"> <span class="badge font-weight-light" :class="'badge-'+cacheActionTypeClass(entry.content.type)"> {{entry.content.type}} </span> </td> <td class="table-fit"> <router-link :to="{name:'cache-preview', params:{id: entry.id}}" class="control-action"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 16"> <path d="M16.56 13.66a8 8 0 0 1-11.32 0L.3 8.7a1 1 0 0 1 0-1.42l4.95-4.95a8 8 0 0 1 11.32 0l4.95 4.95a1 1 0 0 1 0 1.42l-4.95 4.95-.01.01zm-9.9-1.42a6 6 0 0 0 8.48 0L19.38 8l-4.24-4.24a6 6 0 0 0-8.48 0L2.4 8l4.25 4.24h.01zM10.9 12a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-2a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"></path> </svg> </router-link> </td> </tr> </tbody> </table> <!-- Related Redis Commands --> <table class="table table-hover table-sm mb-0" v-show="currentTab=='redis' && redis.length"> <thead> <tr> <th>Command</th> <th>Duration</th> <th></th> </tr> </thead> <tbody> <tr v-for="entry in redis"> <td :title="entry.content.command">{{truncate(entry.content.command, 100)}}</td> <td class="table-fit">{{entry.content.time}}ms</td> <td class="table-fit"> <router-link :to="{name:'redis-preview', params:{id: entry.id}}" class="control-action"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 16"> <path d="M16.56 13.66a8 8 0 0 1-11.32 0L.3 8.7a1 1 0 0 1 0-1.42l4.95-4.95a8 8 0 0 1 11.32 0l4.95 4.95a1 1 0 0 1 0 1.42l-4.95 4.95-.01.01zm-9.9-1.42a6 6 0 0 0 8.48 0L19.38 8l-4.24-4.24a6 6 0 0 0-8.48 0L2.4 8l4.25 4.24h.01zM10.9 12a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-2a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"></path> </svg> </router-link> </td> </tr> </tbody> </table> <!-- Related Mail --> <table class="table table-hover table-sm mb-0" v-show="currentTab=='mails' && mails.length"> <thead> <tr> <th>Mailable</th> <th></th> </tr> </thead> <tbody> <tr v-for="entry in mails"> <td> <span :title="entry.content.mailable">{{truncate(entry.content.mailable || '-', 70)}}</span> <span class="badge badge-secondary font-weight-light ml-2" v-if="entry.content.queued"> Queued </span> <br> <small class="text-muted" :title="entry.content.subject"> Subject: {{truncate(entry.content.subject, 90)}} </small> </td> <td class="table-fit"> <router-link :to="{name:'mail-preview', params:{id: entry.id}}" class="control-action"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 16"> <path d="M16.56 13.66a8 8 0 0 1-11.32 0L.3 8.7a1 1 0 0 1 0-1.42l4.95-4.95a8 8 0 0 1 11.32 0l4.95 4.95a1 1 0 0 1 0 1.42l-4.95 4.95-.01.01zm-9.9-1.42a6 6 0 0 0 8.48 0L19.38 8l-4.24-4.24a6 6 0 0 0-8.48 0L2.4 8l4.25 4.24h.01zM10.9 12a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-2a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"></path> </svg> </router-link> </td> </tr> </tbody> </table> <!-- Related Notifications --> <table class="table table-hover table-sm mb-0" v-show="currentTab=='notifications' && notifications.length"> <thead> <tr> <th>Notification</th> <th>Channel</th> <th></th> </tr> </thead> <tbody> <tr v-for="entry in notifications"> <td> <span :title="entry.content.notification">{{truncate(entry.content.notification || '-', 70)}}</span> <span class="badge badge-secondary font-weight-light ml-2" v-if="entry.content.queued"> Queued </span> <br> <small class="text-muted" :title="entry.content.notifiable"> Recipient: {{truncate(entry.content.notifiable, 90)}} </small> </td> <td class="table-fit">{{truncate(entry.content.channel, 20)}}</td> <td class="table-fit"> <router-link :to="{name:'notification-preview', params:{id: entry.id}}" class="control-action"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 16"> <path d="M16.56 13.66a8 8 0 0 1-11.32 0L.3 8.7a1 1 0 0 1 0-1.42l4.95-4.95a8 8 0 0 1 11.32 0l4.95 4.95a1 1 0 0 1 0 1.42l-4.95 4.95-.01.01zm-9.9-1.42a6 6 0 0 0 8.48 0L19.38 8l-4.24-4.24a6 6 0 0 0-8.48 0L2.4 8l4.25 4.24h.01zM10.9 12a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-2a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"></path> </svg> </router-link> </td> </tr> </tbody> </table> <!-- Related Views --> <table class="table table-hover table-sm mb-0" v-show="currentTab=='views' && views.length"> <thead> <tr> <th>Name</th> <th>Composers</th> <th></th> </tr> </thead> <tbody> <tr v-for="entry in views"> <td> {{entry.content.name}} <br/> <small class="text-muted">{{truncate(entry.content.path, 100)}}</small> </td> <td class="table-fit"> {{entry.content.composers ? entry.content.composers.length : 0}} </td> <td class="table-fit"> <router-link :to="{name:'view-preview', params:{id: entry.id}}" class="control-action"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 16"> <path d="M16.56 13.66a8 8 0 0 1-11.32 0L.3 8.7a1 1 0 0 1 0-1.42l4.95-4.95a8 8 0 0 1 11.32 0l4.95 4.95a1 1 0 0 1 0 1.42l-4.95 4.95-.01.01zm-9.9-1.42a6 6 0 0 0 8.48 0L19.38 8l-4.24-4.24a6 6 0 0 0-8.48 0L2.4 8l4.25 4.24h.01zM10.9 12a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-2a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"></path> </svg> </router-link> </td> </tr> </tbody> </table> </div> </div> </template> <style scoped> td { vertical-align: middle !important; } </style>