@adaptabletools/adaptable 11.1.4 → 11.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/bundle.cjs.js +83 -83
  2. package/package.json +1 -1
  3. package/publishTimestamp.d.ts +1 -1
  4. package/publishTimestamp.js +1 -1
  5. package/src/Api/Implementation/InternalApiImpl.d.ts +4 -0
  6. package/src/Api/Implementation/InternalApiImpl.js +9 -0
  7. package/src/Api/Implementation/ThemeApiImpl.d.ts +1 -0
  8. package/src/Api/Implementation/ThemeApiImpl.js +3 -0
  9. package/src/Api/InternalApi.d.ts +4 -0
  10. package/src/Api/ThemeApi.d.ts +4 -0
  11. package/src/Strategy/AlertModule.js +1 -3
  12. package/src/Strategy/CalculatedColumnModule.js +1 -1
  13. package/src/Strategy/Utilities/getExportColumnsViewItems.js +1 -1
  14. package/src/Utilities/ExpressionFunctions/aggregatedBooleanExpressionFunctions.js +1 -1
  15. package/src/Utilities/ExpressionFunctions/observableExpressionFunctions.js +1 -1
  16. package/src/Utilities/Services/AlertService.d.ts +3 -3
  17. package/src/Utilities/Services/AlertService.js +6 -6
  18. package/src/Utilities/Services/CalculatedColumnExpressionService.d.ts +3 -3
  19. package/src/Utilities/Services/CalculatedColumnExpressionService.js +20 -20
  20. package/src/Utilities/Services/EntitlementService.d.ts +3 -3
  21. package/src/Utilities/Services/EntitlementService.js +12 -8
  22. package/src/Utilities/Services/Interface/IReportService.d.ts +1 -1
  23. package/src/Utilities/Services/MetamodelService.d.ts +3 -3
  24. package/src/Utilities/Services/MetamodelService.js +4 -4
  25. package/src/Utilities/Services/ModuleService.d.ts +3 -3
  26. package/src/Utilities/Services/ModuleService.js +12 -12
  27. package/src/Utilities/Services/QueryLanguageService.d.ts +3 -3
  28. package/src/Utilities/Services/QueryLanguageService.js +20 -19
  29. package/src/Utilities/Services/ReportService.d.ts +4 -4
  30. package/src/Utilities/Services/ReportService.js +50 -44
  31. package/src/Utilities/Services/TeamSharingService.d.ts +3 -3
  32. package/src/Utilities/Services/TeamSharingService.js +19 -16
  33. package/src/Utilities/Services/ValidationService.d.ts +3 -3
  34. package/src/Utilities/Services/ValidationService.js +19 -17
  35. package/src/View/Alert/Wizard/AlertBehaviourWizardSection.js +46 -9
  36. package/src/View/Alert/Wizard/AlertWizard.js +22 -24
  37. package/src/View/CalculatedColumn/Wizard/CalculatedColumnSettingsWizardSection.js +5 -5
  38. package/src/View/Components/AdaptableObjectList/AdaptableObjectList.js +3 -3
  39. package/src/View/DataChangeHistory/DataChangeHistoryPopup.js +1 -3
  40. package/src/View/GridInfo/AdaptableObjectsSummary.js +1 -1
  41. package/src/View/Wizard/OnePageAdaptableWizard.js +1 -1
  42. package/src/agGrid/Adaptable.js +9 -9
  43. package/src/components/StylePreview.js +2 -2
  44. package/src/metamodel/adaptable.metamodel.js +6 -0
  45. package/version.d.ts +1 -1
  46. package/version.js +1 -1
@@ -9,6 +9,39 @@ const CheckBox_1 = require("../../../components/CheckBox");
9
9
  const CodeBlock_1 = require("../../../components/CodeBlock");
10
10
  const rebass_1 = require("rebass");
11
11
  const ValueSelector_1 = require("../../Components/ValueSelector");
12
+ const StyleComponent_1 = require("../../Components/StyleComponent");
13
+ const DropdownButton_1 = tslib_1.__importDefault(require("../../../components/DropdownButton"));
14
+ const ObjectFactory_1 = tslib_1.__importDefault(require("../../../Utilities/ObjectFactory"));
15
+ const AdaptableContext_1 = require("../../AdaptableContext");
16
+ const StylePreview_1 = require("../../../components/StylePreview");
17
+ const HighlightStyle = (props) => {
18
+ const adaptable = AdaptableContext_1.useAdaptable();
19
+ const options = [
20
+ {
21
+ label: 'Use Message Type',
22
+ onClick: () => {
23
+ props.onChange(true);
24
+ },
25
+ },
26
+ {
27
+ label: 'Custom Style',
28
+ onClick: () => {
29
+ const initialStyle = ObjectFactory_1.default.CreateEmptyStyle();
30
+ props.onChange(initialStyle);
31
+ },
32
+ },
33
+ ];
34
+ return (React.createElement(React.Fragment, null,
35
+ React.createElement(rebass_1.Flex, null,
36
+ React.createElement(CheckBox_1.CheckBox, { mr: 2, style: { alignItems: 'flex-start' }, checked: Boolean(props.highlight), onChange: (checked) => {
37
+ props.onChange(checked);
38
+ } }, props.label),
39
+ Boolean(props.highlight) && (React.createElement(DropdownButton_1.default, { items: options }, typeof props.highlight === 'boolean' ? (React.createElement(rebass_1.Text, { fontSize: 2, mt: 1 }, "Use Message Type")) : (React.createElement(rebass_1.Text, { fontSize: 2, mt: 1 }, "Custom Style"))))),
40
+ typeof props.highlight === 'object' && (React.createElement(rebass_1.Box, { paddingLeft: 3 },
41
+ React.createElement(StyleComponent_1.StyleComponent, { headless: true, api: adaptable.api, Style: props.highlight, UpdateStyle: (style) => {
42
+ props.onChange(style);
43
+ } })))));
44
+ };
12
45
  // both used in wizard and list view
13
46
  exports.renderAlertBehaviourSummary = (alert, api, allowWrap = false) => {
14
47
  const { AlertProperties = {} } = alert;
@@ -31,7 +64,15 @@ exports.renderAlertBehaviourSummary = (alert, api, allowWrap = false) => {
31
64
  if (!values.length) {
32
65
  values.push({ label: 'No behaviour selected', id: 'none' });
33
66
  }
34
- return (React.createElement(ValueSelector_1.ValueOptionsTags, { allowWrap: allowWrap, options: values, value: values.map((v) => v.id), readOnly: true, toIdentifier: (x) => x.id, toLabel: (x) => React.createElement(React.Fragment, null, x.label) }));
67
+ return (React.createElement(ValueSelector_1.ValueOptionsTags, { allowWrap: allowWrap, options: values, value: values.map((v) => v.id), readOnly: true, toIdentifier: (x) => x.id, toLabel: (x) => {
68
+ if (x.id === 'highlightCell' && typeof AlertProperties.HighlightCell === 'object') {
69
+ return (React.createElement(StylePreview_1.StylePreview, { padding: 0, mt: 0, styleObject: AlertProperties.HighlightCell }, "Highlight Cell"));
70
+ }
71
+ if (x.id === 'highlightRow' && typeof AlertProperties.HighlightRow === 'object') {
72
+ return (React.createElement(StylePreview_1.StylePreview, { padding: 0, mt: 0, styleObject: AlertProperties.HighlightRow }, "Highlight Row"));
73
+ }
74
+ return React.createElement(React.Fragment, null, x.label);
75
+ } }));
35
76
  };
36
77
  exports.AlertBehaviourWizardSection = (props) => {
37
78
  const { data, api } = OnePageAdaptableWizard_1.useOnePageWizardContext();
@@ -52,16 +93,12 @@ exports.AlertBehaviourWizardSection = (props) => {
52
93
  } },
53
94
  "Prevent Cell Edit",
54
95
  React.createElement(rebass_1.Text, { fontSize: 2, mt: 1 }, "(automatically undo data change which triggered Alert)"))),
55
- cellChangedAlert && (React.createElement(CheckBox_1.CheckBox, { style: { alignItems: 'flex-start' }, checked: Boolean(AlertProperties.HighlightCell), onChange: (HighlightCell) => {
96
+ cellChangedAlert && (React.createElement(HighlightStyle, { highlight: AlertProperties.HighlightCell, label: "Highlight Cell", onChange: (HighlightCell) => {
56
97
  onChange({ HighlightCell });
57
- } },
58
- "Highlight Cell",
59
- React.createElement(rebass_1.Text, { fontSize: 2, mt: 1 }, "(using the Alert message type)"))),
60
- rowAddedAlert && (React.createElement(CheckBox_1.CheckBox, { style: { alignItems: 'flex-start' }, checked: Boolean(AlertProperties.HighlightRow), onChange: (HighlightRow) => {
98
+ } })),
99
+ rowAddedAlert && (React.createElement(HighlightStyle, { highlight: AlertProperties.HighlightRow, label: "Highlight Row", onChange: (HighlightRow) => {
61
100
  onChange({ HighlightRow });
62
- } },
63
- "Highlight Row",
64
- React.createElement(rebass_1.Text, { fontSize: 2, mt: 1 }, "(using the Alert message type)"))),
101
+ } })),
65
102
  cellChangedAlert && (React.createElement(CheckBox_1.CheckBox, { checked: AlertProperties.JumpToCell, onChange: (JumpToCell) => {
66
103
  onChange({ JumpToCell });
67
104
  } }, "Jump To Cell")),
@@ -78,7 +78,7 @@ exports.AlertWizard = (props) => {
78
78
  };
79
79
  if (alertDefinition.AlertForm && typeof alertDefinition.AlertForm !== 'string') {
80
80
  const alertButtons = (_a = alertDefinition.AlertForm) === null || _a === void 0 ? void 0 : _a.Buttons;
81
- alertButtons.forEach((alertButton) => {
81
+ alertButtons === null || alertButtons === void 0 ? void 0 : alertButtons.forEach((alertButton) => {
82
82
  const alertAction = alertButton.Action;
83
83
  if (Array.isArray(alertAction)) {
84
84
  alertButton.Action = alertAction
@@ -89,29 +89,27 @@ exports.AlertWizard = (props) => {
89
89
  alertButton.Action = mapValidButtonActions(alertAction);
90
90
  }
91
91
  });
92
- // map Alert Properties(Behaviour)
93
- if (isCellChangeAlert) {
94
- alertDefinition.AlertProperties.HighlightCell =
95
- alertDefinition.AlertProperties.HighlightRow;
96
- delete alertDefinition.AlertProperties.HighlightRow;
97
- alertDefinition.AlertProperties.JumpToCell = alertDefinition.AlertProperties.JumpToRow;
98
- delete alertDefinition.AlertProperties.JumpToRow;
99
- }
100
- if (isAddedRowChangeAlert) {
101
- alertDefinition.AlertProperties.HighlightRow =
102
- alertDefinition.AlertProperties.HighlightCell;
103
- delete alertDefinition.AlertProperties.HighlightCell;
104
- alertDefinition.AlertProperties.JumpToRow = alertDefinition.AlertProperties.JumpToCell;
105
- delete alertDefinition.AlertProperties.JumpToCell;
106
- delete alertDefinition.AlertProperties.PreventEdit;
107
- }
108
- if (isRemovedRowChangeAlert) {
109
- delete alertDefinition.AlertProperties.PreventEdit;
110
- delete alertDefinition.AlertProperties.HighlightRow;
111
- delete alertDefinition.AlertProperties.JumpToRow;
112
- delete alertDefinition.AlertProperties.HighlightCell;
113
- delete alertDefinition.AlertProperties.JumpToCell;
114
- }
92
+ }
93
+ // map Alert Properties(Behaviour)
94
+ if (isCellChangeAlert) {
95
+ alertDefinition.AlertProperties.HighlightCell = alertDefinition.AlertProperties.HighlightRow;
96
+ delete alertDefinition.AlertProperties.HighlightRow;
97
+ alertDefinition.AlertProperties.JumpToCell = alertDefinition.AlertProperties.JumpToRow;
98
+ delete alertDefinition.AlertProperties.JumpToRow;
99
+ }
100
+ if (isAddedRowChangeAlert) {
101
+ alertDefinition.AlertProperties.HighlightRow = alertDefinition.AlertProperties.HighlightCell;
102
+ delete alertDefinition.AlertProperties.HighlightCell;
103
+ alertDefinition.AlertProperties.JumpToRow = alertDefinition.AlertProperties.JumpToCell;
104
+ delete alertDefinition.AlertProperties.JumpToCell;
105
+ delete alertDefinition.AlertProperties.PreventEdit;
106
+ }
107
+ if (isRemovedRowChangeAlert) {
108
+ delete alertDefinition.AlertProperties.PreventEdit;
109
+ delete alertDefinition.AlertProperties.HighlightRow;
110
+ delete alertDefinition.AlertProperties.JumpToRow;
111
+ delete alertDefinition.AlertProperties.HighlightCell;
112
+ delete alertDefinition.AlertProperties.JumpToCell;
115
113
  }
116
114
  setAlertDefinition(alertDefinition);
117
115
  };
@@ -90,15 +90,15 @@ exports.CalculatedColumnSettingsWizardSection = (props) => {
90
90
  React.createElement(rebass_1.Flex, { flexDirection: "row" },
91
91
  React.createElement(FormLayout_1.default, null,
92
92
  React.createElement(FormLayout_1.FormRow, { label: "Id" },
93
- React.createElement(Input_1.default, { value: data.ColumnId || '', width: 300, autoFocus: !inEdit, disabled: inEdit, type: "text", placeholder: "Enter an Id for the column", onChange: handleColumnIdChange })),
93
+ React.createElement(Input_1.default, { "data-name": "column-id", value: data.ColumnId || '', width: 300, autoFocus: !inEdit, disabled: inEdit, type: "text", placeholder: "Enter an Id for the column", onChange: handleColumnIdChange })),
94
94
  React.createElement(FormLayout_1.FormRow, { label: "Name" },
95
- React.createElement(Input_1.default, { autoFocus: inEdit, onFocus: () => {
95
+ React.createElement(Input_1.default, { "data-name": "column-name", autoFocus: inEdit, onFocus: () => {
96
96
  setColumnNameFocused(true);
97
97
  }, onBlur: () => {
98
98
  setColumnNameFocused(false);
99
99
  }, value: ColumnNameFocused ? ColumnName || '' : ColumnName || ColumnId || '', width: 300, type: "text", placeholder: "Enter column name", onChange: handleColumnNameChange })),
100
100
  React.createElement(FormLayout_1.FormRow, { label: "Type" },
101
- React.createElement(DropdownButton_1.default, { style: {
101
+ React.createElement(DropdownButton_1.default, { "data-name": "column-type", style: {
102
102
  width: '300px',
103
103
  whiteSpace: 'normal',
104
104
  overflow: 'hidden',
@@ -109,11 +109,11 @@ exports.CalculatedColumnSettingsWizardSection = (props) => {
109
109
  onClick: () => handleDataTypeChange(item.value),
110
110
  })) }, dataType ? dataType : 'Select Data Type')),
111
111
  React.createElement(FormLayout_1.FormRow, { label: "Width" },
112
- React.createElement(Input_1.default, { type: "number", width: 300, value: Width || '', onChange: (e) => handleSpecialColumnSettingsChange({
112
+ React.createElement(Input_1.default, { "data-name": "column-width", type: "number", width: 300, value: Width || '', onChange: (e) => handleSpecialColumnSettingsChange({
113
113
  Width: Number(e.target.value),
114
114
  }) })),
115
115
  React.createElement(FormLayout_1.FormRow, { label: "" },
116
- React.createElement(CheckBox_1.CheckBox, { onChange: (checked) => handleSpecialColumnSettingsChange({ ShowToolTip: checked }), checked: ShowToolTip }, "Show Expression as Tooltip")))))),
116
+ React.createElement(CheckBox_1.CheckBox, { "data-name": "column-show-tooltip", onChange: (checked) => handleSpecialColumnSettingsChange({ ShowToolTip: checked }), checked: ShowToolTip }, "Show Expression as Tooltip")))))),
117
117
  ErrorMessage ? React.createElement(ErrorBox_1.default, { marginTop: 2 }, ErrorMessage) : null,
118
118
  React.createElement(SpecialColumnSettingsWizardStep_1.SpecialColumnSettingsWizardStep, { isEditable: false, settings: data.CalculatedColumnSettings, onChange: handleSpecialColumnSettingsChange })));
119
119
  };
@@ -17,7 +17,7 @@ const SuspendToggleButton_1 = require("../Buttons/SuspendToggleButton/SuspendTog
17
17
  const ValueSelector_1 = require("../ValueSelector");
18
18
  const ICON_SIZE = 26;
19
19
  exports.AdaptableObjectListItem = (props) => {
20
- var _a, _b, _c, _d, _e, _f, _g;
20
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
21
21
  const adaptable = AdaptableContext_1.useAdaptable();
22
22
  const dispatch = react_redux_1.useDispatch();
23
23
  const [isEditWizardVisible, setIsEditWizardVisible] = React.useState(false);
@@ -56,8 +56,8 @@ exports.AdaptableObjectListItem = (props) => {
56
56
  });
57
57
  });
58
58
  const isEditDisabled = !Boolean(EditWizard || viewOptions.onOpenEditPopup);
59
- return (React.createElement(rebass_1.Flex, { as: "li", mb: 3, className: itemClassName },
60
- React.createElement(rebass_1.Box, { flex: 1, className: `${baseClassName}__rows` }, (_g = props.data.items) === null || _g === void 0 ? void 0 : _g.map((tag, index) => {
59
+ return (React.createElement(rebass_1.Flex, { "data-name": "adaptable-object-list-item", "data-value": props.data.abObject.Uuid, as: "li", mb: 3, className: itemClassName },
60
+ React.createElement(rebass_1.Box, { flex: 1, className: `${baseClassName}__rows` }, (_j = (_h = (_g = props.data.items).filter) === null || _h === void 0 ? void 0 : _h.call(_g, Boolean)) === null || _j === void 0 ? void 0 : _j.map((tag, index) => {
61
61
  var _a;
62
62
  return (React.createElement(rebass_1.Flex, { "data-name": tag.name, key: index, mb: 2, className: `${baseClassName}__row` },
63
63
  React.createElement(rebass_1.Box, { className: `${baseClassName}__label`, mr: 3 },
@@ -53,9 +53,7 @@ class DataChangeHistoryPopupComponent extends React.Component {
53
53
  this.props.api.dataChangeHistoryApi.undoDataChangeHistoryEntry(changeToBeUndone);
54
54
  }
55
55
  };
56
- const currentAgGridTheme = this.props.api.internalApi
57
- .getAdaptableInstance()
58
- .getAgGridCurrentThemeName();
56
+ const currentAgGridTheme = this.props.api.themeApi.getAgGridCurrentThemeName();
59
57
  return (React.createElement(PopupPanel_1.PopupPanel, { headerText: this.props.moduleInfo.FriendlyName, glyphicon: this.props.moduleInfo.Glyph, infoLink: this.props.moduleInfo.HelpPage, infoLinkDisabled: !this.props.api.internalApi.isDocumentationLinksDisplayed() },
60
58
  React.createElement(rebass_1.Flex, { className: "ab-DataChangeHistoryPopup", flexDirection: "column", style: { height: '100%' } },
61
59
  React.createElement(rebass_1.Flex, { style: {
@@ -19,7 +19,7 @@ exports.AdaptableObjectsSummary = () => {
19
19
  if (!(items === null || items === void 0 ? void 0 : items.length)) {
20
20
  return null;
21
21
  }
22
- return (React.createElement("div", null,
22
+ return (React.createElement("div", { key: module.moduleInfo.ModuleName },
23
23
  React.createElement("b", null, module.moduleInfo.FriendlyName),
24
24
  (items === null || items === void 0 ? void 0 : items.length) && React.createElement(AdaptableObjectList_1.AdaptableObjectList, { items: items, module: module })));
25
25
  })));
@@ -162,7 +162,7 @@ exports.OnePageAdaptableWizard = (props) => {
162
162
  navIndexMap.set(navIndex, index);
163
163
  const active = index === currentSection;
164
164
  const disabled = false; //!active && !currentSectionValid;
165
- return (React.createElement(rebass_1.Flex, { className: "ab-OnePageWizard__section-title", flexDirection: "row", style: {
165
+ return (React.createElement(rebass_1.Flex, { className: "ab-OnePageWizard__section-title", "data-name": section.title, flexDirection: "row", style: {
166
166
  cursor: disabled ? 'auto' : 'pointer',
167
167
  zIndex: 10,
168
168
  transition: 'color 0.2s',
@@ -344,15 +344,15 @@ class Adaptable {
344
344
  this.initStore();
345
345
  // create the services
346
346
  this.LicenseService = this.initLicenseService();
347
- this.ValidationService = new ValidationService_1.ValidationService(this);
348
- this.ReportService = new ReportService_1.ReportService(this);
349
- this.ModuleService = new ModuleService_1.ModuleService(this);
350
- this.CalculatedColumnExpressionService = new CalculatedColumnExpressionService_1.CalculatedColumnExpressionService(this);
351
- this.EntitlementService = new EntitlementService_1.EntitlementService(this);
352
- this.QueryLanguageService = new QueryLanguageService_1.QueryLanguageService(this);
353
- this.AlertService = new AlertService_1.AlertService(this);
354
- this.TeamSharingService = new TeamSharingService_1.TeamSharingService(this);
355
- this.MetamodelService = new MetamodelService_1.MetamodelService(this);
347
+ this.ValidationService = new ValidationService_1.ValidationService(this.api);
348
+ this.ReportService = new ReportService_1.ReportService(this.api);
349
+ this.ModuleService = new ModuleService_1.ModuleService(this.api);
350
+ this.CalculatedColumnExpressionService = new CalculatedColumnExpressionService_1.CalculatedColumnExpressionService(this.api);
351
+ this.EntitlementService = new EntitlementService_1.EntitlementService(this.api);
352
+ this.QueryLanguageService = new QueryLanguageService_1.QueryLanguageService(this.api);
353
+ this.AlertService = new AlertService_1.AlertService(this.api);
354
+ this.TeamSharingService = new TeamSharingService_1.TeamSharingService(this.api);
355
+ this.MetamodelService = new MetamodelService_1.MetamodelService(this.api);
356
356
  this.forPlugins((plugin) => plugin.afterInitServices(this));
357
357
  // Set up Modules - we set up all the Modules suitable for AG Grid
358
358
  // But users can make some hidden or readonly in their entitlements
@@ -6,6 +6,6 @@ const React = tslib_1.__importStar(require("react"));
6
6
  const rebass_1 = require("rebass");
7
7
  const StyleHelper_1 = require("../Utilities/Helpers/StyleHelper");
8
8
  exports.StylePreview = (props) => {
9
- var _a;
10
- return (React.createElement(rebass_1.Box, Object.assign({}, props, { padding: 2, mt: 2, style: Object.assign(Object.assign({}, StyleHelper_1.toStyle(props.styleObject)), props.style) }), (_a = props.children) !== null && _a !== void 0 ? _a : 'Preview result'));
9
+ var _a, _b, _c;
10
+ return (React.createElement(rebass_1.Box, Object.assign({}, props, { padding: (_a = props.padding) !== null && _a !== void 0 ? _a : 2, mt: (_b = props.mt) !== null && _b !== void 0 ? _b : 2, style: Object.assign(Object.assign({}, StyleHelper_1.toStyle(props.styleObject)), props.style) }), (_c = props.children) !== null && _c !== void 0 ? _c : 'Preview result'));
11
11
  };
@@ -11070,6 +11070,12 @@ exports.ADAPTABLE_METAMODEL = {
11070
11070
  "description": "Applies the Current Theme",
11071
11071
  "uiLabel": "Apply Current Theme"
11072
11072
  },
11073
+ {
11074
+ "name": "getAgGridCurrentThemeName",
11075
+ "kind": "function",
11076
+ "description": "Get the name of the current AG Grid theme",
11077
+ "uiLabel": "Get Ag Grid Current Theme Name"
11078
+ },
11073
11079
  {
11074
11080
  "name": "getAllSystemTheme",
11075
11081
  "kind": "function",
package/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- declare const _default: "11.1.4";
1
+ declare const _default: "11.1.5";
2
2
  export default _default;
package/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = '11.1.4'; // PLEASE DONT UPDATE THIS!!! - will be updated at build time with the correct version
3
+ exports.default = '11.1.5'; // PLEASE DONT UPDATE THIS!!! - will be updated at build time with the correct version