###################################################################### Grab bag stuff that didn't fit into official TODO and may not be worth doing or isn't urgent ###################################################################### { "data": { "ayaTypes": [ { "ayaType": "Backup", "change": "OpsAdmin", "readFullRecord": "BizAdminRestricted, BizAdmin, OpsAdminRestricted", "select": "NoRole" }, { "ayaType": "BizMetrics", "change": "BizAdmin", "readFullRecord": "BizAdminRestricted, Accounting, Sales, SalesRestricted", "select": "NoRole" }, { "ayaType": "Contract", "change": "BizAdmin, Service, Accounting", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Tech, Sales, SalesRestricted", "select": "All" }, { "ayaType": "Customer", "change": "BizAdmin, Service, Accounting, Sales", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Tech, SalesRestricted", "select": "All" }, { "ayaType": "CustomerNote", "change": "BizAdmin, Service, Accounting, Sales", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Tech, SalesRestricted", "select": "All" }, { "ayaType": "CustomerServiceRequest", "change": "BizAdmin, Service, Customer", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Tech, CustomerRestricted", "select": "All" }, { "ayaType": "DataListSavedFilter", "change": "BizAdmin", "readFullRecord": "All", "select": "NoRole" }, { "ayaType": "FileAttachment", "change": "BizAdmin", "readFullRecord": "BizAdminRestricted, BizAdmin", "select": "NoRole" }, { "ayaType": "FormCustom", "change": "BizAdmin", "readFullRecord": "All", "select": "NoRole" }, { "ayaType": "FormUserOptions", "change": "All", "readFullRecord": "All", "select": "NoRole" }, { "ayaType": "Global", "change": "BizAdmin", "readFullRecord": "BizAdminRestricted", "select": "NoRole" }, { "ayaType": "GlobalOps", "change": "OpsAdmin", "readFullRecord": "OpsAdminRestricted", "select": "NoRole" }, { "ayaType": "HeadOffice", "change": "BizAdmin, Service, Accounting, Sales", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Tech, SalesRestricted", "select": "All" }, { "ayaType": "License", "change": "BizAdmin", "readFullRecord": "BizAdminRestricted", "select": "NoRole" }, { "ayaType": "LoanUnit", "change": "BizAdmin, Service, Accounting", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Tech, Sales, SalesRestricted", "select": "All" }, { "ayaType": "LogFile", "change": "NoRole", "readFullRecord": "OpsAdminRestricted, OpsAdmin", "select": "NoRole" }, { "ayaType": "Memo", "change": "BizAdminRestricted, BizAdmin, ServiceRestricted, Service, InventoryRestricted, Inventory, Accounting, TechRestricted, Tech, SubContractorRestricted, SubContractor, OpsAdminRestricted, OpsAdmin, Sales, SalesRestricted", "readFullRecord": "BizAdminRestricted, BizAdmin, ServiceRestricted, Service, InventoryRestricted, Inventory, Accounting, TechRestricted, Tech, SubContractorRestricted, SubContractor, OpsAdminRestricted, OpsAdmin, Sales, SalesRestricted", "select": "BizAdminRestricted, BizAdmin, ServiceRestricted, Service, InventoryRestricted, Inventory, Accounting, TechRestricted, Tech, SubContractorRestricted, SubContractor, OpsAdminRestricted, OpsAdmin, Sales, SalesRestricted" }, { "ayaType": "Notification", "change": "All", "readFullRecord": "All", "select": "NoRole" }, { "ayaType": "NotifySubscription", "change": "All", "readFullRecord": "All", "select": "NoRole" }, { "ayaType": "OpsNotificationSettings", "change": "OpsAdmin", "readFullRecord": "BizAdminRestricted, BizAdmin, OpsAdminRestricted", "select": "NoRole" }, { "ayaType": "Part", "change": "BizAdmin, Inventory, Accounting", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Service, InventoryRestricted", "select": "All" }, { "ayaType": "PartAssembly", "change": "BizAdmin, Inventory, Accounting", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Service, InventoryRestricted", "select": "All" }, { "ayaType": "PartInventory", "change": "BizAdmin, Inventory, Accounting", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Service, InventoryRestricted", "select": "All" }, { "ayaType": "PartInventoryDataList", "change": "BizAdmin, Inventory, Accounting", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Service, InventoryRestricted", "select": "All" }, { "ayaType": "PartInventoryRequest", "change": "BizAdmin, Inventory, Accounting", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Service, InventoryRestricted", "select": "All" }, { "ayaType": "PartInventoryRequestDataList", "change": "BizAdmin, Inventory, Accounting", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Service, InventoryRestricted", "select": "All" }, { "ayaType": "PartInventoryRestock", "change": "BizAdmin, Inventory, Accounting", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Service, InventoryRestricted", "select": "All" }, { "ayaType": "PartWarehouse", "change": "BizAdmin, Inventory, Accounting", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Service, InventoryRestricted", "select": "All" }, { "ayaType": "PickListTemplate", "change": "BizAdmin", "readFullRecord": "All", "select": "NoRole" }, { "ayaType": "PM", "change": "BizAdmin, Service", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Sales, SalesRestricted", "select": "All" }, { "ayaType": "PMItem", "change": "BizAdmin, Service", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Sales, SalesRestricted", "select": "All" }, { "ayaType": "PMItemExpense", "change": "BizAdmin, Service", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Sales, SalesRestricted", "select": "All" }, { "ayaType": "PMItemLabor", "change": "BizAdmin, Service", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Sales, SalesRestricted", "select": "All" }, { "ayaType": "PMItemLoan", "change": "BizAdmin, Service", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Sales, SalesRestricted", "select": "All" }, { "ayaType": "PMItemOutsideService", "change": "BizAdmin, Service", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Sales, SalesRestricted", "select": "All" }, { "ayaType": "PMItemPart", "change": "BizAdmin, Service", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Sales, SalesRestricted", "select": "All" }, { "ayaType": "PMItemScheduledUser", "change": "BizAdmin, Service", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Sales, SalesRestricted", "select": "All" }, { "ayaType": "PMItemTask", "change": "BizAdmin, Service", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Sales, SalesRestricted", "select": "All" }, { "ayaType": "PMItemTravel", "change": "BizAdmin, Service", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Sales, SalesRestricted", "select": "All" }, { "ayaType": "PMItemUnit", "change": "BizAdmin, Service", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Sales, SalesRestricted", "select": "All" }, { "ayaType": "Project", "change": "BizAdmin, Service, Accounting", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Tech, Sales, SalesRestricted", "select": "All" }, { "ayaType": "PurchaseOrder", "change": "BizAdmin, Inventory, Accounting", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Service, InventoryRestricted", "select": "All" }, { "ayaType": "Quote", "change": "BizAdmin, Service, Accounting, Sales", "readFullRecord": "BizAdminRestricted, ServiceRestricted, SalesRestricted", "select": "All" }, { "ayaType": "QuoteItem", "change": "BizAdmin, Service, Accounting, Sales", "readFullRecord": "BizAdminRestricted, ServiceRestricted, SalesRestricted", "select": "All" }, { "ayaType": "QuoteItemExpense", "change": "BizAdmin, Service, Accounting, Sales", "readFullRecord": "BizAdminRestricted, ServiceRestricted, SalesRestricted", "select": "All" }, { "ayaType": "QuoteItemLabor", "change": "BizAdmin, Service, Accounting, Sales", "readFullRecord": "BizAdminRestricted, ServiceRestricted, SalesRestricted", "select": "All" }, { "ayaType": "QuoteItemLoan", "change": "BizAdmin, Service, Accounting, Sales", "readFullRecord": "BizAdminRestricted, ServiceRestricted, SalesRestricted", "select": "All" }, { "ayaType": "QuoteItemOutsideService", "change": "BizAdmin, Service, Accounting, Sales", "readFullRecord": "BizAdminRestricted, ServiceRestricted, SalesRestricted", "select": "All" }, { "ayaType": "QuoteItemPart", "change": "BizAdmin, Service, Accounting, Sales", "readFullRecord": "BizAdminRestricted, ServiceRestricted, SalesRestricted", "select": "All" }, { "ayaType": "QuoteItemScheduledUser", "change": "BizAdmin, Service, Accounting, Sales", "readFullRecord": "BizAdminRestricted, ServiceRestricted, SalesRestricted", "select": "All" }, { "ayaType": "QuoteItemTask", "change": "BizAdmin, Service, Accounting, Sales", "readFullRecord": "BizAdminRestricted, ServiceRestricted, SalesRestricted", "select": "All" }, { "ayaType": "QuoteItemTravel", "change": "BizAdmin, Service, Accounting, Sales", "readFullRecord": "BizAdminRestricted, ServiceRestricted, SalesRestricted", "select": "All" }, { "ayaType": "QuoteItemUnit", "change": "BizAdmin, Service, Accounting, Sales", "readFullRecord": "BizAdminRestricted, ServiceRestricted, SalesRestricted", "select": "All" }, { "ayaType": "QuoteStatus", "change": "BizAdmin, Service, Accounting, Sales", "readFullRecord": "All", "select": "All" }, { "ayaType": "Reminder", "change": "BizAdminRestricted, BizAdmin, ServiceRestricted, Service, InventoryRestricted, Inventory, Accounting, TechRestricted, Tech, SubContractorRestricted, SubContractor, OpsAdminRestricted, OpsAdmin, Sales, SalesRestricted", "readFullRecord": "BizAdminRestricted, BizAdmin, ServiceRestricted, Service, InventoryRestricted, Inventory, Accounting, TechRestricted, Tech, SubContractorRestricted, SubContractor, OpsAdminRestricted, OpsAdmin, Sales, SalesRestricted", "select": "BizAdminRestricted, BizAdmin, ServiceRestricted, Service, InventoryRestricted, Inventory, Accounting, TechRestricted, Tech, SubContractorRestricted, SubContractor, OpsAdminRestricted, OpsAdmin, Sales, SalesRestricted" }, { "ayaType": "Report", "change": "BizAdminRestricted, BizAdmin", "readFullRecord": "All", "select": "All" }, { "ayaType": "Review", "change": "BizAdminRestricted, BizAdmin, ServiceRestricted, Service, InventoryRestricted, Inventory, Accounting, TechRestricted, Tech, SubContractorRestricted, SubContractor, OpsAdminRestricted, OpsAdmin, Sales, SalesRestricted", "readFullRecord": "BizAdminRestricted, BizAdmin, ServiceRestricted, Service, InventoryRestricted, Inventory, Accounting, TechRestricted, Tech, SubContractorRestricted, SubContractor, OpsAdminRestricted, OpsAdmin, Sales, SalesRestricted", "select": "BizAdminRestricted, BizAdmin, ServiceRestricted, Service, InventoryRestricted, Inventory, Accounting, TechRestricted, Tech, SubContractorRestricted, SubContractor, OpsAdminRestricted, OpsAdmin, Sales, SalesRestricted" }, { "ayaType": "ServerJob", "change": "OpsAdmin", "readFullRecord": "BizAdminRestricted, BizAdmin, OpsAdminRestricted", "select": "NoRole" }, { "ayaType": "ServerMetrics", "change": "OpsAdmin", "readFullRecord": "OpsAdminRestricted, OpsAdmin", "select": "NoRole" }, { "ayaType": "ServerState", "change": "OpsAdmin", "readFullRecord": "All", "select": "NoRole" }, { "ayaType": "ServiceRate", "change": "BizAdmin, Service, Accounting", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Service, Tech, Sales", "select": "All" }, { "ayaType": "TaskGroup", "change": "BizAdmin, Service", "readFullRecord": "All", "select": "All" }, { "ayaType": "TaxCode", "change": "BizAdmin, Accounting", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Service, Tech, Sales, SalesRestricted", "select": "All" }, { "ayaType": "Translation", "change": "BizAdmin", "readFullRecord": "BizAdminRestricted", "select": "All" }, { "ayaType": "TravelRate", "change": "BizAdmin, Service, Accounting", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Service, Tech, Sales", "select": "All" }, { "ayaType": "TrialSeeder", "change": "BizAdmin, OpsAdmin", "readFullRecord": "BizAdminRestricted, OpsAdminRestricted", "select": "NoRole" }, { "ayaType": "Unit", "change": "BizAdmin, Service, Accounting, Tech", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Sales, SalesRestricted", "select": "All" }, { "ayaType": "UnitMeterReading", "change": "BizAdmin, Service, Accounting, Tech", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Sales, SalesRestricted", "select": "All" }, { "ayaType": "UnitModel", "change": "BizAdmin, Service, Accounting", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Tech, Sales, SalesRestricted", "select": "All" }, { "ayaType": "User", "change": "BizAdmin", "readFullRecord": "BizAdminRestricted", "select": "All" }, { "ayaType": "UserOptions", "change": "BizAdmin", "readFullRecord": "BizAdminRestricted", "select": "NoRole" }, { "ayaType": "Vendor", "change": "BizAdmin, Service, Inventory, Accounting", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Tech, Sales, SalesRestricted", "select": "All" }, { "ayaType": "WorkOrder", "change": "BizAdmin, Service, Accounting, TechRestricted, Tech, SubContractorRestricted, SubContractor", "readFullRecord": "BizAdminRestricted, ServiceRestricted, TechRestricted, SubContractorRestricted, Sales, SalesRestricted", "select": "All" }, { "ayaType": "WorkOrderItem", "change": "BizAdmin, Service, Accounting, Tech", "readFullRecord": "BizAdminRestricted, ServiceRestricted, TechRestricted, SubContractorRestricted, Sales, SalesRestricted", "select": "All" }, { "ayaType": "WorkOrderItemExpense", "change": "BizAdmin, Service, Accounting, TechRestricted, Tech", "readFullRecord": "BizAdminRestricted, ServiceRestricted, TechRestricted, SubContractorRestricted, Sales, SalesRestricted", "select": "All" }, { "ayaType": "WorkOrderItemLabor", "change": "BizAdmin, Service, Accounting, TechRestricted, Tech, SubContractorRestricted, SubContractor", "readFullRecord": "BizAdminRestricted, ServiceRestricted, TechRestricted, SubContractorRestricted, Sales, SalesRestricted", "select": "All" }, { "ayaType": "WorkOrderItemLoan", "change": "BizAdmin, Service, Accounting, Tech", "readFullRecord": "BizAdminRestricted, ServiceRestricted, TechRestricted, SubContractor, Sales, SalesRestricted", "select": "All" }, { "ayaType": "WorkOrderItemOutsideService", "change": "BizAdmin, Service, Accounting, Tech", "readFullRecord": "BizAdminRestricted, ServiceRestricted, TechRestricted, Sales, SalesRestricted", "select": "All" }, { "ayaType": "WorkOrderItemPart", "change": "BizAdmin, Service, Accounting, Tech", "readFullRecord": "BizAdminRestricted, ServiceRestricted, TechRestricted, SubContractor, Sales, SalesRestricted", "select": "All" }, { "ayaType": "WorkOrderItemPartRequest", "change": "BizAdmin, Service, Accounting, Tech", "readFullRecord": "BizAdminRestricted, ServiceRestricted, TechRestricted, SubContractor, Sales, SalesRestricted", "select": "All" }, { "ayaType": "WorkOrderItemPriority", "change": "BizAdmin, Service, Accounting", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Tech, Sales, SalesRestricted", "select": "All" }, { "ayaType": "WorkOrderItemScheduledUser", "change": "BizAdmin, Service, Accounting, Tech", "readFullRecord": "BizAdminRestricted, ServiceRestricted, TechRestricted, SubContractorRestricted, SubContractor, Sales, SalesRestricted", "select": "All" }, { "ayaType": "WorkOrderItemStatus", "change": "BizAdmin, Service, Accounting", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Tech, Sales, SalesRestricted", "select": "All" }, { "ayaType": "WorkOrderItemTask", "change": "BizAdmin, Service, Accounting, TechRestricted, Tech, SubContractorRestricted, SubContractor", "readFullRecord": "BizAdminRestricted, ServiceRestricted, TechRestricted, SubContractorRestricted, Sales, SalesRestricted", "select": "All" }, { "ayaType": "WorkOrderItemTravel", "change": "BizAdmin, Service, Accounting, TechRestricted, Tech, SubContractorRestricted, SubContractor", "readFullRecord": "BizAdminRestricted, ServiceRestricted, TechRestricted, SubContractorRestricted, Sales, SalesRestricted", "select": "All" }, { "ayaType": "WorkOrderItemUnit", "change": "BizAdmin, Service, Accounting, Tech", "readFullRecord": "BizAdminRestricted, ServiceRestricted, TechRestricted, SubContractor, Sales, SalesRestricted", "select": "All" }, { "ayaType": "WorkOrderStatus", "change": "BizAdmin, Service, Accounting", "readFullRecord": "BizAdminRestricted, ServiceRestricted, Tech, Sales, SalesRestricted", "select": "All" } ] } } todo: validation errors not expanded in errorbox, for example saving a widget with same name results in proper display at name field but in error box says: Validation error ErrorAPI2200 I expect it to say the full errorapi2200 bit or simply "Validation error" or, maybe it's ok as is? todo: Attachments button should indicate attachments: Flags hasattachments status visually, do it! (Says add attachment when none) todo: going to need some default views for certain lists that come with AyaNova automatically (even if migrating) some lists may need a list of all but also a list of all relevant items only (part inventory?) Views that supply common tasks or functionality that was in v7 in another way perhaps need a case to consolidate that under or maybe add the views during development? todo: Look for english text at server and client source code and change it all to translation keys todo: Users / Contacts lists not reportable from main UI not using regular DataList for user lists and contact lists? currently not reportable as a list easily since not a GZDataList but could probably rectify that even without switching to datalist likely just a bit of code required to enable it todo: consider that a picklist could come in separate versions that are most appropriate to their area so a PO might show a different part list than a wo etc not sure if sustainable as the system just expects one picklist per ayatype, but it could be tied into the variant or maybe needs additional hint todo: PROBABLY NOT REQUIRED SEE BOTTOM LINE BELOW: missing feature, can't filter widgetlist by User due to no UserList being available Is this meant to be text only filter and we have no id filter system? How hard to add proper list selection and ID because it seems important? thoughts: I think it might be possible to do this, but may not be desireable to do this: Right now it assumes user is filtering by name which is useful and easy in some ways if it was by ID that's pretty specific and not necessarily better for the user it's better that they can select by click but it's limiting in that they can't type "Ford*" and get all items that start with "Ford " i.e. all Ford dealers but if they want a specific ford dealer they can type "Ford Nashville Center" or whatever and get that specfic one ## BOTTOM LINE: the text filter works perfectly even for filtering widgets by user name and you can do starts with etc so easy peasy, I don't see the need for this possible implementation: it appears that the server code filter criteria builder is built with this in mind (see below) so it may be a case of changing DataList field definitions like this one: FieldDefinitions.Add(new AyaDataListFieldDefinition { TKey = "WidgetName", FieldKey = "widgetname", AType = (int)AyaType.Widget, UiFieldDataType = (int)UiFieldDataType.Text, SqlIdColumnName = "awidget.id", SqlValueColumnName = "awidget.name", IsRowId = true }); to uiFieldDataType = InternalId instead and some fixup at the client datagrid to support that as a text view column. For now I'm going to leave it as is, it's not the end of the world to have to redefine it (though post release it might get ugly) Server:datalistsqlcriteriafilterbuilder: //prep for possible ID field filter instead string columnNameToFilter = string.Empty; UiFieldDataType DataTypeToFilter = UiFieldDataType.NoType; //Check if filtering by ID rather than by name //this is indicated by this column being an id type //and by the comparison operator being eq or neq //and the value being a number not a string if (DataListField.HasIdColumn() && IsPossibleIdValue && (opType == DataListFilterComparisonOperator.Equality || opType == DataListFilterComparisonOperator.NotEqual)) { columnNameToFilter = DataListField.SqlIdColumnName; DataTypeToFilter = UiFieldDataType.InternalId; } else { DataTypeToFilter = (UiFieldDataType)dataType; columnNameToFilter = DataListField.GetSqlValueColumnName(); } todo: VUE / VUETIFY ROADMAP RELEASES (Sept 23 2020 was put on hold as it appears vuetify is way behind so looking like post release but check again here) Q1 2021 is vuetify v3 https://vuetifyjs.com/en/introduction/roadmap/ look at what's coming on the radar before release in the big libs I'm using at front end as well, i.e. new vue or vuetify major release etc I would really like to release without a huge new migration looming over my head post release with potential breaking changes Vue 3.x is about ready now or very shortly: https://v3.vuejs.org/guide/migration/introduction.html#overview "The Composition API is purely additive and does not affect / deprecate any existing 2.x APIs. I" looks like I can switch to vue 3 without code changes, at least when it comes to composition api Vuetify 3.x is lagging way behind vue 3.x and doesn't appear to be even close so Put front end newification on hold until it all shakes out, looks like post release` todo: See if this has a use: as an aside there is a relative time formatter available which might be handy does locale aware things like "5 days ago" or "8 years from now" etc https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat todo: hide swagger logo and branding in api explorer Is this really that important? also, in the docs is a section specifically saying I should do something because I'm using newtonsoft json not microsoft built in https://github.com/domaindrivendev/Swashbuckle.AspNetCore#systemtextjson-stj-vs-newtonsoft https://github.com/domaindrivendev/Swashbuckle.AspNetCore todo: keycodes mirror common menu options like save close back etc Ok, half coded this then realized it would conflict with almost every browser and os combination plus whatever hotkey helper people have installed https://stackoverflow.com/questions/3329420/what-are-cross-browser-and-cross-os-safe-keyboard-shortcuts-usable-for-web-appli but, if I were to do it then this is how: https://github.com/jaywcjlove/hotkeys import hotkeys from "hotkeys-js"; //https://github.com/jaywcjlove/hotkeys/issues/115#issuecomment-654283151 Vue.prototype.$keys = hotkeys.noConflict(true); todo: can I support keycodes for saving in AyaNova and other shit that are the same as in v7 or as much as possible, i.e. ctrl-s to save (or whatever was defined) watch out the report editor uses a bunch of hotkeys pre-defined What v7 used to support: f1 - help, case (Keys.Alt | Keys.X) //Close form, alt-w new workorder, alt-m new pm workorder, alt-q new quote, alt-c new client, alt-u new unit, alt-p new part, ctrl-alt-g grid criteria for development, IMPORTANT / DO THIS: insert date and time (localized) as text anywhere with a key combo https://rockfish.ayanova.com/default.htm#!/rfcaseEdit/1514 todo: service workers for monaco going in root of website folder, must be a config setting to move it into the proper place (not there) couldn't find anything about it, may need to post to ask, it's not the end of the world but kind of stupid looking as all the rest of the js is in subfolder https://github.com/microsoft/monaco-editor-webpack-plugin/issues/126 awaiting reply, if nothing by the time I get here then delete and wait for email notification or if I care enough again to bother with it (cosmetic) todo: consider feature to set server to always use a pre-set browser locale settings and not the ones in the browse itself Scenario is user in another country but needs to login and work with central server? server - wide User specific YAGNI / TTM? todo: REPORTING bits and pieces - page breaks properly EXAMPLE NEEDED this is the current CSS property, not the one jsreport was using: https://developer.mozilla.org/en-US/docs/Web/CSS/break-before There are many options including ones for columns and some to prevent page breaks splitting up blocks.