Feat(SQL): Location Get Many and Calc Stored Procedures created with logic using Location Link table.

This commit is contained in:
2025-07-15 15:07:40 +01:00
parent 7573f329e9
commit a3fd8b12fe
44 changed files with 2590 additions and 873 deletions

View File

@@ -47,7 +47,7 @@ export default class TableBasePage extends BasePage {
} else {
let dataPage = this.getLocalStoragePage();
let filters = dataPage[flagFormFilters];
let formFilters = this.getFormFilters();
let formFilters = TableBasePage.getFormFilters();
let filtersDefault = DOM.convertForm2JSON(formFilters);
if (!Validation.areEqualDicts(filters, filtersDefault)) {
this.callFilterTableContent();
@@ -84,14 +84,14 @@ export default class TableBasePage extends BasePage {
else {
svgElement.classList.add(flagIsChecked);
}
return TableBasePage.isDirtyFilter(svgElement);
return this.handleChangeFilter(event, filterActive);
});
let filter = document.querySelector(filterSelector);
let filterValuePrevious = DOM.getElementValueCurrent(filter);
filter.setAttribute(attrValueCurrent, filterValuePrevious);
filter.setAttribute(attrValuePrevious, filterValuePrevious);
}
hookupFilter(filterFlag, handler = (event, filter) => { return TableBasePage.isDirtyFilter(filter); }) {
hookupFilter(filterFlag, handler = (event, filter) => { return this.handleChangeFilter(event, filter); }) {
let filterSelector = idFormFilters + ' #' + filterFlag;
this.hookupEventHandler("change", filterSelector, handler);
let filter = document.querySelector(filterSelector);
@@ -99,31 +99,42 @@ export default class TableBasePage extends BasePage {
filter.setAttribute(attrValueCurrent, filterValuePrevious);
filter.setAttribute(attrValuePrevious, filterValuePrevious);
}
static isDirtyFilter(filter) {
let isDirty = DOM.updateAndCheckIsElementDirty(filter);
handleChangeFilter(event, filter) {
let isDirtyFilter = DOM.updateAndCheckIsElementDirty(filter);
let formFilters = TableBasePage.getFormFilters();
let areDirtyFilters = isDirtyFilter || DOM.hasDirtyChildrenContainer(formFilters);
let tbody = document.querySelector(idTableMain + ' tbody');
let rows = tbody.querySelectorAll(':scope > tr');
let cancelButton = document.querySelector(idFormFilters + ' ' + idButtonCancel);
let saveButton = document.querySelector(idFormFilters + ' ' + idButtonSave);
rows.forEach((row) => {
if (isDirty && !row.classList.contains(flagIsCollapsed)) row.classList.add(flagIsCollapsed);
if (!isDirty && row.classList.contains(flagIsCollapsed)) row.classList.remove(flagIsCollapsed);
if (areDirtyFilters && !row.classList.contains(flagIsCollapsed)) row.classList.add(flagIsCollapsed);
if (!areDirtyFilters && row.classList.contains(flagIsCollapsed)) {
row.classList.remove(flagIsCollapsed);
let dirtyInputs = row.querySelectorAll('input.' + flagDirty);
dirtyInputs.forEach((dirtyInput) => {
dirtyInput.value = DOM.getElementAttributeValueCurrent(dirtyInput);
});
}
});
if (isDirty) {
// tbody.querySelectorAll('tr').forEach((tr) => { tr.remove(); });
if (areDirtyFilters) {
/*
tbody.querySelectorAll('tr').forEach((tr) => {
if (!DOM.hasDirtyChildrenContainer(tr)) tr.remove();
});
*/
tbody.innerHTML = '<div>Press "Apply Filters" to refresh the table.</div>' + tbody.innerHTML;
if (!tbody.classList.contains(flagIsCollapsed)) tbody.classList.add(flagIsCollapsed);
if (!cancelButton.classList.contains(flagIsCollapsed)) cancelButton.classList.add(flagIsCollapsed);
if (!saveButton.classList.contains(flagIsCollapsed)) saveButton.classList.add(flagIsCollapsed);
}
else {
if (tbody.classList.contains(flagIsCollapsed)) tbody.classList.remove(flagIsCollapsed);
if (cancelButton.classList.contains(flagIsCollapsed)) cancelButton.classList.remove(flagIsCollapsed);
if (saveButton.classList.contains(flagIsCollapsed)) saveButton.classList.remove(flagIsCollapsed);
let isDirtyLabel = tbody.querySelector(":scope > div");
if (isDirtyLabel != null) isDirtyLabel.remove();
if (tbody.classList.contains(flagIsCollapsed)) tbody.classList.remove(flagIsCollapsed);
let initialisedElements = tbody.querySelectorAll('.' + flagInitialised);
initialisedElements.forEach((initialisedElement) => {
initialisedElement.classList.remove(flagInitialised);
});
this.hookupTableMain();
}
return isDirty;
this.updateAndToggleShowButtonsSaveCancel();
}
hookupFilterIsNotEmpty() {
this.hookupFilter(flagIsNotEmpty);
@@ -142,7 +153,7 @@ export default class TableBasePage extends BasePage {
}
hookupFilterCommandCategory() {
this.hookupFilter(attrIdCommandCategory, (event, filterCommandCategory) => {
TableBasePage.isDirtyFilter(filterCommandCategory);
this.handleChangeFilter();
let isDirtyFilter = filterCommandCategory.classList.contains(flagDirty);
let idCommandCategory = DOM.getElementValueCurrent(filterCommandCategory);
console.log("filter commands unsorted");
@@ -173,11 +184,11 @@ export default class TableBasePage extends BasePage {
.catch(error => console.error('Error:', error));
}
*/
getFormFilters() {
static getFormFilters() {
return document.querySelector(idFormFilters);
}
callFilterTableContent() {
let formFilters = this.getFormFilters();
let formFilters = TableBasePage.getFormFilters();
let filtersJson = DOM.convertForm2JSON(formFilters);
Utils.consoleLogIfNotProductionEnvironment("callFilterTableContent");
Utils.consoleLogIfNotProductionEnvironment("formFilters");
@@ -223,7 +234,7 @@ export default class TableBasePage extends BasePage {
OverlayError.show('No records to save');
return;
}
let formElement = this.getFormFilters();
let formElement = TableBasePage.getFormFilters();
let comment = DOM.getElementValueCurrent(document.querySelector(idTextareaConfirm));
/*
Utils.consoleLogIfNotProductionEnvironment({ formElement, comment, records });
@@ -266,7 +277,7 @@ export default class TableBasePage extends BasePage {
OverlayError.show('No records to save');
return;
}
let formElement = this.getFormFilters();
let formElement = TableBasePage.getFormFilters();
let comment = DOM.getElementValueCurrent(document.querySelector(idTextareaConfirm));
this.callSaveTableContent(records, formElement, comment)
.then(data => {
@@ -703,7 +714,7 @@ export default class TableBasePage extends BasePage {
return DOM.getElementAttributeValueCurrent(elementCommandCategory);
}
getIdCommandCategoryFilter() {
let formFilters = this.getFormFilters();
let formFilters = TableBasePage.getFormFilters();
let commandCategoryFilter = formFilters.querySelector('#' + attrIdCommandCategory);
let commandFilter = formFilters.querySelector('#' + attrIdCommand);
let idCommandCategory = 0;
@@ -730,7 +741,7 @@ export default class TableBasePage extends BasePage {
return DOM.getElementAttributeValueCurrent(elementCommand);
}
getIdCommandFilter() {
let formFilters = this.getFormFilters();
let formFilters = TableBasePage.getFormFilters();
let commandFilter = formFilters.querySelector('#' + attrIdCommand);
let valueCurrentCommandFilter = DOM.getElementAttributeValueCurrent(commandFilter);
let idCommand = Number(valueCurrentCommandFilter);
@@ -765,7 +776,7 @@ export default class TableBasePage extends BasePage {
throw new Error("Must implement leave() method.");
}
super.leave();
let formFilters = this.getFormFilters();
let formFilters = TableBasePage.getFormFilters();
let dataPage = {};
dataPage[flagFormFilters] = DOM.convertForm2JSON(formFilters);
this.setLocalStoragePage(dataPage);
@@ -786,7 +797,11 @@ export default class TableBasePage extends BasePage {
updateAndToggleShowButtonsSaveCancel() {
let records = this.getTableRecords(true);
let existsDirtyRecord = records.length > 0;
this.toggleShowButtonsSaveCancel(existsDirtyRecord);
let isDirtyMainTable = records.length > 0;
let formFilters = TableBasePage.getFormFilters();
let areDirtyFilters = DOM.hasDirtyChildrenContainer(formFilters);
this.toggleShowButtonsSaveCancel(isDirtyMainTable && !areDirtyFilters);
}
}

View File

@@ -38,10 +38,8 @@ export default class PageDogCommandCategories extends TableBasePage {
let inputName = row.querySelector('td.' + flagName + ' .' + flagName);
let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive);
/*
console.log("inputName");
console.log(inputName);
*/
console.log("inputCode");
console.log(inputCode);
let jsonRow = {};
jsonRow[attrIdCommandCategory] = row.getAttribute(attrIdCommandCategory);

View File

@@ -0,0 +1,83 @@
import API from "../../api.js";
import BusinessObjects from "../../lib/business_objects/business_objects.js";
import DOM from "../../dom.js";
import Events from "../../lib/events.js";
import TableBasePage from "../base_table.js";
import Utils from "../../lib/utils.js";
import Validation from "../../lib/validation.js";
import DogTableMixinPage from "./mixin_table.js";
export default class PageDogLocations extends TableBasePage {
static hash = hashPageDogLocations;
static attrIdRowObject = attrIdLocation;
callSaveTableContent = API.saveLocations;
constructor(router) {
super(router);
this.dogMixin = new DogTableMixinPage(this);
}
initialize() {
this.sharedInitialize();
}
hookupFilters() {
this.sharedHookupFilters();
this.hookupFilterActive();
}
loadRowTable(rowJson) {
if (rowJson == null) return;
if (_verbose) { Utils.consoleLogIfNotProductionEnvironment("applying data row: ", rowJson); }
}
getJsonRow(row) {
if (row == null) return;
let inputName = row.querySelector('td.' + flagName + ' .' + flagName);
let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive);
let jsonRow = {};
jsonRow[attrIdLocation] = row.getAttribute(attrIdLocation);
jsonRow[flagLocationParent] = this.getIdLocationParentRow(row);
jsonRow[flagName] = DOM.getElementAttributeValueCurrent(inputName);
jsonRow[flagActive] = buttonActive.classList.contains(flagDelete);
return jsonRow;
}
getIdLocationParentRow(row) {
let elementLocationParent = row.querySelector('td.' + flagLocationParent + ' .' + flagLocationParent);
return DOM.getElementAttributeValueCurrent(elementLocationParent);
}
initialiseRowNew(tbody, row) {
}
postInitialiseRowNewCallback(tbody) {
let newRows = tbody.querySelectorAll('tr.' + flagRowNew);
let newestRow = newRows[0];
let clickableElementsSelector = [
'td.' + flagDog + ' div.' + flagDog
, ',td.' + flagLocationCategory + ' div.' + flagLocationCategory
, ',td.' + flagLocation + ' div.' + flagLocation
].join('');
newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => {
clickableElement.click();
});
}
hookupTableMain() {
super.hookupTableMain();
this.hookupFieldsLocationCategory();
this.hookupFieldsNameTable();
this.hookupFieldsActive();
}
hookupFieldsLocationParent() {
this.hookupTableCellDdlPreviews(
flagLocationParent
, Utils.getListFromDict(locations)
);
}
leave() {
super.leave();
}
}