Spamworldpro Mini Shell
Spamworldpro


Server : Apache
System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64
User : corals ( 1002)
PHP Version : 7.4.33
Disable Function : exec,passthru,shell_exec,system
Directory :  /home/corals/ts.corals.io/frontend/components/TimesheetCalender/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/ts.corals.io/frontend/components/TimesheetCalender/Entry.vue
<template>
  <div class="row row-entry" :style="(index % 2 === 0) ? {'background-color': 'rgba(0, 0, 0, 0.05)'} :''">
    <div class="col-md-5 col-12 entry-description">
      <h5>
        <nuxt-link :to="`/clients/${entry.client_id}`">{{ entry.client_name }}</nuxt-link>
        -
        <nuxt-link :to="`/clients/${entry.client_id}/projects/${entry.project_id}`">
          {{ entry.project }}
        </nuxt-link>
      </h5>
      <small class="d-block my-1">{{ entry.activity }}</small>
      <div class="" v-html="$getTextWithLinks(entry.description)"></div>
      <div>
        <template v-for="label in entry.labels">
          <span class="badge badge-warning mr-1">{{ label.name }}</span>
        </template>
      </div>
      <template v-if="$isAdmin()">
        <small>
          <nuxt-link :to="`/users/${entry.user_id}`">
            <fa icon="user"/>
            {{ entry.user }}
          </nuxt-link>
        </small>
      </template>
    </div>
    <div class="col-md-5 col-8 entry-time text-left">
      <strong class="bg-secondary rounded time-label text-center text-light p-1"
              v-b-tooltip.hover title="Time">
        <fa icon="hourglass-start"/>
        {{ entry.time }}
      </strong>
      <template v-if="$isAdmin()">
        <strong class="bg-danger rounded time-label text-center text-light p-1" v-b-tooltip.hover
                title="Cost">
          <fa :icon="['far', 'money-bill-alt']"/>
          {{ entry.cost }}
        </strong>
        <strong v-if="evaluationEnabled" class="bg-info rounded time-label text-center text-light p-1" v-b-tooltip.hover
                title="Evaluation hours">
          <fa icon="hourglass"/>
          {{ entry.evaluation_time }}
        </strong>
        <strong class="bg-success rounded time-label text-center text-light p-1" v-b-tooltip.hover
                title="Billable Amount">
          <fa icon="coins"/>
          {{ entry.amount }}
        </strong>
      </template>
      <fa icon="check-circle" v-if="entry.has_reviewed" v-b-tooltip="'Has Reviewed'" class="text-success"/>
    </div>
    <div class="col-md-2 col-4 entry-action text-md-center d-flex d-md-block justify-content-around">
      <b-link @click.prevent="editRecord(entry)" v-b-tooltip.hover title="Edit"
              v-if="entry.edit">
        <fa icon="edit"/>
      </b-link>
      <b-link class="text-danger" @click.prevent="showDeleteModal(entry)"
              v-b-tooltip.hover
              title="Delete"
              v-if="entry.delete">
        <fa icon="trash"/>
      </b-link>

      <b-link class="text-success" @click.prevent="markEntryAsReviewed(entry,index)"
              v-b-tooltip.hover
              title="Mark as Reviewed"
              v-if="entry.markAsReviewed && evaluationEnabled">
        <b-spinner small v-if="reviewing"></b-spinner>
        <fa icon="check" v-else/>
      </b-link>
      <b-link :to="'/invoices/' + entry.invoice_id" v-if="entry.invoice_id && canAccess">
        <fa icon="file-invoice"/>
      </b-link>
    </div>
  </div>
</template>

<script>
export default {
  name: "Entry",
  inject: ['updateEntry'],
  props: {
    entry: {
      required: true
    },
    index: {
      required: true
    }
  },
  data() {
    return {
      reviewing: false
    }
  },
  methods: {
    editRecord(entry) {
      this.$emit('edit-record', entry);
    },
    showDeleteModal(entry) {
      this.$emit('show-delete-modal', entry)
    },
    markEntryAsReviewed(entry, index) {
      this.reviewing = true;
      this.$axios.post(`timesheet/projects/${entry.project_id}/entries/${entry.id}/mark-entry-as-reviewed`)
        .then(response => {
          this.updateEntry(response.data.data)
        }).catch(err => {
        let message = err.message;
        if (err.response && err.response.data && err.response.data.message) {
          message = err.response.data.message;
        }
        this.$toast.error(message);
      }).finally(() => {
        this.reviewing = false;
      })
    }
  },
  computed: {
    evaluationEnabled() {
      return this.$store.getters.settings('evaluation_enabled');
    },
    canAccess() {
      if (this.$cant('view', 'invoice')) {
        return false;
      }
      return true;
    }
  }
}
</script>

<style scoped>
.row-entry .entry-description,
.row-entry .entry-time,
.row-entry .entry-action {
  padding: 1em;
}
</style>

Spamworldpro Mini