This commit is contained in:
2020-02-18 00:42:23 +00:00
parent ca4d8d71b7
commit 849e0d981d
2 changed files with 112 additions and 48 deletions

View File

@@ -81,8 +81,8 @@ DataTable form ListView picker
- Tells gz-data-table control it should update itself - Tells gz-data-table control it should update itself
GZFORM FORMSETTINGS RELATED TO DATALISTVIEW GZFORM FORMSETTINGS RELATED TO DATALISTVIEW
- formSettings.saved.dataTable.{ListViewId:[0 if none or else the last saved view id selected], EditedListViewJson:[edited but unsaved listview json, only if listviewId=0]} - formSettings.saved.dataTable.{listViewId:[0 if none or else the last saved view id selected], unsavedListView:[edited but unsaved listview json, only if listviewId=0]}
- formSettings.temp.dataTable.CachedListViewJson - temporary cached version of listview that was saved at server but only if saved listviewId is non-zero - formSettings.temp.dataTable.cachedListView - temporary cached version of listview that was saved at server but only if saved listviewId is non-zero

View File

@@ -71,9 +71,12 @@
<!-- TEXT (also maybe openable)--> <!-- TEXT (also maybe openable)-->
<template v-if="c.i"> <template v-if="c.i">
<!-- openable object with an ID --> <!-- openable object with an ID -->
<v-btn depressed small @click="gridCellButtonClick(c.key, c.i)">{{ <v-btn
c.v depressed
}}</v-btn> small
@click="gridCellButtonClick(c.key, c.i)"
>{{ c.v }}</v-btn
>
</template> </template>
<template v-else> <template v-else>
{{ c.v }} {{ c.v }}
@@ -295,6 +298,7 @@ export default {
loading: true, loading: true,
dataTablePagingOptions: {}, dataTablePagingOptions: {},
listViewId: 0, listViewId: 0,
listView: {},
pickLists: { pickLists: {
listViews: [] listViews: []
}, },
@@ -314,8 +318,6 @@ export default {
}, },
formKey: String, formKey: String,
dataListKey: String, dataListKey: String,
dataListSort: String,
dataListFilter: String,
showSelect: { showSelect: {
type: Boolean, type: Boolean,
default: false default: false
@@ -359,7 +361,7 @@ export default {
} }
//emit event to parent form of selected rows //emit event to parent form of selected rows
//this.$emit("update:selected", this.selected); //this.$emit("update:selected", this.selected);
//Note that this bubbles up all the columns of all the selected rows //Note vm this bubbles up all the columns of all the selected rows
//so, to be more efficient for now will just send the ID's until I see a need for other shit //so, to be more efficient for now will just send the ID's until I see a need for other shit
this.$emit("update:selected", window.$gz._.map(this.selected, "id")); this.$emit("update:selected", window.$gz._.map(this.selected, "id"));
@@ -384,7 +386,7 @@ export default {
//get the datatype of the column which matches the server columns array index //get the datatype of the column which matches the server columns array index
var typeToOpen = this.serverColumns[key.split("-")[1]].ay; var typeToOpen = this.serverColumns[key.split("-")[1]].ay;
//i is the actual AyaNova index of that record so we have all we need to open that object //i is the actual AyaNova index of vm record so we have all we need to open vm object
window.$gz.eventBus.$emit("openobject", { type: typeToOpen, id: i }); window.$gz.eventBus.$emit("openobject", { type: typeToOpen, id: i });
}, },
lt(ltKey) { lt(ltKey) {
@@ -392,27 +394,27 @@ export default {
}, },
getDataFromApi() { getDataFromApi() {
var that = this; var vm = this;
//start with defaults //start with defaults
var listOptions = { var listOptions = {
DataListKey: that.dataListKey, DataListKey: vm.dataListKey,
Limit: 5, Limit: 5,
Offset: 0 Offset: 0
}; };
//calculate paging based on settings //calculate paging based on settings
const { page, itemsPerPage } = that.dataTablePagingOptions; const { page, itemsPerPage } = vm.dataTablePagingOptions;
if (itemsPerPage && itemsPerPage > 0) { if (itemsPerPage && itemsPerPage > 0) {
listOptions.Offset = (page - 1) * itemsPerPage; listOptions.Offset = (page - 1) * itemsPerPage;
listOptions.Limit = itemsPerPage; listOptions.Limit = itemsPerPage;
} }
//is there a filter? //is there a filter?
if (that.dataFilterId != 0) { if (vm.dataFilterId != 0) {
listOptions["DataFilterID"] = that.dataFilterId; listOptions["DataFilterID"] = vm.dataFilterId;
} }
that.loading = true; vm.loading = true;
// { // {
// "offset": 0, // "offset": 0,
@@ -424,35 +426,29 @@ export default {
// } // }
window.$gz.api window.$gz.api
.upsert(that.apiBaseUrl, { .upsert(vm.apiBaseUrl, {
offset: listOptions.Offset, offset: listOptions.Offset,
limit: listOptions.Limit, limit: listOptions.Limit,
dataListKey: that.dataListKey, dataListKey: vm.dataListKey,
listView: "" listView: ""
}) })
.then(res => { .then(res => {
//NOTE: This is how to call an async function and await it from sync code //NOTE: This is how to call an async function and await it from sync code
(async function() { (async function() {
//Save a copy of the server columns data for handling button clicks etc later //Save a copy of the server columns data for handling button clicks etc later
that.serverColumns = res.columns; vm.serverColumns = res.columns;
//Make sure the locale keys are fetched //Make sure the locale keys are fetched
await fetchLocalizedHeaderNames(res.columns); //Note can use await here because it's wrapped inside an async function call, it will wait then resume next stuff below await fetchLocalizedHeaderNames(res.columns); //Note can use await here because it's wrapped inside an async function call, it will wait then resume next stuff below
await fetchEnums(res.columns); await fetchEnums(res.columns);
//build that.headers here //build vm.headers here
that.headers = buildHeaders(res.columns); vm.headers = buildHeaders(res.columns);
//Post process data here and then set that.records //Post process data here and then set vm.records
that.records = buildRecords(res.data, res.columns); vm.records = buildRecords(res.data, res.columns);
that.loading = false; vm.loading = false;
that.totalRecords = res.totalRecordCount; vm.totalRecords = res.totalRecordCount;
//persist the paging options so user sees same page and list on refresh or leave and return scenario //persist the paging options and listview stuff so user sees same page and list on refresh or leave and return scenario
saveFormSettings(vm);
window.$gz.form.setFormSettings(that.formKey, {
temp: { page: that.dataTablePagingOptions.page },
saved: {
itemsPerPage: that.dataTablePagingOptions.itemsPerPage
}
});
////////// //////////
})(); })();
}); });
@@ -465,19 +461,11 @@ export default {
initForm(vm).then(() => { initForm(vm).then(() => {
// path: "/ay-data-list-view/:listViewId/:dataListKey", // path: "/ay-data-list-view/:listViewId/:dataListKey",
//rehydrate last form settings // - formSettings.saved.dataTable.{listViewId:[0 if none or else the last saved view id selected], unsavedListView:[edited but unsaved listview json, only if listviewId=0]}
var formSettings = window.$gz.form.getFormSettings(this.formKey); // - formSettings.temp.dataTable.cachedListView - temporary cached version of listview vm was saved at server but only if saved listviewId is non-zero
if (formSettings.saved && formSettings.saved.itemsPerPage) {
this.dataTablePagingOptions.itemsPerPage =
formSettings.saved.itemsPerPage;
}
if (formSettings.temp && formSettings.temp.page) {
this.dataTablePagingOptions.page = formSettings.temp.page;
}
// vm.formState.ready = true; //rehydrate last form settings
// vm.dataListKey = this.$route.params.dataListKey; loadFormSettings(vm);
// vm.listViewId = this.$route.params.listViewId;
}); });
} }
}; };
@@ -570,14 +558,14 @@ function buildRecords(listData, columndefinitions) {
default: default:
//do nothing, allow it to stay as is (checkbox, plain text etc) //do nothing, allow it to stay as is (checkbox, plain text etc)
} }
//build the row column object that will be used by the datatable //build the row column object vm will be used by the datatable
var columnObject = { var columnObject = {
v: display, v: display,
t: dataType, t: dataType,
key: iRow + "-" + iColumn key: iRow + "-" + iColumn
}; };
//is the source dtalist field openable? If so it will have an i property set for it's ID and we already know the types to open from the column headers data //is the source dtalist field openable? If so it will have an i property set for it's ID and we already know the types to open from the column headers data
//so between the two we can make a clickable button in the grid that triggers a function with the column index and the id and that in turn will bubble up the event to open that //so between the two we can make a clickable button in the grid vm triggers a function with the column index and the id and vm in turn will bubble up the event to open vm
//object //object
if (column.i) { if (column.i) {
columnObject["i"] = column.i; columnObject["i"] = column.i;
@@ -589,7 +577,7 @@ function buildRecords(listData, columndefinitions) {
//CHANGE TO: //CHANGE TO:
//Headers: [ { "text": "Name", "value": "c1.v" }, { "text": "Serial #", "value": "c2" }, //Headers: [ { "text": "Name", "value": "c1.v" }, { "text": "Serial #", "value": "c2" },
//Records: [ { "id": 1,columns: {"c1": {v:"Incredible Metal Fish 76",t:THETYPE,key:ROWID-COLUMNID e.g. 1-1,1-2,2-1 etc}, "c2": 1, "c3": "$877.8", "c4": "AuthorizationRoles.65536", "c5": "2020-01-30 01:53:57 AM", "c6": "Yup", "c7": "Virgil Strosin 74" }, { "id": 2, "c1": "Practical Plastic Bike 77", "c2": 2, " //Records: [ { "id": 1,columns: {"c1": {v:"Incredible Metal Fish 76",t:THETYPE,key:ROWID-COLUMNID e.g. 1-1,1-2,2-1 etc}, "c2": 1, "c3": "$877.8", "c4": "AuthorizationRoles.65536", "c5": "2020-01-30 01:53:57 AM", "c6": "Yup", "c7": "Virgil Strosin 74" }, { "id": 2, "c1": "Practical Plastic Bike 77", "c2": 2, "
//THis way can have v-if for each column that changes based on type and then has it's shit figured out //THis way can have v-if for each column vm changes based on type and then has it's shit figured out
} }
ret.push(o); ret.push(o);
} }
@@ -616,7 +604,7 @@ async function fetchLocalizedHeaderNames(columnData) {
return; return;
}) })
.catch(err => { .catch(err => {
that.formState.ready = true; //show the form anyway so we know what's what vm.formState.ready = true; //show the form anyway so we know what's what
window.$gz.errorHandler.handleFormError(err); window.$gz.errorHandler.handleFormError(err);
}); });
} }
@@ -666,4 +654,80 @@ function populatePickLists(vm) {
} }
}); });
} }
//////////////////////////////////////////////////////////
//
// Fetch and cache list view
//
async function fetchListView(vm, listViewId) {
if (!listViewId) {
return;
}
await window.$gz.api.get("DataListView/" + listViewId).then(res => {
if (res.error != undefined) {
window.$gz.errorHandler.handleFormError(res.error, vm);
} else {
vm.listView = res.data.listView;
}
});
}
////////////////////
//
function saveFormSettings(vm) {
//do we need to persist this listview (only if it's an unsaved one)
var unsavedlv = vm.listView;
var cachedlv = vm.listView;
if (vm.listViewId != 0) {
//we have a saved one in use so there is no unsaved lv to save
unsavedlv = undefined;
} else {
//we have an unsaved on in use so there is no need for a cached one
cachedlv = undefined;
}
window.$gz.form.setFormSettings(vm.formKey, {
temp: { page: vm.dataTablePagingOptions.page, cachedListView: cachedlv },
saved: {
itemsPerPage: vm.dataTablePagingOptions.itemsPerPage,
dataTable: { listViewId: vm.listViewId, unsavedListView: unsavedlv }
}
});
}
////////////////////
//
function loadFormSettings(vm) {
var formSettings = window.$gz.form.getFormSettings(this.formKey);
if (formSettings.saved) {
if (formSettings.saved.itemsPerPage) {
this.dataTablePagingOptions.itemsPerPage =
formSettings.saved.itemsPerPage;
}
if (formSettings.saved.dataTable.listViewId != undefined) {
vm.listViewId = formSettings.saved.dataTable.listViewId;
}
if (vm.listViewId == 0) {
//check if there is a local copy of a listview vm was edited but not saved
if (formSettings.saved.dataTable.editedListView != undefined) {
vm.listView = formSettings.saved.dataTable.editedListView;
}
}
}
if (formSettings.temp) {
if (formSettings.temp.page) {
this.dataTablePagingOptions.page = formSettings.temp.page;
}
//check for cached local copy of saved list view in use
if (vm.listViewId != 0) {
if (formSettings.temp.dataTable.cachedListView != undefined) {
vm.listView = formSettings.temp.dataTable.cachedListView;
} else {
//fetch it and cache it
(async function() {})();
}
}
}
}
</script> </script>