HUGE REFACTOR / CLEANUP

if there is a issue it's probably something in here that was changed
This commit is contained in:
2021-09-28 20:19:44 +00:00
parent 51eddfede9
commit d0afdd9855
238 changed files with 3127 additions and 8614 deletions

View File

@@ -1,5 +1,3 @@
/* xeslint-disable */
import bizrolerights from "./biz-role-rights";
export default {
@@ -118,15 +116,9 @@ export default {
//DELETE = SAME AS CHANGE FOR NOW (There is no specific delete right for now though it's checked for by routes in Authorized.cs in case we want to add it in future as a separate right from create.)
//NOTE: biz rules can supersede this, this is just for general rights purposes, if an object has restrictive business rules they will take precedence every time.
let ret = this.defaultRightsObject();
const ret = this.defaultRightsObject();
//Get the type name from the type enum value
//de-lodash
// let typeName = window.$gz. _.findKey(window.$gz.type, function(o) {
// return o == aType;
// });
//my _.findKey replacement:
let typeName = undefined;
for (const [key, value] of Object.entries(window.$gz.type)) {
if (value == aType) {
@@ -136,7 +128,7 @@ export default {
}
//Get the AyaNova stock REQUIRED role rights for that object
let objectRoleRights = this.ROLE_RIGHTS[typeName];
const objectRoleRights = this.ROLE_RIGHTS[typeName];
if (!objectRoleRights) {
throw new Error(
`authorizationroles::getRights type ${aType} not found in roles collection`
@@ -144,11 +136,11 @@ export default {
}
//get the logged in user's role
let userRole = window.$gz.store.state.roles;
const userRole = window.$gz.store.state.roles;
//calculate the effective rights
//a non zero result of the bitwise calculation means true and zero means false so using !! to force it into a boolean value
//(contrary to some style guides that say !! is obscure but I say it saves a lot of typing)
let canChange = !!(userRole & objectRoleRights.Change);
const canChange = !!(userRole & objectRoleRights.Change);
//sometimes rights to read are false if change is true since change trumps read anyway so accordingly:
let canReadFullRecord = canChange;
if (!canReadFullRecord) {
@@ -167,7 +159,7 @@ export default {
// (i.e. grids, history etc, initialization of main menu etc)
//
canOpen(aType) {
let r = this.getRights(aType);
const r = this.getRights(aType);
//convention is change might be defined but not read so canOpen is true eitehr way
return r.change == true || r.read == true;
},
@@ -176,46 +168,7 @@ export default {
// (i.e. grids, history etc, initialization of main menu etc)
//
canChange(aType) {
let r = this.getRights(aType);
const r = this.getRights(aType);
return r.change == true;
}
};
/*
USING BITWISE OPERATORS CHEAT SHEET
//https://codeburst.io/using-javascript-bitwise-operators-in-real-life-f551a731ff5
// Test whether your bit number has a single attribute. '&' ensures
// an intersection between them.
if (myBitNumber & HAS_FOO1) {
// False, in this example
}
if (myBitNumber & HAS_FOO2) {
// True!
}
// Test whether your bit number has ANY of the specified attributes
if (myBitNumber & (HAS_FOO1 | HAS_FOO2)) {
// True!
}
if (myBitNumber & (HAS_FOO1 | HAS_FOO3)) {
// False
}
// Test whether your bit number contains ONLY the specified attributes
if (myBitNumber == (HAS_FOO2 | HAS_FOO4)) {
// True
}
if (myBitNumber == (HAS_FOO2 | HAS_FOO3 | HAS_FOO4)) {
// False
}
// Test whether your bit number contains ALL of the given
// attributes. This is slightly tricky: the union of ATTRIBUTES
// can't supersede `myBitNumber` alone, otherwise it contains a bit
// that `myBitNumber` doesn't.
if (myBitNumber == (myBitNumber | (HAS_FOO2 | HAS_FOO4))) {
// True
}
if (myBitNumber == (myBitNumber | (HAS_FOO2 | HAS_FOO3 | HAS_FOO4))) {
// False
}
*/

View File

@@ -1,5 +1,3 @@
/* xeslint-disable */
//import decode from "jwt-decode";
import jwt_decode from "jwt-decode";
import initialize from "./initialize";
import notifypoll from "./notifypoll";
@@ -69,11 +67,11 @@ export function processLogin(authResponse, loggedInWithKnownPassword) {
// );
//Get global settings
let gsets = await window.$gz.api.get("global-biz-setting/client");
const gsets = await window.$gz.api.get("global-biz-setting/client");
if (gsets.error) {
//In a form this would trigger a bunch of validation or error display code but for here and now:
//convert error to human readable string for display and popup a notification to user
let msg = window.$gz.api.apiErrorToHumanString(gsets.error);
const msg = window.$gz.api.apiErrorToHumanString(gsets.error);
window.$gz.eventBus.$emit("notify-error", msg);
} else {
//Check if overrides and use them here
@@ -99,7 +97,6 @@ export function processLogout() {
}
export function isLoggedIn() {
//const token = getToken();
return (
!!window.$gz.store.state.apiToken &&
!isTokenExpired(window.$gz.store.state.apiToken)

View File

@@ -1,5 +1,5 @@
import authorizationroles from "./authorizationroles";
let role = authorizationroles.AUTHORIZATION_ROLES;
const role = authorizationroles.AUTHORIZATION_ROLES;
export default {
registry: [
{
@@ -48,9 +48,9 @@ export default {
}
],
availableItems() {
let ret = [];
const ret = [];
for (let i = 0; i < this.registry.length; i++) {
let item = this.registry[i];
const item = this.registry[i];
if (authorizationroles.hasRole(item.roles)) {
ret.push({ id: item.id, title: item.title, type: item.type });
}

View File

@@ -1,5 +1,3 @@
/* ZZeslint-disable */
export default {
get(enumKey, enumValue) {
enumKey = enumKey.toLowerCase();
@@ -11,13 +9,13 @@ export default {
}
return window.$gz.store.state.enums[enumKey][enumValue];
} else {
let ret = [];
const ret = [];
if (enumValue == null || enumValue == 0) {
return "";
}
let availableRoles = this.getSelectionList("AuthorizationRoles");
const availableRoles = this.getSelectionList("AuthorizationRoles");
for (let i = 0; i < availableRoles.length; i++) {
let role = availableRoles[i];
const role = availableRoles[i];
if (!!(enumValue & role.id)) {
ret.push(role.name);
}
@@ -32,7 +30,7 @@ export default {
//
getSelectionList(enumKey, noSort) {
enumKey = enumKey.toLowerCase();
let e = window.$gz.store.state.enums[enumKey];
const e = window.$gz.store.state.enums[enumKey];
if (!e) {
throw new Error(
"ERROR enums::getSelectionList -> enumKey " +
@@ -40,7 +38,7 @@ export default {
" is missing from store"
);
}
let ret = [];
const ret = [];
//turn it into an array suitable for selection lists
for (const [key, value] of Object.entries(e)) {
@@ -65,19 +63,19 @@ export default {
for (let i = 0; i < enumKey.length; i++) {
//check if list
//if not then fetch it and store it
let k = enumKey[i].toLowerCase();
const k = enumKey[i].toLowerCase();
//de-lodash
// if (!window.$gz. _.has(window.$gz.store.state.enums, k)) {
//enums is an object this is checking if that object has a key with the name in k
if (!window.$gz.util.has(window.$gz.store.state.enums, k)) {
let that = this;
const that = this;
// eslint-disable-next-line
let dat = await that.fetchEnumKey(k);
const dat = await that.fetchEnumKey(k);
//massage the data as necessary
let e = { enumKey: k, items: {} };
const e = { enumKey: k, items: {} };
for (let i = 0; i < dat.length; i++) {
let o = dat[i];
const o = dat[i];
e.items[o.id] = o.name;
}
//stuff the data into the store
@@ -87,7 +85,7 @@ export default {
},
async fetchEnumKey(enumKey) {
// eslint-disable-next-line
let res = await window.$gz.api.get("enum-list/list/" + enumKey);
const res = await window.$gz.api.get("enum-list/list/" + enumKey);
//We never expect there to be no data here
if (!res.hasOwnProperty("data")) {
return Promise.reject(res);

View File

@@ -1,4 +1,3 @@
/* xeslint-disable */
let lastMessageHash = 0;
let lastMessageTimeStamp = new Date();
@@ -9,9 +8,9 @@ let lastMessageTimeStamp = new Date();
async function dealWithError(msg, vm) {
//Check if this is the same message again as last time within a short time span to avoid endless looping errors of same message
//but still allow for user to repeat operation that causes error so they can view it
let newHash = window.$gz.util.quickHash(msg);
const newHash = window.$gz.util.quickHash(msg);
if (newHash == lastMessageHash) {
let tsnow = new Date();
const tsnow = new Date();
//don't show the same exact message if it was just shown less than 1 second ago
if (tsnow - lastMessageTimeStamp < 1000) return;
}
@@ -29,7 +28,7 @@ async function dealWithError(msg, vm) {
}
window.$gz.store.commit("logItem", msg);
if (window.$gz.dev) {
let errMsg = "DEV MODE errorHandler.js:: Unexpected error: \r\n" + msg;
const errMsg = "DEV MODE errorHandler.js:: Unexpected error: \r\n" + msg;
// eslint-disable-next-line no-console
console.error(errMsg);
@@ -41,7 +40,6 @@ async function dealWithError(msg, vm) {
if (!vm || vm.formState == undefined) {
//popup if no place to display it elsewise
window.$gz.eventBus.$emit("notify-error", msg);
//debugger;
return;
}
@@ -98,7 +96,7 @@ function decodeError(e, vm) {
//API error object?
if (e.error) {
let err = e.error;
const err = e.error;
// {
// "code": "2002",
// "message": "See server log for details",

View File

@@ -1,5 +1,3 @@
/*Xeslint-disable */
///Add data key names which make the custom fields control work more easily
///Since the names can be inferred from the data that comes from the server it saves bandwidth to do it here at the client
function addDataKeyNames(obj) {
@@ -27,7 +25,7 @@ export default {
!window.$gz.util.has(window.$gz.store.state.formCustomTemplate, formKey)
) {
//fetch and populate the store
let res = await window.$gz.api.get("form-custom/" + formKey);
const res = await window.$gz.api.get("form-custom/" + formKey);
if (res.error) {
throw new Error(window.$gz.errorHandler.errorToString(res, vm));
}
@@ -55,7 +53,7 @@ export default {
);
}
let template = window.$gz.store.state.formCustomTemplate[formKey];
const template = window.$gz.store.state.formCustomTemplate[formKey];
if (template === undefined) {
throw new Error(
"ERROR form-custom-template::getFieldTemplateValue -> Store is missing form template for [" +
@@ -66,12 +64,10 @@ export default {
//Note that not every field being requested will exist so it's valid to return undefined
//template is an array of objects that contain a key called "fld"
//de-lodash
//let templateItem = window.$gz. _.find(template, ["fld", fieldKey]);
return template.find(z => z.fld == fieldKey);
},
getTemplateConcurrencyToken(formKey) {
let tok =
const tok =
window.$gz.store.state.formCustomTemplate[formKey + "_concurrencyToken"];
if (tok === undefined) {
throw new Error(

View File

@@ -1,4 +1,3 @@
/* Xeslint-disable */
import router from "../router";
function stringifyPrimitive(v) {
@@ -22,7 +21,7 @@ function stringifyPrimitive(v) {
// return true if handled or false if not
//
function handleError(action, error, route) {
let errorMessage =
const errorMessage =
"API error: " + action + " route =" + route + ", message =" + error.message;
window.$gz.store.commit("logItem", errorMessage);
@@ -80,7 +79,6 @@ function handleError(action, error, route) {
//Ideally this should never get called because any issue should be addressed above
window.$gz.errorHandler.handleFormError(error);
// devShowUnknownError(error);
}
export default {
@@ -166,7 +164,7 @@ export default {
//no content, nothing to process
return response;
}
let contentType = response.headers.get("content-type");
const contentType = response.headers.get("content-type");
if (!contentType) {
return response;
@@ -188,7 +186,7 @@ export default {
//no content, nothing to process
return response;
}
let contentType = response.headers.get("content-type");
const contentType = response.headers.get("content-type");
if (!contentType) {
return response;
}
@@ -210,7 +208,6 @@ export default {
},
patchAuthorizedHeaders() {
return {
//Accept: "application/json, text/plain, */*",
Accept: "application/json",
"Content-Type": "application/json-patch+json",
Authorization: "Bearer " + window.$gz.store.state.apiToken
@@ -308,10 +305,7 @@ export default {
//
genericDownloadUrl(route) {
//http://localhost:7575/api/v8/backup/download/100?t=sssss
let url = route + "?t=" + window.$gz.store.state.downloadToken;
return this.APIUrl(url);
return this.APIUrl(route + "?t=" + window.$gz.store.state.downloadToken);
},
/////////////////////////////
// report file download URL
@@ -319,13 +313,12 @@ export default {
reportDownloadUrl(fileName) {
//http://localhost:7575/api/v8/report/download/filename.pdf?t=sssss
let url =
return this.APIUrl(
"report/download/" +
fileName +
"?t=" +
window.$gz.store.state.downloadToken;
return this.APIUrl(url);
fileName +
"?t=" +
window.$gz.store.state.downloadToken
);
},
/////////////////////////////
// backup file download URL
@@ -333,13 +326,12 @@ export default {
backupDownloadUrl(fileName) {
//http://localhost:7575/api/v8/backup/download/100?t=sssss
let url =
return this.APIUrl(
"backup/download/" +
fileName +
"?t=" +
window.$gz.store.state.downloadToken;
return this.APIUrl(url);
fileName +
"?t=" +
window.$gz.store.state.downloadToken
);
},
/////////////////////////////
// attachment download URL
@@ -366,9 +358,7 @@ export default {
// (size= 'small', 'medium', 'large')
logoUrl(size) {
//http://localhost:7575/api/v8/logo/small
let url = "logo/" + size;
return this.APIUrl(url);
return this.APIUrl("logo/" + size);
},
/////////////////////////////
// REPLACE END OF URL
@@ -389,7 +379,7 @@ export default {
if (typeof obj === "object") {
return Object.keys(obj)
.map(function(k) {
let ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
const ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
if (Array.isArray(obj[k])) {
return obj[k]
.map(function(v) {
@@ -416,7 +406,7 @@ export default {
//
async get(route) {
try {
let that = this;
const that = this;
let r = await fetch(that.APIUrl(route), that.fetchGetOptions());
that.statusEx(r);
r = await that.extractBodyEx(r);
@@ -441,7 +431,7 @@ export default {
//
async upsert(route, data, isLogin = false) {
try {
let that = this;
const that = this;
//determine if this is a new or existing record
let fetchOptions = undefined;
//put?
@@ -451,7 +441,6 @@ export default {
//post
//ensure the route doesn't end in /0 which will happen if it's a new record
//since the edit forms just send the url here with the ID regardless
//note: de-lodash was using lodash here endswith method
if (route.endsWith("/0")) {
route = route.slice(0, -2);
}
@@ -471,7 +460,6 @@ export default {
handleError("UPSERT", error, route);
} else {
//specifically this is for the login page
// throw new Error(error);
throw new Error(window.$gz.errorHandler.errorToString(error));
}
}
@@ -480,13 +468,12 @@ export default {
// DELETE DATA FROM API SERVER
//
async remove(route) {
let that = this;
const that = this;
try {
let r = await fetch(that.APIUrl(route), that.fetchRemoveOptions());
that.statusEx(r);
//delete will return a body if there is an error of some kind with the request
r = await that.extractBodyEx(r);
return r;
} catch (error) {
//fundamental error, can't proceed with this call
@@ -498,7 +485,7 @@ export default {
// (used for puts that can't have a concurrency token like above)
async put(route, data) {
try {
let that = this;
const that = this;
let r = await fetch(that.APIUrl(route), that.fetchPutOptions(data));
that.statusEx(r);
r = await that.extractBodyEx(r);
@@ -512,7 +499,7 @@ export default {
// (used for post only routes not needing upserts)
async post(route, data) {
try {
let that = this;
const that = this;
let r = await fetch(that.APIUrl(route), that.fetchPostOptions(data));
that.statusEx(r);
r = await that.extractBodyEx(r);
@@ -526,7 +513,7 @@ export default {
// @param {ayaId:objectid, ayaType:aType, files:[array of files]}
//
async uploadAttachment(at) {
let that = this;
const that = this;
try {
var files = at.files;
var data = new FormData();
@@ -541,7 +528,7 @@ export default {
//-----------------
let fetchOptions = {
const fetchOptions = {
method: "post",
mode: "cors",
headers: {
@@ -565,7 +552,7 @@ export default {
//
//
async upload(route, at) {
let that = this;
const that = this;
try {
var files = at.files;
var data = new FormData();
@@ -585,7 +572,7 @@ export default {
//-----------------
let fetchOptions = {
const fetchOptions = {
method: "post",
mode: "cors",
headers: {
@@ -608,14 +595,14 @@ export default {
//
//
async uploadLogo(fileData, size) {
let that = this;
const that = this;
try {
let data = new FormData();
const data = new FormData();
data.append(fileData.name, fileData);
//-----------------
let fetchOptions = {
const fetchOptions = {
method: "post",
mode: "cors",
headers: {
@@ -654,13 +641,13 @@ export default {
//
//
async renderReport(objectid, reportid, redirectNotPopup) {
let reportDataOptions = {
const reportDataOptions = {
ReportId: reportid,
SelectedRowIds: [objectid],
ClientMeta: this.reportClientMetaData()
};
let res = await window.$gz.api.upsert("report/render", reportDataOptions);
const res = await window.$gz.api.upsert("report/render", reportDataOptions);
if (res.error) {
if (redirectNotPopup) {
return res;
@@ -668,7 +655,7 @@ export default {
throw new Error(window.$gz.errorHandler.errorToString(res));
}
} else {
let reportUrl = window.$gz.api.reportDownloadUrl(res.data);
const reportUrl = window.$gz.api.reportDownloadUrl(res.data);
if (redirectNotPopup) {
//used for direct report open from direct report view url
window.location.replace(reportUrl);
@@ -686,10 +673,7 @@ export default {
//
//
async fetchBizObjectName(ayaType, objectId) {
//todo: this is a good candidate for a light weight cache
//maybe one hour or something to invalidate and volatile on refresh
let res = await this.get(`name/${ayaType}/${objectId}`);
const res = await this.get(`name/${ayaType}/${objectId}`);
//We never expect there to be no data here
if (!res.hasOwnProperty("data")) {
return Promise.reject(res);

View File

@@ -1,4 +1,3 @@
/* Xeslint-disable */
let VM_LOCAL = null;
//Calculate a reasonable time to show the alert based on the size of the message and some sane bounds

View File

@@ -1,4 +1,3 @@
/* xeslint-disable */
///////////////////////////////
// gzform
//
@@ -31,7 +30,6 @@ function isInt(value) {
return false;
}
x = parseFloat(value);
// console.log("isInt:", x);
return (x | 0) === x;
}
@@ -47,27 +45,14 @@ function isNumber(n) {
// Get control from ref
//
function getControl(vm, ref) {
let ctrl = vm.$refs[ref];
// if (vm.$ay.dev) {
// // //NOTE: Due to automatic code formatting some refs will come here with newlines in them resulting in no matches
// // console.log("ref before is", ref);
// // let tref = ref.replace(/\s/g, "");
// // console.log("gzform::getcontrol, ref is ", { tref: tref, ref: ref });
// if (ctrl == null) {
// console.log(`gzform::getControl ref ${ref} not found on form`);
// } else {
// console.log(`gzform::getControl ref ${ref} *WAS* found on form!`);
// }
// }
return ctrl;
return vm.$refs[ref];
}
////////////////////////////////////
// Get value from control
//
function getControlValue(ctrl) {
let value = ctrl.value;
return value;
return ctrl.value;
}
////////////////////////////////////
@@ -149,23 +134,23 @@ export default {
return true;
}
let ctrl = getControl(vm, ref);
const ctrl = getControl(vm, ref);
if (typeof ctrl == "undefined") {
return true;
}
let value = getControlValue(ctrl);
const value = getControlValue(ctrl);
if (!isEmpty(value)) {
return true;
}
// "ErrorRequiredFieldEmpty": "{0} is a required field. Please enter a value for {0}",
let err = vm.$ay.t("ErrorRequiredFieldEmpty");
let fieldName = getControlLabel(ctrl);
const fieldName = getControlLabel(ctrl);
err = err.replace("{0}", fieldName);
//replace only replaces first instance so need to do it twice
err = err.replace("{0}", fieldName);
//Update the form status
this.setFormState({
vm: vm,
valid: false
@@ -180,12 +165,12 @@ export default {
if (vm.formState.loading) {
return true;
}
let ctrl = getControl(vm, ref);
const ctrl = getControl(vm, ref);
if (typeof ctrl == "undefined") {
return true;
}
let value = getControlValue(ctrl);
const value = getControlValue(ctrl);
if (isEmpty(value)) {
return true;
}
@@ -194,10 +179,10 @@ export default {
//get the translated rule text
// "ErrorFieldLengthExceeded": "{0} can not exceed {1} characters.",
let err = vm.$ay.t("ErrorFieldLengthExceeded");
let fieldName = getControlLabel(ctrl);
const fieldName = getControlLabel(ctrl);
err = err.replace("{0}", fieldName);
err = err.replace("{1}", max);
//Update the form status
this.setFormState({
vm: vm,
valid: false
@@ -224,12 +209,12 @@ export default {
if (vm.formState.loading) {
return true;
}
let ctrlStart = getControl(vm, refStart);
const ctrlStart = getControl(vm, refStart);
if (typeof ctrlStart == "undefined") {
return true;
}
let ctrlEnd = getControl(vm, refEnd);
const ctrlEnd = getControl(vm, refEnd);
if (typeof ctrlEnd == "undefined") {
return true;
}
@@ -255,8 +240,8 @@ export default {
if (valueStart > valueEnd) {
// "ErrorStartDateAfterEndDate": "Start date must be earlier than stop / end date",
let err = vm.$ay.t("ErrorStartDateAfterEndDate");
//Update the form status
const err = vm.$ay.t("ErrorStartDateAfterEndDate");
this.setFormState({
vm: vm,
valid: false
@@ -274,21 +259,21 @@ export default {
if (vm.formState.loading) {
return true;
}
let ctrlFirst = getControl(vm, refFirst);
const ctrlFirst = getControl(vm, refFirst);
if (typeof ctrlFirst == "undefined") {
return true;
}
let ctrlSecond = getControl(vm, refSecond);
const ctrlSecond = getControl(vm, refSecond);
if (typeof ctrlSecond == "undefined") {
return true;
}
let valueFirst = getControlValue(ctrlFirst);
let valueSecond = getControlValue(ctrlSecond);
const valueFirst = getControlValue(ctrlFirst);
const valueSecond = getControlValue(ctrlSecond);
if (valueFirst != valueSecond) {
let err = vm.$ay.t("ErrorNoMatch");
//Update the form status
const err = vm.$ay.t("ErrorNoMatch");
this.setFormState({
vm: vm,
valid: false
@@ -305,27 +290,15 @@ export default {
if (vm.formState.loading) {
return true;
}
let ctrl = getControl(vm, ref);
const ctrl = getControl(vm, ref);
if (typeof ctrl == "undefined") {
return true;
}
let value = getControlValue(ctrl);
//this block doesn't work and shouldn't be here afaict
//if you type a letter for example it presents as empty, I guess because it's set to a numeric input type
//in any case, empty isn't a valid integer so it should show as a broken rule when a letter or empty is entered
// if (isEmpty(value)) {
// return true;
// }
const value = getControlValue(ctrl);
if (isInt(value)) {
return true;
}
// "ErrorFieldValueNotInteger": "Value must be an integer"
let err = vm.$ay.t("ErrorFieldValueNotInteger");
//Update the form status
const err = vm.$ay.t("ErrorFieldValueNotInteger");
this.setFormState({
vm: vm,
valid: false
@@ -343,15 +316,12 @@ export default {
//TODO: Handle commas and spaces in numbers
//as per window.$gz.translation rules for numbers
let ctrl = getControl(vm, ref);
const ctrl = getControl(vm, ref);
if (typeof ctrl == "undefined") {
return true;
}
//DEBUG
//logControl("decimalValid", ctrl, ref);
let value = getControlValue(ctrl);
const value = getControlValue(ctrl);
if (isEmpty(value)) {
return true;
}
@@ -360,9 +330,7 @@ export default {
return true;
}
// "ErrorFieldValueNotDecimal": "Value must be a number"
let err = vm.$ay.t("ErrorFieldValueNotDecimal");
//Update the form status
const err = vm.$ay.t("ErrorFieldValueNotDecimal");
this.setFormState({
vm: vm,
valid: false
@@ -380,12 +348,12 @@ export default {
return true;
}
let ctrl = getControl(vm, ref);
const ctrl = getControl(vm, ref);
if (typeof ctrl == "undefined") {
return true;
}
let value = getControlValue(ctrl);
const value = getControlValue(ctrl);
if (isEmpty(value)) {
return true;
}
@@ -399,11 +367,10 @@ export default {
return true;
}
// "ErrorFieldValueNumberGreaterThanMax": "Value must be less than XX"
let err = `${vm.$ay
const err = `${vm.$ay
.t("ErrorFieldValueNumberGreaterThanMax")
.replace("{0}", maxValue)} ${maxValue}`;
//Update the form status
this.setFormState({
vm: vm,
valid: false
@@ -421,12 +388,12 @@ export default {
return true;
}
let ctrl = getControl(vm, ref);
const ctrl = getControl(vm, ref);
if (typeof ctrl == "undefined") {
return true;
}
let value = getControlValue(ctrl);
const value = getControlValue(ctrl);
if (isEmpty(value)) {
return true;
}
@@ -441,11 +408,10 @@ export default {
return true;
}
// "ErrorFieldValueNumberLessThanMin": "Value must be more than XX"
let err = `${vm.$ay
const err = `${vm.$ay
.t("ErrorFieldValueNumberLessThanMin")
.replace("{0}", minValue)} ${minValue}`;
//Update the form status
this.setFormState({
vm: vm,
valid: false
@@ -459,15 +425,12 @@ export default {
if (vm.formState.loading) {
return true;
}
let ctrl = getControl(vm, ref);
const ctrl = getControl(vm, ref);
if (typeof ctrl == "undefined") {
return true;
}
//DEBUG
//logControl("emailValid", ctrl, ref);
let value = getControlValue(ctrl);
const value = getControlValue(ctrl);
if (isEmpty(value)) {
return true;
}
@@ -476,8 +439,8 @@ export default {
return true;
}
let err = vm.$ay.t("ErrorAPI2203"); //"Invalid value"
//Update the form status
const err = vm.$ay.t("ErrorAPI2203"); //"Invalid value"
this.setFormState({
vm: vm,
valid: false
@@ -492,7 +455,7 @@ export default {
return true;
}
let template =
const template =
window.$gz.store.state.formCustomTemplate[vm.formCustomTemplateKey];
if (template === undefined) {
return true;
@@ -500,36 +463,31 @@ export default {
//See if control formCustomTemplateFieldName is in server required fields collection
//this is a collection of both custom field definitions and standard form fields that are required
//since all names are unique can just filter out the one we need by name which will inherently ignore custom fields by default
//de-lodash
// let templateItem = window.$gz. _.find(template, [
// "fld",
// formCustomTemplateFieldName
// ]);
let templateItem = template.find(z => z.fld == formCustomTemplateFieldName);
const templateItem = template.find(
z => z.fld == formCustomTemplateFieldName
);
//templateItem.required
if (templateItem === undefined || templateItem.required !== true) {
return true;
}
let ctrl = getControl(vm, ref);
const ctrl = getControl(vm, ref);
if (typeof ctrl == "undefined") {
return true;
}
let value = getControlValue(ctrl);
const value = getControlValue(ctrl);
if (!isEmpty(value)) {
return true;
}
// "ErrorRequiredFieldEmpty": "{0} is a required field. Please enter a value for {0}",
let err = vm.$ay.t("ErrorRequiredFieldEmpty");
let fieldName = getControlLabel(ctrl);
const fieldName = getControlLabel(ctrl);
err = err.replace("{0}", fieldName);
//replace only replaces first instance so need to do it twice
err = err.replace("{0}", fieldName);
//Update the form status
this.setFormState({
vm: vm,
valid: false
@@ -549,18 +507,17 @@ export default {
return true;
}
let value = subvm.GetValueForField(templateItem.dataKey);
const value = subvm.GetValueForField(templateItem.dataKey);
if (!isEmpty(value)) {
return true;
}
//It's empty and it's required so return error
// "ErrorRequiredFieldEmpty": "{0} is a required field. Please enter a value for {0}",
let err = vm.$ay.t("ErrorRequiredFieldEmpty");
err = err.replace("{0}", fieldName);
//replace only replaces first instance so need to do it twice
err = err.replace("{0}", fieldName);
//Update the form status
this.setFormState({
vm: vm,
valid: false
@@ -577,14 +534,12 @@ export default {
// errors in the UI by Vuetify
//
serverErrors(vm, ref) {
let ret = [];
const ret = [];
//check for errors if we have any errors
if (!window.$gz.util.objectIsEmpty(vm.formState.serverError)) {
//de-lodash
//First let's get the top level error code
let apiErrorCode = parseInt(vm.formState.serverError.code);
const apiErrorCode = parseInt(vm.formState.serverError.code);
//Not all server errors mean the form is invalid, exceptions here
let formValid = false;
@@ -616,7 +571,6 @@ export default {
err = err + "\r\n" + vm.formState.serverError.message;
}
//Update the form status
this.setFormState({
vm: vm,
valid: formValid
@@ -629,14 +583,14 @@ export default {
//Specific field validation errors are in an array in "details" key
if (!window.$gz.util.objectIsEmpty(vm.formState.serverError.details)) {
//See if this key is in the details array
let errorsForField = getErrorsForField(vm, ref);
const errorsForField = getErrorsForField(vm, ref);
if (errorsForField.length > 0) {
//iterate the errorsForField object and add each to return array of errors
//de-lodash
//window.$gz. _.each(errorsForField, function(ve) {
errorsForField.forEach(function(ve) {
let fldErr = "";
let fldErrorCode = parseInt(ve.error);
const fldErrorCode = parseInt(ve.error);
fldErr =
vm.$ay.t("ErrorAPI" + fldErrorCode.toString()) +
" [" +
@@ -657,7 +611,6 @@ export default {
}
});
//Update the form status
this.setFormState({
vm: vm,
valid: false
@@ -772,7 +725,7 @@ export default {
vm.formState.appError = null;
//clear out actual message box display
vm.formState.errorBoxMessage = null;
//Update the form status
this.setFormState({
vm: vm,
valid: true
@@ -783,8 +736,8 @@ export default {
// Gather server errors and set the appropriate keys
//
setErrorBoxErrors(vm) {
let errs = this.serverErrors(vm, "generalerror");
let ret = getErrorBoxErrors(vm, errs);
const errs = this.serverErrors(vm, "generalerror");
const ret = getErrorBoxErrors(vm, errs);
vm.formState.errorBoxMessage = ret;
},
///////////////////////////////
@@ -796,7 +749,7 @@ export default {
//
//
fieldValueChanged(vm, ref, formReference) {
let that = this;
const that = this;
let formControl = null;
if (formReference == undefined) {
formControl = vm.$refs.form;
@@ -806,9 +759,6 @@ export default {
formControl = vm.$refs[formReference];
}
//NOTE: Due to automatic code formatting some refs may come here with newlines in them resulting in no matches
// ref = ref.replace(/\s/g, "");
//dev error on form?
if (formControl == null) {
if (vm.$ay.dev) {
@@ -829,7 +779,7 @@ export default {
}
//# REMOVE SERVER ERRORS FOR THIS FIELD REF
let targetRef = ref.toLowerCase();
const targetRef = ref.toLowerCase();
//NOTE: This block of code is meant to remove all detailed server errors where the Target matches the current referenced control
//Then it checks to see if there is anything left in details as this might have been all there was and if so removes that whole thing
@@ -876,7 +826,7 @@ export default {
if (targetFieldHasServerError) {
triggeringChange = true;
let val = vm.obj[ref];
const val = vm.obj[ref];
vm.obj[ref] = null;
vm.obj[ref] = val;
triggeringChange = false;
@@ -927,12 +877,10 @@ export default {
// and temporary ones are stored in session storage and don't persist a refresh
//
getFormSettings(formKey) {
let formSettings = {
return {
temp: JSON.parse(sessionStorage.getItem(formKey)),
saved: window.$gz.store.state.formSettings[formKey]
};
return formSettings;
},
////////////////////////////////////
// Set form settings
@@ -940,14 +888,6 @@ export default {
// requires object with one or both keys {temp:{...tempformsettings...},saved:{...persistedformsettings...}}
//
setFormSettings(formKey, formSettings) {
// if (window.$gz.dev) {
// if (!formSettings.saved && !formSettings.temp) {
// throw new Error(
// "gzform:setFormSettings - saved AND temp keys are both missing from form data!"
// );
// }
// }
if (formSettings.saved) {
window.$gz.store.commit("setFormSettings", {
formKey: formKey,
@@ -962,7 +902,7 @@ export default {
// Get last report used from form settings
//
getLastReport(formKey) {
let fs = window.$gz.store.state.formSettings[formKey];
const fs = window.$gz.store.state.formSettings[formKey];
if (fs == null || fs.lastReport == null) {
return null;
}
@@ -971,12 +911,7 @@ export default {
// Set last report used in form settings
//
setLastReport(formKey, reportSelected) {
// console.log("setLastReport called", {
// formKey: formKey,
// reportSelected: reportSelected
// });
let fs = window.$gz.store.state.formSettings[formKey];
//console.log("setlast report retrieved formsettings is:",fs)
if (fs == null) {
fs = {};
}
@@ -1010,8 +945,6 @@ export default {
// Get validity of referenced control
//
controlIsValid(vm, ref) {
// //NOTE: Due to automatic code formatting some refs will come here with newlines in them resulting in no matches
// ref = ref.replace(/\s/g, "");
if (vm.$refs[ref]) {
return vm.$refs[ref].valid;
}
@@ -1023,7 +956,7 @@ export default {
controlsAreAllValid(vm, refs) {
//if any are not valid return false
for (let i = 0; i < refs.length; i++) {
let item = refs[i];
const item = refs[i];
if (vm.$refs[item]) {
if (!vm.$refs[item].valid) {
return false;
@@ -1037,7 +970,7 @@ export default {
//
handleObjectNotFound(vm) {
window.$gz.eventBus.$emit("notify-error", vm.$ay.t("ErrorAPI2010"));
// navigate backwards after small delay to show error
//after small delay to show error
//(the navigate removes the toast notification immediately)
setTimeout(function() {
vm.$router.go(-1);

View File

@@ -1,7 +1,3 @@
/* xxxeslint-disable */
// import { VMain } from "vuetify/lib";
/////////////////////////////////
// Menu utils and handlers
//
@@ -10,10 +6,10 @@ export default {
// TECH SUPPORT / CONTACT FORUM URL
//
contactSupportUrl() {
let dbId = encodeURIComponent(
const dbId = encodeURIComponent(
window.$gz.store.state.globalSettings.serverDbId
);
let company = encodeURIComponent(
const company = encodeURIComponent(
window.$gz.store.state.globalSettings.company
);
return `https://contact.ayanova.com/contact?dbid=${dbId}&company=${company}`;
@@ -24,7 +20,7 @@ export default {
// Deal with a menu change request
// called from App.vue
handleMenuChange(vm, ctx) {
let UTILITY_TYPES = [
const UTILITY_TYPES = [
window.$gz.type.NoType,
window.$gz.type.Global,
window.$gz.type.NoType,
@@ -62,7 +58,7 @@ export default {
if (ctx && ctx.formData && ctx.formData.recordName) {
recordName = ctx.formData.recordName;
}
let hasRecordName = recordName != "";
const hasRecordName = recordName != "";
if (ctx.title) {
//it has a title translation key
if (hasRecordName) {
@@ -101,7 +97,7 @@ export default {
}
//flag for if it's wikiable, reviewable, attachable, searchable, historical
let isCoreBizObject = formAyaType != 0 && formRecordId != 0;
const isCoreBizObject = formAyaType != 0 && formRecordId != 0;
//set the help url if presented or default to the User section intro
vm.appBar.helpUrl = ctx.helpUrl ? ctx.helpUrl : "user-intro";
@@ -169,15 +165,6 @@ export default {
//GLOBAL BOTTOM PORTION
//Global sub-heading
//Likely won't want this but here anyway to see
//that.appBar.menuItems.push({ header: "GLOBAL" });
//global menu items
//divider
//vm.appBar.menuItems.push({ divider: true, inset: false });
//SEARCH
//all forms except the search form
if (!ctx.hideSearch && !UTILITY_TYPES.includes(formAyaType)) {
@@ -240,7 +227,7 @@ export default {
//Find the menu item and set it to disabled and recolor it to disabled color and return
for (let i = 0; i < vm.appBar.menuItems.length; i++) {
let menuItem = vm.appBar.menuItems[i];
const menuItem = vm.appBar.menuItems[i];
if (menuItem.key == key) {
vm.$set(vm.appBar.menuItems[i], "disabled", disabled);
//menuItem.disabled = disabled;
@@ -261,7 +248,7 @@ export default {
//Find the menu item and change it's icon
for (let i = 0; i < vm.appBar.menuItems.length; i++) {
let menuItem = vm.appBar.menuItems[i];
const menuItem = vm.appBar.menuItems[i];
if (menuItem.key == key) {
vm.$set(vm.appBar.menuItems[i], "icon", newIcon);
return;
@@ -281,12 +268,11 @@ export default {
//each part is separated by a colon
//Handle different items
let item = this.parseMenuItem(menuItem);
const item = this.parseMenuItem(menuItem);
if (!item.disabled && item.owner == "app") {
switch (item.key) {
case "help":
let helpurl = vm.$store.state.helpUrl + item.data;
window.open(helpurl, "_blank");
window.open(vm.$store.state.helpUrl + item.data, "_blank");
break;
case "search":
vm.$router.push({
@@ -294,19 +280,9 @@ export default {
params: { ayatype: item.data }
});
break;
// case "attachments":
// vm.$router.push({
// name: "ay-attachments",
// params: { ayatype: item.data.ayaType, recordid: item.data.recordId }
// });
// break;
// case "plugin":
// alert("STUB: plugin / more");
// break;
case "review":
//go to list
// path: "/home-reviews/:aType?/:objectId?",
vm.$router.push({
name: "home-reviews",
params: {
@@ -350,8 +326,8 @@ export default {
parseMenuItem(menuItem) {
//format is "AREA:KEY:UNIQUEID"
//and data is in data portion
let keyparts = menuItem.key.split(":");
let ret = {
const keyparts = menuItem.key.split(":");
const ret = {
owner: keyparts[0],
key: keyparts[1],
data: menuItem.data,
@@ -369,38 +345,38 @@ export default {
// called once from app.vue only
//
wireUpEventHandlers(vm) {
let self = this;
const that = this;
window.$gz.eventBus.$on("menu-change", function handleMenuChange(ctx) {
self.handleMenuChange(vm, ctx);
that.handleMenuChange(vm, ctx);
});
window.$gz.eventBus.$on("menu-replace-item", function handleReplaceMenuItem(
newItem
) {
self.handleReplaceMenuItem(vm, newItem);
that.handleReplaceMenuItem(vm, newItem);
});
window.$gz.eventBus.$on("menu-disable-item", function handleDisableMenuItem(
key
) {
self.handleDisableMenuItem(vm, key, true);
that.handleDisableMenuItem(vm, key, true);
});
window.$gz.eventBus.$on("menu-enable-item", function handleDisableMenuItem(
key
) {
self.handleDisableMenuItem(vm, key, false);
that.handleDisableMenuItem(vm, key, false);
});
window.$gz.eventBus.$on(
"menu-change-item-icon",
function handleChangeMenuItemIcon(key, newIcon) {
self.handleChangeMenuItemIcon(vm, key, newIcon);
that.handleChangeMenuItemIcon(vm, key, newIcon);
}
);
window.$gz.eventBus.$on("menu-click", function handleMenuClick(menuitem) {
self.handleAppClick(vm, menuitem);
that.handleAppClick(vm, menuitem);
});
}
//new functions above here

View File

@@ -1,5 +1,3 @@
/* Xeslint-disable */
/////////////////////////////////
// General utility library
//
@@ -206,7 +204,7 @@ export default {
if (!number || number == 0 || number == NaN) {
return number;
}
let wasNegative = number < 0;
const wasNegative = number < 0;
if (wasNegative) {
number = Math.abs(number); //make sure it's positive because rounding negative numbers is weird in JS
}
@@ -223,29 +221,6 @@ export default {
// Clean up a tag with same rules as server
//
normalizeTag: function(tagName) {
/*
SERVER VERSION
public static string NormalizeTag(string inObj)
{
if (string.IsNullOrWhiteSpace(inObj)) return null;
//Must be lowercase per rules
//This may be naive when we get international cust omers but for now supporting utf-8 and it appears it's safe to do this with unicode
inObj = inObj.ToLowerInvariant();
//No spaces in tags, replace with dashes
inObj = inObj.Replace(" ", "-");
//Remove multiple dash sequences
inObj = System.Text.RegularExpressions.Regex.Replace(inObj, "-+", "-");
//Ensure doesn't start or end with a dash
inObj = inObj.Trim('-');
//No longer than 255 characters
inObj = StringUtil.MaxLength(inObj, 255);
return inObj;
}
*/
//de-lodash
//kebab case takes care of all the things we need for tags in one go
// tagName = window.$gz. _.kebabCase(tagName);
if (!tagName || tagName == "") {
return null;
}
@@ -271,9 +246,9 @@ export default {
// https://stackoverflow.com/a/7616484/8939
//
quickHash: function(theString) {
let hash = 0,
i,
chr;
let hash = 0;
let i;
let chr;
if (theString.length === 0) return hash;
for (i = 0; i < theString.length; i++) {
chr = theString.charCodeAt(i);
@@ -289,10 +264,9 @@ export default {
// using 32 character (128 bit) as default
//
getRandomPassword: function() {
let length = 32,
wishlist = "0123456789abcdefghijkmnopqrstuvwxyz";
const wishlist = "0123456789abcdefghijkmnopqrstuvwxyz";
return Array.from(crypto.getRandomValues(new Uint32Array(length)))
return Array.from(crypto.getRandomValues(new Uint32Array(32)))
.map(x => wishlist[x % wishlist.length])
.join("");
},
@@ -337,7 +311,7 @@ export default {
return 0;
}
let ret = parseFloat(string.replace(/[^\d.-]/g, ""));
const ret = parseFloat(string.replace(/[^\d.-]/g, ""));
if (ret == NaN) {
return 0;
}
@@ -582,8 +556,8 @@ export default {
}
mimeType = mimeType.toLowerCase();
let iconFromExtension = extensions[extension];
let iconFromMIME = mimeTypes[mimeType];
const iconFromExtension = extensions[extension];
const iconFromMIME = mimeTypes[mimeType];
if (iconFromMIME) {
return iconFromMIME;
@@ -643,8 +617,8 @@ export default {
// https://stackoverflow.com/a/55292366/8939
//
trimSpecific: function trim(str, ch) {
var start = 0,
end = str.length;
var start = 0;
var end = str.length;
while (start < end && str[start] === ch) ++start;
while (end > start && str[end - 1] === ch) --end;
return start > 0 || end < str.length ? str.substring(start, end) : str;
@@ -661,23 +635,6 @@ export default {
// is string replacement for lodash
// https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore#_isString
//
// isString: function(str) {
// //modified from above, due to bug (I think)
// //posted case here: https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore/issues/304
// if (str == null) {
// return false;
// }
// if (str == "") {//another bug, if numeric this is true?! Using recommended method below
// return true;
// }
// let temp = str.valueOf();
// if (typeof temp === "string") {
// return true;
// } else {
// return false;
// }
// },
isString: function(str) {
return str != null && typeof str.valueOf() === "string";
},
@@ -790,25 +747,13 @@ export default {
//
//
viewGeoLocation: function(obj) {
/*
{
latitude: m.vm.obj.latitude,
longitude: m.vm.obj.longitude,
address: m.vm.obj.address || m.vm.obj.postAddress,
city: m.vm.obj.city || m.vm.obj.postCity,
region: m.vm.obj.region || m.vm.obj.postRegion,
country: m.vm.obj.country || m.vm.obj.postCountry,
postCode: m.vm.obj.postCode
}
*/
let hasGeo =
const hasGeo =
obj.latitude != null &&
obj.latitude != 0 &&
obj.longitude != null &&
obj.longitude != 0;
let hasAddress =
const hasAddress =
!this.stringIsNullOrEmpty(obj.address) &&
!this.stringIsNullOrEmpty(obj.city) &&
!this.stringIsNullOrEmpty(obj.region) &&
@@ -857,7 +802,7 @@ export default {
//order street to country seems to be standard
//note, if google need plus symbol delimiter, if bing, need comma delimiter
//but both might accept one big string space delimited and url encoded so test that on all first
let delimiter = " ";
const delimiter = " ";
let q = "";
if (obj.address) {
q += obj.address + delimiter;
@@ -949,15 +894,6 @@ export default {
//
//
calendarViewToAyaNovaEnum: function(view) {
/*
public enum ScheduleView : int
{
Day = 1,
Week = 2,
Month = 3,
Day4 = 4
}
*/
switch (view) {
case "day":
return 1;

View File

@@ -1,11 +1,9 @@
/* Xeslint-disable */
function addNavItem(title, icon, route, navItems, key, testid, color = null) {
if (!testid) {
testid = route;
}
let o = {
const o = {
title,
icon,
route,
@@ -23,11 +21,8 @@ function addNavItem(title, icon, route, navItems, key, testid, color = null) {
function initNavPanel() {
let key = 0;
let sub = [];
// let t = window.$gz.translation.get;
// let role = window.$gz.role.AUTHORIZATION_ROLES;
let licenseState = window.$gz.store.state.globalSettings.licenseStatus;
let useInventory = window.$gz.store.state.globalSettings.useInventory;
const licenseState = window.$gz.store.state.globalSettings.licenseStatus;
const useInventory = window.$gz.store.state.globalSettings.useInventory;
/*Service = 1,
NotService = 2,
Customer = 3,
@@ -109,7 +104,6 @@ function initNavPanel() {
}
//###### SUBCONTRACTORS ######
//console.log(window.$gz.store.getters.isSubContractorUser);
if (window.$gz.store.getters.isSubContractorUser == true) {
//clear sublevel array
sub = [];
@@ -748,14 +742,14 @@ function initNavPanel() {
async function getUserOptions() {
try {
let res = await window.$gz.api.get(
const res = await window.$gz.api.get(
"user-option/" + window.$gz.store.state.userId
);
if (res.error) {
//In a form this would trigger a bunch of validation or error display code but for here and now:
//convert error to human readable string for display and popup a notification to user
let msg = window.$gz.api.apiErrorToHumanString(res.error);
const msg = window.$gz.api.apiErrorToHumanString(res.error);
window.$gz.store.commit(
"logItem",
"Initialize::() fetch useroptions -> error" + msg
@@ -765,7 +759,7 @@ async function getUserOptions() {
//Check if overrides and use them here
//or else use browser defaults
let l = {
const l = {
languageOverride: null,
timeZoneOverride: null,
currencyName: null,
@@ -775,16 +769,6 @@ async function getUserOptions() {
mapUrlTemplate: null
};
//removed this block, locale already attempts this fully and this should really only set the user persisted value, not guess it here
//get language to use, try user set override first, if empty then browser set, if empty then default to en-us
// l.languageOverride =
// res.data.languageOverride || window.navigator.languages[0] || "en-US";
// l.timeZoneOverride =
// res.data.timeZoneOverride ||
// window.$gz.locale.getResolvedTimeZoneName() ||
// "America/New_York";
l.languageOverride = res.data.languageOverride;
l.timeZoneOverride = res.data.timeZoneOverride;

View File

@@ -1,8 +1,4 @@
/* ZZeslint-disable */
//Browser Locale conversion utilities
// import { faYinYang } from "@fortawesome/free-solid-svg-icons";
//dates,numbers currency etc
export default {
////////////////////////////////////////////////////////
@@ -62,7 +58,7 @@ export default {
//https://en.wikipedia.org/wiki/ISO_4217
//default to USD if nothing specified
getCurrencyName() {
let cur = window.$gz.store.state.userOptions.currencyName;
const cur = window.$gz.store.state.userOptions.currencyName;
if (!window.$gz.util.stringIsNullOrEmpty(cur)) {
return cur;
} else {
@@ -165,7 +161,7 @@ export default {
}
//parse the date which is identified as utc ("2020-02-06T18:18:49.148011Z")
let parsedDate = new Date(value);
const parsedDate = new Date(value);
//is it a valid date?
if (!(parsedDate instanceof Date && !isNaN(parsedDate))) {
@@ -194,7 +190,7 @@ export default {
}
//parse the date which is identified as utc ("2020-02-06T18:18:49.148011Z")
let parsedDate = new Date(value);
const parsedDate = new Date(value);
//is it a valid date?
if (!(parsedDate instanceof Date && !isNaN(parsedDate))) {
@@ -225,7 +221,7 @@ export default {
}
//parse the date which is identified as utc ("2020-02-06T18:18:49.148011Z")
let parsedDate = new Date(value);
const parsedDate = new Date(value);
//is it a valid date?
if (!(parsedDate instanceof Date && !isNaN(parsedDate))) {
@@ -252,7 +248,7 @@ export default {
let theSeconds = 0;
let ret = "";
let work = value.split(":");
const work = value.split(":");
//has days?
if (work[0].includes(".")) {
let dh = work[0].split(".");
@@ -340,7 +336,7 @@ export default {
if (!timeZoneName) {
timeZoneName = this.getResolvedTimeZoneName();
}
let ret = window.$gz.DateTime.local()
const ret = window.$gz.DateTime.local()
.setZone(timeZoneName)
.toUTC()
.toString();
@@ -406,7 +402,7 @@ export default {
if (!timeZoneName) {
timeZoneName = this.getResolvedTimeZoneName();
}
let ret = window.$gz.DateTime.local()
const ret = window.$gz.DateTime.local()
.setZone(timeZoneName)
.toString();
return ret;

View File

@@ -1,4 +1,3 @@
/* xxxeslint-disable */
import ayatype from "./ayatype";
export default {
///////////////////////////////
@@ -19,7 +18,7 @@ export default {
}
if (tid.type && tid.id != null) {
let isCustomerTypeUser =
const isCustomerTypeUser =
window.$gz.store.state.userType == 3 ||
window.$gz.store.state.userType == 4;
//if these come from route parameters they may well be strings
@@ -68,7 +67,7 @@ export default {
case ayatype.WorkOrderItemUnit:
(async () => {
try {
let res = await window.$gz.api.get(
const res = await window.$gz.api.get(
`search/ancestor/${tid.type}/${tid.id}`
);
@@ -112,7 +111,7 @@ export default {
case ayatype.QuoteItemUnit:
(async () => {
try {
let res = await window.$gz.api.get(
const res = await window.$gz.api.get(
`search/ancestor/${tid.type}/${tid.id}`
);
@@ -157,7 +156,7 @@ export default {
case ayatype.PMItemUnit:
(async () => {
try {
let res = await window.$gz.api.get(
const res = await window.$gz.api.get(
`search/ancestor/${tid.type}/${tid.id}`
);
@@ -233,11 +232,10 @@ export default {
tid.inside = true;
}
if (tid.inside == undefined) {
let res = await window.$gz.api.get(
const res = await window.$gz.api.get(
"user/inside-type/" + tid.id
);
if (res.error) {
//throw new Error(res.error);
throw new Error(
window.$gz.errorHandler.errorToString(res, vm)
);
@@ -276,7 +274,7 @@ export default {
(async () => {
try {
let res = await window.$gz.api.get(
const res = await window.$gz.api.get(
"attachment/parent/" + tid.id
);
@@ -326,12 +324,11 @@ export default {
//all we have is the id, but need the formkey to open it
(async () => {
try {
let res = await window.$gz.api.get(
const res = await window.$gz.api.get(
"form-custom/form-key/" + tid.id
);
if (res.error) {
//throw new Error(res.error);
throw new Error(
window.$gz.errorHandler.errorToString(res, vm)
);
@@ -506,12 +503,12 @@ export default {
// called once from app.vue only
//
wireUpEventHandlers(vm) {
let self = this;
const that = this;
//expects extra data (tid) to be { type: [AYATYPE], id: [RECORDID] }
window.$gz.eventBus.$on("openobject", function handleOpenObjectClickHandler(
tid
) {
self.handleOpenObjectClick(vm, tid);
that.handleOpenObjectClick(vm, tid);
});
}
//new functions above here

View File

@@ -22,7 +22,7 @@ export default {
soft_gray: "#d2d7db"
},
getBoldPaletteArray(size) {
let palette = [
const palette = [
this.color.blue,
this.color.red,
this.color.green,
@@ -32,15 +32,15 @@ export default {
this.color.teal,
this.color.black
];
let paletteLength = palette.length;
let ret = [];
const paletteLength = palette.length;
const ret = [];
for (let i = 0; i < size; i++) {
ret.push(palette[i % paletteLength]);
}
return ret;
},
getSoftPaletteArray(size) {
let palette = [
const palette = [
this.color.soft_sand,
this.color.soft_pale_blue,
this.color.soft_gray,
@@ -50,8 +50,8 @@ export default {
this.color.soft_sand_taupe,
this.color.soft_brown_darker
];
let paletteLength = palette.length;
let ret = [];
const paletteLength = palette.length;
const ret = [];
for (let i = 0; i < size; i++) {
ret.push(palette[i % paletteLength]);
}

View File

@@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* Xeslint-disable */
////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////
@@ -24,9 +24,13 @@ export default {
//NOTE: it's valid for one of the two ret values might be undefined as it's valid to have a single date for
//Past or Future
let ret = { after: undefined, before: undefined };
let dtNow = window.$gz.DateTime.local();
let dtToday = window.$gz.DateTime.local(dtNow.year, dtNow.month, dtNow.day);
const ret = { after: undefined, before: undefined };
const dtNow = window.$gz.DateTime.local();
const dtToday = window.$gz.DateTime.local(
dtNow.year,
dtNow.month,
dtNow.day
);
let dtAfter = null;
let dtBefore = null;
@@ -613,403 +617,4 @@ export default {
return ret;
}
/*
{ name: vm.$ay.t("DateRangeJanuary"), id: "*january*" },
{ name: vm.$ay.t("DateRangeFebruary"), id: "*february*" },
{ name: vm.$ay.t("DateRangeMarch"), id: "*march*" },
{ name: vm.$ay.t("DateRangeApril"), id: "*april*" },
{ name: vm.$ay.t("DateRangeMay"), id: "*may*" },
{ name: vm.$ay.t("DateRangeJune"), id: "*june*" },
{ name: vm.$ay.t("DateRangeJuly"), id: "*july*" },
{ name: vm.$ay.t("DateRangeAugust"), id: "*august*" },
{ name: vm.$ay.t("DateRangeSeptember"), id: "*september*" },
{ name: vm.$ay.t("DateRangeOctober"), id: "*october*" },
{ name: vm.$ay.t("DateRangeNovember"), id: "*november*" },
{ name: vm.$ay.t("DateRangeDecember"), id: "*december*" },
{
name: vm.$ay.t("DateRangePreviousYearThisMonth"),
id: "*lastyearthismonth*"
},
{
name: vm.$ay.t("DateRangePreviousYearLastMonth"),
id: "*lastyearlastmonth*"
},
{
name: vm.$ay.t("DateRangePreviousYearNextMonth"),
id: "*lastyearnextmonth*"
}
*/
//new functions above here
};
//LUXON MATH: https://moment.github.io/luxon/docs/manual/zones.html#math-across-dsts
//https://moment.github.io/luxon/docs/manual/math.html
//luxon api ref: https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html
// //############################################################### OLD SERVER FILTERING CODE ##########################
// //HOWEVER, if it's a relative date filter TOKEN like "nextMonth" then the users time zone offset will be taken into consideration
// //So this is the core date time to work off of
// DateTime RelativeToday = DateTime.Today;
// DateTime RelativeNow = DateTime.Now;
// // ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger("FilterSqlCriteriaBuilder::DataFilterToColumnCriteria");
// // log.LogInformation("RelativeToday (before adjustment):");
// // log.LogInformation(RelativeToday.ToString());
// // log.LogInformation("RelativeNow (before adjustment):");
// // log.LogInformation(RelativeNow.ToString());
// if (sValue.StartsWith("{[") && sValue.EndsWith("]}"))
// {
// //Need to adjust RelativeToday to users time frame
// //Fetch useroptions object and relative time offset
// //See servers spec doc core-locale-currency-numbers-time-and-dates.txt for details about why this is necessary to be done this way
// AyaNova.Models.AyContext ct = AyaNova.Util.ServiceProviderProvider.DBContext;
// let u = ct.User.AsNoTracking().Where(a => a.Id == userId).Select(m => new { tz = m.UserOptions.TimeZoneOffset }).First();
// //Add this value to any time's hours to convert to user local time
// Double TimeZoneAdjustment = ((double)u.tz) * -1;
// //Stock times used for many of the tokens:
// RelativeToday = RelativeToday.AddHours(TimeZoneAdjustment);//flip the sign to adjust towards UTC
// RelativeNow = RelativeNow.AddHours(TimeZoneAdjustment);//flip the sign to adjust towards UTC
// //TESTING:
// //LOG THE CRIT AND QUERY
// // ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger("FilterSqlCriteriaBuilder::DataFilterToColumnCriteria");
// // log.LogInformation("RelativeToday (adjusted):");
// // log.LogInformation(RelativeToday.ToString());
// // log.LogInformation("RelativeNow (adjusted):");
// // log.LogInformation(RelativeNow.ToString());
// // log.LogInformation("Offset used:");
// // log.LogInformation(u.tz.ToString());
// #region Build criteria for date RANGE TOKEN specified
// //Used as the basis point
// System.DateTime dtAfter;
// System.DateTime dtBefore;
// switch (sValue)
// {
// //Case 402
// case DataListFilterSpecialToken.Yesterday:
// //Between Day before yesterday at midnight and yesterday at midnight
// dtAfter = RelativeToday.AddDays(-1);
// dtAfter = dtAfter.AddSeconds(-1);
// dtBefore = RelativeToday;//.AddDays(-1);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.Today:
// //Between yesterday at midnight and tommorow at midnight
// dtAfter = RelativeToday.AddSeconds(-1);
// dtBefore = RelativeToday.AddDays(1);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.Tomorrow:
// //Between Tonight at midnight and day after tommorow at midnight
// dtAfter = RelativeToday.AddDays(1);
// dtAfter = dtAfter.AddSeconds(-1);
// dtBefore = RelativeToday.AddDays(2);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// //Case 402
// case DataListFilterSpecialToken.LastWeek:
// //Between two Sundays ago at midnight and last sunday at midnight
// dtAfter = RelativeToday;
// //go back a week
// dtAfter = dtAfter.AddDays(-7);
// //go backwards to Sunday
// while (dtAfter.DayOfWeek != DayOfWeek.Sunday)
// dtAfter = dtAfter.AddDays(-1);
// //go to very start of eighth dayahead
// dtBefore = dtAfter.AddDays(8);
// dtAfter = dtAfter.AddSeconds(-1);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.ThisWeek:
// //Between Sunday at midnight and Next sunday at midnight
// dtAfter = RelativeToday;
// //go backwards to monday
// while (dtAfter.DayOfWeek != DayOfWeek.Monday)
// dtAfter = dtAfter.AddDays(-1);
// //Now go back to sunday last second
// dtAfter = dtAfter.AddSeconds(-1);
// dtBefore = RelativeToday;
// //go forwards to monday
// if (RelativeToday.DayOfWeek == DayOfWeek.Monday)
// {
// //Monday today? then go to next monday
// dtBefore = dtBefore.AddDays(7);
// }
// else
// {
// while (dtBefore.DayOfWeek != DayOfWeek.Monday)
// dtBefore = dtBefore.AddDays(1);
// }
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.NextWeek:
// //Between Next Sunday at midnight and Next Next sunday at midnight
// dtAfter = RelativeToday;
// //If today is monday skip over it first
// if (dtAfter.DayOfWeek == DayOfWeek.Monday)
// dtAfter = dtAfter.AddDays(1);
// //go forwards to next monday
// while (dtAfter.DayOfWeek != DayOfWeek.Monday)
// dtAfter = dtAfter.AddDays(1);
// //Now go back to sunday last second
// dtAfter = dtAfter.AddDays(-1);
// //go seven days ahead
// dtBefore = dtAfter.AddDays(7);
// //case 1155
// dtAfter = dtAfter.AddSeconds(-1);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.LastMonth:
// //start with the first day of this month
// dtAfter = new DateTime(RelativeToday.Year, RelativeToday.Month, 1, RelativeToday.Hour, RelativeToday.Minute, 00);
// //subtract a Month
// dtAfter = dtAfter.AddMonths(-1);
// //Add one month to dtAfter to get end date
// dtBefore = dtAfter.AddMonths(1);
// //case 1155
// dtAfter = dtAfter.AddSeconds(-1);
// // 'yyyy-mm-ddTHH:MM:SS'
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.ThisMonth:
// //start with the first day of this month
// dtAfter = new DateTime(RelativeToday.Year, RelativeToday.Month, 1, RelativeToday.Hour, RelativeToday.Minute, 00);
// //Add one month to dtAfter to get end date
// dtBefore = dtAfter.AddMonths(1);
// //case 1155
// dtAfter = dtAfter.AddSeconds(-1);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.NextMonth:
// //start with the first day of this month
// dtAfter = new DateTime(RelativeToday.Year, RelativeToday.Month, 1, RelativeToday.Hour, RelativeToday.Minute, 00);
// //Add a Month
// dtAfter = dtAfter.AddMonths(1);
// //Add one month to dtAfter to get end date
// dtBefore = dtAfter.AddMonths(1);
// //case 1155
// dtAfter = dtAfter.AddSeconds(-1);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.FourteenDayWindow:
// //start with today zero hour
// dtAfter = new DateTime(RelativeToday.Year, RelativeToday.Month, RelativeToday.Day, RelativeToday.Hour, RelativeToday.Minute, 00);
// dtAfter = dtAfter.AddDays(-7);
// //Add 15 days to get end date (zero hour so not really 15 full days)
// dtBefore = dtAfter.AddDays(15);
// //case 1155
// dtAfter = dtAfter.AddSeconds(-1);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// //case 2067 ADDITIONAL DATE RANGES ************
// case DataListFilterSpecialToken.Past:
// //Forever up to Now
// dtAfter = new DateTime(1753, 1, 2, 00, 00, 00);
// dtBefore = DateTime.UtcNow;
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.Future:
// //From Now to forever (999 years from now)
// dtAfter = DateTime.UtcNow;
// dtBefore = DateTime.UtcNow.AddYears(999);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.LastYear:
// //From zero hour january 1 a year ago
// dtAfter = new DateTime(RelativeNow.AddYears(-1).Year, 1, 1, 0, 0, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
// //To zero hour January 1 this year
// dtBefore = new DateTime(RelativeNow.Year, 1, 1, 0, 0, 00).AddHours(TimeZoneAdjustment);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.ThisYear:
// //From zero hour january 1 this year
// dtAfter = new DateTime(RelativeNow.Year, 1, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
// //To zero hour Jan 1 next year
// dtBefore = new DateTime(RelativeNow.AddYears(1).Year, 1, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.InTheLast3Months:
// //From Now minus 3 months
// dtAfter = DateTime.UtcNow.AddMonths(-3);
// //To Now
// dtBefore = DateTime.UtcNow;
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.InTheLast6Months:
// //From Now minus 6 months
// dtAfter = DateTime.UtcNow.AddMonths(-6);
// //To Now
// dtBefore = DateTime.UtcNow;
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.InTheLastYear:
// //From Now minus 365 days
// dtAfter = DateTime.UtcNow.AddDays(-365);
// //To Now
// dtBefore = DateTime.UtcNow;
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// //=======================
// //NEW ONES FOR RAVEN
// case DataListFilterSpecialToken.YearToDate:
// //From zero hour january 1 this year
// dtAfter = new DateTime(RelativeNow.Year, 1, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment); ;
// //To now
// dtBefore = RelativeNow;
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.Past90Days:
// //From Now minus 90 days
// dtAfter = DateTime.UtcNow.AddDays(-90);
// //To Now
// dtBefore = DateTime.UtcNow;
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.Past30Days:
// //From Now minus 30 days
// dtAfter = DateTime.UtcNow.AddDays(-30);
// //To Now
// dtBefore = DateTime.UtcNow;
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.Past24Hours:
// //From Now minus 24 hours
// dtAfter = DateTime.UtcNow.AddHours(-24);
// //To Now
// dtBefore = DateTime.UtcNow;
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.January:
// //From zero hour january 1 this year
// dtAfter = new DateTime(RelativeNow.Year, 1, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
// //To zero hour feb 1 this year
// dtBefore = new DateTime(RelativeNow.Year, 2, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.February:
// dtAfter = new DateTime(RelativeNow.Year, 2, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
// dtBefore = new DateTime(RelativeNow.Year, 3, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.March:
// dtAfter = new DateTime(RelativeNow.Year, 3, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
// dtBefore = new DateTime(RelativeNow.Year, 4, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.April:
// dtAfter = new DateTime(RelativeNow.Year, 4, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
// dtBefore = new DateTime(RelativeNow.Year, 5, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.May:
// dtAfter = new DateTime(RelativeNow.Year, 5, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
// dtBefore = new DateTime(RelativeNow.Year, 6, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.June:
// dtAfter = new DateTime(RelativeNow.Year, 6, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
// dtBefore = new DateTime(RelativeNow.Year, 7, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.July:
// dtAfter = new DateTime(RelativeNow.Year, 7, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
// dtBefore = new DateTime(RelativeNow.Year, 8, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.August:
// dtAfter = new DateTime(RelativeNow.Year, 8, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
// dtBefore = new DateTime(RelativeNow.Year, 9, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.September:
// dtAfter = new DateTime(RelativeNow.Year, 9, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
// dtBefore = new DateTime(RelativeNow.Year, 10, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.October:
// dtAfter = new DateTime(RelativeNow.Year, 10, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
// dtBefore = new DateTime(RelativeNow.Year, 11, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.November:
// dtAfter = new DateTime(RelativeNow.Year, 11, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
// dtBefore = new DateTime(RelativeNow.Year, 12, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
// case DataListFilterSpecialToken.December:
// //From zero hour dec 1 this year
// dtAfter = new DateTime(RelativeNow.Year, 12, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
// //To zero hour Jan 1 next year
// dtBefore = new DateTime(RelativeNow.AddYears(1).Year, 1, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
// BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
// break;
//
// //-----
// }
// #endregion
// }
// else
// {

View File

@@ -1,5 +1,3 @@
/* ZZeslint-disable */
//AyaNova Translation related utilities
export default {
////////////////////////////////
// Update the local cache
@@ -12,32 +10,12 @@ export default {
if (editedTranslation) {
//iterate the keys that are cached and set them from whatever is in editedTranslation for that key
//de-lodash
// window.$gz. _.forOwn(window.$gz.store.state.translationText, function(
// cacheval,
// cachekey
// ) {
// //find match
// //de-lodash
// // let display = window.$gz. _.find(editedTranslation.translationItems, {
// // key: cachekey
// // }).display;
// let display = editedTranslation.translationItems.find(
// z => z.key == cachekey
// ).display;
// window.$gz.store.commit("setTranslationText", {
// key: cachekey,
// value: display
// });
// });
for (const [key, value] of Object.entries(
window.$gz.store.state.translationText
)) {
let display = editedTranslation.translationItems.find(z => z.key == key)
.display;
const display = editedTranslation.translationItems.find(
z => z.key == key
).display;
window.$gz.store.commit("setTranslationText", {
key: key,
@@ -46,22 +24,15 @@ export default {
}
} else {
//gather up the keys that are cached and fetch the latest and then replace them
let needIt = [];
//de-lodash
// window.$gz. _.forOwn(window.$gz.store.state.translationText, function(
// cacheval,
// cachekey
// ) {
// needIt.push(cachekey);
// });
const needIt = [];
Object.keys(window.$gz.store.state.translationText).forEach(z => {
needIt.push(z);
});
//fetch these keys
let transData = await window.$gz.api.upsert("translation/subset", needIt);
const transData = await window.$gz.api.upsert(
"translation/subset",
needIt
);
transData.data.forEach(function commitFetchedTranslationItemToStore(
item
) {
@@ -89,7 +60,7 @@ export default {
//step 1: build an array of keys that we don't have already
//Note: this will ensure only unique keys go into the store so it's safe to call this with dupes as can happen
//for example datatables have dynamic column names so they need to fetch on demand
let needIt = [];
const needIt = [];
for (let i = 0; i < keys.length; i++) {
if (
!window.$gz.util.has(window.$gz.store.state.translationText, keys[i])
@@ -323,21 +294,19 @@ export default {
// (fetch and cache any missing strings)
async translateStringWithMultipleKeysAsync(s) {
let ret = s;
let found = s.match(/LT:[\w]*/gm);
const found = s.match(/LT:[\w]*/gm);
if (found == null) {
return ret;
}
//clean up the keys for fetching
let keysToCache = found.map(z => z.replace("LT:", ""));
const keysToCache = found.map(z => z.replace("LT:", ""));
//cache / fetch any that are not already present
//(async () => {
await this.cacheTranslations(keysToCache);
// })();
//replace
found.forEach(z => {
let translated = this.get(z.replace("LT:", ""));
const translated = this.get(z.replace("LT:", ""));
//replace all
ret = ret.split(z).join(translated);
});
@@ -352,13 +321,13 @@ export default {
//this is the sync version to be used in non async capable code
translateStringWithMultipleKeys(s) {
let ret = s;
let found = s.match(/LT:[\w]*/gm);
const found = s.match(/LT:[\w]*/gm);
if (found == null) {
return ret;
}
//replace
found.forEach(z => {
let translated = this.get(z.replace("LT:", ""));
const translated = this.get(z.replace("LT:", ""));
//replace all
ret = ret.split(z).join(translated);
});