This commit is contained in:
@@ -23,7 +23,7 @@ ACTIONS:
|
||||
XNOPE, doesn't offer to filter, only sort and I'm happy with it for now.If it basically is working well enough regardless of filtering roles then see if its even conceivable that server could filter roles
|
||||
maybe the client sends a lot of or i.e. roles = (64 or 1234 or 32768) however that shit has to work
|
||||
if conceivable then need to make a copy of the ay-data-list-view.vue and modify to work with roles as a filter
|
||||
Make sure can print, bulk ops etc
|
||||
XMake sure can print, bulk ops etc
|
||||
If all is well then move it into the regular adm-users and replicate to cust-users and ditch the shitty current half-ass grid
|
||||
Remove the routes that were being used for inside and outside user lists as they are no longer reqd.
|
||||
$profit
|
||||
@@ -32,7 +32,7 @@ todo: throw new Error() code *MUST* put only a string into the constructor of er
|
||||
Search for all instances of throw new Error and ensure it's a string not an object, use stringify if necessary when all else fails
|
||||
or a central function that turns any error object into a human readable message and inserts that into the error text
|
||||
See extension-export-control.vue line 45 for example
|
||||
|
||||
|
||||
todo: seeder subcontractor user no vendor attached?
|
||||
|
||||
todo: deleting customer must attempt to delete the following as they are entered "in" form and not selected externally so they are part of Customer and should delete with it:
|
||||
@@ -58,7 +58,7 @@ todo: Initialize has an expired license section that prevents all other options
|
||||
todo: Case 3595 Mass delete extension
|
||||
Do this early as it will be copied over and over again
|
||||
|
||||
|
||||
todo: test import User record
|
||||
|
||||
............................................................
|
||||
|
||||
|
||||
@@ -1,156 +1,80 @@
|
||||
<template>
|
||||
<div>
|
||||
<gz-error :errorBoxMessage="formState.errorBoxMessage"></gz-error>
|
||||
<v-data-table
|
||||
v-model="selected"
|
||||
:headers="headers"
|
||||
:items="obj"
|
||||
class="elevation-1"
|
||||
:disable-pagination="true"
|
||||
:disable-filtering="true"
|
||||
hide-default-footer
|
||||
@click:row="rowClick"
|
||||
:sort-by="['name']"
|
||||
:header-props="{ sortByText: $ay.t('Sort') }"
|
||||
data-cy="usersTable"
|
||||
<gz-report-selector ref="reportSelector"></gz-report-selector>
|
||||
<gz-extensions
|
||||
:ayaType="ayType"
|
||||
:selectedItems="selectedItems"
|
||||
ref="extensions"
|
||||
>
|
||||
<template v-slot:[`item.active`]="{ item }">
|
||||
<v-simple-checkbox v-model="item.active" disabled></v-simple-checkbox>
|
||||
</template>
|
||||
<!-- Keeping as an example of custom narrowing a single column <template v-slot:[`item.roles`]="{ item }">
|
||||
<div class="red--text text-truncate" style="max-width: 150px;">
|
||||
{{ item.roles }}
|
||||
</div>
|
||||
</template> -->
|
||||
</v-data-table>
|
||||
</gz-extensions>
|
||||
<gz-data-table
|
||||
ref="gzdatatable"
|
||||
formKey="adm-users"
|
||||
:dataListKey="dataListKey"
|
||||
:dataListFilter="dataListFilter"
|
||||
:dataListSort="dataListSort"
|
||||
:showSelect="rights.change"
|
||||
:metaView="metaView"
|
||||
v-on:selection-change="handleSelected"
|
||||
data-cy="insideUsersTable"
|
||||
>
|
||||
</gz-data-table>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
const FORM_KEY = "adm-users";
|
||||
export default {
|
||||
async created() {
|
||||
let vm = this;
|
||||
try {
|
||||
await initForm(vm);
|
||||
created() {
|
||||
//Inside users only
|
||||
this.metaView = JSON.stringify([
|
||||
{
|
||||
fld: "usertype",
|
||||
filter: {
|
||||
items: [
|
||||
{ op: "!=", value: 3 },
|
||||
{ op: "!=", value: 4 }
|
||||
]
|
||||
}
|
||||
}
|
||||
]);
|
||||
|
||||
vm.rights = window.$gz.role.getRights(window.$gz.type.User);
|
||||
vm.formState.readOnly = !vm.rights.change;
|
||||
vm.formState.ready = true;
|
||||
window.$gz.eventBus.$on("menu-click", clickHandler);
|
||||
await vm.getDataFromApi();
|
||||
vm.formState.loading = false;
|
||||
} catch (err) {
|
||||
vm.formState.ready = true;
|
||||
window.$gz.errorHandler.handleFormError(err, vm);
|
||||
}
|
||||
//outside users only
|
||||
// this.metaView = JSON.stringify([
|
||||
// {
|
||||
// fld: "usertype",
|
||||
// filter: {
|
||||
// items: [
|
||||
// { op: "=", value: 3 },
|
||||
// { op: "=", value: 4 }
|
||||
// ],
|
||||
// any: true
|
||||
// }
|
||||
// }
|
||||
// ]);
|
||||
|
||||
this.rights = window.$gz.role.getRights(window.$gz.type.User);
|
||||
window.$gz.eventBus.$on("menu-click", clickHandler);
|
||||
generateMenu(this);
|
||||
},
|
||||
|
||||
beforeDestroy() {
|
||||
window.$gz.eventBus.$off("menu-click", clickHandler);
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
obj: [],
|
||||
headers: [],
|
||||
selected: [],
|
||||
formState: {
|
||||
ready: false,
|
||||
loading: true,
|
||||
errorBoxMessage: null,
|
||||
appError: null,
|
||||
serverError: {}
|
||||
},
|
||||
currentListViewId: 1,
|
||||
dataListKey: "InsideUserDataList",
|
||||
dataListFilter: "",
|
||||
dataListSort: "",
|
||||
metaView: undefined,
|
||||
rights: window.$gz.role.defaultRightsObject(),
|
||||
availableRoles: [],
|
||||
timeZoneName: window.$gz.locale.getBrowserTimeZoneName(),
|
||||
languageName: window.$gz.locale.getBrowserLanguages(),
|
||||
hour12: window.$gz.locale.getHour12()
|
||||
ayType: window.$gz.type.User,
|
||||
selectedItems: []
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
rowClick(item) {
|
||||
window.$gz.eventBus.$emit("openobject", {
|
||||
type: window.$gz.type.User,
|
||||
id: item.id,
|
||||
inside: true
|
||||
});
|
||||
},
|
||||
rolesDisplayFromRoles(roles) {
|
||||
let roleNames = [];
|
||||
if (roles != null && roles != 0) {
|
||||
for (let i = 0; i < this.availableRoles.length; i++) {
|
||||
let role = this.availableRoles[i];
|
||||
if (!!(roles & role.id)) {
|
||||
roleNames.push(role.name);
|
||||
}
|
||||
}
|
||||
}
|
||||
return roleNames.join(", ");
|
||||
},
|
||||
async getDataFromApi() {
|
||||
let vm = this;
|
||||
vm.formState.loading = true;
|
||||
|
||||
window.$gz.form.deleteAllErrorBoxErrors(vm);
|
||||
try {
|
||||
let res = await window.$gz.api.get("user/list");
|
||||
|
||||
if (res.error) {
|
||||
if (res.error.code == "2010") {
|
||||
window.$gz.form.handleObjectNotFound(vm);
|
||||
}
|
||||
vm.formState.serverError = res.error;
|
||||
window.$gz.form.setErrorBoxErrors(vm);
|
||||
} else {
|
||||
if (res.data) {
|
||||
/* Id = z.Id,
|
||||
Active = z.Active,
|
||||
Name = z.Name,
|
||||
Roles = z.Roles,
|
||||
UserType = z.UserType,
|
||||
EmployeeNumber = z.EmployeeNumber,
|
||||
LastLogin = z.LastLogin */
|
||||
let ret = [];
|
||||
for (let i = 0; i < res.data.length; i++) {
|
||||
let o = res.data[i];
|
||||
ret.push({
|
||||
id: o.id,
|
||||
name: o.name,
|
||||
employeeNumber: o.employeeNumber,
|
||||
active: o.active,
|
||||
userType: window.$gz.enums.get("insideusertype", o.userType),
|
||||
lastLogin: window.$gz.locale.utcDateToShortDateAndTimeLocalized(
|
||||
o.lastLogin,
|
||||
this.timeZoneName,
|
||||
this.languageName,
|
||||
this.hour12
|
||||
),
|
||||
roles: this.rolesDisplayFromRoles(o.roles)
|
||||
});
|
||||
}
|
||||
|
||||
vm.obj = ret;
|
||||
} else {
|
||||
vm.rawObj = [];
|
||||
vm.obj = [];
|
||||
}
|
||||
|
||||
window.$gz.form.setFormState({
|
||||
vm: vm,
|
||||
dirty: false,
|
||||
valid: true,
|
||||
loading: false
|
||||
});
|
||||
generateMenu(vm);
|
||||
}
|
||||
} catch (error) {
|
||||
window.$gz.form.setFormState({
|
||||
vm: vm,
|
||||
loading: false
|
||||
});
|
||||
window.$gz.errorHandler.handleFormError(error, vm);
|
||||
}
|
||||
handleSelected(selected) {
|
||||
this.selectedItems = selected;
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -171,19 +95,54 @@ async function clickHandler(menuItem) {
|
||||
params: { recordid: 0 }
|
||||
});
|
||||
break;
|
||||
// case "extensions":
|
||||
// let res = await m.vm.$refs.extensions.open();
|
||||
// break;
|
||||
case "extensions":
|
||||
let res = await m.vm.$refs.extensions.open(
|
||||
m.vm.$refs.gzdatatable.getDataListSelection(window.$gz.type.User)
|
||||
);
|
||||
break;
|
||||
case "report":
|
||||
if (m.id != null) {
|
||||
//last report selected is in m.id
|
||||
m.vm.$router.push({
|
||||
name: "ay-report",
|
||||
params: { recordid: m.id, ayatype: window.$gz.type.User }
|
||||
});
|
||||
} else {
|
||||
//general report selector chosen
|
||||
|
||||
let res = await m.vm.$refs.reportSelector.open(
|
||||
m.vm.$refs.gzdatatable.getDataListSelection(window.$gz.type.User)
|
||||
);
|
||||
|
||||
//if null for no selection
|
||||
//just bail out
|
||||
if (res == null) {
|
||||
return;
|
||||
}
|
||||
//persist last report selected
|
||||
window.$gz.form.setLastReport(FORM_KEY, res);
|
||||
|
||||
//Now open the report viewer...
|
||||
m.vm.$router.push({
|
||||
name: "ay-report",
|
||||
params: { recordid: res.id, ayatype: window.$gz.type.User }
|
||||
});
|
||||
}
|
||||
break;
|
||||
case "directnotify":
|
||||
//nav to direct notify with list of users appended to route
|
||||
if (m.vm.selected.length == 0) {
|
||||
let selected = m.vm.$refs.gzdatatable.getDataListSelection(
|
||||
window.$gz.type.User
|
||||
).selectedRowIds;
|
||||
if (selected.length == 0) {
|
||||
m.vm.$router.push({
|
||||
name: "home-notify-direct"
|
||||
});
|
||||
} else {
|
||||
m.vm.$router.push({
|
||||
name: "home-notify-direct",
|
||||
params: { userIdList: m.vm.selected.map(z => z.id).toString() }
|
||||
params: { userIdList: selected.toString() }
|
||||
//params: { userIdList: m.vm.selected.map(z => z.id).toString() }
|
||||
});
|
||||
}
|
||||
break;
|
||||
@@ -221,32 +180,32 @@ function generateMenu(vm) {
|
||||
});
|
||||
}
|
||||
|
||||
//STUB REPORTS
|
||||
//## NOTE: This form is not based on a DataList so it cannot be printed
|
||||
//if it was a datalist then all would be as normal
|
||||
//not sure why it's not a datalist
|
||||
|
||||
//REPORTS
|
||||
//Report not Print, print is a further option
|
||||
// menuOptions.menuItems.push({
|
||||
// title: "Report",
|
||||
// icon: "$ayiFileAlt",
|
||||
// key: FORM_KEY + ":report",
|
||||
// vm: vm
|
||||
// });
|
||||
menuOptions.menuItems.push({
|
||||
title: "Report",
|
||||
icon: "$ayiFileAlt",
|
||||
key: FORM_KEY + ":report",
|
||||
vm: vm
|
||||
});
|
||||
|
||||
// menuOptions.menuItems.push({
|
||||
// title: "stub: Last report used",
|
||||
// icon: "$ayiFileAlt",
|
||||
// key: FORM_KEY + ":report:STUBlastusedreportid",
|
||||
// vm: vm
|
||||
// });
|
||||
//get last report selected
|
||||
let lastReport = window.$gz.form.getLastReport(FORM_KEY);
|
||||
if (lastReport != null) {
|
||||
menuOptions.menuItems.push({
|
||||
title: lastReport.name,
|
||||
icon: "$ayiFileAlt",
|
||||
key: FORM_KEY + ":report:" + lastReport.id,
|
||||
vm: vm
|
||||
});
|
||||
}
|
||||
|
||||
// menuOptions.menuItems.push({
|
||||
// title: "Extensions",
|
||||
// icon: "fa - puzzle-piece",
|
||||
// key: FORM_KEY + ":extensions",
|
||||
// vm: vm
|
||||
// });
|
||||
menuOptions.menuItems.push({
|
||||
title: "Extensions",
|
||||
icon: "$ayiPuzzlePiece",
|
||||
key: FORM_KEY + ":extensions",
|
||||
vm: vm
|
||||
});
|
||||
|
||||
menuOptions.menuItems.push({
|
||||
title: "DirectNotification",
|
||||
@@ -257,55 +216,4 @@ function generateMenu(vm) {
|
||||
|
||||
window.$gz.eventBus.$emit("menu-change", menuOptions);
|
||||
}
|
||||
|
||||
/////////////////////////////////
|
||||
//
|
||||
//
|
||||
async function initForm(vm) {
|
||||
await fetchTranslatedText(vm);
|
||||
await cacheEnums(vm);
|
||||
await createTableHeaders(vm);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
//
|
||||
// Ensures UI translated text is available
|
||||
//
|
||||
async function fetchTranslatedText(vm) {
|
||||
await window.$gz.translation.cacheTranslations([
|
||||
"User",
|
||||
"UserEmployeeNumber",
|
||||
"Active",
|
||||
"UserType",
|
||||
"LastLogin",
|
||||
"AuthorizationRoles"
|
||||
]);
|
||||
}
|
||||
|
||||
//////////////////////
|
||||
//
|
||||
//
|
||||
async function cacheEnums(vm) {
|
||||
//ensure the enum values required are pre-fetched
|
||||
await window.$gz.enums.fetchEnumList("insideusertype");
|
||||
await window.$gz.enums.fetchEnumList("AuthorizationRoles");
|
||||
vm.availableRoles = window.$gz.enums.getSelectionList("AuthorizationRoles");
|
||||
}
|
||||
|
||||
//////////////////////
|
||||
//
|
||||
//
|
||||
async function createTableHeaders(vm) {
|
||||
vm.headers = [
|
||||
{ text: vm.$ay.t("User"), value: "name" },
|
||||
{ text: vm.$ay.t("UserEmployeeNumber"), value: "employeeNumber" },
|
||||
{ text: vm.$ay.t("Active"), value: "active" },
|
||||
{ text: vm.$ay.t("UserType"), value: "userType" },
|
||||
{ text: vm.$ay.t("LastLogin"), value: "lastLogin" }
|
||||
];
|
||||
//Add roles if not narrowest width
|
||||
if (vm.$vuetify.breakpoint.name != "xs") {
|
||||
vm.headers.push({ text: vm.$ay.t("AuthorizationRoles"), value: "roles" });
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
</gz-extensions>
|
||||
<gz-data-table
|
||||
ref="gzdatatable"
|
||||
formKey="inside-User-list"
|
||||
formKey="adm-users"
|
||||
:dataListKey="dataListKey"
|
||||
:dataListFilter="dataListFilter"
|
||||
:dataListSort="dataListSort"
|
||||
@@ -23,7 +23,7 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
const FORM_KEY = "inside-user-list";
|
||||
const FORM_KEY = "adm-users";
|
||||
export default {
|
||||
created() {
|
||||
//Inside users only
|
||||
@@ -129,7 +129,19 @@ async function clickHandler(menuItem) {
|
||||
});
|
||||
}
|
||||
break;
|
||||
|
||||
case "directnotify":
|
||||
//nav to direct notify with list of users appended to route
|
||||
if (m.vm.selected.length == 0) {
|
||||
m.vm.$router.push({
|
||||
name: "home-notify-direct"
|
||||
});
|
||||
} else {
|
||||
m.vm.$router.push({
|
||||
name: "home-notify-direct",
|
||||
params: { userIdList: m.vm.selected.map(z => z.id).toString() }
|
||||
});
|
||||
}
|
||||
break;
|
||||
default:
|
||||
window.$gz.eventBus.$emit(
|
||||
"notify-warning",
|
||||
@@ -190,6 +202,15 @@ function generateMenu(vm) {
|
||||
key: FORM_KEY + ":extensions",
|
||||
vm: vm
|
||||
});
|
||||
|
||||
|
||||
menuOptions.menuItems.push({
|
||||
title: "DirectNotification",
|
||||
icon: "$ayiCommentAlt",
|
||||
key: FORM_KEY + ":directnotify",
|
||||
vm: vm
|
||||
});
|
||||
|
||||
window.$gz.eventBus.$emit("menu-change", menuOptions);
|
||||
}
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user