Files
raven-client/ayanova/src/views/ay-history.vue
2021-09-03 23:03:05 +00:00

474 lines
13 KiB
Vue

<template>
<v-card v-if="this.formState.ready">
<v-card-title
><v-icon class="mr-3">{{ getIconForPage() }}</v-icon
>{{ name }}</v-card-title
>
<v-row>
<gz-error :error-box-message="formState.errorBoxMessage"></gz-error>
<v-col rows="12">
<template v-if="$route.params.userlog">
<!-- **** USER LOG ****** -->
<v-timeline :dense="$vuetify.breakpoint.smAndDown" data-cy="timeLine">
<v-timeline-item
v-for="i in obj"
:key="i.index"
fill-dot
:color="getIconColorForEvent(i.event)"
:icon="getIconForEvent(i.event)"
>
<v-card :outlined="$store.state.darkMode">
<v-card-title>{{ i.name }}</v-card-title>
<v-card-subtitle
>{{ i.date }} - {{ getEventName(i.event) }}</v-card-subtitle
>
<v-card-text
><v-icon large class="mr-2">{{
getIconForAType(i.aType)
}}</v-icon
>{{ getNameForType(i.aType) }}
<div class="mt-4" v-if="i.textra">{{ i.textra }}</div>
</v-card-text>
<v-card-actions>
<v-btn text @click="openHistoryOfItem(i)">{{
$ay.t("History")
}}</v-btn>
<v-btn v-if="canOpen(i.aType)" text @click="openItem(i)">{{
$ay.t("Open")
}}</v-btn>
</v-card-actions>
</v-card>
</v-timeline-item>
</v-timeline>
</template>
<template v-else>
<!-- **** OBJECT LOG ****** -->
<v-timeline :dense="$vuetify.breakpoint.smAndDown" data-cy="timeLine">
<v-timeline-item
v-for="i in obj"
:key="i.index"
fill-dot
:color="getIconColorForEvent(i.event)"
:icon="getIconForEvent(i.event)"
>
<v-card :outlined="$store.state.darkMode">
<v-card-title>{{ i.name }}</v-card-title>
<v-card-subtitle
>{{ i.date }} - {{ getEventName(i.event) }}</v-card-subtitle
>
<v-card-text
><v-icon large class="mr-2">{{
getIconForAType(i.aType)
}}</v-icon
>{{ getNameForType(i.aType) }}
<div class="mt-4" v-if="i.textra">{{ i.textra }}</div>
</v-card-text>
<v-card-actions>
<v-btn text @click="openHistoryOfItem(i)">{{
$ay.t("History")
}}</v-btn>
<v-btn
v-if="canViewUserHistory(i)"
text
@click="openHistoryOfUser(i)"
>{{ $ay.t("Activity") }}</v-btn
>
<v-btn v-if="canOpenUser" text @click="openItem(i)">{{
$ay.t("Open")
}}</v-btn>
</v-card-actions>
</v-card>
</v-timeline-item>
</v-timeline>
</template>
</v-col>
<v-col cols="12">
<v-btn
block
color="primary"
large
v-if="moreAvailable"
text
@click="getDataFromApi()"
>{{ $ay.t("More") }}</v-btn
></v-col
>
</v-row>
</v-card>
</template>
<script>
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* Xeslint-disable */
////////////////////////////////////////////////////////////////////////////////////////////////////////////
const FORM_KEY = "ay-history";
const API_BASE_URL = "event-log/";
const DEFAULT_EVENTS_PAGE_SIZE = 200;
export default {
async created() {
let vm = this;
try {
await initForm(vm);
vm.readOnly = true;
window.$gz.eventBus.$on("menu-click", clickHandler);
generateMenu(vm, false);
await vm.getDataFromApi();
} catch (err) {
window.$gz.errorHandler.handleFormError(err, vm);
} finally {
vm.formState.ready = true;
}
},
beforeDestroy() {
window.$gz.eventBus.$off("menu-click", clickHandler);
},
data() {
return {
obj: [],
name: null,
eventTypes: {},
ayaTypes: {},
page: -1, //Note this must be -1 at start to work properly
moreAvailable: false,
canOpenUser: window.$gz.role.canOpen(window.$gz.type.User),
formState: {
ready: false,
loading: false,
errorBoxMessage: null,
appError: null,
serverError: {}
}
};
},
methods: {
openItem(item) {
if (item.userId) {
window.$gz.eventBus.$emit("openobject", {
type: window.$gz.type.User,
id: item.userId
});
} else {
window.$gz.eventBus.$emit("openobject", {
type: item.aType,
id: item.objectId
});
}
},
openHistoryOfItem(item) {
if (item.userId) {
//object log, so open is for user
//note: this exception is required because in object log there is no item.objecttype
this.$router.push({
name: "ay-history",
params: { ayatype: window.$gz.type.User, recordid: item.userId }
});
} else {
this.$router.push({
name: "ay-history",
params: { ayatype: item.aType, recordid: item.objectId }
});
}
},
canViewUserHistory(objectlogitem) {
//For object log to decide if view history of user in item is allowed
//if user has full read role to User or it's themselves then they can
return (
this.canOpenUser || this.$store.state.userId == objectlogitem.userId
);
},
openHistoryOfUser(item) {
this.$router.push({
name: "ay-history",
params: {
ayatype: window.$gz.type.User,
recordid: item.userId,
userlog: true
}
});
},
canOpen(otype) {
return (
this.ayaTypes[otype].openableObject && window.$gz.role.canOpen(otype)
);
},
getIconForPage() {
let vm = this;
if (vm.$route.params.userlog) {
return vm.ayaTypes[window.$gz.type.User].icon;
} else {
return vm.ayaTypes[vm.$route.params.ayatype].icon;
}
},
getEventName(event) {
return this.eventTypes[event].name;
},
getIconForEvent(event) {
return this.eventTypes[event].icon;
},
getIconForAType(otype) {
if (otype) {
//return this.ayaTypes[otype].icon;
return window.$gz.util.iconForType(otype);
} else {
return null;
}
},
getNameForType(otype) {
if (otype) {
return this.ayaTypes[otype].name;
} else {
return null;
}
},
getIconColorForEvent(event) {
switch (event) {
case 0:
return "red";
case 1:
case 10:
return "green";
//attachments all purple to distinguish when looking at object's history
case 4:
case 5:
case 6:
case 11:
return "indigo";
case 12: //erase all data
case 13: //reset serial number
return "deep-purple";
default:
return "primary";
}
},
async getDataFromApi() {
let vm = this;
if (vm.formState.loading) {
return;
}
vm.formState.loading = true;
window.$gz.form.deleteAllErrorBoxErrors(vm);
let url = null;
vm.page += 1;
//path: "/history/:ayatype/:recordid/:userlog?"
///event-log/UserLog?UserId=2&Offset=2&Limit=2
///event-log/ObjectLog?AyaType=2&AyId=2&Offset=2&Limit=2
if (vm.$route.params.userlog) {
url = API_BASE_URL + "userlog?UserId=" + vm.$route.params.recordid;
} else {
url =
API_BASE_URL +
"objectlog?AyaType=" +
vm.$route.params.ayatype +
"&AyId=" +
vm.$route.params.recordid;
}
//paging
url += "&Offset=" + vm.page * DEFAULT_EVENTS_PAGE_SIZE;
url += "&limit=" + DEFAULT_EVENTS_PAGE_SIZE;
try {
let res = await window.$gz.api.get(url);
if (res.error) {
//Not found?
if (res.error.code == "2010") {
window.$gz.form.handleObjectNotFound(vm);
}
vm.formState.serverError = res.error;
window.$gz.form.setErrorBoxErrors(vm);
} else {
vm.moreAvailable = res.data.events.length == DEFAULT_EVENTS_PAGE_SIZE;
vm.name = res.data.name;
vm.name = await window.$gz.translation.translateStringWithMultipleKeysAsync(
res.data.name
);
let temp = res.data.events;
let currentEventCount = vm.obj.length;
let timeZoneName = window.$gz.locale.getResolvedTimeZoneName();
let languageName = window.$gz.locale.getResolvedLanguage();
let hour12 = window.$gz.store.state.userOptions.hour12;
for (let i = 0; i < temp.length; i++) {
temp[i].date = window.$gz.locale.utcDateToShortDateAndTimeLocalized(
temp[i].date,
timeZoneName,
languageName,
hour12
);
temp[
i
].name = await window.$gz.translation.translateStringWithMultipleKeysAsync(
temp[i].name
);
temp[i].index = currentEventCount + i;
}
vm.obj = [...vm.obj, ...temp];
//Update the form status
window.$gz.form.setFormState({
vm: vm,
dirty: false,
valid: true,
loading: false
});
//modify the menu as necessary
// generateMenu(vm);
}
} catch (error) {
//Update the form status
window.$gz.form.setFormState({
vm: vm,
loading: false
});
window.$gz.errorHandler.handleFormError(error, vm);
}
}
}
};
/////////////////////////////
//
//
function clickHandler(menuItem) {
if (!menuItem) {
return;
}
let m = window.$gz.menu.parseMenuItem(menuItem);
if (m.owner == FORM_KEY && !m.disabled) {
switch (m.key) {
default:
window.$gz.eventBus.$emit(
"notify-warning",
FORM_KEY + "::context click: [" + m.key + "]"
);
}
}
}
//////////////////////
//
//
function generateMenu(vm) {
let menuOptions = {
isMain: false,
icon: "$ayiHistory",
title: "History",
helpUrl: "ay-history",
menuItems: []
};
window.$gz.eventBus.$emit("menu-change", menuOptions);
}
/////////////////////////////////
//
//
async function initForm(vm) {
await fetchTranslatedText(vm);
await populateAyaTypeList(vm);
await populateEventTypeList(vm);
}
//////////////////////
//
//
async function populateAyaTypeList(vm) {
await window.$gz.enums.fetchEnumList("ayatype");
let ayt = window.$gz.enums.getSelectionList("ayatype");
let temp = {};
for (let i = 0; i < ayt.length; i++) {
let item = ayt[i];
let openableObject = false;
//CoreBizObject add here
//todo: centralize this if reuqired one more time anywhere
switch (item.id) {
//default to can open and only have exceptions because most stuff can be opened
case window.$gz.type.NoType:
case window.$gz.type.DashboardView:
openableObject = false;
break;
default:
openableObject = true;
}
temp[item.id] = {
name: item.name,
openableObject: openableObject
};
}
vm.ayaTypes = temp;
}
/////////////////////////////////
//
//
function populateEventTypeList(vm) {
vm.eventTypes = {
0: { name: vm.$ay.t("EventDeleted"), icon: "$ayiTrashAlt" },
1: { name: vm.$ay.t("EventCreated"), icon: "$ayiPlus" },
2: {
name: vm.$ay.t("EventRetrieved"),
icon: "$ayiEnvelopeOpenText"
},
3: { name: vm.$ay.t("EventModified"), icon: "$ayiSave" },
4: {
name: vm.$ay.t("EventAttachmentCreate"),
icon: "$ayiPlus"
},
5: {
name: vm.$ay.t("EventAttachmentDelete"),
icon: "$ayiTrashAlt"
},
6: {
name: vm.$ay.t("EventAttachmentDownload"),
icon: "$ayiFileDownload"
},
7: {
name: vm.$ay.t("EventLicenseFetch"),
icon: "$ayiTicket"
},
8: {
name: vm.$ay.t("EventLicenseTrialRequest"),
icon: "$ayiRocket"
},
9: {
name: vm.$ay.t("EventServerStateChange"),
icon: "$ayiPlus"
},
10: { name: vm.$ay.t("EventSeedDatabase"), icon: "$ayiPlus" },
11: { name: vm.$ay.t("EventAttachmentModified"), icon: "$ayiSave" },
12: { name: "ERASE ALL DATA", icon: "$ayiSeedling" },
13: { name: vm.$ay.t("EventResetSerial"), icon: "$ayiEgg" },
13: {
name: vm.$ay.t("EventUtilityFileDownload"),
icon: "$ayiFileDownload"
}
};
}
//////////////////////////////////////////////////////////
//
// Ensures UI translated text is available
//
async function fetchTranslatedText(vm) {
await window.$gz.translation.cacheTranslations([
"EventDeleted",
"EventCreated",
"EventRetrieved",
"EventModified",
"EventAttachmentCreate",
"EventAttachmentDelete",
"EventAttachmentDownload",
"EventAttachmentModified",
"EventLicenseFetch",
"EventLicenseTrialRequest",
"EventServerStateChange",
"EventSeedDatabase",
"EventResetSerial",
"EventUtilityFileDownload",
"Activity"
]);
}
</script>