Final (?) de-widgetification

This commit is contained in:
2021-09-07 14:33:48 +00:00
parent 195edf7791
commit db8eafb1c0
22 changed files with 44 additions and 1062 deletions

View File

@@ -22,7 +22,7 @@ Test protocol for latest build:
- RESULTS: I would say leave all in as they each will display somethign useful on different platforms.
- TIME INPUT UTC HONOURED? Date time input fucked:
- Selected 420 in the widget edit form but it shows as 11:20 on the main list, translation time issue
- Selected 420 in the customer edit form but it shows as 11:20 on the main list, translation time issue
- Retest on desktop, probably a general date time conversion bug
- 404 WORKS ON ALL DEVICES DISPLAYS PROPERLY
@@ -63,13 +63,13 @@ EDGE desktop
- Broken rules work
- Navigate via menu then press back goes back to last form properly?
- About then back to form or main inventory home etc
- Widget form
- customer form
- translation showing properly on form
- Numeric inputs show numeric keyboard on mobile
- Calendar selects date and time or is that still fucky on some platforms?
- Rights work properly
- Test as manager
- Test widget form under full, edit own and readonly and no rights, confirm it works
- Test customer form under full, edit own and readonly and no rights, confirm it works
- Roles: Change = AuthorizationRoles.BizAdmin | AuthorizationRoles.Inventory, EditOwn = AuthorizationRoles.Tech, ReadRecord = AuthorizationRoles.BizAdminRestricted | AuthorizationRoles.InventoryRestricted
- 401 redirect to login
- 403 should redirect to prior form (no rights SubContractorRestricted)

View File

@@ -68,7 +68,7 @@ todo:1 grid position not preserved when open a record then track back
this is very important that it work correctly
I *did* code this so it should actually be working, not sure why it isn't but the code is probably all there.
todo: test bulk ops on wo/quote/pm tagging or something, had widget code in it that I just switched to wo/quote/pm

View File

@@ -2,7 +2,7 @@ export default {
NoType: 0,
Global: 1,
//corebizobject
Widget: 2,
UNUSED_2: 2,
//corebizobject
User: 3,
ServerState: 4,

View File

@@ -98,7 +98,6 @@ export default {
GlobalOps: { Change: 16384, ReadFullRecord: 8192, Select: 0 },
User: { Change: 2, ReadFullRecord: 1, Select: 131071 },
UserOptions: { Change: 2, ReadFullRecord: 1, Select: 0 },
Widget: { Change: 34, ReadFullRecord: 17, Select: 131071 },
ServerState: { Change: 16384, ReadFullRecord: 131071, Select: 0 },
License: { Change: 2, ReadFullRecord: 1, Select: 0 },
TrialSeeder: { Change: 16386, ReadFullRecord: 8193, Select: 0 },

View File

@@ -487,7 +487,6 @@ export default {
///////////////////////////////
// USER REQUIRED FIELDS
// (Fields defined by AyaNova users as required on form that are not stock required already)
// (was using this in testing on widget form notes field but not sure where else it's applicable)
userRequiredFields(vm, ref, formCustomTemplateFieldName) {
if (vm.formState.loading) {
return true;
@@ -542,14 +541,6 @@ export default {
// For now the only rule is that they can be required or not
//
customFieldsCheck(vm, templateItem, subvm, fieldName) {
//templateItem sample
// dataKey: "c2"
// fld: "WidgetCustom2"
// hide: "false"
// required: true
// type: "text"
// debugger;
if (vm.formState.loading) {
return true;
}

View File

@@ -419,8 +419,6 @@ export default {
return "$ayiGenderless";
case window.$gz.type.Global:
return "$ayiGlobe";
case window.$gz.type.Widget:
return "$ayiVial";
case window.$gz.type.User:
return "$ayiUser";
case window.$gz.type.ServerState:

View File

@@ -727,11 +727,6 @@ function initNavPanel() {
addNavItem("Operations", "$ayiServer", undefined, sub, key++, "operations");
}
// //############ WIDGETS (TOP GROUP)
// if (window.$gz.role.canOpen(window.$gz.type.Widget)) {
// addNavItem("WidgetList", "$ayiVial", "/widgets", [], key++, "widgets");
// }
//*** EVALUATION active trial license should always go to evaluation as home page
//as long as they are a normal User type and not a subcontractor type
if (

View File

@@ -219,12 +219,7 @@ export default {
params: { recordid: tid.id }
});
break;
case ayatype.Widget:
vm.$router.push({
name: "widget-edit",
params: { recordid: tid.id }
});
break;
case ayatype.User:
//Is it an "Inside" user (staff or subcontractor)
//or an "outside" user (customer or headoffice)

View File

@@ -169,7 +169,6 @@ export default {
"PartInventoryTransactionList",
"PartWarehouseList",
"PurchaseOrderUIRestockList",
"WidgetList",
"VendorList",
"AdministrationGlobalSettings",
"HelpLicense",

View File

@@ -600,7 +600,6 @@ async function populateFieldDefinitions(vm) {
vm.fieldDefinitions = JSON.parse(ss);
return;
} else {
//http://localhost:7575/api/v8/data-list/listfields?DataListKey=TestWidgetDataList
let res = await window.$gz.api.get(
"data-list/listfields?DataListKey=" + vm.dataListKey
);

View File

@@ -1272,7 +1272,6 @@ async function initForm(vm) {
////////////////////
//
async function fetchSavedFilterList(vm) {
//http://localhost:7575/api/v8/data-list-filter/list?ListKey=TestWidgetDataList
let res = await window.$gz.api.get(
"data-list-filter/list?ListKey=" + vm.dataListKey
);

View File

@@ -1083,22 +1083,6 @@ export default new Router({
}
},
//TEST TEST TEST TEST TEST
// {
// //NEW TEST GZ DATA TABLE
// path: "/widgets",
// name: "widget-list",
// component: () =>
// import(/* webpackChunkName: "widget" */ "./views/widgets.vue")
// },
// {
// //TEST WIDGET EDIT FORM
// path: "/widgets/:recordid",
// name: "widget-edit",
// component: () =>
// import(/* webpackChunkName: "widget" */ "./views/widget.vue")
// },
{
path: "/ay-evaluate",
name: "ay-evaluate",

View File

@@ -384,7 +384,6 @@ async function fetchTranslatedText(vm) {
////////////////////
//
async function populateFieldDefinitions(vm) {
//http://localhost:7575/api/v8/data-list/listfields?DataListKey=TestWidgetDataList
let res = await window.$gz.api.get(
"data-list/listfields?DataListKey=" + vm.dataListKey
);

View File

@@ -69,7 +69,6 @@ export default {
}
}
};
//"[{\"fld\": \"widgetname\",\"filter\": {\"any\":false,\"items\": [{\"op\": \"%-\",\"value\": \"Awesome\"}]}},{\"fld\":\"widgetserial\"},{\"fld\":\"widgetdollaramount\"},{\"fld\":\"widgetusertype\"},{\"fld\":\"widgetstartdate\"},{\"fld\":\"widgetactive\"},{\"fld\":\"username\"},{\"fld\":\"widgettags\"},{\"fld\":\"widgetcustom1\"},{\"fld\":\"widgetcustom2\"}]"
/////////////////////////////
//
//

View File

@@ -1,798 +0,0 @@
<template>
<div>
<gz-report-selector ref="reportSelector"></gz-report-selector>
<v-row v-if="formState.ready">
<v-col>
<v-form ref="form">
<v-row>
<gz-error :error-box-message="formState.errorBoxMessage"></gz-error>
<v-col cols="12" sm="6" lg="4" xl="3">
<v-text-field
v-model="obj.name"
:readonly="formState.readOnly"
:label="$ay.t('WidgetName')"
:rules="[form().required(this, 'name')]"
:error-messages="form().serverErrors(this, 'name')"
ref="name"
data-cy="name"
@input="fieldValueChanged('name')"
></v-text-field>
</v-col>
<v-col
v-if="form().showMe(this, 'Serial')"
cols="12"
sm="6"
lg="4"
xl="3"
>
<v-text-field
v-model="obj.serial"
:readonly="true"
:label="$ay.t('WidgetSerial')"
data-cy="serial"
></v-text-field>
</v-col>
<v-col
v-if="form().showMe(this, 'Count')"
cols="12"
sm="6"
lg="4"
xl="3"
>
<v-text-field
v-model="obj.count"
:readonly="formState.readOnly"
:clearable="!formState.readOnly"
@click:clear="fieldValueChanged('count')"
:counter="10"
:label="$ay.t('WidgetCount')"
ref="count"
data-cy="count"
:rules="[form().integerValid(this, 'count')]"
:error-messages="form().serverErrors(this, 'count')"
@input="fieldValueChanged('count')"
type="number"
></v-text-field>
</v-col>
<v-col
v-if="form().showMe(this, 'DollarAmount')"
cols="12"
sm="6"
lg="4"
xl="3"
>
<gz-currency
v-model="obj.dollarAmount"
:readonly="formState.readOnly"
:label="$ay.t('WidgetDollarAmount')"
ref="dollarAmount"
data-cy="dollarAmount"
:rules="[
form().decimalValid(this, 'dollarAmount'),
form().required(this, 'dollarAmount')
]"
:error-messages="form().serverErrors(this, 'dollarAmount')"
@input="fieldValueChanged('dollarAmount')"
></gz-currency>
</v-col>
<v-col cols="12" sm="6" lg="4" xl="3">
<gz-date-time-picker
:label="$ay.t('WidgetStartDate')"
v-model="obj.startDate"
:readonly="formState.readOnly"
ref="startDate"
data-cy="startDate"
:error-messages="form().serverErrors(this, 'startDate')"
@input="fieldValueChanged('startDate')"
></gz-date-time-picker>
</v-col>
<v-col cols="12" sm="6" lg="4" xl="3">
<gz-date-time-picker
:label="$ay.t('WidgetEndDate')"
:rules="[form().datePrecedence(this, 'startDate', 'endDate')]"
:error-messages="form().serverErrors(this, 'endDate')"
v-model="obj.endDate"
:readonly="formState.readOnly"
ref="endDate"
data-cy="endDate"
@input="fieldValueChanged('endDate')"
></gz-date-time-picker>
</v-col>
<v-col
v-if="form().showMe(this, 'UserId')"
cols="12"
sm="6"
lg="4"
xl="3"
>
<gz-pick-list
:aya-type="ayaTypes().User"
show-edit-icon
v-model="obj.userId"
:readonly="formState.readOnly"
:label="$ay.t('User')"
ref="userid"
data-cy="userid"
:error-messages="form().serverErrors(this, 'userid')"
@input="fieldValueChanged('userid')"
></gz-pick-list>
</v-col>
<v-col
v-if="form().showMe(this, 'UserType')"
cols="12"
sm="6"
lg="4"
xl="3"
>
<v-select
v-model="obj.userType"
:items="selectLists.usertypes"
item-text="name"
item-value="id"
:readonly="formState.readOnly"
:label="$ay.t('UserType')"
ref="usertype"
data-cy="usertype"
:rules="[form().integerValid(this, 'usertype')]"
:error-messages="form().serverErrors(this, 'usertype')"
@input="fieldValueChanged('usertype')"
></v-select>
</v-col>
<v-col cols="12" sm="6" lg="4" xl="3">
<v-checkbox
v-model="obj.active"
:readonly="formState.readOnly"
:label="$ay.t('Active')"
ref="active"
data-cy="active"
:error-messages="form().serverErrors(this, 'active')"
@change="fieldValueChanged('active')"
></v-checkbox>
</v-col>
<!-- ------------------------------------- -->
<v-col v-if="form().showMe(this, 'Notes')" cols="12">
<v-textarea
v-model="obj.notes"
:readonly="formState.readOnly"
:label="$ay.t('WidgetNotes')"
:error-messages="form().serverErrors(this, 'notes')"
ref="notes"
data-cy="notes"
@input="fieldValueChanged('notes')"
auto-grow
:clearable="!formState.readOnly"
></v-textarea>
</v-col>
<v-col v-if="form().showMe(this, 'Tags')" cols="12">
<gz-tag-picker
v-model="obj.tags"
:readonly="formState.readOnly"
ref="tags"
data-cy="tags"
:error-messages="form().serverErrors(this, 'tags')"
@input="fieldValueChanged('tags')"
></gz-tag-picker>
</v-col>
<v-col cols="12">
<gz-custom-fields
v-model="obj.customFields"
:form-key="formCustomTemplateKey"
:readonly="formState.readOnly"
:parent-v-m="this"
ref="customFields"
data-cy="customFields"
:error-messages="form().serverErrors(this, 'customFields')"
@input="fieldValueChanged('customFields')"
></gz-custom-fields>
</v-col>
<v-col v-if="form().showMe(this, 'Wiki')" cols="12">
<gz-wiki
:aya-type="ayaType"
:aya-id="obj.id"
ref="wiki"
v-model="obj.wiki"
:readonly="formState.readOnly"
@input="fieldValueChanged('wiki')"
></gz-wiki
></v-col>
<v-col
v-if="form().showMe(this, 'Attachments') && obj.id"
cols="12"
>
<gz-attachments
:readonly="formState.readOnly"
:aya-type="ayaType"
:aya-id="obj.id"
></gz-attachments
></v-col>
</v-row>
</v-form>
</v-col>
</v-row>
<v-overlay :value="!formState.ready || formState.loading">
<v-progress-circular indeterminate :size="64" />
</v-overlay>
</div>
</template>
<script>
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* Xeslint-disable */
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
const FORM_KEY = "widget-edit";
const API_BASE_URL = "widget/";
const FORM_CUSTOM_TEMPLATE_KEY = "Widget"; //<-- Should always be CoreBizObject AyaType name here where possible
export default {
async created() {
let vm = this;
try {
await initForm(vm);
vm.rights = window.$gz.role.getRights(window.$gz.type.Widget);
vm.formState.readOnly = !vm.rights.change;
window.$gz.eventBus.$on("menu-click", clickHandler);
// //id 0 means create or duplicate to new
// if (vm.$route.params.recordid != 0) {
// //is there already an obj from a prior operation?
// if (this.$route.params.obj) {
// //yes, no need to fetch it
// this.obj = this.$route.params.obj;
// window.$gz.form.setFormState({
// vm: vm,
// loading: false
// });
// } else {
// await vm.getDataFromApi(vm.$route.params.recordid); //let getdata handle loading
// }
// } else {
// //----------------------------------------------------------
// //NEW OBJECT DEFAULTS
// let defaultDates = window.$gz.locale.defaultStartDateTime(
// window.$gz.type.Widget
// );
// vm.obj.startDate = defaultDates.start;
// vm.obj.endDate = defaultDates.end;
// //----------------------------------------------------------
// window.$gz.form.setFormState({
// vm: vm,
// loading: false
// });
// }
// window.$gz.form.setFormState({
// vm: vm,
// dirty: false,
// valid: true
// });
let setDirty = false;
let setValid = true;
//id 0 means create or duplicate to new
if (vm.$route.params.recordid != 0) {
//is there already an obj from a prior operation?
if (this.$route.params.obj) {
//yes, no need to fetch it
this.obj = this.$route.params.obj;
} else {
await vm.getDataFromApi(vm.$route.params.recordid); //let getdata handle loading
}
} else {
//Might be a duplicate and contain another record
if (this.$route.params.obj) {
this.obj = this.$route.params.obj;
this.obj.concurrency = undefined;
this.obj.id = 0;
this.obj.name = `${this.obj.name} - ${window.$gz.translation.get(
"Copy"
)}`;
setDirty = true;
} else {
//----------------------------------------------------------
//NEW OBJECT DEFAULTS
let defaultDates = window.$gz.locale.defaultStartDateTime(
window.$gz.type.Widget
);
vm.obj.startDate = defaultDates.start;
vm.obj.endDate = defaultDates.end;
//----------------------------------------------------------
}
}
window.$gz.form.setFormState({
vm: vm,
loading: false,
dirty: setDirty,
valid: setValid
});
generateMenu(vm);
} catch (error) {
window.$gz.errorHandler.handleFormError(error, vm);
} finally {
vm.formState.ready = true;
}
},
async beforeRouteLeave(to, from, next) {
if (!this.formState.dirty || JUST_DELETED) {
next();
return;
}
if ((await window.$gz.dialog.confirmLeaveUnsaved()) === true) {
next();
} else {
next(false);
}
},
beforeDestroy() {
window.$gz.eventBus.$off("menu-click", clickHandler);
},
data() {
return {
formCustomTemplateKey: FORM_CUSTOM_TEMPLATE_KEY,
selectLists: {
usertypes: []
},
obj: {
//IMPORTANT NOTE: Fields that are NON NULLABLE in the schema for the table but *are* hideable **MUST** have a default value set here or else there will be no way to save the record
//I.E. Serial, usertype fields
//Also, if it's a non-nullable Enum backed field then it should have a valid selection i.e. not zero if there is no zero
id: 0,
concurrency: 0,
name: null,
serial: 0,
dollarAmount: null,
active: true,
userType: 2, //defaulted here to something valid
startDate: null,
endDate: null,
notes: null,
count: null,
wiki: null,
customFields: "{}",
tags: [],
userId: null
},
formState: {
ready: false,
dirty: false,
valid: true,
readOnly: false,
loading: true,
errorBoxMessage: null,
appError: null,
serverError: {}
},
rights: window.$gz.role.defaultRightsObject(),
ayaType: window.$gz.type.Widget
};
},
//WATCHERS
watch: {
formState: {
handler: function(val) {
//,oldval is available here too if necessary
if (this.formState.loading) {
return;
}
//enable / disable save button
if (val.dirty && val.valid && !val.readOnly) {
window.$gz.eventBus.$emit("menu-enable-item", FORM_KEY + ":save");
} else {
window.$gz.eventBus.$emit("menu-disable-item", FORM_KEY + ":save");
}
//enable / disable duplicate / new button
if (!val.dirty && val.valid && !val.readOnly) {
window.$gz.eventBus.$emit(
"menu-enable-item",
FORM_KEY + ":duplicate"
);
window.$gz.eventBus.$emit("menu-enable-item", FORM_KEY + ":new");
} else {
window.$gz.eventBus.$emit(
"menu-disable-item",
FORM_KEY + ":duplicate"
);
window.$gz.eventBus.$emit("menu-disable-item", FORM_KEY + ":new");
}
},
deep: true
}
},
methods: {
canSave: function() {
return this.formState.valid && this.formState.dirty;
},
canDuplicate: function() {
return this.formState.valid && !this.formState.dirty;
},
ayaTypes: function() {
return window.$gz.type;
},
form() {
return window.$gz.form;
},
fieldValueChanged(ref) {
if (
this.formState.ready &&
!this.formState.loading &&
!this.formState.readOnly
) {
window.$gz.form.fieldValueChanged(this, ref);
}
},
async getDataFromApi(recordId) {
let vm = this;
window.$gz.form.setFormState({
vm: vm,
loading: true
});
if (!recordId) {
throw new Error(FORM_KEY + "::getDataFromApi -> Missing recordID!");
}
let url = API_BASE_URL + recordId;
try {
window.$gz.form.deleteAllErrorBoxErrors(vm);
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.obj = res.data;
//modify the menu as necessary
generateMenu(vm);
//Update the form status
window.$gz.form.setFormState({
vm: vm,
dirty: false,
valid: true,
loading: false
});
}
} catch (error) {
window.$gz.errorHandler.handleFormError(error, vm);
} finally {
window.$gz.form.setFormState({
vm: vm,
loading: false
});
}
},
async submit() {
let vm = this;
if (vm.canSave == false) {
return;
}
try {
window.$gz.form.setFormState({
vm: vm,
loading: true
});
let url = API_BASE_URL; // + vm.$route.params.recordid;
//clear any errors vm might be around from previous submit
window.$gz.form.deleteAllErrorBoxErrors(vm);
let res = await window.$gz.api.upsert(url, vm.obj);
if (res.error) {
vm.formState.serverError = res.error;
window.$gz.form.setErrorBoxErrors(vm);
} else {
//Logic for detecting if a post or put: if id then it was a post, if no id then it was a put
if (res.data.id) {
//POST - whole new object returned
vm.obj = res.data;
//Change URL to new record
//NOTE: will not cause a page re-render, almost nothing does unless forced with a KEY property or using router.GO()
this.$router.replace({
name: "widget-edit",
params: {
recordid: res.data.id,
obj: res.data // Pass data object to new form
}
});
} else {
//PUT - only concurrency token is returned (**warning, if server changes object other fields then this needs to act more like POST above but is more efficient this way**)
//Handle "put" of an existing record (UPDATE)
vm.obj.concurrency = res.data.concurrency;
}
//Update the form status
window.$gz.form.setFormState({
vm: vm,
dirty: false,
valid: true
});
}
} catch (ex) {
window.$gz.errorHandler.handleFormError(ex, vm);
} finally {
window.$gz.form.setFormState({
vm: vm,
loading: false
});
}
},
async remove() {
let vm = this;
try {
let dialogResult = await window.$gz.dialog.confirmDelete();
if (dialogResult != true) {
return;
}
//do the delete
window.$gz.form.setFormState({
vm: vm,
loading: true
});
//No need to delete a new record, just abandon it...
if (vm.$route.params.recordid == 0) {
//this should not get offered for delete but to be safe and clear just in case:
JUST_DELETED = true;
// navigate backwards
vm.$router.go(-1);
} else {
let url = API_BASE_URL + vm.$route.params.recordid;
window.$gz.form.deleteAllErrorBoxErrors(vm);
let res = await window.$gz.api.remove(url);
if (res.error) {
vm.formState.serverError = res.error;
window.$gz.form.setErrorBoxErrors(vm);
} else {
//workaround to prevent warning about leaving dirty record
//For some reason I couldn't just reset isdirty in formstate
JUST_DELETED = true;
// navigate backwards
vm.$router.go(-1);
}
}
} catch (error) {
//Update the form status
window.$gz.form.setFormState({
vm: vm,
loading: false
});
window.$gz.errorHandler.handleFormError(error, vm);
}
},
duplicate() {
//Navigate to new record
this.$router.push({
name: "widget-edit",
params: {
recordid: 0,
obj: this.obj
}
});
}
}
};
/////////////////////////////
//
//
async function clickHandler(menuItem) {
if (!menuItem) {
return;
}
let m = window.$gz.menu.parseMenuItem(menuItem);
if (m.owner == FORM_KEY && !m.disabled) {
switch (m.key) {
case "save":
m.vm.submit();
break;
case "delete":
m.vm.remove();
break;
case "new":
m.vm.$router.push({
name: "widget-edit",
params: { recordid: 0 }
});
break;
case "duplicate":
m.vm.duplicate();
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.Widget }
});
} else {
//general report selector chosen
let res = await m.vm.$refs.reportSelector.open({
AType: window.$gz.type.Widget,
selectedRowIds: [m.vm.obj.id]
});
//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.Widget }
});
}
break;
default:
window.$gz.eventBus.$emit(
"notify-warning",
FORM_KEY + "::context click: [" + m.key + "]"
);
}
}
}
//////////////////////
//
//
function generateMenu(vm) {
let menuOptions = {
isMain: false,
readOnly: vm.formState.readOnly,
icon: "$ayiSplotch",
title: "Widget",
helpUrl: "widgets",
formData: {
ayaType: window.$gz.type.Widget,
recordId: vm.$route.params.recordid,
formCustomTemplateKey: FORM_CUSTOM_TEMPLATE_KEY,
recordName: vm.obj.name
},
menuItems: []
};
if (vm.rights.change) {
menuOptions.menuItems.push({
title: "Save",
icon: "$ayiSave",
surface: true,
key: FORM_KEY + ":save",
vm: vm
});
}
if (vm.rights.delete && vm.$route.params.recordid != 0) {
menuOptions.menuItems.push({
title: "Delete",
icon: "$ayiTrashAlt",
surface: false,
key: FORM_KEY + ":delete",
vm: vm
});
}
//REPORTS
//Report not Print, print is a further option
menuOptions.menuItems.push({
title: "Report",
icon: "$ayiFileAlt",
key: FORM_KEY + ":report",
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
});
}
if (vm.rights.change) {
menuOptions.menuItems.push({
title: "New",
icon: "$ayiPlus",
key: FORM_KEY + ":new",
vm: vm
});
}
if (vm.rights.change && vm.$route.params.recordid != 0) {
menuOptions.menuItems.push({
title: "Duplicate",
icon: "$ayiClone",
key: FORM_KEY + ":duplicate",
vm: vm
});
}
menuOptions.menuItems.push({ divider: true, inset: false });
window.$gz.eventBus.$emit("menu-change", menuOptions);
}
let JUST_DELETED = false;
/////////////////////////////////
//
//
async function initForm(vm) {
await fetchTranslatedText(vm);
await window.$gz.formCustomTemplate.get(FORM_CUSTOM_TEMPLATE_KEY, vm);
await populateSelectionLists(vm);
}
//////////////////////////////////////////////////////////
//
// Ensures UI translated text is available
//
async function fetchTranslatedText(vm) {
await window.$gz.translation.cacheTranslations([
"Widget",
"WidgetName",
"WidgetSerial",
"WidgetDollarAmount",
"WidgetCount",
"User",
"UserType",
"WidgetStartDate",
"WidgetEndDate",
"WidgetNotes",
"WidgetCustom1",
"WidgetCustom2",
"WidgetCustom3",
"WidgetCustom4",
"WidgetCustom5",
"WidgetCustom6",
"WidgetCustom7",
"WidgetCustom8",
"WidgetCustom9",
"WidgetCustom10",
"WidgetCustom11",
"WidgetCustom12",
"WidgetCustom13",
"WidgetCustom14",
"WidgetCustom15",
"WidgetCustom16"
]);
}
//////////////////////
//
//
async function populateSelectionLists(vm) {
//ensure the pick lists required are pre-fetched
await window.$gz.enums.fetchEnumList("usertype");
vm.selectLists.usertypes = window.$gz.enums.getSelectionList("usertype");
}
</script>
<style></style>

View File

@@ -1,165 +0,0 @@
<template>
<div>
<gz-report-selector ref="reportSelector"></gz-report-selector>
<gz-extensions
:aya-type="aType"
:selected-items="selectedItems"
ref="extensions"
>
</gz-extensions>
<gz-data-table
ref="gzdatatable"
form-key="widget-list"
data-list-key="TestWidgetDataList"
:show-select="rights.read"
:reload="reload"
@selection-change="handleSelected"
data-cy="widgetsTable"
>
</gz-data-table>
</div>
</template>
<script>
const FORM_KEY = "widget-list";
export default {
created() {
this.rights = window.$gz.role.getRights(window.$gz.type.Widget);
window.$gz.eventBus.$on("menu-click", clickHandler);
generateMenu(this);
},
beforeDestroy() {
window.$gz.eventBus.$off("menu-click", clickHandler);
},
data() {
return {
rights: window.$gz.role.defaultRightsObject(),
aType: window.$gz.type.Widget,
selectedItems: [],
reload: false
};
},
methods: {
handleSelected(selected) {
this.selectedItems = selected;
}
}
};
/////////////////////////////
//
//
async function clickHandler(menuItem) {
if (!menuItem) {
return;
}
let m = window.$gz.menu.parseMenuItem(menuItem);
if (m.owner == FORM_KEY && !m.disabled) {
switch (m.key) {
case "new":
m.vm.$router.push({
name: "widget-edit",
params: { recordid: 0 }
});
break;
case "extensions":
let res = await m.vm.$refs.extensions.open(
m.vm.$refs.gzdatatable.getDataListSelection(window.$gz.type.Widget)
);
if (res && res.refresh == true) {
m.vm.reload = !m.vm.reload;
}
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.Widget }
});
} else {
//general report selector chosen
let res = await m.vm.$refs.reportSelector.open(
m.vm.$refs.gzdatatable.getDataListSelection(window.$gz.type.Widget)
);
//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.Widget }
});
}
break;
default:
window.$gz.eventBus.$emit(
"notify-warning",
FORM_KEY + "::context click: [" + m.key + "]"
);
}
}
}
//////////////////////
//
//
function generateMenu(vm) {
let menuOptions = {
isMain: true,
icon: "$ayiVial",
title: "WidgetList",
helpUrl: "widgets",
menuItems: [],
formData: {
ayaType: window.$gz.type.Widget
}
};
if (vm.rights.change) {
menuOptions.menuItems.push({
title: "New",
icon: "$ayiPlus",
surface: true,
key: FORM_KEY + ":new",
vm: vm
});
}
//REPORTS
//Report not Print, print is a further option
menuOptions.menuItems.push({
title: "Report",
icon: "$ayiFileAlt",
key: FORM_KEY + ":report",
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: "$ayiPuzzlePiece",
key: FORM_KEY + ":extensions",
vm: vm
});
window.$gz.eventBus.$emit("menu-change", menuOptions);
}
</script>

View File

@@ -16,25 +16,25 @@
// .clear()
// .type(`${Cypress.env("adminpassword")}{enter}`);
// cy.visit("/widgets/1");
// cy.url().should("include", "/widgets/1");
// cy.visit("/customers/1");
// cy.url().should("include", "/customers/1");
// //check serial field is present, then hide it and check it's gone then re-show it again
// cy.get("[data-cy=serial]").should("exist");
// cy.get("[data-cy=WidgetCustom8]").should("not.exist");
// cy.get("[data-cy=customerCustom8]").should("not.exist");
// cy.wait(100);
// cy.get("[data-cy=contextmenu]").click();
// cy.get('[data-cy="app:customize"]').click();
// cy.url().should("include", "/customize/Widget");
// cy.url().should("include", "/customize/customer");
// //hide serial
// cy.get("[data-cy=SerialVisible]").uncheck({ force: true });
// cy.wait(10);
// //show widget 8 and set it to a type
// cy.get("[data-cy=WidgetCustom8]").scrollIntoView();
// cy.get("[data-cy=WidgetCustom8Visible]").check({ force: true });
// cy.get("[data-cy=WidgetCustom8SelectType]").type("tr{enter}", {
// //show customer 8 and set it to a type
// cy.get("[data-cy=customerCustom8]").scrollIntoView();
// cy.get("[data-cy=customerCustom8Visible]").check({ force: true });
// cy.get("[data-cy=customerCustom8SelectType]").type("tr{enter}", {
// force: true
// });
@@ -43,22 +43,22 @@
// cy.go("back");
// //check customize worked
// cy.get("[data-cy=serial]").should("not.exist");
// cy.get("[data-cy=WidgetCustom8]").should("exist");
// cy.get("[data-cy=customerCustom8]").should("exist");
// //reverse
// cy.wait(100);
// cy.get("[data-cy=contextmenu]").click();
// cy.get('[data-cy="app:customize"]').click();
// cy.url().should("include", "/customize/Widget");
// cy.url().should("include", "/customize/customer");
// cy.get("[data-cy=SerialVisible]").check({ force: true });
// cy.get("[data-cy=WidgetCustom8Visible]").uncheck({ force: true });
// cy.get("[data-cy=WidgetCustom8SelectType]").type("te{enter}", {
// cy.get("[data-cy=customerCustom8Visible]").uncheck({ force: true });
// cy.get("[data-cy=customerCustom8SelectType]").type("te{enter}", {
// force: true
// });
// cy.get('[data-cy="customize:save"] > .v-btn__content > .v-icon').click();
// cy.go("back");
// cy.get("[data-cy=serial]").should("exist");
// cy.get("[data-cy=WidgetCustom8]").should("not.exist");
// cy.get("[data-cy=customerCustom8]").should("not.exist");
// //-----
// });
// });

View File

@@ -11,11 +11,11 @@ describe("GZ-DATA-TABLE", () => {
.clear()
.type("BizAdmin{enter}");
//cy.url().should("include", "/home-dashboard");
cy.visit("/widgets");
cy.url().should("include", "/widgets");
cy.visit("/customers");
cy.url().should("include", "/customers");
cy.contains("Rows per page");
//select default widget list view
//select default customer list view
cy.get("[data-cy=selectlistview]").type("-{enter}", { force: true });
//confirm we see the data expected
cy.contains("Name");
@@ -24,7 +24,7 @@ describe("GZ-DATA-TABLE", () => {
//refresh
cy.get("[data-cy=refresh]").click();
//confirm the first column is the widget name
//confirm the first column is the customer name
cy.get("thead > tr > th:nth-child(1) > span").contains("Name");
// cy.get('[aria-label="Next page"] > .v-btn__content > .v-icon').click();
@@ -53,7 +53,7 @@ describe("GZ-DATA-TABLE", () => {
'[data-cy="columncard:username"] > .v-card__text > .d-flex > :nth-child(1) > .v-btn__content > [data-cy=movestart]'
).click();
//go back to widgetlist
//go back to customerlist
cy.go("back");
//confirm the first column is now the username
@@ -62,20 +62,20 @@ describe("GZ-DATA-TABLE", () => {
//switch back to default filter
cy.get("[data-cy=selectlistview]").type("-{enter}{esc}", { force: true });
//open a widget record
//open a customer record
cy.wait(100);
cy.get("tbody > :nth-child(1) > :nth-child(1)").click();
//cy.get(":nth-child(1) > :nth-child(1) > .subtitle-1 > a").click();
//confirm on widget edit form
cy.get('[data-cy="widget-edit:delete"]');
//confirm on customer edit form
cy.get('[data-cy="customer-edit:delete"]');
//go back to widgetlist
//go back to customerlist
cy.go("back");
//new
cy.get("[data-cy='widget-list:new']").click();
cy.url().should("include", "/widgets/0");
cy.get("[data-cy='customer-list:new']").click();
cy.url().should("include", "/customers/0");
//cy.get("thead > tr > th:nth-child(1)").contains("User");

View File

@@ -28,8 +28,8 @@ describe("PICK LIST TEMPLATE", () => {
cy.get(
'[data-cy="adm-global-select-templates:save"] > .v-btn__content > .v-icon'
).click({ force: true });
cy.visit("/widgets/0");
cy.url().should("include", "/widgets/0");
cy.visit("/customers/0");
cy.url().should("include", "/customers/0");
//select a user with a zone set
cy.get("[data-cy=userid] > .v-input")
.type("..zone")
@@ -50,8 +50,8 @@ describe("PICK LIST TEMPLATE", () => {
cy.get(
'[data-cy="adm-global-select-templates:save"] > .v-btn__content > .v-icon'
).click({ force: true });
cy.visit("/widgets/0");
cy.url().should("include", "/widgets/0");
cy.visit("/customers/0");
cy.url().should("include", "/customers/0");
//select a user with a zone set
cy.get("[data-cy=userid] > .v-input")
.type("..zone")

View File

@@ -46,7 +46,7 @@ describe("SEARCH", () => {
sub = t;
//nave to first result form
cy.get("[data-cy=btnopenitem1]").click();
cy.url().should("include", "/widget");
cy.url().should("include", "/customer");
//name field should contain whatever was shown in search results list
cy.contains(sub).should("exist");
});

View File

@@ -430,18 +430,6 @@ describe("SMOKE", () => {
cy.url({ timeout: 10000 }).should("include", "/cust-customers/1");
cy.get("[data-cy=name]");
// cy.visit("/viewreport?oid=1&rid=1");
// cy.url({ timeout: 10000 }).should("include", "/cust-customers/1");
// cy.get("[data-cy=name]");
// cy.visit("/widgets");
// cy.url({ timeout: 10000 }).should("include", "/widgets");
// cy.get("[data-cy=widgetsTable]");
// cy.visit("/widgets/0");
// cy.url({ timeout: 10000 }).should("include", "/widgets/0");
// cy.get("[data-cy=name]");
cy.visit("/NOTFOUND");
cy.contains("404");

View File

@@ -3,8 +3,8 @@
// const { WatchIgnorePlugin } = require("webpack");
//https://docs.cypress.io/guides/references/assertions.html#BDD-Assertions
describe("WIDGET FORM", () => {
it("Performs all crud ops on widget successfully", () => {
describe("customer FORM", () => {
it("Performs all crud ops on customer successfully", () => {
let unique = new Date().getTime();
cy.visit("/login");
cy.get("input[name=username]")
@@ -19,8 +19,8 @@ describe("WIDGET FORM", () => {
cy.url().should("include", "/ay-evaluate");
//POST
cy.visit("/widgets/0");
cy.url().should("include", "/widgets/0");
cy.visit("/customers/0");
cy.url().should("include", "/customers/0");
//cy.wait(5000);
//save the start url for later
@@ -69,20 +69,20 @@ describe("WIDGET FORM", () => {
force: true
}); //esc necessary to close tags control
cy.get(
"[data-cy=WidgetCustom2]"
"[data-cy=customerCustom2]"
).type("Custom text field testing a...b...c...{enter}EOT", { force: true });
//GET ROUTE
//SAve the record and ensure it's different
cy.get('[data-cy="widget-edit:save"]').click();
cy.url().should("include", "/widgets");
cy.get('[data-cy="customer-edit:save"]').click();
cy.url().should("include", "/customers");
cy.get("[data-cy=serial]").should("not.have.value", 0); //server sets new value on save
//PUT
cy.get("[data-cy=count]").type("321", { force: true });
cy.get('[data-cy="widget-edit:save"]').click({ force: true });
cy.get('[data-cy="customer-edit:save"]').click({ force: true });
//now get it back again and confirm settings
@@ -91,7 +91,7 @@ describe("WIDGET FORM", () => {
//delete the record
cy.get("[data-cy=contextmenu]").click();
cy.get('[data-cy="widget-edit:delete"]').click();
cy.get('[data-cy="customer-edit:delete"]').click();
cy.get('[data-cy="gzconfirm:yesbutton"]').click();
// //LOGOUT