January 2020 Archives

Today is a day of changes. Today marks the day that the UK will leave the European Union. It is also a day of changes for me personally as I finished up my final day of contracting. To mark the day that the UK leaves the European Union (Brexit), the Mayor of London has advertised various #LondonIsOpen messages across the city of London. The UK will leave tonight at 11:00pm. On the London Underground, I noticed that the displays were updated to mark "London Is Open, today and always". This advertising reminds me of the Valentine's Day and other promotions that the railway had done in the past when station names were changed to celebrate the day.  

london-is-open.jpg

Contracting. I could have stayed in contracting longer, but I was only guaranteed short extensions. I'm not sure if I would have been in this contract in March, so it was time to leave. While I thoroughly enjoyed my time contracting, I will not miss the long hours and short extensions that I have had for the majority. I will not miss having to cancel travel plans because of project deadlines changing or not knowing if I would be in a contract in order to make plans. For many others that I know, contracting offers flexible working and similar treatment to permanent employees instead of a resource; however, I found myself in quite busy and time-intensive/demanding contracts with short extensions and told to cancel my travel plans for my milestone birthday or simply fearful of making travel plans because the one time that I did have plans due at the end of the contract, it made finding the next contract difficult.

together-we-can.jpg

My big news is that I am starting a permanent job, and I am hoping that this will be an end to the lack of stability, overworking, and lack of time off that the past five years provided me with. It's also the right time to go because of new legislation being passed in the next couple of months around contractors. I'm not sure what traction that it will have, but that was not the reason that I personally have decided to stop contracting. I am hoping that everything works out well and that I can now start to make plans. 

In addition to the above, the house renovation work has been completed a little over a week ago now; there's still a bit of snagging to do, and I am in the middle of moving/unpacking boxes and deep-cleaning. This is going to take awhile to sort everything out since I am working full time and do not have a break between.

I hope that everything continues to go well. And remember: London Is Open!

| No Comments | No TrackBacks

Decimal Separator Format

Depending on the user (or location if null in user), the user can have numbers displayed in the formats 100,00 or 100.00 (1.000,00 or 1000.00 with the comma separator used in the one format). Users should be able to enter a decimal symbol as a comma or as a fullstop/period in the inputs. In every place where we do anything with numbers, we must do the following to ensure Javascript can correctly handle numbers:

Call the following method. This will check if the user/location format and if the user uses the comma-decimal-format, the code will remove all the '.' (thousand separator symbols) and replace the ',' character with a fullstop/period symbol. Javascript only knows the universal format for numbers, eg, 100.00 or 1000.00.

number = dispatch(convertToGlobalNumberFormat(number));

After doing the above, you can do your calculations but you must achieve the following, which will convert the number to the localised string. (We use de-DE for the correct format expected.) This method takes the number, precision (number of decimal places to show) and an optional isRaw boolean, which avoids the rounding and shows the number as is.

dispatch(formatDecimalByLocale(number, precision));

Date Format

The user has a date format set; if it is null, it will use the location or DD-MM-YYY as the ultimate fallback. The date components and displays must always obtain the date format and show accordingly.

Generic String Replacement

General rule for replacement characters in strings is this:

Any text that will be automatically generated or require other logic (such as a link with clickable text) will use the replacement characters starting with {0} and then incremented.

Use the function to replace the generated text in the brackets: genericStringReplacement(message, values). Message is the message and values are an array of strings based on the replacement characters.

"Page {0} of {1}"
"Cannot find the record. {0} to search."

In the above examples, the full message in quotes will be passed along with the values ["1", "10"], or simply ["click here"] which would be generated automatically or manually, given the scenario.

Editing a Transaction

A user is able to open a draft in edit mode and then re-save t. (The draft can be re-saved as a draft or as a transaction, updating the status to complete.) A user can also do a rebill.

window.StockControl.Constants.routeTransaction + "?id=" + transactionID + "&status=edit";

Clicking a draft form will pre-populate the values in edit mode. The transaction ID and action (draft/rebill) will be passed to the page. There will be a security check against the logged-in user to verify that they are able to edit the transaction based on their location. If they are not permitted to edit the draft, they will be redirected to error page.

There is also security in place to prevent the user editing a transaction that is not a draft status. The details and the transaction page will look at the transaction ID and determine if the transaction is editable. The status of the transaction will enable the transaction to be displayed in either the details page or the draft form.

If the draft they are editing is a Receipt transaction, note that they will be unable to click onto the 'split delivery' checkbox. They will just have the one receiving device field (which may be pre-populated if they have entered these details).

If editing a draft and the data does not exist, the user will be redirected to an error page.

The DRN validation still applies. If the fields have not been changed and the item is a DRAFT, the validation on this will not be completed again. (The date and timestamp will match the transaction unique id in order to pass the validation.)

If doing a Contra, the transaction will have the status updated to cancelled. If doing a Contra & Rebill, the original transaction will be cancelled and a new one will be duplicated with Contra status and open in form mode. The user can update the values (or click rebill to edit at any time) and upon saving, it will save the transaction. It keeps the DRN the same and updates the status.

So editing a transaction will take a status of rebill or draft. If user manually changes status, it will check that the status action is allowed (if a draft, it must be edit)

SAML POST form API call

Since SAML has been integrated, there are added extra OOTB security on AEM to verify the user token and to pass it in the header. Instead of using fetch, developers should use XHR as below to complete the call. The first step is to get the token in AEM.

if (window.StockControl.Constants.isAEM) { //if AEM....
let xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
let msg = JSON.parse(xhr.responseText);
token = msg.token;
self.sendArchiveRequest(fileid, token, target);
}
};
// Open the request to the token endpoint and send the GET
xhr.open("GET", "/libs/granite/csrf/token.json", true); //path to obtain token in AEM
xhr.send();
}

After getting the token, set up your POST to your endpoint and pass the token.

let xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
//test the JSON.parse(xhr.responseText) is not an error and place in here what you want to happen after the call
}
};
xhr.open("POST", endpointURL, true);
if (token !== null) {
xhr.setRequestHeader("CSRF-Token", token);
}
xhr.send(JSON.stringify(archivePostData)); //must stringify Json or send as . FormData object

SAML required headers for user API

The headers must be set in the fetchUser API for older or out-dated browsers. Otherwise, it will not use the correct credentials headers. Please set the below in curly brackets.

fetch(endpointURL, { cache: "no-cache", credentials: 'same-origin' } )

If the call needs some access to admin page or AEM nodes, it needs to pass the credentials if you want to access via localhost.

fetch(endpointURL, { cache: "no-cache", credentials: 'includes' } )

| No Comments | No TrackBacks
 
import React, {Component} from "react";
import {connect} from "react-redux";
import {bindActionCreators} from 'redux';

import Section from "../layout/Section";
import CheckboxInline from "../form/CheckboxInline";
import DateTimePicker from "../form/DateTimePicker";
import Input from "../form/Input";
import Select from "../form/Select";
import TextArea from "../form/TextArea";
import ReviewPanelReceipt from "../form/ReviewPanelReceipt";
import Actions from "../form/Actions";
import InputWithSelect from "../form/InputWithSelect";
import Alert from "../form/Alert";
import Checkbox from "../form/Checkbox";
import ReceivingDeviceList from "../form/ReceivingDeviceList";
import DocumentsList from "../ui/DocumentsList";
import Modal from "../form/Modal";
import 'bootstrap/js/dist/modal';
import 'bootstrap/scss/bootstrap.scss';
import Toast from "../form/Toast";

import handleSelectChange from '../../store/actions/handleSelectChange';
import handleInputChange from '../../store/actions/handleInputChange';
import handleInputFocus from '../../store/actions/handleInputFocus';
import handleInputBlur from '../../store/actions/handleInputBlur';
import handleInputKeyPress from '../../store/actions/handleInputKeyPress';
import handleSelectBlur from '../../store/actions/handleSelectBlur';
import handleTextAreaChange from '../../store/actions/handleTextAreaChange';
import handleCheckboxChange from '../../store/actions/handleCheckboxChange';
import handleDateChange from '../../store/actions/handleDateChange';
import handleModalClose from '../../store/actions/handleModalClose';
import handleDocumentTypeChange from '../../store/actions/handleDocumentTypeChange';
import handleAddDocumentClick from '../../store/actions/handleAddDocumentClick';
import handleRemove from '../../store/actions/handleRemove';
import handleDocumentFileInputChange from '../../store/actions/handleDocumentFileInputChange';
import handleButtonClick from '../../store/actions/handleButtonClick';
import handleResetDocumentList from '../../store/actions/handleResetDocumentList';
import showInvalidTimeModal from '../../store/actions/showInvalidTimeModal';
import validateStartTime from '../../store/actions/validateStartTime';
import validateEndTime from '../../store/actions/validateEndTime';
import selectHasError from '../../store/actions/selectHasError';
import determineDensityOrTemperatureHelpText from '../../store/actions/determineDensityOrTemperatureHelpText';
import isDensityStockControlValid from '../../store/actions/isDensityStockControlValid';
import getInitialDate from '../../store/actions/getInitialDate'
import genericStringReplacement from '../../store/actions/genericStringReplacement';
import determineDensityValidationRule from '../../store/actions/determineDensityValidationRule';
import stringReplacement from '../../store/actions/stringReplacement';
import addDevice from '../../store/actions/addDevice';
import removeDevice from '../../store/actions/removeDevice';
import sortArray from "../../store/actions/sortArray";
import convertToGlobalNumberFormat from "../../store/actions/convertToGlobalNumberFormat";
import formatDecimalByLocale from "../../store/actions/formatDecimalByLocale";

class Receipt extends Component {
constructor(props){
super(props);
this.state = {
};
this.handleButtonClick.bind(this);
}

componentWillMount(){

console.log('-------receivingDeviceOptions', this.props.receivingDeviceOptions)
console.log('-------location', this.props.location)

const {
documentTypeData,
UOM,
densityUOM_ID,
volumeUOM_ID,
weightUOM_ID,
tempUOM_ID,
receivingDeviceOptions,
documentListOptions
} = this.props;

var volumeUOMOptions = [], tempratureUOMOptions = [], densityUOMOptions = [], weightUOMOptions = [];

// documentTypeData.map((documentList)=>{
// return(
// documentListOptions.push({
// value: documentList.Document_Type_Code,
// label: documentList.Document_Type_Name
// })
// )
// });

console.log('-------this.props.loadedTransaction', this.props.loadedTransaction)

console.log('-------uom', this.props.UOM)

console.log('-------densityUOM_ID', densityUOM_ID)
console.log('-------receivingDeviceOptions', receivingDeviceOptions)

// Building UOM Options for Advised Receipt Section and push location default option to the top

UOM.map((uom)=> {
let loadedTransaction = this.props.loadedTransaction;

switch (uom.UOM_Type) {
case "Volume":
// Push the location DUOM Option to the Top and make it default
if(volumeUOM_ID === uom.UOM_Id && uom.Is_Active){
volumeUOMOptions.unshift({
value: uom.UOM_Code,
label: uom.UOM_Code,
});
this.setState({
selectedVolumeUom: uom.UOM_Code
});
} else {
volumeUOMOptions.push({
value: uom.UOM_Code,
label: uom.UOM_Code,
});
}
if (loadedTransaction !== null) {
this.setState({
selectedVolumeUom: loadedTransaction['Adv_Quantity_UOM']
});
}
break;

case "Temperature":
if(tempUOM_ID === uom.UOM_Id && uom.Is_Active){

tempratureUOMOptions.unshift({
value: uom.UOM_Code,
label: uom.UOM_Code
});
this.setState({
selctedTempUom: uom.UOM_Code
});
} else {
tempratureUOMOptions.push({
value: uom.UOM_Code,
label: uom.UOM_Code
});
}

if (loadedTransaction !== null) {
this.setState({
selctedTempUom: loadedTransaction['Adv_Temperature_UOM']
});
}
break;

case "Density":
if(densityUOM_ID === uom.UOM_Id && uom.Is_Active){
densityUOMOptions.unshift({
value: uom.UOM_Code,
label: uom.UOM_Code
});

this.setState({
selectedDensityUom: uom.UOM_Code
});
} else {
densityUOMOptions.push({
value: uom.UOM_Code,
label: uom.UOM_Code
});
}
if (loadedTransaction !== null) {
this.setState({
selectedDensityUom: loadedTransaction['Adv_Density_UOM']
});
}
break;

case "Weight":
if(weightUOM_ID === uom.UOM_Id && uom.Is_Active){
weightUOMOptions.unshift({
value: uom.UOM_Code,
label: uom.UOM_Code
});

this.setState({
selectedWeightUom: uom.UOM_Code
});
} else {
weightUOMOptions.push({
value: uom.UOM_Code,
label: uom.UOM_Code
});
}
if (loadedTransaction !== null) {
this.setState({
selectedWeightUom: loadedTransaction['Adv_Weight_UOM']
});
}
break;
default:
}
return true;
}
);


volumeUOMOptions = this.sortUomArray(volumeUOMOptions);
weightUOMOptions = this.sortUomArray(weightUOMOptions);
tempratureUOMOptions = this.sortUomArray(tempratureUOMOptions);
densityUOMOptions = this.sortUomArray(densityUOMOptions);

this.setState({
volumeUOMOptions : volumeUOMOptions,
tempratureUOMOptions : tempratureUOMOptions,
densityUOMOptions : densityUOMOptions,
weightUOMOptions : weightUOMOptions,
// documentListOptions: documentListOptions,
ambientVolumeDUOM_select: this.props.volumeUOM_Code,
standardVolumeDUOM_select: this.props.volumeUOM_Code,
//deviceList : deviceList,
initialVolumeUOM : this.props['ambientVolumeDUOM_select'] || volumeUOMOptions[0]
});
}


sortUomArray = (arrayObj) => {
arrayObj.sort(function(a, b){
let aLabel = a.label;
let bLabel = b.label;

if (aLabel !== undefined) {
aLabel = aLabel.toLowerCase();
}

if (bLabel !== undefined) {
bLabel = bLabel.toLowerCase();
}

if(aLabel < bLabel) { return -1; }
if(aLabel > bLabel) { return 1; }
return 0;
});
return arrayObj;
};

isBUOMApplicable = () => {
const {initialVolumeUOM} = this.state;
const loadedTransaction = this.props.loadedTransaction;

if(initialVolumeUOM.value === this.props.volumeUOM_Code){
if(this.props['ambientVolumeDUOM_select'] !== undefined || this.props['standardVolumeDUOM_select'] !== undefined){
if(this.props['ambientVolumeDUOM_select'] === this.props.volumeUOM_Code || this.props['standardVolumeDUOM_select'] === this.props.volumeUOM_Code){
return false;
} else {
return true;
}
} else {
return false;
}
} else {
if (loadedTransaction !== null) {
if(this.props['ambientVolumeDUOM_select'] !== undefined || this.props['standardVolumeDUOM_select'] !== undefined){
if(this.props['ambientVolumeDUOM_select'] === this.props.volumeUOM_Code || this.props['standardVolumeDUOM_select'] === this.props.volumeUOM_Code){
return false;
} else {
return true;
}
} else {
return false;
}
} else {
return true;
}
}
}

showBUOM(name, val){
let dUOM = this.props[name];
const volumeUOM_Code = this.props.volumeUOM_Code;
const volumeUOM_DUOM = this.props.ambientVolumeDUOM_select;

if (volumeUOM_DUOM === '' ) {
dUOM = volumeUOM_Code;
}
if(dUOM !== volumeUOM_Code) {
return true;
} else {
return false;
}
}

showTransLossGain(){
const {measurementMethod, modeOfTransport, ambientVolumeBUOM, standardVolumeBUOM, totalAmbientVolume, documentListOptions} = this.props;

let ambientVolumeBUOMStr = ambientVolumeBUOM.toString();
let standardVolumeBUOMStr = standardVolumeBUOM.toString();

ambientVolumeBUOMStr = this.props.convertToGlobalNumberFormat(ambientVolumeBUOMStr);
ambientVolumeBUOMStr = parseFloat(ambientVolumeBUOMStr);

standardVolumeBUOMStr = this.props.convertToGlobalNumberFormat(standardVolumeBUOMStr);
standardVolumeBUOMStr = parseFloat(standardVolumeBUOMStr);

if((measurementMethod !== "" && modeOfTransport !== "") && ((ambientVolumeBUOMStr !== "" && !isNaN(ambientVolumeBUOMStr))|| (standardVolumeBUOMStr !== "" && !isNaN(standardVolumeBUOMStr))) && (totalAmbientVolume !== "")){
return true;
} else {
return false;
}
}

// Calculate Ambient Volume for transportation loss and gain
calcTransAmbVol(){
const {totalAmbientVolume, ambientVolumeBUOM, volumePrecision} = this.props;
let ambientVolumeBUOMVal = ambientVolumeBUOM;
let totalAmbientVolumeVal = totalAmbientVolume;
ambientVolumeBUOMVal = this.props.convertToGlobalNumberFormat(ambientVolumeBUOMVal);
totalAmbientVolumeVal = this.props.convertToGlobalNumberFormat(totalAmbientVolume);
totalAmbientVolumeVal = parseFloat(totalAmbientVolumeVal) - parseFloat(ambientVolumeBUOMVal);
return this.props.formatDecimalByLocale(totalAmbientVolumeVal, volumePrecision);
}


// Calculate Standard Volume for transportation loss and gain
calcTransStdVol() {
const {totalStandardVolume, standardVolumeBUOM, volumePrecision} = this.props;
let standardVolumeBUOMVal = standardVolumeBUOM;
let totalStandardVolumeVal = totalStandardVolume;
standardVolumeBUOMVal = this.props.convertToGlobalNumberFormat(standardVolumeBUOMVal);
totalStandardVolumeVal = this.props.convertToGlobalNumberFormat(totalStandardVolume);
totalStandardVolumeVal = parseFloat(totalStandardVolumeVal) - parseFloat(standardVolumeBUOMVal);
return this.props.formatDecimalByLocale(totalStandardVolumeVal, volumePrecision);
}

// Calculate Ambient Volume Percentage for transportation loss and gain
calcAmbVolPercent() {
const {totalAmbientVolume, volumePrecision} = this.props;
let totalAmbientVolumeVal = totalAmbientVolume;
totalAmbientVolumeVal = this.props.convertToGlobalNumberFormat(totalAmbientVolumeVal);
let calcTransAmbVolVal = this.calcTransAmbVol();
calcTransAmbVolVal = this.props.convertToGlobalNumberFormat(calcTransAmbVolVal);
const ambVolPercent = (calcTransAmbVolVal / totalAmbientVolumeVal) * 100;

return this.props.formatDecimalByLocale(ambVolPercent, volumePrecision); //parseFloat(ambVolPercent).toFixed(volumePrecision);
}

// Calculate Standard Volume Percentage for Transportation loss and gain section
calcStdVolPercent() {
const {totalStandardVolume, volumePrecision} = this.props;
let totalStandardVolumeVal = totalStandardVolume;
totalStandardVolumeVal = this.props.convertToGlobalNumberFormat(totalStandardVolumeVal);
let calcTransStdVol = this.calcTransStdVol();
calcTransStdVol = this.props.convertToGlobalNumberFormat(calcTransStdVol);
const stdVolPercent = (calcTransStdVol / totalStandardVolumeVal) * 100;

return this.props.formatDecimalByLocale(stdVolPercent,volumePrecision);
}

parsedNumber(number) {
number = this.props.convertToGlobalNumberFormat(number);
return parseFloat(number);
}

isNotValidNumberForVol(number) {
let retVal = true;
number = this.props.convertToGlobalNumberFormat(number);

if (number !== '' && number !== null && number !== undefined) {
let parsedNum = parseFloat(number);
retVal = isNaN(parsedNum);
}
return retVal;
}

determineTolerance(type){
const {transportationLoss, selectedFuelGradeId, selectedModeOfTransportId, transportationLossGainLabel} = this.props;

if(transportationLoss !== "" && selectedFuelGradeId !== "" && selectedModeOfTransportId !== ""){
// Determine Tolerance level
let toleranceLevel = "";

transportationLoss.map((transLoss)=>{
if(transLoss.Fuel_Grade_Id === parseInt(selectedFuelGradeId)){
return transLoss.transportation_mode_loss.map((mode)=>{
if(mode.Mode_Of_Transport_Id === parseInt(selectedModeOfTransportId)){
return toleranceLevel = mode.Tolerance_Per_Transaction;
}
});
}
});

const inRange = (x, min, max) => {
return ((x-min)*(x-max) < 0);
}

if(type === "standard") {
if (inRange(parseFloat(this.calcStdVolPercent()), -toleranceLevel, toleranceLevel)) {
return null;
} else {
return `${transportationLossGainLabel.transportation_loss_gain_msg.replace('{0}',toleranceLevel)}`;
}
} else if(type === "ambient") {
if (inRange(parseFloat(this.calcAmbVolPercent()), -toleranceLevel, toleranceLevel)) {
return null;
} else {
return `${transportationLossGainLabel.transportation_loss_gain_msg.replace('{0}',toleranceLevel)}`;
}
} else {
console.log('Type is unavailable');
}
} else {
return null;
}
}

handleButtonClick = (event) => {
return this.props.handleButtonClick(event);
};

render(){
const {selectedTransactionTypeLabel,
selectedSubTransactionTypeLabel,
receiptLabels,
receiptVolumeLabels,
generalFormLabels,
detailsLabels,
transportationLossGainLabel,
transactionPointOptions,
fuelGradeOptions,
operatorOptions,
ambientTemprature,
ambientDensity,
standardDensity,
notesLabels,
documentCounter,
enableMultipleDocuments,
validator,
dateTimeValidations,
ambientVolumeDUOM,
ambientVolumeDUOM_select,
standardVolumeDUOM,
standardVolumeDUOM_select,
ambientTemprature_ARV,
ambientTemprature_select,
weightInAir,
weightInAir_select,
weightInVacuum,
weightInVacuum_select,
ambientDensity_ARV,
ambientDensity_select,
standardDensity_ARV,
standardDensity_select,
receivingDeviceOptions,
volumeUOM_Code,
ambientVolumeBUOM,
standardVolumeBUOM,
totalAmbientVolume,
totalStandardVolume,
transportationLoss,
selectedFuelGradeId,
selectedModeOfTransportId,
documentListOptions,
volumePrecision
} = this.props;

const {volumeUOMOptions, densityUOMOptions, weightUOMOptions, deviceList, tempratureUOMOptions} = this.state;
const {selectedVolumeUom, selctedTempUom, selectedDensityUom, selectedWeightUom} = this.state;

return (
<React.Fragment>
<Section title={`${selectedTransactionTypeLabel}`}>
<Select
name="transactionPoint"
label={receiptLabels.transaction_point}
options={transactionPointOptions}
handleSelectChange={(event) =>this.props.handleSelectChange(event, validator)}
generalFormLabels={generalFormLabels}
helpText={receiptLabels.transaction_point_tooltip}
value={this.props.transactionPoint}
/>

<Select
name="fuelGrade"
label={receiptLabels.fuel_grade}
options={fuelGradeOptions}
validationText={generalFormLabels.form_general_this_field_is_required}
handleSelectChange={(event) =>this.props.handleSelectChange(event, validator)}
handleSelectBlur={this.props.handleSelectBlur}
isError={this.props.selectHasError(fuelGradeOptions, this.props.selectValidations["fuelGrade"])}
generalFormLabels={generalFormLabels}
required={fuelGradeOptions.length > 1}
value={this.props.fuelGrade}
/>

<Select
name="measurementMethod"
label={receiptLabels.measurement_method}
options={this.props.measurementMethodOptions}
validationText={generalFormLabels.form_general_this_field_is_required}
handleSelectChange={(event) =>this.props.handleSelectChange(event, validator)}
handleSelectBlur={this.props.handleSelectBlur}
isError={this.props.selectHasError(this.props.measurementMethodOptions, this.props.selectValidations["measurementMethod"])}
generalFormLabels={generalFormLabels}
required={this.props.measurementMethodOptions.length > 1}
value={this.props.measurementMethod}
/>

<Select
name="modeOfTransport"
label={receiptLabels.mode_of_transport}
options={this.props.modeOfTransportOptions}
validationText={generalFormLabels.form_general_this_field_is_required}
handleSelectChange={(event) =>this.props.handleSelectChange(event, validator)}
generalFormLabels={generalFormLabels}
handleSelectBlur={this.props.handleSelectBlur}
isError={this.props.selectHasError(this.props.modeOfTransportOptions, this.props.selectValidations["modeOfTransport"])}
required={this.props.modeOfTransportOptions.length > 1}
value={this.props.modeOfTransport}
/>

<Select
name="productSupplyCompany"
label={receiptLabels.product_supplier_company}
options={this.props.productSupplyCompanyOptions}
validationText={generalFormLabels.form_general_this_field_is_required}
handleSelectChange={(event) =>this.props.handleSelectChange(event, validator)}
handleSelectBlur={this.props.handleSelectBlur}
isError={this.props.selectHasError(this.props.productSupplyCompanyOptions, this.props.selectValidations["productSupplyCompany"])}
generalFormLabels={generalFormLabels}
required={this.props.productSupplyCompanyOptions.length > 1}
value={this.props.productSupplyCompany}
/>

<Select
name="locationOfOrigin"
label={receiptLabels.location_of_origin}
options={this.props.locationOfOriginOptions}
validationText={generalFormLabels.form_general_this_field_is_required}
handleSelectChange={(event) =>this.props.handleSelectChange(event, validator)}
handleSelectBlur={this.props.handleSelectBlur}
isError={this.props.selectHasError(this.props.locationOfOriginOptions, this.props.selectValidations["locationOfOrigin"])}
generalFormLabels={generalFormLabels}
required={this.props.locationOfOriginOptions.length > 1}
value={this.props.locationOfOrigin}
/>

<Select
name="operator"
label={receiptLabels.operator}
options={operatorOptions}
handleSelectChange={(event) =>this.props.handleSelectChange(event, validator)}
generalFormLabels={generalFormLabels}
value={this.props.operator}
/>
</Section>


{ this.props.showAdvisedReceipt === true ?
<React.Fragment>
<Section title={this.props.showAdvisedReceipt === true ? receiptVolumeLabels.advised_receipt_volume : ''}>

<InputWithSelect
name="ambientVolumeDUOM"
label={receiptVolumeLabels.ambient_volume_duom}
options={volumeUOMOptions}
inputValue={ambientVolumeDUOM === '-' ? '' : ambientVolumeDUOM}
inputSelect={ambientVolumeDUOM_select || selectedVolumeUom}
handleSelectChange={(event) =>this.props.handleSelectChange(event, validator)}
handleInputChange={this.props.handleInputChange}
handleInputBlur={(event)=>{this.props.handleInputBlur(event, this.props.validator)}}
handleInputFocus={this.props.handleInputFocus}
handleInputKeyPress={this.props.handleInputKeyPress}
helpText={receiptVolumeLabels.ambient_volume_duom_tooltip}
/>

<InputWithSelect
name="standardVolumeDUOM"
label={receiptVolumeLabels.standard_volume_duom}
options={volumeUOMOptions}
inputValue={standardVolumeDUOM === '-' ? '' : standardVolumeDUOM}
inputSelect={standardVolumeDUOM_select || selectedVolumeUom}
handleSelectChange={(event) =>this.props.handleSelectChange(event, validator)}
handleInputChange={this.props.handleInputChange}
handleInputBlur={(event)=>{this.props.handleInputBlur(event, this.props.validator)}}
handleInputFocus={this.props.handleInputFocus}
handleInputKeyPress={this.props.handleInputKeyPress}
helpText={receiptVolumeLabels.standard_volume_duom_tooltip}
/>


{
this.isBUOMApplicable() ?
<React.Fragment>
{ this.showBUOM('ambientVolumeDUOM_select', 'ambientVolumeBUOM') || (this.props.loadedTransaction !== null && this.props.ambientVolumeDUOM_select !== this.props.ambientVolumeBUOM && this.props.ambientVolumeBUOM !== '-') ?
<Input name="ambientVolumeBUOM"
label={receiptVolumeLabels.ambient_volume_buom}
value={this.isNotValidNumberForVol(ambientVolumeDUOM) ? '-' : ambientVolumeBUOM}
uom={volumeUOM_Code}
helpText={receiptVolumeLabels.ambient_volume_buom_tooltip}
static /> : null }

{ this.showBUOM('standardVolumeDUOM_select', 'standardVolumeBUOM') || (this.props.loadedTransaction !== null && this.props.standardVolumeDUOM_select !== this.props.standardVolumeBUOM && this.props.standardVolumeBUOM !== '-') ?
<Input name="standardVolumeBUOM"
label={receiptVolumeLabels.standard_volume_buom}
value={this.isNotValidNumberForVol(standardVolumeDUOM) ? "-" : standardVolumeBUOM}
uom={volumeUOM_Code}
helpText={receiptVolumeLabels.ambient_volume_buom_tooltip}
static /> : null }

</React.Fragment>
: <React.Fragment></React.Fragment>
}

<InputWithSelect
name="ambientTemprature_ARV"
label={detailsLabels.ambient_temperature}
options={tempratureUOMOptions}
inputValue={ambientTemprature_ARV === '-' ? '' : ambientTemprature_ARV}
inputSelect={ambientTemprature_select || selctedTempUom}
handleSelectChange={(event) =>this.props.handleSelectChange(event, validator)}
handleInputChange={this.props.handleInputChange}
handleInputBlur={(event)=>{this.props.handleInputBlur(event, this.props.validator)}}
handleInputFocus={this.props.handleInputFocus}
handleInputKeyPress={this.props.handleInputKeyPress}
value={this.props.selectedVolumeUom}
/>

<InputWithSelect
name="ambientDensity_ARV"
label={detailsLabels.ambient_density}
options={densityUOMOptions}
inputValue={ambientDensity_ARV === '-' ? '' : ambientDensity_ARV}
inputSelect={ambientDensity_select || selectedDensityUom}
handleSelectChange={(event) =>this.props.handleSelectChange(event, validator)}
handleInputChange={this.props.handleInputChange}
handleInputBlur={(event)=>{this.props.handleInputBlur(event, this.props.validator)}}
handleInputFocus={this.props.handleInputFocus}
handleInputKeyPress={this.props.handleInputKeyPress}
/>

<InputWithSelect
name="standardDensity_ARV"
label={detailsLabels.standard_density}
options={densityUOMOptions}
inputValue={standardDensity_ARV === '-' ? '' : standardDensity_ARV}
inputSelect={standardDensity_select || selectedDensityUom}
handleSelectChange={(event) =>this.props.handleSelectChange(event, validator)}
handleInputChange={this.props.handleInputChange}
handleInputBlur={(event)=>{this.props.handleInputBlur(event, this.props.validator)}}
handleInputFocus={this.props.handleInputFocus}
handleInputKeyPress={this.props.handleInputKeyPress}
/>

<InputWithSelect
name="weightInAir"
label={receiptVolumeLabels.weight_in_air}
inputValue={weightInAir === '-' ? '' : weightInAir}
inputSelect={weightInAir_select || selectedWeightUom}
options={weightUOMOptions}
handleSelectChange={(event) =>this.props.handleSelectChange(event, validator)}
handleInputChange={this.props.handleInputChange}
handleInputBlur={(event)=>{this.props.handleInputBlur(event, this.props.validator)}}
handleInputFocus={this.props.handleInputFocus}
handleInputKeyPress={this.props.handleInputKeyPress}
/>

<InputWithSelect
name="weightInVacuum"
label={receiptVolumeLabels.weight_in_vacuum}
inputValue={weightInVacuum === '-' ? '' : weightInVacuum}
inputSelect={weightInVacuum_select || selectedWeightUom}
options={weightUOMOptions}
handleSelectChange={(event) =>this.props.handleSelectChange(event, validator)}
handleInputChange={this.props.handleInputChange}
handleInputBlur={(event)=>{this.props.handleInputBlur(event, this.props.validator)}}
handleInputFocus={this.props.handleInputFocus}
handleInputKeyPress={this.props.handleInputKeyPress}
/>
</Section>
</React.Fragment> : null }

<Section title={detailsLabels.transaction_details}>
<DateTimePicker
name="start-date-time"
label={detailsLabels.start_date_and}
handleDateChange={this.props.handleDateChange}
showInvalidTimeModal={this.props.showInvalidTimeModal}
startDateField={this.props.startDateField}
validateStartTime={this.props.validateStartTime}
validationText={((dateTimeValidations.isStartTimeValid || dateTimeValidations.isStartTimeValid === '') && (dateTimeValidations.isStartDateValid || dateTimeValidations.isStartDateValid === '')) ? null : this.props.dateStartValidationText}
timezone={this.props.timezoneOffset}
getInitialDate={this.props.getInitialDate}
required
startTime={this.props.startTime}
requiredText={dateTimeValidations.isStartTimeSet || dateTimeValidations.isStartTimeSet === '' ? null : generalFormLabels.form_general_this_field_is_required}
dateFormatOption={this.props.userDateFormat || this.props.selected_SPL_Date_Format}
loadedTransaction={this.props.loadedTransaction}
/>

<DateTimePicker
name="end-date-time"
label={detailsLabels.end_date_and}
handleDateChange={this.props.handleDateChange}
showInvalidTimeModal={this.props.showInvalidTimeModal}
endDateField={this.props.endDateField}
startDateField={this.props.startDateField}
startTime={this.props.startTime}
endTime={this.props.endTime}
getInitialDate={this.props.getInitialDate}
validateEndTime={this.props.validateEndTime}
validationText={((dateTimeValidations.isEndTimeValid || dateTimeValidations.isEndTimeValid === '') && (dateTimeValidations.isEndDateValid || dateTimeValidations.isEndDateValid === '')) ? null : this.props.dateEndValidationText}
required
requiredText={dateTimeValidations.isEndTimeSet || dateTimeValidations.isEndTimeSet === '' ? null : generalFormLabels.form_general_this_field_is_required}
timezone={this.props.timezoneOffset}
dateFormatOption={this.props.userDateFormat || this.props.selected_SPL_Date_Format}
loadedTransaction={this.props.loadedTransaction}
/>


<Input
name="ambientTemprature"
label={detailsLabels.ambient_temperature}
size="short"
required
uom={`${'º'}${this.props.tempUOM_Code}`}
value={this.props.ambientTemprature === '-' ? '' : this.props.ambientTemprature}
handleInputChange={this.props.handleInputChange}
handleInputBlur={(event)=>{this.props.handleInputBlur(event, this.props.validator)}}
requiredText={generalFormLabels.form_general_this_field_is_required}
validator={validator}
validationRule={`required|max:${this.props.VCF_Method.Max_Temp},num|min:${this.props.VCF_Method.Min_Temp},num`}
helpText={this.props.determineDensityOrTemperatureHelpText(window.StockControl.Constants.vcfTemperature)}
validationText={this.props.genericStringReplacement(this.props.stockLabels.temperature_range_error, [this.props.VCF_Method.Min_Temp, this.props.VCF_Method.Max_Temp])}
step=".01"
handleInputFocus={this.props.handleInputFocus}
handleInputKeyPress={this.props.handleInputKeyPress}
/>

<Input
name="ambientDensity"
label={detailsLabels.ambient_density}
size="short"
uom={this.props.densityUOM_Code}
value={this.props.ambientDensity === '-' ? '' : this.props.ambientDensity}
handleInputChange={this.props.handleInputChange}
handleInputBlur={(event)=>{this.props.handleInputBlur(event, this.props.validator)}}
fieldsetRowClassName={this.props.measuredDensityMethod !== 'A' && this.props.isVcfValid === false ? 'has-error-true' : null}
requiredText={(this.props.ambientDensity || this.props.ambientDensity === '' || this.props.ambientDensity === '-') ? generalFormLabels.form_general_this_field_is_required : null}
required
validator={validator}
validationRule={this.props.measuredDensityMethod === 'A' ?
this.props.determineDensityValidationRule(window.StockControl.Constants.vcfADensity) : 'required'}
static={this.props.measuredDensityMethod === 'A' ? false : true}
helpText={this.props.measuredDensityMethod === 'A' ? this.props.determineDensityOrTemperatureHelpText(window.StockControl.Constants.vcfADensity) : null}
validationText={this.props.measuredDensityMethod === 'A' ? this.props.isDensityStockControlValid(false) : this.props.isDensityStockControlValid(true)}
customValidationText={this.props.measuredDensityMethod !== 'A' && this.props.isVcfValid === false ? this.props.stockLabels.no_vcf_found : null}
step=".01"
handleInputFocus={this.props.handleInputFocus}
handleInputKeyPress={this.props.handleInputKeyPress}
/>

<Input
name="standardDensity"
label={detailsLabels.standard_density}
size="short"
uom={this.props.densityUOM_Code}
value={this.props.standardDensity === '-' ? '' : this.props.standardDensity}
handleInputChange={this.props.handleInputChange}
handleInputBlur={(event)=>{this.props.handleInputBlur(event, this.props.validator)}}
validator={validator}
fieldsetRowClassName={this.props.measuredDensityMethod !== 'S' && this.props.isVcfValid === false ? 'has-error-true' : null}
validationRule={this.props.measuredDensityMethod === 'S' ?
this.props.determineDensityValidationRule(window.StockControl.Constants.vcfSDensity) : 'required'}
required
requiredText={(this.props.ambientDensity && this.props.ambientDensity !== '' && this.props.ambientDensity !== '-') ? null : generalFormLabels.form_general_this_field_is_required}
static={this.props.measuredDensityMethod === 'S' ? false : true}
helpText={this.props.measuredDensityMethod === 'S' ? this.props.determineDensityOrTemperatureHelpText(window.StockControl.Constants.vcfSDensity) : null}
validationText={this.props.measuredDensityMethod === 'S' ? this.props.isDensityStockControlValid(false) : this.props.isDensityStockControlValid(true)}
customValidationText={this.props.measuredDensityMethod !== 'S' && this.props.isVcfValid === false ? this.props.stockLabels.no_vcf_found : null}
step=".01"
handleInputFocus={this.props.handleInputFocus}
handleInputKeyPress={this.props.handleInputKeyPress}
/>

<Checkbox
name="splitDelivery"
label={detailsLabels.split_delivery}
isChecked={this.props.c_splitDelivery}
value='Y'
helpText={detailsLabels.split_delivery_tooltip}
hidden={this.props.loadedTransaction !== null}
handleCheckboxChange={(event)=>{this.props.handleCheckboxChange(event, this.props.validator)}}
/>


<ReceivingDeviceList
deviceList={receivingDeviceOptions}
detailsLabels={detailsLabels}
receivingDevicesList={this.props.receivingDevicesList}
validator={this.props.validator}
uom={this.props.volumeUOM_Code}
receivingDeviceOptions={receivingDeviceOptions}
addDevice={this.props.addDevice}
removeDevice={(event) => {this.props.removeDevice(event, this.props.validator)}}
addReceivingDevice={this.props.addReceivingDevice}
addVolume={this.props.addVolume}
receivingDevices={this.props.receivingDevices}
receivingDevicesAmbVols={this.props.receivingDevicesAmbVols}
receivingDevicesStdVols={this.props.receivingDevicesStdVols}
handleSelectChange={(event) =>this.props.handleSelectChange(event, validator)}
handleSelectBlur={this.props.handleSelectBlur}
handleInputChange={this.props.handleInputChange}
handleInputBlur={(event)=>{this.props.handleInputBlur(event, this.props.validator)}}
totalAmbientVolume={this.props.totalAmbientVolume}
totalStandardVolume={this.props.totalStandardVolume}
generalFormLabels={this.props.generalFormLabels}
selectValidations={this.props.selectValidations}
selectHasError={this.props.selectHasError}
receivingDevicesValidations={this.props.receivingDevicesValidations}
handleInputFocus={this.props.handleInputFocus}
handleInputKeyPress={this.props.handleInputKeyPress}
helpText={this.props.c_splitDelivery ? detailsLabels.split_delivery_device_tooltip : ''}
stringReplacement={this.props.stringReplacement}
deliveryReceiptNumber={this.props.deliveryReceiptNumber}
headerLabels={this.props.headerLabels}
/>

</Section>

{
this.props.showAdvisedReceipt === true && this.showTransLossGain() ?
<Section title={transportationLossGainLabel.transportation_loss_gain}>
{
ambientVolumeDUOM ?
<Input
name="trans_ambVol"
label={transportationLossGainLabel.ambient_volume}
value={this.isNotValidNumberForVol(this.calcTransAmbVol()) ? "-" : this.calcTransAmbVol()}
uom={volumeUOM_Code}
static={true}
/>
: null
}

{
ambientVolumeDUOM && parseFloat(this.props.convertToGlobalNumberFormat(totalAmbientVolume)) > 0 ?
<Input
name="trans_ambVolPer"
label={transportationLossGainLabel.ambient_volume_percentage}
value={this.isNotValidNumberForVol(this.calcAmbVolPercent()) ? "-" : this.calcAmbVolPercent()+"%"}
uom={volumeUOM_Code}
customWarningText={this.determineTolerance("ambient")}
fieldsetRowClassName={this.determineTolerance("ambient") ? "has-error-true" : null}
static={true}
/>
: null
}

{
standardVolumeDUOM && parseFloat(this.props.convertToGlobalNumberFormat(totalStandardVolume)) > 0 ?
<Input
name="trans_stdVol"
label={transportationLossGainLabel.standard_volume}
value={this.isNotValidNumberForVol(this.calcTransStdVol()) ? "-" : this.calcTransStdVol()}
uom={volumeUOM_Code}
static={true}
/>
: null
}

{
standardVolumeDUOM && parseFloat(this.props.convertToGlobalNumberFormat(totalStandardVolume)) > 0 ?
<Input
name="trans_stdVolPer"
label={transportationLossGainLabel.standard_volume_percentage}
value={this.isNotValidNumberForVol(this.calcStdVolPercent()) ? "-" : this.calcStdVolPercent()+"%"}
uom={volumeUOM_Code}
customWarningText={this.determineTolerance("standard")}
fieldsetRowClassName={this.determineTolerance("standard") ? "has-error-true" : null}
static={true}
/>
: null
}
</Section>
: null
}

<Section title={notesLabels.notes_and_documents}>
<TextArea
name="internalNotes"
label={notesLabels.internal_notes}
helpText={notesLabels.these_notes_are}
characterLimit={250}
countLimit={250}
handleTextAreaChange={this.props.handleTextAreaChange}
notesLabels={notesLabels}
value={this.props.internalNotes}
/>
<DocumentsList items={this.props.documents}
remove={this.props.handleRemove}
documentListOptions={documentListOptions}
notesLabels={notesLabels}
handleDocumentTypeChange={this.props.handleDocumentTypeChange}
handleAddDocumentClick={this.props.handleAddDocumentClick}
handleDocumentFileInputChange={this.props.handleDocumentFileInputChange}
documentCounter={documentCounter}
generalFormLabels={generalFormLabels}
enableMultipleDocuments={enableMultipleDocuments}
attachmentLists={this.props.attachmentLists}
attachmentDocTypes={this.props.attachmentDocTypes}
attachmentFiles={this.props.attachmentFiles}
handleResetDocumentList={this.props.handleResetDocumentList}
handleSelectBlur={this.props.handleSelectBlur}
selectHasError={this.props.selectHasError}
selectValidations={this.props.selectValidations}
handleInputBlur={this.props.handleInputBlur}
validator={this.props.validator}
fileValidations={this.props.fileValidations}
editModeAttachments={this.props.loadedTransaction !== null && this.props.loadedTransaction['Attachments_Metadata']}
viewDetailsLabels={this.props.viewDetailsLabels}
showToastHandler={this.props.showToastHandler}
/>
</Section>

<ReviewPanelReceipt
{...this.props}
uom={{volume:volumeUOM_Code}}
arv_uom={
{
//volume: this.props.ambientVolumeDUOM_select || this.state.volumeUOMOptions[0].label,
volume: volumeUOM_Code,
temprature: this.props.ambientTemprature_select || this.state.tempratureUOMOptions[0].label,
density: this.props.ambientDensity_select || this.state.densityUOMOptions[0].label,
weight: this.props.weightInAir_select || this.state.weightUOMOptions[0].label
}
}
trans_loss_gain={
{
ambientVolume: this.showTransLossGain() ? `${this.calcTransAmbVol()}` : "-",
standardVolume: this.showTransLossGain() && !this.isNotValidNumberForVol(this.calcStdVolPercent()) && this.calcStdVolPercent() !== "Infinity" && this.calcStdVolPercent() !== "-Infinity" ? `${this.calcTransStdVol()}` : "-",
standardVolumePer: this.showTransLossGain() && !this.isNotValidNumberForVol(this.calcStdVolPercent()) && this.calcStdVolPercent() !== "Infinity" && this.calcStdVolPercent() !== "-Infinity" ? `${this.calcStdVolPercent()}%` : "-",
ambientVolumePer: this.showTransLossGain() && !this.isNotValidNumberForVol(this.calcAmbVolPercent()) && this.calcAmbVolPercent() !== "Infinity" && this.calcAmbVolPercent() !== "-Infinity" ? `${this.calcAmbVolPercent()}%` : "-"
}
}
/>

<Actions isReady={true}
ctaLabels={this.props.ctaLabels}
handleButtonClick={(event)=>this.props.handleButtonClick(event, this.props.validator)}
loadedTransaction={this.props.loadedTransaction}
/>
{this.props.modal.status==="open" ?
<Modal
modalTitle={this.props.modal.modalTitle}
modalMessage={this.props.modal.modalMessage}
handleModalClose={this.props.handleModalClose}
/> : null
}

{this.props.toasts.length ?

<Toast
level= "success"
visible= {true}
toasts= {this.props.toasts}
enableMultiContainer
/>
: null}

</React.Fragment>

);
}
};

const mapStateToProps = (state) => {
const store = state.getLocation_reducer;
return {
receivingDeviceOptions:store.receivingDeviceOptions,
transactionPointOptions:store.transactionPointOptions,
fuelGradeOptions:store.fuelGradeOptions,
operatorOptions:store.operatorOptions,
ambientTemprature:store.ambientTemprature,
ambientDensity:store.ambientDensity,
standardDensity:store.standardDensity,
totalAmbientVolume:store.totalAmbientVolume,
selectedIssuingDeviceId:store.selectedIssuingDeviceId,
selectedReceivingDeviceId:store.selectedReceivingDeviceId,
selectedTransactionTypeLabel:store.selectedTransactionTypeLabel,
selectedSubTransactionTypeLabel:store.selectedSubTransactionTypeLabel,
selectedTransactionPointLabel:store.selectedTransactionPointLabel,
transportationLossGainLabel:store.transportationLossGainLabel,
totalStandardVolume:store.totalStandardVolume,
detailsLabels:store.detailsLabels,
notesLabels:store.notesLabels,
documentCounter:store.documentCounter,
reviewLabels:store.reviewLabels,
generalFormLabels:store.generalFormLabels,
stockLabels:store.stockLabels,
receiptVolumeLabels:store.receiptVolumeLabels,
receiptLabels:store.receiptLabels,
enableMultipleDocuments:store.areMultipleDocuments,
ModeOfTransportData:store.ModeOfTransportData,
startDateField:store.startDateField,
endDateField:store.endDateField,
modal:store.modal,
toasts:store.toasts,
documentTypeData : store.documentTypeData,
dateTimeValidations : store.dateTimeValidations,
attachmentLists: store.attachmentLists,
attachmentDocTypes: store.attachmentDocTypes,
attachmentFiles: store.attachmentFiles,
selectValidations: store.selectValidations,
issuingDeviceOptions: store.issuingDeviceOptions,
VCF_Method: store.VCF_Method,
vehicleMetersData: store.vehicleMetersData,
meterStartReadings: store.meterStartReadings,
meterVolumes: store.meterVolumes,
meterEndReadings: store.meterEndReadings,
meterUoms: store.meterUoms,
meterValidations: store.meterValidations,
tempUOM_Code: store.tempUOM_Code,
densityUOM_Code: store.densityUOM_Code,
measuredDensityMethod: store.measuredDensityMethod,
isVcfValid: store.isVcfValid,
documents: store.documents,
UOM: store.UOM,
measurementMethodOptions: store.measurementMethodOptions,
modeOfTransportOptions: store.modeOfTransportOptions,
productSupplyCompanyOptions: store.productSupplyCompanyOptions,
locationOfOriginOptions: store.locationOfOriginOptions,
receivingDevicesList: store.receivingDevicesList,
volumeUOM_Code: store.volumeUOM_Code,
receivingDevices: store.receivingDevices,
receivingDevicesAmbVols: store.receivingDevicesAmbVols,
receivingDevicesStdVols: store.receivingDevicesStdVols,
receivingDevicesValidations: store.receivingDevicesValidations,
delivery_receipt_number: store.delivery_receipt_number,
headerLabels: store.headerLabels,
showAdvisedReceipt: store.showAdvisedReceipt,
ambientVolumeDUOM: store.ambientVolumeDUOM,
ambientVolumeDUOM_select: store.ambientVolumeDUOM_select,
standardVolumeDUOM: store.standardVolumeDUOM,
standardVolumeDUOM_select: store.standardVolumeDUOM_select,
ambientVolumeBUOM: store.ambientVolumeBUOM,
standardVolumeBUOM: store.standardVolumeBUOM,
volumeUOM_ID: store.volumeUOM_ID,
tempUOM_ID: store.tempUOM_ID,
densityUOM_ID: store.densityUOM_ID,
ambientTemprature_select: store.ambientTemprature_select,
ambientDensity_select: store.ambientDensity_select,
standardDensity_select: store.standardDensity_select,
weightInAir_select: store.weightInAir_select,
weightInVacuum_select: store.weightInVacuum_select,
c_splitDelivery: store.c_splitDelivery,
documentListOptions: store.documentListOptions,
transportationLoss: store.transportationLoss,
fileValidations: store.fileValidations,
timezoneOffset: store.timezoneOffset,
dateStartValidationText: store.dateStartValidationText,
dateEndValidationText: store.dateEndValidationText,
startTime: store.startTime,
endTime: store.endTime,
transactionType: store.transactionType,
userDateFormat: store.userDateFormat,
selected_SPL_Date_Format: store.selected_SPL_Date_Format,
ambientTemprature_ARV: store.ambientTemprature_ARV,
ambientDensity_ARV: store.ambientDensity_ARV,
standardDensity_ARV: store.standardDensity_ARV,
weightInAir: store.weightInAir,
weightInVacuum: store.weightInVacuum,
volumePrecision: store.volumePrecision,
selectedFuelGradeId: store.selectedFuelGradeId,
selectedModeOfTransportId: store.selectedModeOfTransportId,
ctaLabels: store.ctaLabels,
deliveryReceiptNumber: store.deliveryReceiptNumber,
internalNotes: store.internalNotes,
fuelGrade: store.fuelGrade,
transactionPoint: store.transactionPoint,
measurementMethod: store.measurementMethod,
operator: store.operator,
loadedTransaction: store.loadedTransaction,
productSupplyCompany: store.productSupplyCompany,
modeOfTransport: store.modeOfTransport,
locationOfOrigin: store.locationOfOrigin,
selctedTempUom: store.selctedTempUom,
viewDetailsLabels: store.viewDetailsLabels
}
};

const mapDispatchToProps = (dispatch) => bindActionCreators(
{
handleSelectChange : (event, validator) => handleSelectChange(event, validator),
handleInputChange : (event) => handleInputChange(event),
handleInputFocus : (event) => handleInputFocus(event),
handleInputBlur : (event, validator) => handleInputBlur(event, validator),
handleInputKeyPress: (event) => handleInputKeyPress(event),
handleSelectBlur : (event) => handleSelectBlur(event),
handleTextAreaChange : (event) => handleTextAreaChange(event),
handleCheckboxChange : (event, validator) => handleCheckboxChange(event, validator),
handleDateChange : (type, dateISOFormat, dateRegular) => handleDateChange(type, dateISOFormat, dateRegular),
handleModalClose : () => handleModalClose(),
handleDocumentTypeChange : (event) => handleDocumentTypeChange(event),
handleAddDocumentClick : (event) => handleAddDocumentClick(event),
handleRemove : (event) => handleRemove(event),
handleDocumentFileInputChange : (file, event) => handleDocumentFileInputChange(file, event),
handleButtonClick : (event, validator) => handleButtonClick(event, validator),
handleResetDocumentList : () => handleResetDocumentList(),
showInvalidTimeModal: (event) => showInvalidTimeModal(event),
validateStartTime: () => validateStartTime(),
validateEndTime: () => validateEndTime(),
selectHasError: (options, validation) => selectHasError(options, validation),
determineDensityOrTemperatureHelpText: (type) => determineDensityOrTemperatureHelpText(type),
determineDensityValidationRule: (type) => determineDensityValidationRule(type),
isDensityStockControlValid: (validateVcf) => isDensityStockControlValid(validateVcf),
getInitialDate: () => getInitialDate(),
genericStringReplacement: (message, valueArray) => genericStringReplacement(message, valueArray),
stringReplacement: (messsage, value) => stringReplacement(messsage, value),
addDevice: () => addDevice(),
removeDevice: (event, validator) => removeDevice(event, validator),
convertToGlobalNumberFormat: (number) => convertToGlobalNumberFormat(number),
formatDecimalByLocale: (number, precision, isRaw) => formatDecimalByLocale(number, precision, isRaw),
}, dispatch
);

export default connect(mapStateToProps, mapDispatchToProps)(Receipt);









----------------------------------------------------------






import
React from "react";
import ReceivingDeviceListItem from "./ReceivingDeviceListItem";

import Input from "./Input";
import MeterRow from "./MeterRow";
import Receipt from "../pages/Receipt";
import {GetClassList} from "../utility";
import Section from "../layout/Section";
import formatDecimalByLocale from "../../store/actions/formatDecimalByLocale";
import Select from "./Select";

const ReceivingDeviceList = props => {
var errorStatus = "inValid";
const { validator } = props;


const isError = (validator, props) => {
if (validator) {
const { errorMessages, visibleFields } = validator;
if (
( visibleFields.includes("totalAmbientVolume") &&
(errorMessages["totalAmbientVolume"] !== null &&
errorMessages["totalAmbientVolume"] !== ""))
||
( visibleFields.includes("totalStandardVolume") &&
(errorMessages["totalStandardVolume"] !== null &&
errorMessages["totalStandardVolume"] !== ""))
) {
if (errorMessages["totalAmbientVolume"] ||
errorMessages["totalStandardVolume"]) {

if (errorMessages["totalAmbientVolume"] !== null && errorMessages["totalAmbientVolume"] !== undefined) {
if (errorMessages["totalAmbientVolume"].indexOf("required") > -1) {
errorStatus = "isRequired";
} else {
errorStatus = "inValid";
}
}

if (errorMessages["totalStandardVolume"] !== null && errorMessages["totalStandardVolume"] !== undefined) {
if (errorMessages["totalStandardVolume"].indexOf("required") > -1) {
errorStatus = "isRequired";
} else {
errorStatus = "inValid";
}
}
return true;
}
}
return false;
} else {
return false;
}
};


const receivingItems = props.receivingDevicesList.map((item, index) =>
<ReceivingDeviceListItem
key={window.StockControl.Constants.receivingFieldsPrefix + index}
index={index}
name={item}
id={window.StockControl.Constants.receivingFieldsPrefix + index }
label={`${props.detailsLabels.receiving_device} ${index + 1}`}
validator={props.validator}
detailsLabels={props.detailsLabels}
receivingDeviceOptions={props.receivingDeviceOptions}
uom={props.uom}
count={props.receivingDevicesCount}
addDevice={props.addDevice}
removeDevice={props.removeDevice}
receivingDevicesLength={props.receivingDevicesList.length}
receivingDeviceValue={props.receivingDevices[index]}
receivingDevicesAmbVolValue={props.receivingDevicesAmbVols[index]}
receivingDevicesStdVolValue={props.receivingDevicesStdVols[index]}
handleSelectChange={(event)=>{props.handleSelectChange(event, props.validator)}}
handleSelectBlur={props.handleSelectBlur}
handleInputChange={props.handleInputChange}
handleInputBlur={(event)=>{props.handleInputBlur(event, props.validator)}}
requiredText={props.generalFormLabels.form_general_this_field_is_required}
validationText={props.generalFormLabels.form_general_this_field_is_required}
required={true}
selectValidations={props.selectValidations}
selectHasError={props.selectHasError}
customValidation={props.receivingDevicesValidations[index] /*props.receivingDevicesAmbVols[index] === '' || props.receivingDevicesStdVols[index] === '' || props.receivingDevices[index] === '' ? false : true*/}
handleInputFocus={props.handleInputFocus}
handleInputKeyPress={props.handleInputKeyPress}
helpText={props.stringReplacement(props.helpText, `${props.deliveryReceiptNumber ? props.deliveryReceiptNumber : '['+props.headerLabels.delivery_receipt_number+']'}-${index + 1}`)}
/>
);

return (
<div className="receiving-device-list">
<div className="form-group receiving-device-list__header">
<div className="device-ambient-volume">{props.detailsLabels.ambient_volume}</div>
<div className="device-standard-volume">{props.detailsLabels.standard_volume}</div>
</div>
{receivingItems}
<div className={`form-group receiving-device-list__totals has-error-${isError(props.validator, props)}`}>
<div className="device-label">{props.detailsLabels.total_ambient_and}</div>
<div className="device-ambient-volume">
<Input
//className="form-control"
size="short"
label=""
value={props.totalAmbientVolume === '-' ? '' : props.totalAmbientVolume}
name="totalAmbientVolume"
uom={props.uom}
static
validationRule={`required|min:0,num`}
validator={props.validator}
type="number"
required
/>

</div>
<div className="device-standard-volume">

<Input
name="totalStandardVolume"
type="number"
size="short"
label=""
value={props.totalStandardVolume === '-' ? '' : props.totalStandardVolume}
uom={props.uom}
static
validationRule={`required|min:0,num`}
validator={props.validator}
required
/>
</div>
{isError(validator, props) ? (
<div className="fieldset validation-mirror w-100 ml-3 mr-3">
<div className="validation w-100">
{errorStatus === "isRequired" ? <p>{props.generalFormLabels.form_general_this_field_is_required}</p> : <p>{props.generalFormLabels.form_general_this_field_is_required}</p>}
</div>
</div>
) : null}
</div>
</div>


);
};

export default ReceivingDeviceList;


-----------------------------------------------------------

import React from "react";
import Label from "./Label";
import { GetClassList, GetStyles } from "../utility";
import ValidationMessage from "./ValidationMessage";
import Hint from "./Hint";
import Select from "./Select";
import Input from "./Input";


const ReceivingDeviceListItem = props => {
const { validator } = props;

var errorStatus = "inValid";

const isError = (validator, props) => {
if (validator) {
const { errorMessages, visibleFields } = validator;
let flag = false;
let selectflag = false;
let ambflaf = false;
let stdflag = false;


if (props.selectValidations[window.StockControl.Constants.receivingDevicesFieldsPrefix + props.index] !== '') {
if (props.selectValidations[window.StockControl.Constants.receivingDevicesFieldsPrefix + props.index] === false) {
// console.log('......');
errorStatus = "isRequired";
selectflag = true;
}
}

if ( visibleFields.indexOf(`${window.StockControl.Constants.receivingAmbVolFieldsPrefix}${props.index}`) > -1 &&
(errorMessages[`${window.StockControl.Constants.receivingAmbVolFieldsPrefix}${props.index}`] !== null &&
errorMessages[`${window.StockControl.Constants.receivingAmbVolFieldsPrefix}${props.index}`] !== "")) {
//console.log('....amb vol')
ambflaf = true;
}

if ( visibleFields.indexOf(`${window.StockControl.Constants.receivingStdVolFieldsPrefix}${props.index}`) > -1 &&
(errorMessages[`${window.StockControl.Constants.receivingStdVolFieldsPrefix}${props.index}`] !== null &&
errorMessages[`${window.StockControl.Constants.receivingStdVolFieldsPrefix}${props.index}`] !== "")) {
//console.log('....stdflag vol')
stdflag = true;
}

if (selectflag || ambflaf || stdflag) {
flag = true;
}

return flag;
} else {
return false;
}
};



return (
<React.Fragment>
<div className={`form-group ${!props.stacked ? "row":""} receiving-device-list__item ${GetClassList(props)} has-error-${isError(props.validator, props) || props.customValidation === false}`} data-id={props.id} style={GetStyles(props)}>
<Label {...props} />

<div className="device-type">
<Select
name={`${window.StockControl.Constants.receivingDevicesFieldsPrefix}${props.index}`}
label=""
options={props.receivingDeviceOptions}
handleSelectChange={(event)=>{props.handleSelectChange(event, props.validator)}}
handleSelectBlur={props.handleSelectBlur}
value={props.receivingDeviceValue}
index={props.index}
required={props.receivingDeviceOptions.length > 1}
isError={props.selectHasError(props.receivingDeviceOptions, props.selectValidations[`${window.StockControl.Constants.receivingDevicesFieldsPrefix}${props.index}`])}
generalFormLabels={props.generalFormLabels}
/>
</div>


<div className="device-ambient-volume short">

<Input
//className="form-control"
name={`${window.StockControl.Constants.receivingAmbVolFieldsPrefix}${props.index}`}
type="number"
size="short"
label=""
validator={props.validator}
uom={props.uom}
value={props.receivingDevicesAmbVolValue === '-' ? '' : props.receivingDevicesAmbVolValue}
index={props.index}
validationRule={`required|min:0,num`}
required
handleInputChange={props.handleInputChange}
handleInputBlur={(event)=>{props.handleInputBlur(event, props.validator)}}
handleInputFocus={props.handleInputFocus}
handleInputKeyPress={props.handleInputKeyPress}
step=".01"
/>
</div>
<div className="device-standard-volume short">
<Input
name={`${window.StockControl.Constants.receivingStdVolFieldsPrefix}${props.index}`}
type="number"
size="short"
label=""
value={props.receivingDevicesStdVolValue}
static
uom={props.uom}
required
handleInputChange={props.handleInputChange}
handleInputBlur={(event)=>{props.handleInputBlur(event, props.validator)}}
handleInputKeyPress={props.handleInputKeyPress}
validationRule={`required|min:0,num`}
validator={props.validator}
/>

</div>

{props.receivingDevicesLength === 2 && props.index + 1 === props.receivingDevicesLength ? (
<React.Fragment>
<div className="device-actions">
<button
className="btn btn-default device-actions__add"
onClick={props.addDevice}>
+
</button>
</div>
</React.Fragment>
) : null}

{(props.receivingDevicesLength > 2 && props.index >= 2 && props.index + 1 < props.receivingDevicesLength) || props.index === 8 ? (
<React.Fragment>
<div className="device-actions">
<button
className="btn btn-danger device-actions__remove"
data-key={props.index}
onClick={props.removeDevice}>
&times;
</button>
</div>
</React.Fragment>
) : null}

{(props.receivingDevicesLength > 2 && props.receivingDevicesLength < 9) && props.index + 1 === props.receivingDevicesLength ? (
<React.Fragment>
<div className="device-actions">
<button
className="btn btn-default device-actions__add"
onClick={props.addDevice}>
+
</button>
<button
className="btn btn-danger device-actions__remove"
data-key={props.index}
onClick={props.removeDevice}>
&times;
</button>
</div>
</React.Fragment>
) : null}

{props.helpText && <Hint {...props} />}

{isError(validator, props) || props.customValidation === false /*|| hasSelectError(props) === false */? (
<div className="fieldset validation-mirror w-100 ml-3 mr-3">
<div className="validation w-100">
{errorStatus === "isRequired" ? <p>{props.requiredText}</p> : <p>{props.validationText}</p>}
</div>
</div>
) : null}
</div>
</React.Fragment>
);
};


export default ReceivingDeviceListItem;



| No Comments | No TrackBacks
import React, { Component } from "react";
import SimpleReactValidator from "simple-react-validator";
import {BrowserRouter as Router, Redirect, Route} from 'react-router-dom';
import {connect} from 'react-redux';
import { bindActionCreators } from 'redux';

import fetchUserData from '../../store/actions/fetchUserData';
import resetAlert from '../../store/actions/resetAlert'

import TransactionHeader from "../pages/TransactionHeader";
import TransactionInfo from "../pages/TransactionInfo";
import TransferOffsite from "../pages/TransferOffsite";
import Alert from "../form/Alert";
import Receipt from "../pages/Receipt";
import Error from "../layout/Error";
import TransferOwnership from "../pages/TransferOwnership";
import Toast from "../form/Toast";
import {SET_STATE} from '../../store/actions/actionTypes';
import LoadingSpinner from "../ui/LoadingSpinner";

class MainForm extends Component {
constructor(props) {
super(props);
this.validator = new SimpleReactValidator({ autoForceUpdate: this });
}

componentWillMount() {
console.log("Component Did Mount");
//this.props.fetchLocation();
this.props.fetchUserData();
}


renderRedirect = () => {
return <Redirect
to={{
pathname: `${window.StockControl.Constants.routeSearch}`,
state: {
from: `${window.StockControl.Constants.routeSearch}`,
alerts: this.props.state.alerts,
toasts: this.props.state.toasts
}}}/>
};

renderSwitch(transactionType) {
switch (transactionType) {
//Transfer Onsite
case "TO":
return (
<TransactionInfo
validator={this.validator}
/>
);
//Transfer Offsite
case "PH":
return (
<TransferOffsite
validator={this.validator}
/>
);
//Receipt
case "RE":
return (
<Receipt
validator={this.validator}
/>
);
case "CO":
return (
<TransferOwnership
validator={this.validator}
/>
);
default:
return null;
}
}

componentDidUpdate(prevProps, prevState, snapshot){
const { alerts } = this.props.state;
let timeoutString = window.StockControl.Constants.alertTimeout;
let timeout = parseInt(timeoutString);
let self = this;

if(typeof alerts.msg !== 'undefined'){
if (alerts.type === 'alert-success') {
setTimeout(function(){
let alertDiv = document.getElementsByClassName('is-show');

if(alertDiv && alertDiv.length === 1){
alertDiv[0].classList.add('alert-content');
alertDiv[0].classList.remove('is-show');
}
prevProps.resetAlert();
},timeout);
}
}
}

render() {
const { subTransactionType, transactionType, location, alerts, redirect, generalFormLabels, error, transactionOptions } = this.props.state;
return error ? (
<Error generalFormLabels={generalFormLabels} {...this.props.state} />
) : (
!this.props.state.userAPiLoaded/*transactionApiLoaded*/ ? <LoadingSpinner /> :

<React.Fragment>
<div className="container">

{(redirect)
? this.renderRedirect(transactionType)
: null}


{alerts.msg !== undefined && alerts.type !== undefined ? (
<Alert className={alerts.type === 'alert-success' ? "alert-content is-show" : ''} variant={alerts.type}>{alerts.msg}</Alert>
) : null}

{this.props.state.userAPiLoaded ? (
<TransactionHeader
//handleSelectChange={this.handleSelectChange}
//handleInputChange={this.handleInputChange}
//handleInputBlur={this.handleInputBlur}
validator={this.validator}
//handleSelectBlur={this.handleSelectBlur}
selectHasError={this.selectHasError}
/>
) : (
<LoadingSpinner />
)}

{(transactionType === "PH" || transactionType === "TO" || transactionType === "CO") && subTransactionType !== ""
? this.renderSwitch(transactionType)
: null}
{transactionType === "RE" ? this.renderSwitch(transactionType) : null}
</div>
</React.Fragment>
);
}
}

const mapStateToProps = (state) =>{
return {
state : state.getLocation_reducer,
}
}

const mapDispatchToProps = (dispatch, validator) => bindActionCreators({
fetchUserData : () => fetchUserData(validator),
resetAlert : () => resetAlert()
}, dispatch)

export default connect(mapStateToProps, mapDispatchToProps)(MainForm);



-------------------------------------------------------------

import React from "react";
import {connect} from "react-redux";
import {bindActionCreators} from 'redux';

import Section from "../layout/Section";
import DocumentsList from "../ui/DocumentsList";
import DateTimePicker from "../form/DateTimePicker";
import Input from "../form/Input";
import Select from "../form/Select";
import TextArea from "../form/TextArea";
import MeterRowList from "../form/MeterRowList";
import ReviewPanelTransferOnsite from "../form/ReviewPanelTransferOnsite";
import Actions from "../form/Actions";
import Modal from "../form/Modal";

import handleSelectChange from '../../store/actions/handleSelectChange';
import handleInputChange from '../../store/actions/handleInputChange';
import handleInputFocus from '../../store/actions/handleInputFocus';
import handleInputBlur from '../../store/actions/handleInputBlur';
import handleInputKeyPress from '../../store/actions/handleInputKeyPress';
import handleSelectBlur from '../../store/actions/handleSelectBlur';
import handleTextAreaChange from '../../store/actions/handleTextAreaChange';
import handleCheckboxChange from '../../store/actions/handleCheckboxChange';
import handleDateChange from '../../store/actions/handleDateChange';
import handleModalClose from '../../store/actions/handleModalClose';
import handleDocumentTypeChange from '../../store/actions/handleDocumentTypeChange';
import handleAddDocumentClick from '../../store/actions/handleAddDocumentClick';
import handleRemove from '../../store/actions/handleRemove';
import handleDocumentFileInputChange from '../../store/actions/handleDocumentFileInputChange';
import handleButtonClick from '../../store/actions/handleButtonClick';
import handleResetDocumentList from '../../store/actions/handleResetDocumentList';
import showInvalidTimeModal from '../../store/actions/showInvalidTimeModal';
import validateStartTime from '../../store/actions/validateStartTime';
import validateEndTime from '../../store/actions/validateEndTime';
import selectHasError from '../../store/actions/selectHasError';
import determineDensityOrTemperatureHelpText from '../../store/actions/determineDensityOrTemperatureHelpText';
import isDensityStockControlValid from '../../store/actions/isDensityStockControlValid';
import getInitialDate from '../../store/actions/getInitialDate'
import genericStringReplacement from '../../store/actions/genericStringReplacement';
import determineDensityValidationRule from '../../store/actions/determineDensityValidationRule';
import stringReplacement from '../../store/actions/stringReplacement';
import formatDecimalByLocale from "../../store/actions/formatDecimalByLocale";

import 'bootstrap/js/dist/modal';
import 'bootstrap/scss/bootstrap.scss';
import Toast from "../form/Toast";

class TransactionInfo extends React.Component {
constructor(props) {
console.log('Props of Transaction Onsite', props);
super(props);
const documentListOptions = [];

props.documentTypeData.map((documentList)=>{
return(
documentListOptions.push({
value: documentList.Document_Type_Code,
label: documentList.Document_Type_Name
})
)
});
this.documentListOptions = documentListOptions;
}

render() {
const {
receivingDeviceOptions,
transactionPointOptions,
fuelGradeOptions,
operatorOptions,
ambientTemprature,
ambientDensity,
standardDensity,
totalAmbientVolume,
documentTypeData,
transferOnsiteLabels,
detailsLabels,
stockLabels,
notesLabels,
generalFormLabels,
documentCounter,
enableMultipleDocuments,
selectedTransactionTypeLabel,
selectedSubTransactionTypeLabel,
dateTimeValidations,
modal,
toasts,
issuingDeviceOptions,
selectValidations,
VCF_Method,
vehicleMetersData
} = this.props;

const validator = this.props.validator;
return (
<React.Fragment>
<Section title={`${selectedTransactionTypeLabel} - ${selectedSubTransactionTypeLabel}`}>
<Select
name="transactionPoint"
label={transferOnsiteLabels.transaction_point}
options={transactionPointOptions}
handleSelectChange={(event) =>this.props.handleSelectChange(event, validator)}
generalFormLabels={generalFormLabels}
helpText={transferOnsiteLabels.transaction_point_tooltip}
value={this.props.transactionPoint}
/>

<Select
name="fuelGrade"
label={transferOnsiteLabels.fuel_grade}
options={fuelGradeOptions}
validationText={generalFormLabels.form_general_this_field_is_required}
handleSelectChange={(event) =>this.props.handleSelectChange(event, validator)}
handleSelectBlur={this.props.handleSelectBlur}
isError={this.props.selectHasError(fuelGradeOptions, this.props.selectValidations["fuelGrade"])}
generalFormLabels={generalFormLabels}
required={fuelGradeOptions.length > 1}
value={this.props.fuelGrade}
/>

<Select
name="issuingDevice"
label={transferOnsiteLabels.issuing_device}
options={issuingDeviceOptions}
validationText={generalFormLabels.form_general_this_field_is_required}
handleSelectChange={(event) =>this.props.handleSelectChange(event, validator)}
handleSelectBlur={this.props.handleSelectBlur}
isError={this.props.selectHasError(issuingDeviceOptions, this.props.selectValidations["issuingDevice"])}
generalFormLabels={generalFormLabels}
required={issuingDeviceOptions.length > 1}
value={this.props.issuingDevice}
/>

<Select
name="receivingDevice"
label={transferOnsiteLabels.receiving_device}
options={receivingDeviceOptions}
handleSelectChange={(event) =>this.props.handleSelectChange(event, validator)}
handleSelectBlur={this.props.handleSelectBlur}
isError={this.props.selectHasError(receivingDeviceOptions, this.props.selectValidations["receivingDevice"])}
validationText={generalFormLabels.form_general_this_field_is_required}
generalFormLabels={generalFormLabels}
required={receivingDeviceOptions.length > 1}
value={this.props.receivingDevice}
/>

<Input
name="standNumber"
label={transferOnsiteLabels.stand_number}
size="short"
handleInputChange={this.props.handleInputChange}
required={this.props.pitOrStandRequired}
validator={validator}
validationText={generalFormLabels.form_general_this_field_alphanumeric}
validationRule={this.props.pitOrStandRequired ? 'required|alpha_num' : ''}
value={this.props.standNumber}
handleInputBlur={(event)=>{this.props.handleInputBlur(event, this.props.validator)}}
requiredText={generalFormLabels.form_general_this_field_is_required}
hideField={this.props.pitOrStandRequired ? false : true}
inputType={this.props.pitOrStandRequired ? 'text' : 'hidden'}
handleInputKeyPress={this.props.handleInputKeyPress}
maxLength={4}
/>

<Input
name="pitNumber"
label={transferOnsiteLabels.pit_number}
size="short"
requiredText={generalFormLabels.form_general_this_field_is_required}
handleInputChange={this.props.handleInputChange}
required={this.props.pitOrStandRequired}
inputType={this.props.pitOrStandRequired ? 'text' : 'hidden'}
hideField={this.props.pitOrStandRequired ? false : true}
validator={validator}
validationText={generalFormLabels.form_general_this_field_alphanumeric}
validationRule={this.props.pitOrStandRequired ? 'required|alpha_num' : ''}
value={this.props.pitNumber}
handleInputBlur={(event)=>{this.props.handleInputBlur(event, this.props.validator)}}
handleInputKeyPress={this.props.handleInputKeyPress}
maxLength={4}
/>

<Select
name="operator"
label={transferOnsiteLabels.operator}
options={operatorOptions}
handleSelectChange={(event) =>this.props.handleSelectChange(event, validator)}
generalFormLabels={generalFormLabels}
value={this.props.operator}
/>

</Section>

<Section title={detailsLabels.transaction_details}>
<DateTimePicker
name="start-date-time"
label={detailsLabels.start_date_and}
handleDateChange={this.props.handleDateChange}
showInvalidTimeModal={this.props.showInvalidTimeModal}
startDateField={this.props.startDateField}
validateStartTime={this.props.validateStartTime}
validationText={((dateTimeValidations.isStartTimeValid || dateTimeValidations.isStartTimeValid === '') && (dateTimeValidations.isStartDateValid || dateTimeValidations.isStartDateValid === '')) ? null : this.props.dateStartValidationText}
timezone={this.props.timezoneOffset}
getInitialDate={this.props.getInitialDate}
required
startTime={this.props.startTime}
requiredText={dateTimeValidations.isStartTimeSet || dateTimeValidations.isStartTimeSet === '' ? null : generalFormLabels.form_general_this_field_is_required}
dateFormatOption={this.props.userDateFormat || this.props.selected_SPL_Date_Format}
loadedTransaction={this.props.loadedTransaction}
/>

<DateTimePicker
name="end-date-time"
label={detailsLabels.end_date_and}
handleDateChange={this.props.handleDateChange}
showInvalidTimeModal={this.props.showInvalidTimeModal}
endDateField={this.props.endDateField}
startDateField={this.props.startDateField}
startTime={this.props.startTime}
endTime={this.props.endTime}
getInitialDate={this.props.getInitialDate}
validateEndTime={this.props.validateEndTime}
validationText={((dateTimeValidations.isEndTimeValid || dateTimeValidations.isEndTimeValid === '') && (dateTimeValidations.isEndDateValid || dateTimeValidations.isEndDateValid === '')) ? null : this.props.dateEndValidationText}
required
requiredText={dateTimeValidations.isEndTimeSet || dateTimeValidations.isEndTimeSet === '' ? null : generalFormLabels.form_general_this_field_is_required}
timezone={this.props.timezoneOffset}
dateFormatOption={this.props.userDateFormat || this.props.selected_SPL_Date_Format}
loadedTransaction={this.props.loadedTransaction}
/>

<Input
name="ambientTemprature"
label={detailsLabels.ambient_temperature}
size="short"
required
uom={`${'º'}${this.props.tempUOM_Code}`}
value={this.props.ambientTemprature === '-' ? '' : this.props.ambientTemprature}
handleInputChange={this.props.handleInputChange}
handleInputBlur={(event)=>{this.props.handleInputBlur(event, this.props.validator)}}
requiredText={generalFormLabels.form_general_this_field_is_required}
validator={this.props.validator}
validationRule={`required|max:${VCF_Method.Max_Temp},num|min:${VCF_Method.Min_Temp},num`}
helpText={this.props.determineDensityOrTemperatureHelpText(window.StockControl.Constants.vcfTemperature)}
validationText={this.props.genericStringReplacement(this.props.stockLabels.temperature_range_error, [VCF_Method.Min_Temp, VCF_Method.Max_Temp])}
step=".01"
handleInputFocus={this.props.handleInputFocus}
handleInputKeyPress={this.props.handleInputKeyPress}
/>

<Input
name="ambientDensity"
label={detailsLabels.ambient_density}
size="short"
uom={this.props.densityUOM_Code}
value={this.props.ambientDensity === '-' ? '' : this.props.ambientDensity}
handleInputChange={this.props.handleInputChange}
handleInputBlur={(event)=>{this.props.handleInputBlur(event, this.props.validator)}}
fieldsetRowClassName={this.props.measuredDensityMethod !== 'A' && this.props.isVcfValid === false ? 'has-error-true' : null}
requiredText={(this.props.ambientDensity || this.props.ambientDensity === '' || this.props.ambientDensity === '-') ? generalFormLabels.form_general_this_field_is_required : null}
required
validator={this.props.validator}
validationRule={this.props.measuredDensityMethod === 'A' ?
this.props.determineDensityValidationRule(window.StockControl.Constants.vcfADensity) : 'required'}
static={this.props.measuredDensityMethod === 'A' ? false : true}
helpText={this.props.measuredDensityMethod === 'A' ? this.props.determineDensityOrTemperatureHelpText(window.StockControl.Constants.vcfADensity) : null}
validationText={this.props.measuredDensityMethod === 'A' ? this.props.isDensityStockControlValid(false) : this.props.isDensityStockControlValid(true)}
customValidationText={(this.props.measuredDensityMethod !== 'A' && this.props.isVcfValid === false) ? this.props.stockLabels.no_vcf_found : null}
step=".01"
handleInputFocus={this.props.handleInputFocus}
handleInputKeyPress={this.props.handleInputKeyPress}
/>

<Input
name="standardDensity"
label={detailsLabels.standard_density}
size="short"
uom={this.props.densityUOM_Code}
value={this.props.standardDensity === '-' ? '' : this.props.standardDensity}
handleInputChange={this.props.handleInputChange}
handleInputBlur={(event)=>{this.props.handleInputBlur(event, this.props.validator)}}
validator={this.props.validator}
fieldsetRowClassName={this.props.measuredDensityMethod !== 'S' && this.props.isVcfValid === false ? 'has-error-true' : null}
validationRule={this.props.measuredDensityMethod === 'S' ?
this.props.determineDensityValidationRule(window.StockControl.Constants.vcfSDensity) : 'required'}
required
requiredText={(this.props.ambientDensity && this.props.ambientDensity !== '' && this.props.ambientDensity !== '-') ? null : generalFormLabels.form_general_this_field_is_required}
static={this.props.measuredDensityMethod === 'S' ? false : true}
helpText={this.props.measuredDensityMethod === 'S' ? this.props.determineDensityOrTemperatureHelpText(window.StockControl.Constants.vcfSDensity) : null}
//validationText={this.props.measuredDensityMethod === 'S' ? this.props.isDensityStockControlValid(false) : this.props.isDensityStockControlValid(true)}
validationText={this.props.measuredDensityMethod === 'S' ? this.props.isDensityStockControlValid(false) : this.props.isDensityStockControlValid(true)}
customValidationText={this.props.measuredDensityMethod !== 'S' && this.props.isVcfValid === false ? this.props.stockLabels.no_vcf_found : null}
step=".01"
handleInputFocus={this.props.handleInputFocus}
handleInputKeyPress={this.props.handleInputKeyPress}
/>

{vehicleMetersData.length >= 1 ? (
<MeterRowList {...this.props}
handleInputChange={this.props.handleInputChange}
handleInputBlur={(event)=>{this.props.handleInputBlur(event, this.props.validator)}}
handleInputFocus={this.props.handleInputFocus}
handleInputKeyPress={this.props.handleInputKeyPress}
meterStartReadings={this.props.meterStartReadings}
meterVolumes={this.props.meterVolumes}
/>
) : (
''
)}

<Input
name="totalAmbientVolume"
label={detailsLabels.total_ambient_volume}
size="short"
uom={this.props.volumeUOM_Code}
handleInputChange={this.props.handleInputChange}
handleInputBlur={(event)=>{this.props.handleInputBlur(event, this.props.validator)}}
requiredText={generalFormLabels.form_general_this_field_is_required}
validationText={generalFormLabels.form_general_this_field_is_required}
value={this.props.totalAmbientVolume === '-' ? '' : this.props.totalAmbientVolume}
validator={this.props.validator}
validationRule='required'
fieldsetClassName={this.props.vehicleMetersData.length >= 1 ? 'offset-2' : ''}
required
static={this.props.vehicleMetersData.length >= 1 ? true : false}
handleInputKeyPress={this.props.handleInputKeyPress}
handleInputFocus={this.props.handleInputFocus}
customValidationText={this.props.totalAmbientVolume === '' && this.props.vehicleMetersData.length >= 1 ? generalFormLabels.form_general_this_field_is_required : null }
fieldsetRowClassName={this.props.totalAmbientVolume === '' && this.props.vehicleMetersData.length >= 1 ? 'has-error-true' : null}
/>
</Section>

<Section title={notesLabels.notes_and_documents}>
<TextArea
name="internalNotes"
label={notesLabels.internal_notes}
helpText={notesLabels.these_notes_are}
characterLimit={250}
countLimit={250}
handleTextAreaChange={this.props.handleTextAreaChange}
notesLabels={notesLabels}
value={this.props.internalNotes}
/>


<DocumentsList items={this.props.documents}
remove={this.props.handleRemove}
documentListOptions={this.props.documentListOptions}
notesLabels={notesLabels}
handleDocumentTypeChange={this.props.handleDocumentTypeChange}
handleAddDocumentClick={this.props.handleAddDocumentClick}
handleDocumentFileInputChange={this.props.handleDocumentFileInputChange}
documentCounter={documentCounter}
generalFormLabels={generalFormLabels}
enableMultipleDocuments={enableMultipleDocuments}
attachmentLists={this.props.attachmentLists}
attachmentDocTypes={this.props.attachmentDocTypes}
attachmentFiles={this.props.attachmentFiles}
handleResetDocumentList={this.props.handleResetDocumentList}
handleSelectBlur={this.props.handleSelectBlur}
selectHasError={this.props.selectHasError}
selectValidations={this.props.selectValidations}
handleInputBlur={this.props.handleInputBlur}
validator={this.props.validator}
fileValidations={this.props.fileValidations}
editModeAttachments={this.props.loadedTransaction !== null && this.props.loadedTransaction['Attachments_Metadata']}
viewDetailsLabels={this.props.viewDetailsLabels}
showToastHandler={this.props.showToastHandler}
/>
</Section>

<ReviewPanelTransferOnsite {...this.props} />

<Actions isReady={true}
ctaLabels={this.props.ctaLabels}
handleButtonClick={(event)=>this.props.handleButtonClick(event, this.props.validator)}
loadedTransaction={this.props.loadedTransaction}
/>
{modal.status==="open" ?
<Modal
modalTitle={modal.modalTitle}
modalMessage={modal.modalMessage}
handleModalClose={this.props.handleModalClose}
/> : null
}

{toasts.length ?

<Toast
level= "success"
visible= {true}
toasts= {toasts}
enableMultiContainer
/>
: null}

</React.Fragment>
);
}
};

const mapStateToProps = (state) => {
const store = state.getLocation_reducer;
return {
receivingDeviceOptions : store.receivingDeviceOptions,
transactionPointOptions : store.transactionPointOptions,
fuelGradeOptions : store.fuelGradeOptions,
operatorOptions : store.operatorOptions,
ambientTemprature : store.ambientTemprature,
ambientDensity : store.ambientDensity,
standardDensity : store.standardDensity,
totalAmbientVolume : store.totalAmbientVolume,
documentTypeData : store.documentTypeData,
transferOnsiteLabels : store.transferOnsiteLabels,
detailsLabels : store.detailsLabels,
stockLabels : store.stockLabels,
notesLabels : store.notesLabels,
generalFormLabels : store.generalFormLabels,
documentCounter : store.documentCounter,
enableMultipleDocuments : store.areMultipleDocuments,
selectedTransactionTypeLabel : store.selectedTransactionTypeLabel,
selectedSubTransactionTypeLabel : store.selectedSubTransactionTypeLabel,
dateTimeValidations : store.dateTimeValidations,
modal : store.modal,
toasts : store.toasts,
startDateField: store.startDateField,
endDateField: store.endDateField,
isConfirm: store.isConfirm,
reviewLabels: store.reviewLabels,
attachmentLists: store.attachmentLists,
attachmentDocTypes: store.attachmentDocTypes,
attachmentFiles: store.attachmentFiles,
selectValidations: store.selectValidations,
issuingDeviceOptions: store.issuingDeviceOptions,
VCF_Method: store.VCF_Method,
vehicleMetersData: store.vehicleMetersData,
meterStartReadings: store.meterStartReadings,
meterVolumes: store.meterVolumes,
meterEndReadings: store.meterEndReadings,
meterUoms: store.meterUoms,
meterValidations: store.meterValidations,
tempUOM_Code: store.tempUOM_Code,
densityUOM_Code: store.densityUOM_Code,
measuredDensityMethod: store.measuredDensityMethod,
isVcfValid: store.isVcfValid,
documents: store.documents,
documentListOptions: store.documentListOptions,
headerLabels: store.headerLabels,
deliveryReceiptNumber: store.deliveryReceiptNumber,
pitOrStandRequired: store.pitOrStandRequired,
pitNumber: store.pitNumber,
standNumber: store.standNumber,
fileValidations: store.fileValidations,
timezoneOffset: store.timezoneOffset,
dateStartValidationText: store.dateStartValidationText,
dateEndValidationText: store.dateEndValidationText,
startTime: store.startTime,
endTime: store.endTime,
volumeUOM_Code: store.volumeUOM_Code,
userDateFormat: store.userDateFormat,
selected_SPL_Date_Format: store.selected_SPL_Date_Format,
ctaLabels: store.ctaLabels,
internalNotes: store.internalNotes,
fuelGrade: store.fuelGrade,
subTransactionType: store.subTransactionType,
transactionPoint: store.transactionPoint,
operator: store.operator,
issuingDevice: store.issuingDevice,
receivingDevice: store.receivingDevice,
loadedTransaction: store.loadedTransaction,
viewDetailsLabels: store.viewDetailsLabels
}
}

const mapDispatchToProps = (dispatch) => bindActionCreators(
{
handleSelectChange : (event, validator) => handleSelectChange(event, validator),
handleInputChange : (event) => handleInputChange(event),
handleInputFocus : (event) => handleInputFocus(event),
handleInputBlur : (event, validator) => handleInputBlur(event, validator),
handleInputKeyPress: (event) => handleInputKeyPress(event),
handleSelectBlur : (event) => handleSelectBlur(event),
handleTextAreaChange : (event) => handleTextAreaChange(event),
handleCheckboxChange : (event, validator) => handleCheckboxChange(event, validator),
handleDateChange : (type, dateISOFormat, dateRegular) => handleDateChange(type, dateISOFormat, dateRegular),
handleModalClose : () => handleModalClose(),
handleDocumentTypeChange : (event) => handleDocumentTypeChange(event),
handleAddDocumentClick : (event) => handleAddDocumentClick(event),
handleRemove : (event) => handleRemove(event),
handleDocumentFileInputChange : (file, event) => handleDocumentFileInputChange(file, event),
handleButtonClick : (event, validator) => handleButtonClick(event, validator),
handleResetDocumentList: () => handleResetDocumentList(),
showInvalidTimeModal: (event) => showInvalidTimeModal(event),
validateStartTime: () => validateStartTime(),
validateEndTime: () => validateEndTime(),
selectHasError: (options, validation) => selectHasError(options, validation),
determineDensityOrTemperatureHelpText: (type) => determineDensityOrTemperatureHelpText(type),
determineDensityValidationRule: (type) => determineDensityValidationRule(type),
isDensityStockControlValid: (validateVcf) => isDensityStockControlValid(validateVcf),
getInitialDate: () => getInitialDate(),
genericStringReplacement: (message, valueArray) => genericStringReplacement(message, valueArray),
stringReplacement: (messsage, value) => stringReplacement(messsage, value),
formatDecimalByLocale: (number, precision, israw) => formatDecimalByLocale(number, precision, israw)
}, dispatch
);

export default connect(mapStateToProps, mapDispatchToProps)(TransactionInfo);
------------------------------------------------------------------------

import {SET_STATE} from '../actions/actionTypes';
import formatDecimalPoints from '../actions/formatDecimalPoints';
import doStockControl from '../actions/doStockControl';
import calculateTotalVolumesForSplitDelivery from '../actions/calculateTotalVolumesForSplitDelivery';
import doSplitStockControl from '../actions/doSplitStockControl';
import buildMetersReview from '../actions/buildMetersReview';
import mapMetersToDatabase from '../actions/mapMetersToDatabase';
import checkDRNValues from '../actions/checkDRNValues';
import validateSplitReceiveingDeviceCriteria from '../actions/validateSplitReceiveingDeviceCriteria';
import formatDecimalByLocale from "./formatDecimalByLocale";

const handleInputBlur = (event, validator) => {
return (dispatch, getState) => {
const targetName = event.target.name;
const { value } = event.target;
dispatch(formatDecimalPoints(event));
if (
targetName.indexOf(window.StockControl.Constants.meterVolumeFieldSuffix) > -1 ||
targetName === "ambientTemprature" ||
targetName === "ambientDensity" ||
targetName === "totalAmbientVolume" ||
targetName === "standardDensity" ||
targetName.indexOf(window.StockControl.Constants.receivingAmbVolFieldsPrefix) > -1
) {
if (
!(event.target.oldValue === value) &&
getState().getLocation_reducer.autoPopulateTempDens &&
validator.fieldValid(targetName)
) {
if (getState().getLocation_reducer.transactionType === 'RE') {
dispatch(doSplitStockControl(null, null, true));
dispatch(calculateTotalVolumesForSplitDelivery());
} else {
dispatch(doStockControl());
}
dispatch(buildMetersReview());
dispatch(mapMetersToDatabase());
} else if (!getState().getLocation_reducer.autoPopulateTempDens) {
dispatch(doStockControl());
}
}

if (targetName === "deliveryReceiptNumber") {
dispatch(checkDRNValues(event));
}

if (targetName.indexOf(window.StockControl.Constants.receivingAmbVolFieldsPrefix) > -1) {
let receivingDevicesAmbVols = getState().getLocation_reducer.receivingDevicesAmbVols;
let volumePression = getState().getLocation_reducer.volumePrecision;
let index = event.target.getAttribute('index');
receivingDevicesAmbVols[index] = dispatch(formatDecimalByLocale(value, volumePression));

const updateStateAndResolve = async () => {
let promise = new Promise((resolve, reject)=>{
const newreceivingDevicesAmbVols = [...receivingDevicesAmbVols];

dispatch({
type: SET_STATE,
payload: {
receivingDevicesAmbVols: newreceivingDevicesAmbVols
}
});

resolve('done');
});

let result = await promise;
if(result === 'done'){
dispatch(doSplitStockControl(index, value, false));
dispatch(calculateTotalVolumesForSplitDelivery());
dispatch(validateSplitReceiveingDeviceCriteria(index));
}
}
updateStateAndResolve();
}

//this.validator.showMessageFor(targetName);
if (validator.fieldValid(targetName)) {
validator.hideMessageFor.call(this, targetName);
} else {
validator.showMessageFor.call(this, targetName);
}
}
};

export default handleInputBlur;----------------------------------------------------

import React, { Component } from "react";
import PropTypes from "prop-types";
import Label from "./Label";
import { GetClassList, GetStyles } from "../utility";
import ValidationMessage from "./ValidationMessage";
import Hint from "./Hint";

class Select extends Component {
constructor(props) {
super(props);
}

render() {
return (
<div className={`form-group ${!this.props.stacked ? "row":""} ${GetClassList(this.props)} has-error-${this.props.isError}`} style={GetStyles(this.props)}>

{this.props.label === '' ? null : <Label {...this.props} />}
<div className={(this.props.options && this.props.options.length === 1 ? 'static' : '') + ' fieldset'}>

<select
className={(this.props.options && this.props.options.length === 1 ? 'd-none' : '') + ' form-control'}
id={this.props.name}
name={this.props.name}
type={this.props.inputType}
value={this.props.options.length === 1 ? this.props.options[0].label : this.props.value}
onChange={this.props.handleSelectChange}
required={this.props.required && "required"}
readOnly={this.props.readOnly && true}
tabIndex={this.props.readOnly && "-1"}
disabled={this.props.disabled && true}
onBlur={this.props.handleSelectBlur}
index={this.props.index}
defaultValue={this.props.defaultValue}
size={this.props.size || null}
multiple={this.props.multiple || false}
>

{ this.props.options.map((option, index) =>
<option
key={'option-' + index}
value={option.value}
label={this.props.placeholder}
issuingdeviceid={option.subIssuingDeviceId}
receivingdeviceid={option.subReceivingDeviceId}
fuelgradeid={option.fuelgradeid}
fuelgradeline1={option.fuelgradeline1}
fuelgradeaddcode={option.fuelgradeaddcode}
itemID={option.itemID}
selected={option.selected}
vehicletype={option.vehicleType ? option.vehicleType : "false"}
>
{option.label}
</option>
)};

</select>

{this.props.options.length === 1 ? (
<span>{this.props.options[0].label}</span>
) : (
''
)}

</div>
{this.props.validationText && this.props.isError && (
<div className="col-auto offset-1">
<ValidationMessage {...this.props} />
</div>
)}
{this.props.helpText && <Hint {...this.props} />}
</div>
);
}
}

Select.propTypes = {
inputType: PropTypes.oneOf(["text", "number", "password", "email", "hidden"]),
name: PropTypes.string,
label: PropTypes.string,
value: PropTypes.string,
placeholder: PropTypes.string,
className: PropTypes.string,
required: PropTypes.bool,
hidden: PropTypes.bool,
handleSelectChange: PropTypes.func,
options: PropTypes.array,
validationText: PropTypes.string
};

Select.defaultProps = {
inputType: "text",
};

export default Select;

| No Comments | No TrackBacks
fetch(endPointURL, {cache: "no-cache",credentials: 'include'})
.then( response =>{
return response.json();
}
)
.then( data=> {
if(data["error_info"]){
if(data[endpointTransactionData] === null){
throw 1
}else{
throw 1
}
}else if(!data["error_info"] && data[endpointTransactionData] === null){
throw 1
}else{
const rootDataNode = data[endpointTransactionData];

| No Comments | No TrackBacks
//TODO INITIATE THE SAVING
//TODO obtain the token from AEM for POSTING (code is below),then call saveContraForm_Details
//First, get the AEM token
let token = null;
if (window.StockControl.Constants.isAEM) {
let xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
let msg = JSON.parse(xhr.responseText);
token = msg.token;
dispatch(saveContraForm_Details(token, isRebillSelected));
}
};
// Open the request to the token endpoint and send the GET
xhr.open("GET", "/libs/granite/csrf/token.json", true);
xhr.send();
} else {
dispatch(saveContraForm_Details(token, isRebillSelected));
}


const saveContraForm_Details = (token, isRebill) => {
return (dispatch, getState) => {
let contraEndpointUrl = ''; //TODO replace this with the new API url for contra/rebill

const doError = (data, disableButtons) => {
return (dispatch, getState) => {
//TODO you can reuse this error handing in case there is a server error with the response/API down
/*console.log(data.err);
const updateStateAndResolve = async () => {
let promise = new Promise((resolve, reject) => {
let alerts = {
msg: getState().transactionDetailReducer.generalFormLabels.internal_server_error,
type: "alert-danger",
};
const newalerts = Object.assign({}, alerts);
dispatch({
type: SET_STATE_TRANSACTION,
payload: {
alerts: newalerts
}
});
resolve('done');
});

let result = await promise;
if (result === 'done') {
if (disableButtons) {
let targetSave = document.getElementsByName("save")[0];
targetSave.disabled = false;
}
}
};
updateStateAndResolve();
return data;*/
}
};

if (contraEndpointUrl === '') { //TODO DELETE this...just a demo...
//TODO this is just a test to demo the functionality so remove this whole block
setTimeout( () => {
let linkUrl = `${window.StockControl.Constants.routeTransactionDetail}?id=8kpazktoo8na1578549690896`;
if (isRebill) { //This is a rebill, so when successfully saved, open in new window.
linkUrl = window.StockControl.Constants.routeTransaction + "?Id=08uiikixbxyd1580277608412&action=rebill";
}
window.location.href = linkUrl;
}, 4000);
}


if (contraEndpointUrl !== '') { //TODO you can delete this check once you have the endpoint
let xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {

if (xhr.readyState === 4) {
if (xhr.status === 200) {
var data = JSON.parse(xhr.responseText);
//console.log("PostData ", body);
//console.log("data ", data);

if (!data["error_info"]) {
//TODO add logic here to call the endpoint to post the contraReason and contraComments. This API will trigger the back end changes to the completed record and will create the contra.
//if the stock movemnt ID does not contain rebill or contra (see constants defined at top), then the first one will be called 'Contra'
// if the stock movement id does contain 'contra' (see constants at top), then it will be appended _Contra1

/*
The format for the contra is as such:
a4gbqqzixh131570518702487 - first ticket, marked as completed but will be cancelled.
a4gbqqzixh131570518702487_Contra - the first contra ticket will be appended with _Contra
a4gbqqzixh131570518702487_Rebill - the first rebill will be appended with _Rebill
a4gbqqzixh131570518702487_Contra2 - the second contra (only able to be made from the a4gbqqzixh131570518702487_Rebill ticket) is _Contra2
a4gbqqzixh131570518702487_Rebill2
a4gbqqzixh131570518702487_Contra3
*/
//TODO add success here
//TODO obtain the response. The response should contain the contra stock movement ID (eg, a4gbqqzixh131570518702487_Contra, a4gbqqzixh131570518702487_Contra1).
//Todo the stock movement id should be used to create the URL to redirect to ONLY if the isRebillSelected flag is true. Otherwise, simply refresh the page (with closed modal)

let stock_movement_id = data.id; //TODO this should be the response stock movement ID

let linkUrl = `${window.StockControl.Constants.routeTransactionDetail}?id=${stock_movement_id}`;
if (isRebill) { //This is a rebill, so when successfully saved, open in new window.
//TODO obtain the saved ID (contra one)
//Pass the contra ID to the form page Id=1234_contra&action=rebill
//Todo update isRebill in state...this should open the cancelled transaction in the draft page on finish
linkUrl = window.StockControl.Constants.routeTransaction + "?Id=" + stock_movement_id + "&action=rebill";
}

//redirects to detail page unless it is a rebill
window.location.href = linkUrl;

} else {
//dispatch(doError(data, true)); TODO uncomment
}
return data;
} else { //status is not 200
// dispatch(doError(data, false)); TODO uncomment
}
}
};
xhr.open("POST", contraEndpointUrl, true);
if (token !== null) {
xhr.setRequestHeader("CSRF-Token", token);
}
//xhr.send(JSON.stringify(body)); TODO uncomment this out when you send the body json
}



}
};

export default saveContraForm_Details;






Today, I've come across street art by Bambi that I took a few years ago and forgot to post. Since then, the street art no longer exists, but it used to be in Seven Dials at the start of the alleyway (on the Monmouth Street side) into a little mall not far from Neal's Yard. Today, this alleyway marks one of the entrances to Seven Dials Market. The artwork was painted in the summer of 2017 to mark the anniversary of Princess Diana's death. 

bambi-streetart-sevendials.jpg

"Be As Naughty As You Want" shows Diana as the fictional Mary Poppins with a Harrods skirt, her umbrella opened and being watched by Prince George and Princess Charlotte. The text reads: "Be As Naughty As You Want, Just Don't Get Caught".

London Maps in Illustration

| No Comments | No TrackBacks
Ever have an alternative view of London, such as where to get the best cocktails or learn the history of music in the city? Why not create your own illustrated map of London? This idea started from a series of books for families to explore London and learn about different stories while they explore various areas in London. The books can be found here: London Adventure Walks for Families: http://www.adventurewalksforfamilies.co.uk/.
handdrawnlondon.jpg
1) 101 Dalmatians Walk: This map features the areas that map-readers can explore in the classic Disney story.
2) Brixton as a Tree: This map depicts the area of Brixton with the roads as branches and the illustrator's favourite cafes and pubs as fruit hanging from the branches.
3) London Firsts: This map shows some of London's first achievements, such as the first broadcast and police force.
4) Markets: The illustrator created a map with decorative text and imagery to provide details about the speciality of the market.
5) Grosvenor and Berkley Squares: Depicts the famous squares in Mayfair.
londonillustratedmap2.jpg
6) Detail of illustrated music map of London by Pixie.
londonillustratedmap3.jpg
7) Super Mario London TUBE map - Naturalbeats
legostore-08.jpg
 
8) London Lego map in the Lego store in Leicester Square. Note that there were also a series of historical tube maps in Lego in a few of the London underground stations a few years ago.
 
For more examples of London maps, see: http://mappinglondon.co.uk/

Lunch at Bournemouth's Urban Garden

| No Comments | No TrackBacks

Located on the slope above the Lower Gardens in Bournemouth is the bar/restaurant Urban Gardens, one of a small handful of bars and restaurants in a local chain in the city. A couple weekends ago, I visited the restaurant for a late lunch with 

uppergarden-bournemouth1.jpg

uppergarden-bournemouth2.jpg

uppergarden-bournemouth3.jpg

uppergarden-bournemouth4.jpg

uppergarden-bournemouth5.jpg

Last month, I made my first visit to one of London's newest shopping areas, "Coal Drops Yard", located in a new development north of King's Cross station. Many smaller and independent businesses have opened up shop here in the arches and the Victorian warehouses that were used to store coal transported down Regent's Canal into London. When the warehouses became unused, the derelict warehouses became scenes of nightclubs, illegal raves, and "underground" use before becoming derelict again. Now, this area has a new life after ongoing work at King's Cross, and "Coal Drops Yard" was opened to the public in the autumn of 2018.

coaldrops1.jpg

Many of the shops at "Coal Drops Yard" are independent ones, and there's also a small area for street food. I noticed that many of the shops here are fashion-oriented. There are a couple of chains here, but the idea of this new London market is to serve a purpose for independent sellers and craftspeople in order to exchange ideas. 

coaldrops2.jpg

coaldrops3.jpg

coaldrops4.jpg

The shops are located on two levels with a third building constructed above the Victorian warehouses, and this is a Samsung shop. This blends the modern with the Victorian design in a unique architectural design.

coaldrops5.jpg

coaldrops6.jpg

coaldrops7.jpg

"Coal Drops Yard" also hosts various creative, health, wellness, and foodie workshops throughout the year.

coaldrops8.jpg

coaldrops9.jpg

I did not stop for food and drink on this visit to "Coal Drops Yard", but I expect that this market is busier in the summer months. It had a fair amount of footfall when I visited it before the holidays.

After an appearance at Canary Wharf Winter Lights 2019, artist collective Squidsoup brings two more immersive light installations to London for the festive season. "Wave" comes to Eccelston Yards in Belgravia from 28 November 2019 to 11 January 2020. "Votices" comes to Queen Elizabeth Hall on South Bank from early December until 2 January 2020. 

squidsoup-xmas-02.jpg

"Wave" ('Chromotherapy Christmas') is free to visit in Eccleston Yards, and consists of 500 colourful orbs of lights dangling above. They have been designed to improve wellness through the use of colour, and each orb contains a recorded sound of a single choir voice that makes a full choir sound in synchronisation. Mulled wine can also be enjoyed here at Eccleston Yards during this time.

squidsoup-xmas-03.jpg

squidsoup-xmas-01.jpg

Meanwhile, another new Squidsoup artwork appears at Southbank Centre's Winter Festival. "Votices" is available to view from 2 December 2019 to 7 January 2020 in Queen Elizabeth Hall in the foyer. This installation is a little more lacklustre as it is inside the main foyer of the building and changes colour with a faint some soundscape. It's difficult to be immersed in this installation.

squidsoup-southbank.jpg

Did you get to see either of the Squidsoup installations over the festive season? What did you think?

Late Summer and Autumn Empties 2019

| No Comments | No TrackBacks

I didn't get to write or post my review of the latest empty beauty and make-up products last year as there were so many other things going on, but I used up a fair amount of products in the late summer through to the end of autumn. I am slowly still making my way through the products that I own, and I've started to organise and unpack boxes this week. The building work isn't completed yet because the builders had two weeks off over Christmas and have not been around much since, and I am starting to get "cabin fever" at having to live amongst dust and unpacked boxes for the past several months. However, my dressing table and new make-up tower have been put into the room, so I have been able to unpack some of my beauty and make-up items now. I review the products that I have used up so I can decide what to purchase or not purchase in the future. Also, hopefully this will help others.

empties2019-end.jpg

Konnyaku Face Sponge: This came in one of the empty packets from my "No Make No Life" box, and the sponge was made from asian potato. It is meant to be kept damp and isn't harsh on the skin. I actually really liked the product because it was able to clean my face without being too harsh. The product lasted around a month, and it needed to be kept moist, but if it did dry out, it would regain its shape again. Would I buy it again? Yes, if it can be purchased in the UK.

Savon de Chocolate Soap: This bar of chocolate-scented soap came in another of the packages, and it really smelled like chocolate. The soap contained cocao butter and charcoal to moisturise and cleanse skin, and it was a soft lathery soap. Would I buy it again? I enjoyed the product, so I would purchase it again.

7th Heaven Black Seaweed peel-off: This mask promises a deep cleanse and detox of skin, and it was what my skin needed at the time. It was actually better than some masks I have used and left my skin feeling soft and clean. Would I buy it again? Yes, it was better than other similar masks on the market.

Bamboo Oil strengthening deep cleanser: This hair mask product promises to nourish all hair types, and it really did help detangle my hair and leave it soft and smelling good. I had split ends at the time I used it, so it really helped give my hair the extra boost. Would I buy it again? Yes, definitely; it was one of the better hair masks. I'd love to purchase this again.

Bath and Body Works 'Afternoon Apple Picking' hand soap: Bath and Body Works products are always a favoruite of mine, but unfortunately they are not sold in the UK. I used up this wonderful 'Afternoon Apple-Picking' scent, which took me back to the farm and eating/picking apples in the autumn. This was the soap I had out at the end of summer and used up as the autumn was finishing. It reminded me of warm Indian summer days with the fragrance of apple in the air. Would I buy it again? Yes.

The Body Shop perfume in 'British Rose': This is a rose-scented perfume and one that I used up in the summer months. Would I buy it again? No, it was not as long-lasting as similar scents; I still love the "Chloe" scent which is a longer-lasting rose scent.

Claire's Cosmetics pink nail polish: I finally used up this bright cotton-candy pink (colour not described on packaging) chip-resistant nail polish. This brand is really targeted at a younger user. I did't get on with the product as it needed a few layers to cover nails. Would I buy it again? No, although it was chip resistant, the colour needed several layers.

Models Own nail polish in 'chrome indigo': This fast-drying nail polish is a metallic blue shade, which was perfect to apply in a hurry and went well with a casual outfit. Would I buy it again? No, although the product applies well and dries quickly, it doesn't wear well as it prones to flake off after a day or two, and topping it up looks patchy.

ModelCo Lip Laquer in 'Morocco': This muted red-brown shade looks good on me, and the product had a fruity scent when applied. It applied in a glossy finish. Would I buy it again? No, I just did not care for the product and feel that there are better ones available.

MUA Power Pout in 'Allure': A purple-red colour, this gloss is applied with a brush attached to the end of the applicator, and it is a high-gloss lip product. Would I buy it again? No, I just felt that it was too glossy and had to be applied thickly.

TempleSpa 'Peace be Still' calming skin balm: I received this product in a hotel in Bristol and used it primarily as a hand lotion. I loved the scent of the product as it was a calming scent. Would I buy it again? Yes, but I have a lot of lotions to use.

Redherring make up palette, 'office to party': This make-up set included a mirror and two palettes: one for day wear and then evening wear. Each set included two lip gloss colours, a blush, and two eyeshadows with the applicator brushes. It came in an attractive butterfly design. Would I buy it again? No. Although the eye shadows and blush were useful, the lip gloss attracted powder and was very sticky. I would have preferred just the blush and eyeshadow, but I found that I used the "party" shade less, but I did end up using it as a daytime shade with the right outfit.

Dr Botanicals PO  Pomegranate superfood sleeping mask: This mask promises to help hydrate and repair skin while you sleep. Would I buy it again? No, I did not really notice any benefits to using the product, and it seemed to affect my eyes when I woke up, even though I didn't put it anywhere near my eyes.

Bath and Body Works 'Twisted Peppermint' hand soap: This is a Christmas hand soap from one of my favourite brands, "Bath and Body Works" smells of peppermint, and I didn't finish the product in 2018 but brought it out for last Christmas, and it was used up. Would I buy it again? I love this brand, but I wouldn't purchase this scent again as it was a little too minty and there were nicer Christmas scents in the range.

Rituals Lip Balm in 'Japanese Mint': This product was a freebie (or included in the cost) of Virgin Airlines first class. I loved the balm with the gentle mint scent and it helped hydrate my lips when they needed a boost. Would I buy it again? Yes.

NARS matte lip gloss in 'Starwoman': This bright red lipstick is a matte finish. Would I buy it again? I would purchase this product in a berry shade because I don't tend to wear bright lipstick, but I loved the matte finish.

DKNY Be Delicious perfume in 'fresh blossom': I love the apple fragrance of the DKNY range of 'Be Delicious'. The "pink" bottle, called "fresh blossom" is the more fruity, easy-going, and subtle of the scents. Would I buy it again? Although I love the scents, they do not last long, so I would have to say no.

Original Source hydrating water infusions shower soap in 'apple and melon': This is an environmentally friendly product that does not include harsh chemicals that pollute the water or environment. The product comes in a nice summery fruity scent, which I loved. The product did not lather up as much as other shower gels, but the scent was delicious. Would I buy it again? Yes, I like that it is good for the environment and smells wonderful; the only issue was that it didn't lather up as well as other products.

Superdrug mask in 'creamy coconut': This facial mask helps purify skin's pores. Would I buy it again? Probably because it is easy to locate as it's in a chain store; there are better masks out there, such as the one I reviewed earlier.

Palmers Natural Fusions chai seed and argan oil hair mask: This hair mask helps to deep clean and repair damaged hair. The product also had a nice scent. Would I buy it again? Yes, I liked the product and its deep conditioning, so I would purchase it again.

Canary Wharf Winter Lights 2020

| No Comments | No TrackBacks

Winter Lights at Canary Wharf is celebrating its sixth year and has become an annual event in the London calendar for the middle of January. This was my fifth year visiting the Winter Lights festival at Canary Wharf; I never made it to the first year. Compared to the previous years, the event is slightly shorter this year, lasting only just over a week as opposed to two weeks. This year was the busiest that I have ever seen it, which may be due to the event being shorter (opening on a Thursday instead of a Tuesday), increased marketing from the previous year when numbers soared for the first time, and an increase in workforce in the area. 

winterlights2020-01.jpg

Improved signage and volunteers helped keep the event organised, which was lacking the first four years, however, getting lost in those initial years actually allowed me to understand the layout of Canary Wharf so that it is no longer a maze for me). Some installations from previous years were included this year, but there were also many new installations too. Also, the Winter Lights bites street food stalls returned for their second year in a row but located in different areas this year and with more options. Another difference was that the trail covered a wider area of Canary Wharf than in previous years. Many of the light installations were colourful and interactive, and I managed to see them all this year without wind or operation issues. Continue reading to see what is on display this year.

Montgomery Square hosted one of the larger interactive installations again this year but left plenty of room for several street food trucks. One of these sold marshmallows for toasting in the cold January evening. I had the blueberry and gin marshmallow.

At the end of the night, I had a crumble with vanilla custard from a street food seller "Humble Crumble", and it was delicious.

I also had the wood-fired pizza, but it was different to last year's pizza, which was really tasty. This one was "Barney and the Pizza" and was good but did not quite hit the spot. This was located in the same place as last year along with four or five other vendors by Cabot Circus. 

AFFINITY BY AMIGO & AMIGO AND S1T2

This large scale illuminated artwork mimics how neurons send messages to the brain; the orbs near the ground send different colours up the chain of orbs above when they have been touched by viewers. Due to its large scale and ability to walk around and underneath the installation, it encourages viewer interaction, which also allows its colour and brightness to be transformed.

POOLS OF LIGHT

Thousands of plastic balls have been spilled inside the Jubilee Park decorative ponds, and colours of light are projected onto these white plastic balls. The colours change and reflect onto the ball-filled pools, giving them a glow.

CHROMATIC PLAY BY TINE BECH STUDIO

These alien-like creatures with "antennae" change colour when they sense movement near them, and they interact accordingly. These sculptures were inspired by the sense of personal space and how humans interact with one another in this "personal space".

16 BITS BY PARKER HEYL

Inside the shopping mall below Jubilee Park is another interactive installation. It is comprised of several blocks that move when visitors switch a series of levers in front of the installation; these move the blocks to create a unique installation piece using motion and light. The artist of this installation uses elements of mechanical engineering to create this interactive artwork.

SQUIGGLE BY ANGUS MUIR DESIGN

"Squiggle" is a sculpture with a series of glowing lights around it. The artwork's light change colour and pattern and seem to emit from the central sculpture. At times, the light moves like a wave; other times, the light is solid but changing in colour and intensity.

MI-E DOR DE TINE BY DAISLER ASSOCIATION

This phrase in this artwork is roughly translated from Romanian to English as "I miss you". However, the phrase is not an equal translation because it has a deeper feeling than the English phrase conveys. This installation hangs over the dock to reflect on the water and is an exchange with "Lights on Romania" art festival.

SASHA TREES BY ADAM DECOLIGHT

These illuminated and colour-changing trees are back for a second time at Winter Lights in Canary Wharf; they made an impact last year and look beautiful in this new square. The artwork appears to be pine trees, which are lit with colourful lights in blocks. The lights transform gradually between a series of colours on each block, creating a unique glowing artwork.

SHISH-KA-BUOY BY ANGUS MUIR DESIGN

These towering sculptures change and glow with different colours, absorbing the light to give off a glow during the day. They are constructed out of marine buoys. 

STRATUM BY STUDIO CHEVALVERT

This interactive installation is made from 92 metal totems, an the light from these change pattern and shape depending on how the user interacts with it using a sensor panel in front of the artwork. The lights pulsate, appear like water droplets, or completely illuminate and change pattern depending on how the visitor's hand is waved in front of a sensor. This is also set to a soundscape.

LACTOLIGHT BY LACTOLIGHT

Constructed out of used milk bottles in a giant circle, this unique artwork uses light and soundscape to charm viewers. This installation highlights the importance of recycling plastics. The artwork has colours projected onto it on which patterns were created and change.

TIME & TIDE BY PAUL & PUTE

This installation was on display last year and highlights the issues with plastic pollution. The item is constructed out of biodegradable material. The sculpture illuminates into an hourglass shape, which is meant to suggest that time is limited or that the planet is up against time.

SKY ON EARTH BY UAII STUDIO

This installation simulates being in the clouds in the middle of a storm. Crashes of thunder, wind sound, and flashes of bright light mimic a storm. Wind is also emitted, which sometimes lifts up the foam into the air. The installation is from a sky or cloud view.

DITTO BY ITHACA STUDIO

This chamber of light is decorated with mirrors on the floor and ceiling and bright orbs of light and colour. The visitor can interact with it by going inside the sculpture where there are benches to sit on to enjoy the surrounding of the changing colour, patterns, and to enjoy the accompanying soundscape.

ABSORBED BY LIGHT BY GALI MAY LUCAS

This light sculpture offers a social message about people being "glued" to their phones, which emit a glow. The light sculpture also encourages visitors to have a seat to pose for photographs as there is a free seat between the figures on the bench. 

LIQUID SOUND BY ENTERTAINMENT EFFECTS

As last year, the fountain in Cabot Square has become an installation set to light and music. The fountains move and create patterns with the beat of the song, and the lights of the fountain change colour.

MOUNTAIN OF LIGHT BY ANGUS MUIR DESIGN

This illuminated mountain of colourful blocks can be manipulated by the viewer in order to create their own colour or patterns. The colours are similar shades at first, then it is built up through interaction to be brighter and bolder multi-coloured elements. 

THE CLEW BY OTTOTTO

This installation is created using 100 circles of red light and is inspired by the architecture of the bridge and the glow of sunset reflecting on the water.

BIT.FALL BY JULIUS POPP

This year, the installation was broken and kept repeating the phrases "subscribe" and "access", which I think means that the installation failed to contact the news service feeds in order to gather the words from them that it uses to display as droplets of water and light and instead displays the generic subscription message. Although this installation is a permanent one and features every year at Winter Lights, I enjoyed seeing the words from the news that would surface on the water.

THE BRA TREE

This tree is covered in bras and then illuminated with light. It raises awareness of breast cancer and aims to raise money to support breast cancer charities.

NEON TREE BY HAWTHORN

This tree has been decorated with neon strings of light, and it really brightens up the square.

LIGHTBENCH BY LBO LICHTBANK

These light benches are part of the permanent collection and have been in place for three years now after having been showcased previously as temporary artworks at Winter Lights. The benches are illuminated and change colour, and they can be seen all year.

SEED OF LIFE BY AMBERLIGHTS

This installation or a similar one by the same company was on display a couple of years ago. Unfortunately, its current location inside the shopping mall isn't dark enough to highlight the real beauty of this object. The different colours of panel create a light and metallic effect.

CONSTELLATIONS BY STUDIO JOANIE LEMERCIER

"Constellations" is a production created using water mist, light, and sound. The image is projected onto a spray of water or mist from the dock below. This then shows animations of the sky, such as the moon at eclipse, black hole, and stars. With the water mist and light, shapes and patterns are formed.

DESIRE BY UXU STUDIO

This installation is created with a soundscape and pulsating red lights. On one side, it appears to be a pair of lips, and the side appears to be a heart. The lights pulsate, and this is a very photographic artwork.

LUMA PAINT LIGHT GRAFFITI BY LICHTFAKTOR AND BOMBER GRAFFITI

This interactive artwork was so popular that it returns again, and there was a long queue to participate in it. The creator of the artwork also becomes part of the artwork with an illuminated photograph of themselves taken to appear as part of the graffiti. They also "paint" light onto the canvas to create their own unique designs.

AQUATICS BY PHILIPP ARTUS

This artwork is similar to last year's parade of animals, but the artist is different. The installation mimics sea life swimming around. This is another interactive piece where the viewer can decide the shapes of the creatures.

Some of the permanent installations were not included this year, such as the lit-up trees in the sky garden, glowing reeds below the Crossrail station, and the illuminated walk-way to the Crossrail station. This is the first time in the six years that "WE COULD MEET BY MARTIN RICHMAN" (the reeds) were not included as one of the items in the trail, but it is a permanent installation.

Previous visits to the Winter Lights at Canary Wharf can be seen below:

Canary Wharf Winter Lights 2019
Winter Lights @ Canary Wharf 2018
Canary Wharf Winter Lights (2017)
Winter Lights @ Canary Wharf (2016)

London-based street artist Jim Vision always has a wall painted with his artwork somewhere in London. I've managed to accumulate a lot of photographs of his work over the past several months that I have not posted. The pieces range from a tribute to the "Avengers: Endgame" film, an environmental-message film advertising a programme "Our Planet", a series of dragons, and feminine faces. 

jimvision-2019-05.jpg

The most recent artwork appeared on Pedley Street off of Brick Lane and is a collaboration with Fanakapan and ThisOne, two other street artists who paint in London a lot. It was painted during the final days of the community gardens at the end of the street here. 

jimvision-2019-01.jpg

The below group of orange girls was painted at least two years ago, but I never got around to uploading it. It looks like a collaboration. 

jimvision-2019-02.jpg

The series of dragons appeared on Wheler Street near Shoreditch High Street tube.

jimvision-2019-03.jpg

The below image highlights the planet and the dangers that humans are causing to contribute to the demise of our planet home.

jimvision-2019-04.jpg

Lastly, I have photographed a lot of the mural on Hanbury Street. It was hard to photograph this wall because it is so large, and a sunny day can take away the detail. All of the popular characters from the "Avengers: Endgame" film are portrayed on the wall.

jimvision-2019-06.jpg 

That's all of the photographs I got so far, but keep checking back for more street art.

Jim Vision's Street Art Tribute to Stan Lee
Street Art: 2Square, CodeFC, Jim Vision, Mr. Cenz, Peter Drew, Zadok
Jim Vision "Battlechasers" Street Art
Jim Vision "Lost Paradise" and Other Street Art
Jim Vision Adds to Tagged ROA Hedgehog and New Work
HumanNature Endangered13 Street Art Paint Jam, Day 2
New 'Star Wars' Street Art in Shoreditch

The Pantone® "colour of the year" for 2020 is "Classic Blue" (PANTONE 19-4052). The colour blue is a stable, comforting, and dependable colour that will help launch the new era. This shade of blue is an elegant and classic grown-up shade of blue, and this is the colour that Pantone® believe will be used throughout the year in fashion, the arts, and design. However, it's a little controversial because the company have not seem to have really got the colour right all of the times in the past and a new colour emerges as that year's most popular colour. It's too early to tell, but welcome to the year with the shade of classic blue. 

pantone2020.jpg

Overall, it's not one of my favourite colours. Blue is actually one of my least favourite colours, but it is a colour with mass appeal and probably the favourite colour for most people. 

Pantone® helps to set the colour trends. Expect to see this colour used in the world of fashion, interior design, home furnishings, and graphic design over the next year. The past few years of Pantone® 'colours of the year' are listed below.

2019: Living Coral
2018: Ultra-Violet
2017: Greenery
2016: Serenity & Rose Quartz
2015: Marsala
2014: Radiant Orchid
2013: Emerald
2012: Tangerine Tango
2011: Honeysuckle

1) Pantone®. https://store.pantone.com/uk/en/color-of-the-year-2020 [14 January, 2020].

One of my friends celebrated her birthday today, so we went to Rhinefield House Hotel in the New Forest (in Hampshire, southern England) for a late sitting of afternoon tea. I did not have any expectations as I've never been to the Rhinefield House Hotel before, unlike my other friends, but by the end of the evening, I was impressed with the venue and the quality and value of afternoon tea at the Rhinefield House Hotel. 

rhinefield-house-tea-01.jpg

We arrived at the venue near Brockenhurst as the sun was setting, and we got a quick glimpse of the hotel in the waning sunlight. I preferred the photographs taken on the way out of the building. The hotel is a large estate designed in the gothic and Tudor styles, and one of the rooms is inspired by the Alhambra Palace in Spain. Although the building looks to be from much older times, it was actually built in the late 1800s. Before the present building, the site was occupied in William the Conqueror's time and was used for hunting; hunting lodges existed here. In 1950, the family had to sell the house.  

rhinefield-house-tea-02.jpg

I had a glass of champagne with my afternoon tea. The sandwiches on offer were ham and mustard, salmon and cream cheese, coronation chicken, egg mayonnaise, and cheese and pickle. They were very accommodating to dietary requirements. My favoruite were the ham sandwiches; the ham tasted of good quality. 

rhinefield-house-tea-03.jpg

Next up were the scones, which came with plenty of clotted cream and a little pot of strawberry jam. A plain and fruit scone was served per person. These were also very tasty and good quality.

rhinefield-house-tea-04.jpg

We had the sweet afternoon tea, but there was also a savoury option for those who did not want the sweets. The pastries included a piece of salted caramel brownie, a chocolate chip cookie, Victoria sponge, mille feuille, and an chocolate and orange-flavoured tart. My favoruites were the cookie and the brownie. 

rhinefield-house-tea-05.jpg

On the drive back home, the moon was very low and a golden colour; it was very large in the sky. By the time I got home, it did not look so close and the golden colour had gone, but I managed to get a decent photograph. I will have to see what it looks like tomorrow evening, if there's no cloud coverage.

rhinefield-house-tea-06.jpg

Overall, I was very impressed with the Rhinefield House Hotel afternoon tea.

"Walking with the Snowman" is a trail featuring twelve life-sized snowman sculptures from Raymond Briggs' illustrated book "The Snowman". The snowman sculptures have been placed between London Bridge and Tower Bridge in London on the south bank where a Christmas market and street food has also been set up along the route. (Apparently, this part of London is now called London Bridge City.) Each of the twelve sculptures is designed based on the Christmas song "The Twelve Days of Christmas". The art trail has been set up between Wild in Art and Penguin Ventures. Often, these sculptures are auctioned off at the end of the trail to raise money for charity.

snowman-trail-london-2019-01.jpg
Eleven Pipers Piping - Jess Loveday

I enjoyed seeing the sculptures, which were all easy to locate and could be completed in a short amount of time. I saw others also looking for the snowmen as well as other people who did not know about them and happened to stumble upon them. With the Christmas market and street food, I found this part of London to be busy on a Sunday late afternoon a little over a week before Christmas.

snowman-trail-london-2019-02.jpg
Twelve Drummers Drumming - Jessican Perrin

snowman-trail-london-2019-09.jpg
Ten Lords a-Leaping - Hammo

snowman-trail-london-2019-03.jpg
Eight Maids a-Milking - Donna Newman

snowman-trail-london-2019-04.jpg
Six Geese a-Laying - Matilda Elizabeth; Nine Ladies Dancing - Lizzie Rose Chapman

snowman-trail-london-2019-05.jpg
Seven Swans a-Swimming - Laura-Kate Chapman

snowman-trail-london-2019-06.jpg
Four Calling Birds - Jenny Leonard

snowman-trail-london-2019-07.jpg
Five Gold Rings - Adam Pekr; Three French Hens - LeiMai Lemaow

snowman-trail-london-2019-08.jpg
A Partridge in a Pear Tree - Jodie Silverman; Two Turle Doves - Megan Heather Evans

The "Walking with the Snowman" sculpture trail is located between London Bridge and Tower Bridge (south Bank) until the 5th of January, and it is a fun day out.

The Royal Marsden Cancer Charity has created an illuminated rose garden in Grosvenor Square in Mayfair, London. The idea was conceived by Camilla Morton and Anya Hindmarch; you may recognise Hindmarch's name as she was responsible for the large chubby red heart balloons that appeared around Valentine's Day (Chubby Hearts Float Around London). The rose garden is known as "Ever After Garden" and was dedicated in memory of art director Michael Howells, designer of the film "Ever After". "Light Rose Garden", an exhibition first launched in Korea by Pancommunication and a very popular event, helped to also inspire "Ever After Garden".

ever-after-grosvenor1.jpg

Over 270,000 illuminated roses are lit up in the square, and visitors can make a donation to dedicate a rose, which will be planted in the garden. The "Ever After Garden" pays tribute to those who were lost over the year and celebrate those who we miss over the Christmas holidays.

ever-after-grosvenor2.jpg

ever-after-grosvenor3.jpg

In addition to the rose garden, a lit-up archway is also available to see for free in Grosvenor Square, and this proved to be popular as well.

ever-after-grosvenor4.jpg

The illuminated rose garden was free to visit from 30th November until 22nd December.

Marchesi 1824 Bakery in London

| No Comments | No TrackBacks

Earlier this year, Milan's famous Marchesi 1824 bakery moved to London. The London branch is located near Berkeley Square on Mount Street. The original Marchesi 1824 bakery (which has been in operation since 1824) was purchased by Prada in 2014. There are two additional branches in Milan, but this London branch is the first one outside of Italy. Coffees, pastries, and sweets can be enjoyed here, and panetonne is one of the most popular items.

I finally got the chance to visit the bakery/cafe over the holidays. They are not open on Sundays, so my first visit ended in staring at the beautifully-decorated cakes and display in the window. 

My second visit allowed me to enjoy a hot chocolate. I have had so much watered-down hot chocolate in this country that when I ordered the hot chocolate, I ordered it with cream. I wish I hadn't. It didn't need cream. It was a delicious thick Italian hot chocolate, and I certainly shouldn't have assumed anything less from a Milanese cafe, which of course would be expected to serve up proper Italian hot chocolate. It is certainly one of the best hot chocolates that I have had in London.

To accompany the hot chocolate, I asked for a Christmas dessert. Being after Christmas, the cafe was getting back to normal, but they did have one of these little vanilla trains. It was a vanilla mousse, covered in a thin chocolate, with a biscuit base. The edible train tasted delciious, and it was light in flavour.

The shop interior has been designed to the Milan spec with the gold, cream, and forest green colours, mirrors and hanging lights. There are two rooms, and I was sat in the back room because there wasn't any space in the front room. The front room is more airy and lit-naturally, whereas the back room is more secluded and private but not as bright.

I also ordered the pistachio spread to go as I love pistachio, and I ordered a couple of Christmas biscuits. One was a candy cane, and the other was a round biscuit with a red and white design. I believe that they are shortbread biscuits, but I have not had one yet to try. Overall, I recommend Marchesi 1824 in London as I am sure the other pastries were delicious (I had my eye on a strawberry tart and strawberry and custard croissant), and the hot chocolate is certainly one of the best.

Fait Maison Brunch and Holiday Cupcakes

| No Comments | No TrackBacks

Before Christmas, I went to Fait Maison for brunch and Christmas treats. I had previously eaten here in February for a late lunch (Lunch at Fait Maison, Gloucester Road), but I had never had brunch. The menu is French-inspired for a middle-eastern twist, and there are three branches in London. The one near Gloucester Road station is the easiest one for me to get to, so this was the branch I visited. I also visited during the summer in order to see their floral display on the shop front, and I posted these photographs at the bottom of the post.

faitmaisonxmas-2019-01.jpg

I had the French toast for brunch, and this came with maple syrup, fresh fruit, and chopped almonds.

fait maison xmas

fait maison xmas

Fait Maison are one of London's prettiest cafes with a selection of beautifully-designed cakes and pastries and decorated with florals to match. For Christmas, the theme was brightly-coloured candy and candy canes amongst the flowers.

fait maison xmas

Their afternoon tea looks gorgeous as well, as you can see in the image below.

fait maison xmas

fait maison xmas

A photograph of a few of their pastries and cakes, inculuding an almond tart. All look delicious but too-good-to-eat.

fait maison xmas

fait maison xmas

I had a candy cane cupcake, which was cocnut and vanilla; I took this one home with me.

fait maison xmas

I had the little reindeer sponge, which was super-cute. I think it was a vanilla with a hint of toffee or salted caramel.

fait maison xmas

fait maison xmas

As promised, the summer shots are below with the whole cafe covered in pastel pink, blue, purple, and cream flowers...

fiatmaison-summer2019-01.jpg

...and a selection of floral pastries to match.

fiatmaison-summer2019-02.jpg

I recommend a visit, but do bear in mind that sometimes their payment machines do not appear to work, so you need to ensure that you have cash on you. And there's only a couple of cash machines in the area, and they tend to also not work all of the time. So, make sure that you have plenty of cash with you.

In between Christmas and New Year's Eve, I visited "34 Mayfair" restaurant, which is located just off of Grosvenor Square. At Christmas time, the restaurant was decorated with over 14,000 baubles and other tree decorations hanging from the walls and ceilings into a very festive-looking room. The new look restaurant for the festive season was named "The Miracle at 34 Mayfair" and included a festive cocktail and dessert menu along with their standard menu. The display was put together by florist Jane Wadham.

miracle-at-34-xmas-brunch1.jpg

In the run up to Christmas, Santa was rumoured to have popped in from time to time during the weekend brunch menu. So, I am sure it was even more festive before Christmas and with music and festive cocktails and desserts. I visited for brunch, and received a plate of bread to start and ordered an Imperial Julep (champagne and mint) to start. The cocktail was good, but it was mainly ice with very little fluid, so it was not the best value at all, especially considering the cost.

miracle-at-34-xmas-brunch2.jpg

miracle-at-34-xmas-brunch3.jpg

I ordered the pancakes, which were meant to come with bacon and maple syrup but came with blueberries and a lot of blueberry sauce and no maple syrup. The bacon was on a side plate, so I think they messed up the order a bit for me, sadly. This would have tasted nice with the bacon and maple syrup. I would not have minded a few blueberries on top. 

miracle-at-34-xmas-brunch4.jpg

miracle-at-34-xmas-brunch5.jpg

Overall, the atmosphere was a beautiful festive setting. I think visiting before Christmas would have been more special, but there wasn't any space left when I looked at the end of November. I felt that the food was over-priced for what it was, but the mix-up with the order probably did not help that, and the cocktail portions are on the stingy side. I would give it another go for lunch or dinner, but I'd steer clear of the cocktails.

Yolkin serve ice cream macarons and macarons from a shop at the edge of Chinatown in London, but their humbe beginnings were selling their macaron ice cream sandwiches from a small cart at the market here; I visited them originally in 2015 before paying the first visit in their new shop this summer. They are as good as ever with seasonal flavours and cute creations. They currently have an inspiring Christmas range in store, which I just had to post about. 

yolkin2019-xmas-1.jpg

The seasonal favourites include the above candy cane ice cream in a snowflake macaron. The reindeer macaron is salted caramel. The Santa is mince pie, and the Christmas pudding is chocolate honeycomb.

yolkin2019-xmas-2.jpg

yolkin2019-xmas-4.jpg

If those flavours do not suit your fancy, you can create a custom macaron ice cream sandwich, and they have snowmen macarons for the ice cream sandwiches. Oh, and I loved the pink tree.

yolkin2019-xmas-3.jpg

I also tried some macaroons, all of which were different flavours and some non-Christmas ones too.

yolkin2019-xmas-5.jpg

Strawberry cake, cookie monster, unicorn and créme brulée were the below flavours.

yolkin2019-xmas-6.jpg

Yolkin is located at 24 Rupert Street, W1D 6DQ. They are open from 1:00 to 10:00 during Sundays and the weeks and open until 11:00 on Fridays and Saturdays. 

For more posts about Yolkin, see:

London "Happy Halloween" Foodie Treats
A Visit to Yolkin for Ice Cream Macaroon Sandwiches
Yolkin Macaroon Ice Cream Sandwiches

Dominique Ansel Christmas

| No Comments | No TrackBacks

I recently visited Dominique Ansel for the third time, following my visit last November for the pumpkin pie (A November Visit to Dominique Ansel Bakery) and after a very disappointing second visit where the staff overcharged me (they displayed the wrong prices on their pastry and I noticed and ended up walking out as they wouldn't sell it for the price advertised). After this feedback and failure of customer service, I was invited to go back for a third visit for them to rectify the problem. Continue reading to learn a short history of Dominique Ansel Bakery and to see some pastries and reviews.

dominique-ansel-xmas2019-3.jpg

Dominique Ansel Bakery started in New York City and opened in London near Victoria Station in September 2016. Dominique Ansel is a French-born pastry chef who opened the restaurant first in 2011 in New York City, and the restaurant became successful and created popular items, such as the cronut (a cross between a doughnut and croissant), the cookie shot (a cookie-shaped shot glass with warm milk inside), frozen S'mores, blossoming hot chocolate, and other unique pastries. 

dominiqueansel-xmas-2018-01.jpg

dominiqueanslxmas2019-front.jpg

Like many other restaurants, shops, and cafes, Dominique Ansel decorate their storefront for the season. I photographed some of the Christmas treats below. I had the chocolate pine cone, which was created with dark chocolate mouse and dark chocolate flakes, hand-crafted to create the pinecone.

dominiqueansel-xmas-2018-02.jpg

dominiqueansel-xmas-2018-03.jpg

dominiqueansel-xmas-2018-04.jpg

When I visited, the inside of the shop was still decorated for autumn as this is the period between fall and Christmas.

dominique-ansel-xmas2019-1.jpg

dominique-ansel-xmas2019-2.jpg

I had the Zahra Rose pastry, which is a light sponge on a rice biscuit base. The thin layer of sponge is covered with a rose mousse and raspberry sauce inside. 

dominique-ansel-xmas2019-4.jpg

Pictured above is the shake-up Eton Mess, which comes in a plastic container so that you can shake it together. I expected that this would be fruity, but it wasn't, and I didn't like the cream at all, which reminded me of a yoghurt and was slightly sour. The strawberries were strawberry mousse with white chocolate shell in the shape of a strawberry. I'm not a fan of white chocolate nor yoghurt, so I could not eat this one.

The service was much better on this visit, but the food is a bit hit-or-miss for me when I've tried it. I would give them another chance.

Decade in Review: The 2010s (2010-2019)

| No Comments | No TrackBacks

Since we have left the old decade (the 2010s) behind and have started a new decade (the 2020s), I thought a post was appropriate to remember the old decade while we storm into the 2020s. Ten years is a long time, and a lot can happen in those ten years. The past ten have certainly had its ups and downs, strengths and weaknesses, and highs and lows. That can be said on a personal level as much as it can on a worldwide level. 

be-excellent-to-each-other.jpg

What has changed? Looking back on the 2010s, a lot has changed. Social issues, economy, conflicts, politics, food, technology, and environment concerns have been popular this decade, and I will explain each area. 

First up, we had some changes in social issues around the LGBTQi, race, and feminism topics, including an understanding of threshold of what is acceptable. These social issues have had a lot of publicity, and overall a change in attitude from society, making every individual accountable. There is still a long way to go, but it is a start.

together.jpg

The MeToo movement and empowering women has highlighted scandals where women have been silent victims in daily life, work, Hollywood, and family. Altering the society to the struggles of women has attempted to bridge the pay gap, get women into more senior offices and fields, and put a halt to downgrading women. One change is that women and girls now make up more television and film characters as role models and key characters, and portraying women as objects has been frowned upon. Some newspapers have stopped the objectionified photographs, and the skantily-clad female roles have either nearly ceased to exist or include men. We saw films such as "Rogue One" and "Wonder Woman" with female leads. In addition to empowering women, many films had an all-black cast, and "Moonlight" and "Black Panther" were such films that obtained a lot of coverage for this. 

dreph-2017-41.jpg

The 2010s started out with the economy being in a mess, and much of the world has had a lot of conflict. A lot of this conflict is a result of earlier decades and power struggles/shifts and the increase of terrorism. 

In terms of politics, Obama was the president at the start of the 2010s, and after his two terms, Trump was elected to the presidency. Trump's presidency has been marred by a lot of conflict internally but a strong dollar. The issue I see with politics both here and abroad are politicians who are elected are either too far left or too far right; there's no one in the middle, and the public has become split.

oglebay-10.jpg

One example of this has been Brexit (the UK to leave the European Union). The Brexit campaign was voted on in June of 2016, and the country voted to leave the European Union by March 2019. The UK has been in limbo since then, and the nation has been divided, which has caused a lot of changes in politics over the past three years. Eventually, Boris Johnson became prime minister, and after long years of negotiations, the UK may leave the EU early in 2020. The country remains divided, but the vote in December of 2019 has put an end to a power politician divide.

On a lighter note, veganism has taken off. Previously, the world was categorised into vegetarian and meat-eaters. Veganism started to take off around the mid-2010s, and now it is common-place for restaurants to cater to vegans or alternative options for dieters, such as gluten-free. More gluten-free options started to come about at the start of the decade. Some restaurants and cafes are completely vegan. 

fenton house

Advancements have been made in technology with cloud and mobile changes. Smart phones are now the standard with people being able to connect to the Internet wherever they are with a mobile phone. In addition, everyone who has a smart phone now also has a portable camera, so some have become obsessed with capturing the moment for social media; this does get annoying when traveling or having a day out because the majority of people were not interested in photography before this. Apps and social media have become standard and increased. Facebook did begin its life in the mid-2000s, and it was open to the public from 2007. The social media platform gained a lot of ground and made a lot of changes from where it was at in 2010. Also, more applications have adopted some form of social media, and new networks have been launched. Apple became more popular with users with the introduction of the tablet device in 2010 and better iPhones, resulting in iPhones being more wide-spread.

smile.jpg

Digital cameras are now standard, and that means more people are using them and taking more photographs, unlike the old days where you had a roll of film that could hold maybe 12, 24, or 32 shots, but you couldn't see the shots until they were developed. Now, everyone has a camera in their smart phone, resulting in attractions being busier, especially when combining "selfies", and businesses marketing for these photography factors.

Additionally, television and film streaming networks have recently become entertainment tools and medium. This allows viewers to watch what they and when they want, and it has created some spin-off television shows and films. 

together-we-can.jpg

Last of all, one area that has had attention is the environment and a focus on protecting the environment and stopping the pollution. Changes have been made for alternative fuels and energy in research, and electric cars have been imagined. The public are more concerned about wide-spread environmental damage. There is still a long way to go in this aspect, and it's one that needs to be taken seriously.

Despite the good points and the advancements, there are some wider issues in society. First of all, there appears to be a backlash or conflict between people, and it appears that far right groups have been making headway in damaging society. People seem to have less time for each other and are glued to their mobile devices.  

dont-be-first-world-problem.jpg

Here is a personal review of my decade.

2010 - A terrible start; a rocky and turbulant year of changes 

2010: Much changed happened in 2010. At the beginning of the month, I was in the states as I had visited for Christmas, and I had gone to see the film "Avatar" with family and friends before getting a flight back to the UK. At Heathrow, the plane landed amongst a snow storm with Basingstoke being the worst affected area with large snow drifts up to my knee. We managed to slowly drive "home" to Poole without any accidents.

A lot changed in January. The purchase of my shared ownership flat completed, and I was a home-owner for the first time in my life. Sure, it was shared ownership, but I am of a generation where getting on the property ladder has been a challenging feat. Unfortunately, on the same day that I picked up my keys, I received a redundancy letter from the employer that I had worked at for the past couple of years. It was a low point. I found a new job, but I had rushed to find something and ended up with a pay cut when factoring in commuting costs to London. This led me to look for another toward the end of the year, which I started at the end of 2010. 

In 2010, I started to update this blog more regularly, but it was mainly to showcase design and technology. I soon expanded it to include street art, travel, photography, and pretty much anything on my mind.

No photo description available.

Over Easter, I went letter-boxing in Dartmoor. This was something that I did for a few years in a row over Easter with a stay in a nice B&B at Belstone Tor. I'd make a second trip to Dartmoor letter-boxing in June, and I got engaged then.

In May, I went to Amsterdam for a long weekend to explore the city and the museums. It was a lot of walking, and I fell off the bicycle on a tour because the person in front of me panicked and stopped short due to a cycle race coming past us the opposite way. I had a gash in my skin on my forehead and had to conceal it with my hair or a hat for a few weeks. Luckily, it did not leave a scar. However, my Canon digital camera got destroyed.  

elephant2.jpg

While working on Great Portland Street in the summer of 2010, I discovered the Elephant Parade (Parading Artistic Elephants in London), and saw the whole herd at the Royal Hospital in Chelsea after work. This started my love of the sculpture trail, and these sculpture trails have become particularly popular in this decade. They have brought about some great sculpture trails with big brands, fantastic artwork, and helping to raise money for charity. 

mmwedding2.jpg

I also went to the US in the summer of 2010 for my youngest brother's wedding: Alabama Wedding. I should have taken more photographs. Anyway, the wedding was in Alabama, so I took a road trip with my family there. While in the area, I saw the space museum and "Star Wars" props, the replica of the Parthenon in Tennessee, and the Jack Daniels distillery in Tennessee. I would have liked to have spent more time in the road trip and done more on the way back, but we had to rush home and drive straight through because my other brother had a headache. 

While in the states, I also planned the wedding and did some preparation work. I met up with friends and had some great days out with them.

kew_1.jpg

Later that summer, I had my first ever visit to Kew Gardens (An Afternoon At Kew Gardens). As a coincidence, my second visit to Kew Gardens was this year (2019); I am not counting the disappointing illuminations that I went to sometime in the middle of the century as this was just to see the illuminations after Christmas, and Kew Gardens was one of the first places to have these; now, they are in many places. I remember walking the treetop walkway, which had opened not long before, and visiting one of the palm houses.

gothenburg2.jpg

In October, I visited Gothenburg in Sweden because my friend from the states and her husband had a seminar to attend in the city. It was a fun trip, although it was quite wet and cloudy for the majority of the time, and we had a wander around the museums; the floating museum was the highlight. We got to board several boats and a submarine. Read more about Gothenburg here: October in Gothenburg, Sweden.

2011 - One of the best years with friends & family and new beginnings

2011: A lot happened in 2011, but it was a fairly stable year. It was one of two years of this decade that I felt balanced and looked after myself and felt better. A lot changed for me this year; it was the year I got married. It was a year that I finally felt balanced for the majority of the year with the exception of the last couple of months.

royalwedding01.jpg

In April, the world watched as Prince William and Kate Middleton got married. I captured some photographs in the run-up to the wedding ('I Do': The World Gets Ready for a Royal Wedding). Everyone was happy and wishing the royal family well, and many people traveled to London to try to get a glimpse of the event. It was one of the most-talked about events of the year.

lisbon03.jpg

The UK gained an extra day off of work for the royal wedding in the spring. I actually went on holiday to escape the royal wedding, and I went to enjoy Portugal, hoping for nicer weather. In fact, the UK had nicer weather than Portugal did. Despite the weather, I explored Lisbon, Cascais and Sintra: Spring in Lisbon, Portugal. I loved Sintra, and it was one of the best places that I have visited.

Working in the City of London meant that I had a new area to explore, and I visited St. Paul's Cathedral, South Bank, and Borough Market a lot during the lunch breaks. I got to know this part of London well.

cornflowerboquet_1.jpg

In July, I went to the states for the wedding, and I had a wonderful time making the preparations and catching up with friends and family. I was in the US for most of the month of July. It was a busy time, but I really enjoyed it. This was the most period of time that I had been "home" since I moved to the UK in 2003.

bealieu2.jpg

After I returned from the USA in August, the bloke and I went on one of my favourite walks from Beaulieu to Buckler's Hard: Beaulieu to Bucker's Hard Walk in Photographs. This is a short walk through the countryside, forest, and riverside to the old village of Buckler's Hard, a historical row of houses.

thamesfest07.jpg

2011 also marked the last great year for London's last festival of the year, Thames Festival 2011. The festival is not anywhere near as good now, but the month of September was dedicated to the Thames with various events. On the "closing" or final night, visitors could enjoy a night parade and a fireworks display along the river at Westminster. On one of the weekends during the month-long Thames Festival, they also closed London Bridge and hosted crafts and turned the bridge into a huge dining area. It was a massive event, and it has been sadly scaled down. Thames Festival was also rebranded to 'Totally Thames'. In 2012, the fireworks took place, but they were combined with the fireworks for the Olympics. They never had them again after that.

dungeness4.jpg

In September, the bloke and I went to visit friends in Kent. On the day, we went to explore the coastline of Deal, which I had previously enjoyed. We had nice weather, and we ate lunch at a pub with the sea in front of us: Walking by the Seaside in Deal, Kent. Our friend lives near Dungeness, so we had a drive there, and it was a fascinating place to visit: Inspiring Photos of Dungeness, Kent.

deal7.jpg

In autumn of 2011, the 'Occupy' movement set up camp at St. Paul's Cathedral to highlight issues with the economy and social injustice. The camp was set up for three or four months, then it just disappeared. I got some photographs: Photographs from 'Occupy London'. The monopoly board pictured below was by Banksy. Because the commute to London every day was starting to kill me, I really wanted to pitch a tent and join them. It would have saved expensive commuting costs and time spent traveling to Basingstoke each day. Heck, I also would not have had to fight for a seat on the train.

occupy5.jpg

At the end of November, I had a wedding party in the UK for those who could not go to the USA, and my parents visited us for it. I really had a good time, and we enjoyed some days out at Bath Christmas market, London, and the Victorian Christmas at Historic Portsmouth Docks.

docksxmas8.jpg

Because of tight deadlines at work and management issues, I started to feel stressed and not appreciated at work. I ended up covering support on Christmas Day and New Year's Day. I ended up doing long hours, and I started to get into unhealthy ways as well as having a hellish commute.

2012 - One of the worst years with a bad workplace & passport woes; highlights were Olympic Games, Malta, & Croatia

2012: The London Olympics year; this year was one of the greatest years in London's history as the Olympics arrived, and everyone seemed to be in a festival mood from the early summer. On a personal level, 2012 was not my year at all. It was one of the worst years of the decade for me. It was the year that I had my citizenship test and then to sort out the paperwork for my UK citizenship. It was also the year that I got a new camera, a Leica V-Lux-3. This was the second digital camera that I ever owned after never having got along with the Canon.

gozo5.jpg

In the early spring, I had a long weekend break to Malta. I went to Malta and the island of Gozo to the north, and I saw the Azure Window, a beautiful rock formation that sadly crashed into the sea in 2017 and no longer exists. I loved visiting the prehistoric sites, such as the caves and tombs and the cathedral and narrow passages of Mdina. (Prehistoric Malta and the Blue GrottoA Day in Valletta - Streets, Cathedrals, and HarboursNarrow Passages and Romantic Walks in Mdina, MaltaExploring Above and Under Ground in Rabat, MaltaA Beautiful Afternoon on the Maltese Islands of Gozo and Comino).

mdina08.jpg

In early spring of 2012, I was head-hunted for a new role, and I accepted the job offer as it promised a shorter commute, a better work-life balance, and promised to be a custom role for me. Unfortunately, the role and company was not for me; they had told me what I wanted to hear to get me in the door. The commute ended up being as long as commuting to London, and the work-life balance did not happen. In mid-October, it was clear that it was not going to work out, but I tried to stick with it and did so for the end of the year, even though it made me really unhappy.

londoneggs05.jpg

In the spring and in time for Easter, a new sculpture trail hit London. This time, the sculptures were giant eggs from Fabergé to raise money for charity. I went to see them around London and then again when they were all in Covent Garden: Hunting Eggs in London: Fabergé Big Egg Hunt and London's Big Egg Hunt Grand Finale at Covent Garden.

hvar01.jpg

In May, I had a two-week break in Croatia and Bosnia Herzegovina. This was partially a road trip, and it started in Dubrovnik with a day trip to Korcula, Dubrovnik nearby islands, and then a road trip to the coastal towns such as Split, Trogir, and the island of Hvar. Here's a list of posts: Day 1: Charming Dubrovnik, "Pearl of the Adriatic"Day 2: Visiting Korčula Island, CroatiaDay 3: A Cruise to the Elaphiti Islands from DubrovnikDay 4: Beautiful Hvar Island - Lavender and Mountain ViewsDay 5: Exploring Hvar and St. Prosper's Festival in Hvar TownDay 6: Dalmatian Coast - Split, Salona, and Trogir.

plitvice11.jpg

One of the highlights of Croatia, although it was all very beautiful, was Plitvice Lakes. At Plitvice Lakes, several walkways and trails wind along the lakes, forests, and waterfalls. This was one of the most beautiful places that I have been: Day 7: Beautiful Plitvice Lakes (Croatia).

bosnia10.jpg

After visiting the lakes, we drove into Bosnia & Herzegovina, which was quieter than Croatia. We were welcomed with rain, which contrasted with the beautiful weather we had in Croatia and at Plitvice Lakes. We arrived in Sarajevo late in the day and had a little bit of time to look around. In the morning when we woke up in Sarajevo, we had had a freak snow storm overnight. Bear in mind that the visit was in mid-May! The trees were in full foliage, so many branches has snapped. We had pre-arranged a guided tour, and although we could see some of the city, we couldn't see everything on the list due to the snow and visibility: Day 8: Bosnian Road TripDay 9: Exploring Sarajevo in May in ... Snow?!.

mostar03.jpg

On the last day, we explored Mostar, which was a site of conflict during the 1990s and is popular for its UNESCO bridge. The bridge has been rebuilt since it was destroyed in the conflict: Day 10: Mostar.

pageant14.jpg

More royal news happened again this year with the Queen's Diamond Jubilee and the Thames River Pageant. The world's eyes were on the UK again this year as the royal family floated down the river Thames with a parade of other boats. It was an amazing atmosphere, and I got to catch a glimpse of members of the royal family. The UK invested a lot in the event, and there were street parties and merchandise: Britain Gets Ready for the Queen's Diamond Jubilee. The weather on the day of the Thames River Pageant held up until just after the Queen's boat passed by Westminster Bridge, and then it started to rain. 

diamondjubilee15.jpg

In July, the festival atmosphere continued with the build up to the London Olympics. To mark the Olympic Games, the country hosted special art commissions, concerts, and Olympic torch relays to most major towns and areas: London Gets Ready for the Olympics

olympicslondon02.jpg

One of the art commissions that I went to see was Compagnie Carabosse 'Fire Garden' in Milton Keynes. I was actually scheduled to see this at Stonehenge, but rain the day before caused the event to be cancelled. A week or two later, it travelled to Milton Keynes, and I convinced a friend to go with me to visit it after work. It was one of the best art installations that I had seen in this decade. Towers of flames lit the sky on mechanical structures with kinetic motions. It felt like being inside a magical world, teasing the brain with the senses combinging soundscapes, movement, flame, and smell of smoke and kerosene.

firegarden02.jpg 

Toward the end of July, I also got to see the Hyde Park Olympic Torch Relay. The Olympic torch did come to Basingstoke (as it did most towns and cities), but I was working on the day and did not get to see it. The Olympic Torch Relay in Hyde Park included a concert with some decent acts and sponsors; I remember Katy B and Dizzee Rascal. Unfortunately, by the time I got into London, I missed a lot of the concert, but I was still able to see the torch and London Mayor Boris Johnson (who was well-liked then). Hyde Park was set up with concerts for at least a few days, but Hyde Park continued to host large screens to watch the games.

torchrelay04.jpg

In July, the bloke and I had a short break. We had a night in Derby before heading away to have another night in Hull for our anniversary. This was at the end of July, and the evening spent in Derby was the same evening that the Olympics Opening Ceremony took place; we saw it on the television in the hotel lobby. We explored a little of Derby, Hull, and then we went to the Heights of Abraham and the Tramway Museum on the way home: Derbyshire - Heights of Abraham and Tramway Museum.

derby06.jpg

I managed to secure tickets to the Olympic Park in August for a September visit during the Paralympic games. There was so much to see, and the entrance time for my visit was in the afternoon, so this was not long enough to see everything. I was still able to enjoy the atmosphere and to see the crowds, including the largest McDonalds, shops, and several buildings dedicated to sponsors (Coca Cola and MINI). Today, the Olympic park is quiet and dull compared to the busy sun-filled summer of 2012: London 2012 Olympic Park.

op09.jpg

September was also the month that I needed to give up my passport in order to process my UK citizenship. Unfortunately, this meant that I could not leave the country. I expected to get my passport back within a couple of months because it had never taken very long previously; I would have applied in person, but no spaces were available either. Unfortunately, it took over nine months to get my passport returned this time, and I would not get my passport back until the spring of 2013. This was one of the other reasons why 2012 was a bad year. It made me miss my brother's wedding in early 2013, and it also meant that I could not travel out of the country. It was a hellish time.

windsor4.jpg

Since I had put a lot of focus in at work for several months over the summer, I had some days of holiday to use, so I took one day off to explore Wintery Windsor. I had only visited the city once before, and that was in 1998. The day that I visited was very cold and frosty, and the main reason for the visit was to see a pantomime, "Jack and the Beanstalk". This was my first experience to see a pantomime.

edinburg02.jpg

Since I had holiday to use but could not leave the country, I used a few days to go to Scotland to see the bloke's family. We had a day in Edinburgh (Edinburgh in Winter), and the rest of the time was spent in Portmahomack. I felt a bit subdued over the holiday season as I really disliked the job and really wanted my passport to arrive in time for my brother's wedding and for the UK citizenship to be sorted.

2013 - A poor start but ended up as one of the BEST years with freelancing at a nice company, travel to some great places, street art, and time with friends and family

2013: Although it did not start well, 2013 was one of the two best years of the decade for me. I left the toxic job and decided to try contracting/freelancing. This was something that I had been thinking about previously and prior to accepting that job. Because of the toxic atmosphere that I endured at the job and the false promises, I decided to have a couple of weeks off before starting my contract in order to take the breaks that I held off taking. The first break was to Cornwall. While Basingstoke had a bit of snow, Cornwall missed out, so it was actually a pleasant time: Days Out: Polperro, CornwallDays Out: Land's End, St. Ives and MevagisseyDays Out: St. Michael's Mount, Cornwall.

polperro03.jpg

After spending some time in Cornwall, I used one of the vouchers that I received and had a two or three-night break in Derbyshire and the Peak District. It snowed, but the villages looked picturesque with snow. We saw caves, including one with an boat ride and another with blue john stone: Days Out: Snowy Peak District, Part 1Days Out: Snowy Peak District, Part 2Days Out: Snowy Peak District, Part 3

peakwinter-1.jpg

Toward the end of January, I started my contract role. I was really worried about it because I'd had such a bad time at the previous company. However, this ended up being one of my favourite projects and companies in my career. I worked with some amazing people; I was sad when my time ended a couple of years later.

The only downside was the commute, which was a struggle. The company was located on Brick Lane, which is a ten or fifteen minute walk from most tube stations. I stayed in London for a couple of weeks now and then to lessen the burden. However, the one great thing about working here was the street art. I was able to explore a new part of London and to see the street art, which had exploded in 2012. This turned out to be an interest that I invested a lot of time in.

I also discovered the Spitalfields Pancake Race 2013 for the first time in 2013 when I happened to go for lunch and heard a clattering outside the office and saw a large crowd of people and contestants. It was the one day that my camera's battery had died, so I only got a few photographs on my old smart phone. 

eggs2013-8.jpg

One of my favourite sculpture charity trails of the decade was also back in London this year, and they were located in Covent Garden: Big Egg Hunt 2013 Begins in London

beeston-1.jpg

In April and over Easter, I spent a long weekend in and around Cheshire. I went to Beeston Castle (pictured above), the Anderson Boat Lift, and Chester: Days Out at Beeston CastleNantwich and Anderson Boat LiftDays Out: Frodsham, Cheshire.

dulwicharthouse.jpg

At the start of May, I attended one of the best street art festivals of the decade. It took place as a part of Dulwich Arts Festival, and the interior of a house was decorated entirely with street art: Open Day at the Street Art House, Dulwich Arts Festival: Part 1.

hoy04.jpg

hoy12.jpg

In May, I had an amazing holiday for a week to the Orkney Islands off the coast of northern Scotland. I found it to be a fascinating place with prehistoric sites, which are well-preserved. I am sure there are so many other sites buried at the bottom of the sea since the lowlands have become flooded since those times. One of the highlights was walking to the Old Man of Hoy sea stack on Hoy Island, and other highlights were Birsay and Gurness. Here's several posts of my visit to the Orkney Islands: Orkney Islands: Skara Brae, Stromness, and OphirOrkney Islands: Rousay, Cairns, Mills and FarmsOrkney Islands: Birsay, Gurness, Brodgar and Cuween HillOrkney Islands: Italian Chapel and KirkwallOrkney Islands: Hoy

shard01.jpg

June was an amazing month. The bloke treated me to a trip up the Shard after work. The Shard, the tallest building in London and one of the tallest buildings in Europe, had just recently opened to the public with a viewing platform at the top (310m Above London: The View from the Shard). 

potterstudio6.jpg

He also treated me to Warner Brother Studios tour on the weekend in order to see where some of the "Harry Potter" films were filmed and to see some of the sets and props. Since that visit, more has been opened to the public. One of the attractions is a huge model of a castle that was used in the film. At Christmas, this is decorated with snow, and I still want to see this someday: Off to Hogwarts...Harry Potter Studio Tour.

vertigo42-3.jpg

I took some time off in the middle of the month in order to spend time with my friends from the states who had their first proper visit to London. I think it is fair to say that we all had a blast. One of the highlights was champagne at Tower42 in the City of London (Champagne at Tower42, Vertigo42). We did all of the touristy things too.

gromitunleashed19.jpg

In July, the bloke and I went to Bristol to see the new trail "Gromit Unleashed!" This came after the success of gorilla scuptures in Bristol two years previously. This was the first of the Aardman Studios trails that continue to take place every couple of years now. 'Gromit Unleashed' in Bristol, Part 1 and Gromit Unleashed in Bristol, Part 2. This was the best trail by far, and it really captured the people of Bristol and beyond. In fact, it was so awesome that they now make a trail every couple of years, though none have been as amazing as the first one.

plasticine-gromit4.jpg

On the weekend that we visited Bristol, so much was going on. We even managed to visit the science museum and saw a class where we could create our very own plasticine Gromit, which was taught by one of the guys who works creating models at Aardman Studios (Creating Gromits with Aardman Studios).

That weekend was also the weekend of the annual Bristol Harbour Festival, so we ended up seeing some of the events along the harbour and watching the fireworks. 

July had amazing weather, and we went back to Cheshire for a long weekend because we had bought day tickets to Cheshire Zoo when we visited the area in the spring, but we did not get to use them during that visit. In addition to Chester Zoo, we drove through north Wales and went to Anglesey. The weather was perfect, and I would have loved to have stayed another day and did the boat ride to see puffins, but we both had to get back home for work.

norwichgorillas03.jpg

In August, I had my first ever visit to Norwich, a city that I now really enjoy visiting. The reason for my visit was to see another sculpture art trail: Go Go Gorillas! take over Norwich. I also explored Norwich and watched a rubber duck race on the river.

dublin1-05.jpg

In September, I got the chance to explore Dublin, Ireland. I enjoyed my visit, and the highlight was seeing the goal in Dublin: Dublin:Goal, Whiskey and CathedralsDublin: Guinness, Castles, Colleges and CultureA Day in Dublin: Gaol, Whiskey and CathedralsDublin Parks, Pubs, Markets, Museums, and HistoryA Day in Dublin: Guinness, Castles, Colleges and Culture.

frankenmuth10.jpg

Lastly, 2013 left with a bang as I got to go back to the states for Thanksgiving at the end of November so that I could catch up with all of my friends and family. The day after Thanksgiving, the parents and I drove to Frankenmuth in Michigan (A Start to the Christmas Season in Frankenmuth, Michigan) where we explored the festive atmosphere of this town. We had a trip to one of the largest Christmas stores, if not the largest, in the world: A Trip to Bronner's CHRISTmas Store

greenfield07.jpg

We also spent a day at Henry Ford Museum and Greenfield Village. I found Greenfield Village to be amazing; it contains old buildings that have historical significance, and you could also ride in vintage vehicles. I got to ride in a Model T. I would love to go back to Greenfield Village because we had to rush through it and there was still much more to see. The museum was not as good as the village, but we saw historic cars and agriculture equipment. The chair that Abraham Lincoln was killed in was in the museum as well as other important items that Henry Ford collected: Days Out: Henry Ford's Greenfield VillageDays Out: Henry Ford Museum.

newarkxmas2013-01.jpg

When we got back to Ohio, I had to go to the emergency room in December for an allergic reaction to hair dye. We also went to the Ohio Amish Christmas Cookie Tour of Inns, which included a visit to a few hotels and inns in the Amish Country and a free cookie and snacks at each place. The event was very festive, and it included horse-drawn wagon rides and visits to some beautiful properties. It was such a fantastic event. I was back in the UK for Christmas, which was a more low-key event.

2014 - An average year with some interesting moments, a road trip in Ireland, German Christmas markets, and arty events

2014: Although not as busy as 2013, 2014 was not too bad of a year. With a couple of exceptions, it was not as memorable, but I was feeling more worn down due to commuting.

One of the best art/historical displays that I visited this decade was to see the Cheapside Hoard, a collection of jewellery that was discovered buried underneath rubble of buildings on Cheapside in the City of London. These were buried in the Great Fire of London and never found again until recent times; they are great examples of jewellery from the time.

cheapsidehoard1.jpg

London's first cat cafe opened up at the beginning of March, and I went along to see it: Tea, Cake and Cats at London's First Cat Cafe. For months, it was fully booked up and was one of the top attractions to do in London.

ladydinah05.jpg

Pancake Day happened on the same week, and after first glimpsing it last year, I spent most of my lunch break watching the race: Great Spitalfields Pancake Day Race 2014.  

pancakeday2014-22.jpg

In March, I had arranged a tour of the Whitechapel Bell Foundry. This is where the Liberty Bell and Big Ben were cast. The foundary is a crooked collection of cottages/warehouses with a lot of bells, bell moulds, and bell-making machinery. I was visiting to understand more about the history of the bell foundary, but most of people in the group seemed to be there for the musical element; I know nothing about music, so that aspect did not interest me. I purchased a few bells during my visits to the foundary during my lunch breaks as it was only a ten minute walk from there. Sadly, the Whitechapel Bell Foundary decided to vacate the building three years ago, leaving the fate of the building unknown at this time.

whitechapel-bell-04.jpg

Over Easter in April, I went letter-boxing with the bloke in Dartmoor; it's now been a few years since I last went to Dartmoor for letter-boxing and walking. Here are a couple of the trails that I walked: Walking Little Links Tor Vicinity in Dartmoor and Walking Sourton Tor in Dartmoor.

greatlinks2014-01.jpg

In May, I went to one of the most interesting places that had remained hidden from the public for several years: A Visit to Paddock, World War Bunker in London. This was a top secret place used in World War II and for decoding the enemy messages and codes. It is hidden underground and not often open to the public. 

paddock01.jpg

In the middle of May, we went to a beautiful wedding (John and Alice's English Country House Wedding). We've only seen these friends a couple of times since then, sadly, so we must remember to meet up with them again and make an effort.

johnalicewedding08.jpg

In June, my parents visited, and we had a whirlwind road trip around Ireland for a couple of weeks (The Summer Ireland Road Trip). We saw a lot of wonderful places, but also noticed how bad sight-seeing and traveling has become with people and their smart phones... just the sheer amount of visitors out trying to capture the perfect selfie on their phone without any regards to anyone else. We commented that people seem to be inconsiderate and in a rush anymore, which has certainly become a changed behaviour in the past couple of years.  

belfast07.jpg

One of the highlights was to Belfast's Titanic Quarter and museum (pictured above) and the rope bridge in northern Ireland (pictured below). My first niece was also born in June during or Ireland road trip; she was born a day before my birthday.

carrick-09.jpg

We enjoyed Killarney National Park (the day my niece was born) and saw an amazing rainbow. Unfortunately, our trip to Skellig Michael was cancelled because of very choppy waters, so I want to return to it some day. However, the year after our Ireland road trip, this island became a setting for a part in the new "Star Wars" films, so it will probably be difficult and more expensive to get the boat across. You can only get to the island on a fishing boat.

kilarney

In 2014, there were several events and art installations to commemorate 100 years since World War I began. One of the biggest events was Giant Spectacle Marionettes in Liverpool 'Memories of 1914' Commemorate World War 1. At the end of July, I headed to Liverpool to check out the giants for their special 1914 art installation. The giants were very popular, and we got stuck in bad traffic all the way to Liverpool. Instead of taking three hours to get to Liverpool, it took eight. So, we lost the first day. We still managed to see the giants and also see some of Liverpool, one of my favourite cities. This was one of the best art installations that I have seen this decade. The team behind the giants retired them a year ago now, so the giants will not be walking on Liverpool's streets anymore.

liverpoolgiants08.jpg

In August, the bloke and I booked Secret Cinema. I've been wanting to go to a Secret Cinema event for a long time, and this year was their biggest production yet with a replica of 1950s Hill Valley, the fictional Californian town as the setting in "Back to the Future". We were given a character to pretend, and everyone wore clothing that looked like clothing worn in the 1950s, and we enjoyed watching the film with live action scenes taking place around us: Secret Cinema "Back to the Future".

bttf01.jpg

Another one of the wonderful art installations to mark the centinnial of World War I and to remember those who perished were the poppies in the Tower of London. I watched the poppy field grow throughout the couple of months and until November 5th when the poppies completely filled the moat at the Tower of London. The crowds were intense, especially in the autumn: Tower of London Poppies and Tower of London Poppies Commemorate The Great War and #LightsOut. When the ceramic poppies went up on sale, I purchased one. Each one represented a fallen British (or commonwealth) soldier.

towerpoppies-01.jpg

One of the best immersive theatre experiences that I enjoyed in this decade was the Faulty Towers Dining Experience at the Charing Cross Hotel. The actors were hilarious and really put in an effort to bring the world of Faulty Towers to life.

faultytowers05.jpg

In October, I headed over to Borough Market to experience Apple Day at Borough Market. I was able to try some historical apples and enjoy the festival atmosphere with theatre and apple-themed fun. Apple Day takes place on a Sunday, a day when Borough Market is typically closed, so this was one of the few times Borough Market is open on a Sunday. It was busy but not as busy as visiting on a Saturday.

appleday01.jpg

I did not know it at the time, but 2014 was my last full year in Basingstoke. I watched the fireworks in the park on Bonfire Night in early November, and I got home in time to see the Basingstoke Christmas Lights Switch On in front of Festival Place. Live music and fireworks took place, and it was enjoyable. Basingstoke was an awesome place to live, and I loved living in the centre of town. I only regret that I did not get to enjoy it for longer.

basingstoke-xmas-03.jpg

In December, the bloke and I had a few days in Rothenburg ob der Tauber and Nuremberg. We explored the Christmas markets, museums, and shops. One of the most memorable museums in Nuremberg was about the rise of Hitler, which was located at the party's former rally grounds; it put the problem into new perspectives and was educational and truthful about the history of Nuremburg but also as a city that has accepted its fate and moved on to recover. The Nuremburg Court House (where the trials were held to convinct the Nazis) was also an interesting place to visit when tired of the Christmas market. Rothenburg ob der Tauber was a beautiful village with cobblestone streets and interesting architecture, and it is located not too far from Nuremburg. I walked around most of the city's walls. This city escaped damage during World War II thanks to its beauty.

rothenberg

On the way to Scotland for Christmas, I had a night in Liverpool and booked in A Fab Four Beatles Taxi Tour in Liverpool because I am a huge fan of the Beatles and wanted to understand more about them and about their city from their view. This was a fantastic tour, and our taxi driver was very knowledgable.

pennylane1.jpg

Before I close 2014, one of the best afternoon teas that I have had all decade was the Christmas Afternoon Tea at Conrad St. James. It included bottomless Prosecco, live music, and Christmas carols.

conrad-christmas-tea-05.jpg

Overall, 2014 was not a bad year, but it was a tiring one and not as interesting or great as 2013. 

2015 - a year of changes: new job, moving on, moving house, a kitten, struggling with a lack of stability

2015: This year brought about some major changes, but it felt like a whirlwind, and I was not able to make plans for the majority of the year. January was particularly gloomy, and there was a terrorist incident in Paris involving a lot of people getting killed, so many people felt down. January was also the month that I'd been contracting at the same company for two years so had to leave. The project was winding down. It was very emotional as I really enjoyed the company and colleagues. My last day was toward the end of February, and I was able to try my luck at getting more photographs during the Spitalfields Great Pancake Day Race 2015.

I was also able to get a preview of the Walkie Talkie Sky Garden (20 Fenchurch Street) a couple of days after it opened to the public. This has gone on to become one of the most-visited attractions in London now thanks to social media, and I tried to take my friends here in the summer of 2019, but we could not get in.

walkie talkie sky garden

One of the most memorable days out for Valentine's Days happened this year. Valentine's Day happened on a weekend day, and I went to the pop-up Crazy Golf at Swingers in London. This pop-up was located in Shoreditch in an area that is now being constructed on. Swingers actually ended up opening a permanent venue in the City of London a couple of years later, and it now has one in Soho. We received a free rose Prosecco during our visit, and we had a great time. Unfortunately, the visit I had this year to their venue in Soho did not even compare to my first visit when it was a pop-up.

swingers6.jpg

The new job that I started as soon as the last one ended was primarily working from home, but I had to spend a couple of weeks on site at Ashby-de-la-Zouch. On one of the weekends, I explored Ashby de la Zouch Castle. I enjoyed this project because the colleagues that I worked with were amazing, and the work was interesting. Things changed later on as the original people had to leave, so the project was in two phases: pre-August and then post-August. From August, it ended up being a rolling-monthly position, so it was impossible to plan in advance.

ashby de la zouch castle

After three years of daily commutes to London every day, I was glad that I did not have to commute from March. The job was primarily working from home, and I could finally recover. In the second phase of the priject, I had to work longer hours and had to spend some time in the office in Amsterdam. I was able to enjoy Basingstoke for the first time in the first phase of the project, and I spent a Day Making Stained Glass Artwork with Cake at Basingstoke's Aristology Cafe, which I really enjoyed.

stainedglass-basingstoke10.jpg

Over Easter, the bloke and I spent a long weekend around Harrogate, and I previously posted my visit to Harrogate, afternoon tea at Betty's Tea RoomsMother Shipton's Petrifying WellKnaresborough, and Knaresborough Castle. Knaresborough and its castle have amazing views over the river, and I really enjoyed it. I also enjoyed the visit to Mother Shipton's Petrifying Well as it is a unique one-of-a-kind place with the minerals in the rock encasing items left tied along the sides.

petrifyingwell14.jpg

I also saw Brimham Rocks, Yorkshire (England)Ripon and Ripon Cathedral, Yorkshire, and Ripley Castle (Yorkshire, England). I had a tour of Ripley Castle and enjoyed the lake views and daffodils. Everything was so beautiful in this area.

ripleycastle08.jpg

However, my highlight (if I had to choose one on such a memorable trip) was Easter Day. On Easter Day, we went to "Guy Fawkes Arms" pub and restaurant in Scotton, the birthplace of Guy Fawkes (Easter Lunch at the 'Guy Fawkes Arms', in Scotton near Harrogate). This was possibly the best meal of the decade; it's one of the best, at least. After the Easter lunch, we went to Fountains Abbey.

guy fawkes arms

The highlight attraction for me was Fountains Abbey and Studley Royal Water Garden. The setting is beautiful, and it somehow felt that I had been there before; it was a strange feeling. The whole weekend was warm, and we were lucky that we did not have any rain. The warmest and sunniest day was Easter Sunday.

fountains abbey

In the spring, the bloke and I started to look for a house closer to London, and we had an offer accepted in May for a house in Ruislip. We did not know which area in London to move to, but the flat was always too small for us, and the commute to London was costly and killing my health. Now that I was working from home, I had more energy to invest in finding a home as I know that I would have to be commuting to London again at some point.

secretcinema-starwars3.jpg

In early July, the bloke and his brother and I went to London for Secret Cinema Presents 'Star Wars: The Empire Strikes Back'. We had lunch at Bob Bob Ricard, London, where there is a "press for champagne" button. I really want to go back and visit this restaurant again because the food was so good.

From the beginning of July, the country had wonderful warm weather, and I went to Overton Scarecrow Festival (Hampshire, England), which was part of a summer-long event in Basingstoke and the area. A lot of the houses and businesses had designed scarecrows. 

basingstokelive09.jpg

That same weekend was Basingstoke Live 2015, and for the duration of the time spent in Basingstoke, the music could be heard from the flat. Saturday night sounded amazing, but I wanted to visit on the Sunday as Saturday in Overton was such a long day. I watched the acts, and one of the acts was Jerry Mungo who sang "In the Summertime" as probably his most well-known hit.

I also took a day off of work toward the end of the month in order to enjoy some local attractions, such as these Lavender Fields in Hampshire, England. It was a gorgeous visit, but the weather was not the best on that day due to heavy spells of rain. I loved driving past these fields and smelling the lavender. At the end of July, I had to spend a week in Amsterdam for work.

August kicked off with Battle Proms and Picnic at Highclere Castle, and I visited with friends. We enjoyed the concert and fireworks, and the weather was beautiful and warm. Highclere Castle is where "Downton Abbey" is filmed.

I then had to go back to Amsterdam for work for a couple of weeks (Visit to Amsterdam), and I managed to do some sight-seeing this time, including visiting Amsterdam SAIL 2015. The SAIL event happens every couple of years and allows members of the public to see and board various boats and ships of different ages. I went onto a working warship and submarine. Amsterdam's harbours were packed with people, and it was a long walk up and down the harbour area. We really enjoyed it, though, despite the hot weather and long walks. My legs and feet were sore by the end of it.

dismaland35.jpg

When I returned to England at the end of August, I went to one of the best street art events of the decade: Dismaland, Banksy's Bemusement Park. Throughout the park, I was able to see artwork and installations by Banksy and other artists.

silchester1.jpg

In September, the friends we hung out with at Battle Proms and I got together for a pub lunch and walk (Pub Lunch at Mattingley's "Leather Bottle" Pub and a Visit to Silchester Ruins), and it was an enjoyable day out.

Finally, it was time to leave Basingstoke, which had become my home for the past seven years, behind as moving day came at the start of October: Goodbye, Basingstoke. Hello, Ruislip. It took awhile to adjust to a new place where I didn't know anyone. One of the differences is that the area is so quiet when compared to the middle of Basingstoke where we constantly heard noise. I struggled to sleep because of a lack of noise. Actually, over four years on, and we still have not been able to unpack. The house needed some renovations, and that has been going on in phases. As I write this at the end of 2019, the final renovations are nearing completion, so I am expecting to get sorted in early 2020.

merlin1.jpg

Another huge life event happened at the beginning of November. We got a Maine Coon kitten. We named him Merlin: Welcome, Merlin the Kitten. He is still confident as a cat.

At the end of the year, the contracts were changing supplier, and the company in charge maanged to mess things up. This led to a lot of issues and caused other people to also become annoyed at the handling of this. So, I knew that I would need to find something new in January, and this had me a bit worried, so I struggled to relax.

2016 - so many promises...turned out one of the WORST years; over-worked, lacked stability, messed around, & mean people

2016: I entered this year looking for a new contract after the previous one came to an end, and I had something lined up by the middle of the month. I really enjoyed my role and put in a lot of hours to build the project up from the beginning as I was the first developer on the project. However, before I joined the company, I spent the first day of the new year on a tour to find The Seven Noses of Soho. This was a fun walk and included a pub stop.

7noses-11.jpg

January also brought two light shows to London, including the first Lumiere London 2016. It was a fantastic event and drew crowds into central London. I was lucky to visit it on opening night when the crowds were minimal. It was one of the best art trails/installations of the decade and included a lot of illuminated artwork. I also checked Winter Lights @ Canary Wharf, and this was my first visit and second year of the event.

lumierelondon2016-20.jpg

During Chinese New Year, I visited the Magical Lantern Festival @ Chiswick House with two good friends. One of my friends is Chinese, so she was able to explain some of the Chinese symbols in the lanterns. We had so much fun that we decided to go back next year, but the lanterns were more "westernised" and not as enjoyable, so we did not bother to make this event a yearly tradition. 

chiswick-lantern39.jpg

One of the highlights of the year was that I was able to secure tickets to the sought-after Valentine's Day in the 'Harry Potter' Great Hall @ Warner Bros. Studio Tour. We had dinner in the Hogwarts Great Hall, and this was followed by a tour of the studios and a butterbeer. We were able to check out the new exhibitions, including the train.

valentines-warnerbros4.jpg

One of the most memorable days of the year happened in early March when, after living in the UK for over twelve years, I finally received my British citizenship. Despite having moved, I had to go back to Basingstoke for the ceremony.

british-citizenship.jpg

A couple of weekends later, a group of friends and I met up for a Sunday lunch at the Waterwitch Pub in Odiham (near Basingstoke in Hampshire), and after lunch, some of us went on a walk along the canal to Odiham Castle. This was the first proper spring day of the year, and we had a lovely walk chatting and seeing the castle ruins.

odiham-castle1.jpg

I also got to visit the RHS Chelsea Flower Show for the first time, and I really enjoyed the show gardens.

chelseaflowershow-02.jpg

June was the month that everything started to go downhill. I was over-worked, and this was starting to get the better of me. I also had some work done on one of my teeth, and the dentist did not have the correct tools to complete it; the temporary filling fell out, and I was left in a lot of pain for a week. I was having a couple of days off in Birmingham when this happened, and I was in so much agony that I had to leave a day in advance. Also, the night before this, I had to help with some issues at work, off the clock. So, this left me without any energy. I'd spent a lot of the previous weekends absorbed in work (because I enjoy what I do), but I was pulling the weight of everyone else on my team as everyone else except two others were either an under-achiever or inexperienced. (Yes, I did highlight the issues.) The stress started to show and started to affect me.

biscuiteers-queen90-07.jpg

The Queen's official 90th birthday was in April, but her state birthday is always the same weekend as my birthday in June, and special events were put on in London for it. 

mark-hamill01.jpg

I was able to go to 'Star Wars' Celebration 2016, which was held in London this year. The event was very popular, and I wished that I had not felt too guilty for having a day or two off from work to go when it was quieter. I got to see Mark Hamill as the event was closing for the day; he was addressing a small crowd, and I happened to be in the right place at the right time.

harrypotter-play1.jpg

In July, it was finally time to see the play "Harry Potter and the Cursed Child", which I had booked in October last year. The play is in two parts, and I managed to book to see both parts on the same day and just before the play was open to the public. It was such a great story and a follow-up to the original characters after the films/books.

cluequest.jpg

In August, I went with a group of friends to clueQuest for the Plan52 Escape Room in London, and we really enjoyed the escape room. We enjoyed it so much that we ended up doing a couple more.

firegarden-tate03.jpg

September marked 350 years since the Great Fire of London (1666), and a few special art installations, events and walks were put on in London. I visited a few of them, including the Fire Garden in front of Tate South Bank, which was an art installation by the company who hosted the "Fire Garden" event in Milton Keynes in 2012. Unfortunately, each event that I went to from June was marred with an overwhelming dread of work and feeling that I couldn't take time off or enjoy life outside of work.

rutlandwater11.jpg

This overwhelming dread included a long September weekend away that I had in Rutland, England's smallest county. We went to Newark and Bolingbroke castles before staying in Oakham (where there is another castle). One of the main attractions of the area is Rutland Water, which we went to the following day. 

tyne7.jpg

In October, I had a long weekend in Newcastle, again marred by work. I had learned that they would not be renewing all contractors, so my free time was then spent on starting to search for a new role before the market slowed down for the holidays instead of having some time to relax a little bit and reclaim my life from all of the overtime. That weekend, I had previously planned a trip to Newcastle to see the Great North Snowdogs sculpture trail around the area. My heart was not really into the sight-seeing.

Luckily, I was able to go back to the company that I enjoyed working at in 2013, though I was on a new project. I also had booked Christmas in the states with my family as I had been verbally told that I would be extended, but then this was changed a few days later. Talk about being messed around! Since I had already booked the time away, I had to take it and shortly after starting the new role, which I felt bad for. A lot that had happened in the next few years was all down to being messed around in October.

cliftonmill28.jpg

Despite all of the problems that I had later in the year, I tried to enjoy my time away as much as possible. To add more complications, the first phase of the building work was also scheduled to begin. I had been told that they would start in September, but they were delayed. So, I had booked the time off and didn't expect them to start until January, but they wanted to start in December; I was worried about the house while I was away because of the renovations. 

The highlights of my visit to the states was the annual trip to the Dickens Victorian Village and the Courthouse Light Show in Cambridge, Ohio and a first visit to Clifton Mill and Jersey Dairy to have delicious ice cream. We had a delicious meal at Clifton Mill in the morning and then looked around some huge antique malls before going to the ice cream and then seeing the lights.

cambridge-dickens-13.jpg

I was glad to see the back of 2016 as it was a terrible year with mean and lazy people at work. If it was any consulation, I did find it funny when I was told that the project failed a couple of months after I left. This year had a complete lack of stability and a multitude of stresses caused the workplace. This year, along with 2012, were the worst years of the decade so far.

2017 - a roller coaster BAD year, drained, unable to catch up, messed around; highlight was a new pet

2017: The year 2017 ended up being a roller coaster of a year in which I was pulled in so many directions and lacked the stability that I desired. However, 2017 was far better because I met some great people and  completed one phase of the renovation work (which began in December 2016). One of the worst things with 2017 was that I had three different workplaces in one year, so I was unable to catch my breath or get caught up on other aspects of life. I was left feeling exhausted most of the year. 

royalmint07.jpg

In autumn, the UK planned to circulate the new pound coin, and I arranged a visit to the Royal Mint Exhibition Experience near Cardiff. I saw how coins were made and learned about them in the exhibition and museum. After the visit to the Royal Mint, I went down the road to Caerphilly Castle

spitalfieldspancake2017-04.jpg

Since I was back working on Brick Lane again, I got to watch the Great Spitalfields Pancake Day Race.

In March, I had a tour of the Clapham South disused underground station, which was previously used as a World War II bunker. I remember it well because it was the same day as a terror attack on Westminster Bridge; I did not know it at this time, but one person who helped a victim of this tragedy ended up being a colleague of mine later in the year.

 ruislip-fairies-02.jpg

Over Easter, I went to visit Duck Pond Market, and to watch the Easter egg hunt in Ruislip Woods. This turned out to be an enjoyable day with lovely weather, and I also saw the Ruislip Fairy Village, which I enjoyed visiting and trying to locate the little doors for. Unfortunately, someone kept destroying the little doors, so the fairies have stopped building them.

imber06.jpg

On Easter Monday, I paid a visit to the abandoned village of Imber in the Salisbury Plains. This village was abandoned during World War II, and the buildings are pretty much all empty shells. Exploring them is like exploring a ghost village. However, the large number of people visiting kept it from being eerie. This is a popular place to visit, especially after it had some publicity.

renovations2017-1.jpg

In May, I wanted to escape the confines of a small room that I shared with a cat and boxes. Being at home was depressing because of the renovations, so I got out of the house and visited Reigate Caves and Reigate Castle (and Baron's Cave) during an open day in early May. Reigate is built on a series of caves, some of which were used to harvest sand. Other sections of the cave were used in World War II.

By the middle of May, the renovations were complete. I could finally start to put things in order.

sail2017-01.jpg

In the autumn of the previous year, the bloke's brother won second place for raising money for a charity, so he and the winner received a prize, a sailing trip from Southampton to the Isle of Wight with a stop for lunch on the boat. We had perfect weather for this and learned the basics of sailing. Unfortunately, the bloke's brother's fiance could not make it as she was expecting a baby, so it ended up being just the three of us. The winners happened to choose my birthday as the day for the sailing trip.

On the last day of June, all of the freelancers (including me) were told that our contracts were being cut. This came as a blow as I had hoped to stay at the company for awhile like I had done a couple of years previously. I really enjoyed working with new colleagues and ones that I had worked with in the past, and I made some great new contacts and friends.

regentspark2.jpg

On one hot July day, I visited London and took a walk through London to Regent's Park and went to see the sculptures in the park at Frieze Art Fair. This was such a lovely day with perfect temperatures. This was my first visit to the Frieze Art Sculptures in Regent's Park.

At the end of the month, I finished up my contract and started a new one the next working day. Fortunately, I met some amazing people in this project as well. 

lancelot.jpg

In August, I took home a new kitten that we ended up naming Sir Lancelot, though I don't think the name really fits him. At the time of writing this, he and Merlin (the cat we got in 2015) have settled in nicely together.

amershamheritageday11.jpg

Autumn was more interesting compared to the rest of the year. In September, I went on a ride of a vintage steam train tour from Harrow-on-the-Hill to Amersham during Amersham Heritage Day. I enjoyed seeing the vintage cars and beautiful gardens in Amersham, and it was a happy atmosphere with warm weather. The only problem is that I wanted to stay longer, but the bloke wanted to leave.

hampstead-highgate-halloween-01.jpg

I did something different for Halloween this year too. Normally, I do not bother with Halloween, but this year, I went on the Haunted Hampstead to Highgate Pub Walk. This was good fun as it was a trek across a part of London that I had never explored, and we stopped off at a few pubs and heard ghost stories along the way.

I had booked time off with my parents at the end of November as my first contract was meant to end then, but we were all cut short. Then, when the second contract (a rolling monthly contract) told me that they could not extend, I needed to sort something else out. This messed me around for a second year in a row. I went from having a contract cut short to a rolling monthly contract, which then had a large project come through as soon as I found another role. I agreed to work overtime to help them with the project as well as to start a new role, which wanted me to start sooner and were not too happy about the time I had booked off; it was actually difficult to find something due to that time off. I seriously felt like I could not win this year.

munich-xmas-17.jpg

My parents visited me at the end of November and beginning of December, and we had a few days in Scotland before going to Germany to visit MunichKufstein and Innsbruck in Austria, Lindau, and Neuschwanstein and Hohenschwangau castles.

neuschwanstein-castle-09.jpg

When we returned from Germany, I had arranged a special festive treat, the BT Christmas Concert at the Royal Albert Hall. We had dinner before the show at Elgar Bar & Grill, and this was one of the best meals that I had this decade.

bt-christmas-concert01.jpg

After my parents left, I spent the rest of the month working extra time and over-time in every free moment that I could. I was so glad to see the back of 2017 and had better aspirations for 2018. 

2018 - a continuation of 2017... drained, unable to catch up, over-worked; work, work, work; three beautiful weddings

2018: The year started with working on New Year's Day and then any spare moment I got. As soon as I completed that project for the other company in the spring, I was then asked to do overtime for the company that I joined at the end of November last year. The client was demanding and the deadline was originally in May. So, I spent most of my waking life working. In short, 2018 was a continuation of 2017.

twelfthnight-geffrye5.jpg

I managed to get one evening off to enjoy Twelfth Night and Farewell Party at the Geffrye Museum, a museum dedicated to the British home. The museum is closed for renovations for a couple of years, so this doubled as a Farewell Party.

lumierelondon2018.jpg

London Lumiere, a four-day light art installation show held across multiple locations in London, also took place for its second year. The illuminations were spread out over a greater area this time, and it took more than a day to see them all because of this. 

disneyland-paris-illum-25-01.jpg

"The Beast from the East" was the term given for a spell of unusually cold weather, and this hit the UK at the end of February and continued into March with snowfall and freezing temperatures. In the middle of March, luckily, the freezing weather had stopped in time for a visit to Disneyland Paris in its 25th anniversary of Disneyland Paris year. A special "Star Wars" event was also held in March. The theme park was busy for March, and we ended up having to wait a long while for the rides.

neo-bournemouth5.jpg

In April, we went to Bournemouth for a christening of the six-month old nephew and had lunch at Neo's Restaurant in Bournemouth afterwards.

ashbridge-bluebells13.jpg

May had beautiful weather, and I visited the bluebell forests at Ashridge Estate in Hertfordshire and Berkhamstead Castle. I loved the bluebell forests; my photographs cannot even do them justice, and they smelled so beautiful. We also went down to Bournemouth again and had a day out at Corfe Castle Model Village and Corfe Castle. The views of the castle are very pretty.

corfe-castle-model-village-23.jpg

June is my birthday month, and it was a big one for me this year. I had planned to take off a couple of weeks to go somewhere special, and I let work know at the beginning of the year. However, I was told that I couldn't take the time off as the client wanted more features and had pushed the deadline back by a month to deliver some of these new features. I was allowed to have a couple of days off only, so I booked a visit to Milan: Birthday Trip to Milan. Over 2.5 years later, and I still need to plan the special day that I never got to take.

34090098_642570486087639_3342501647493365760_n.jpg

I spent a couple of days in Milan and then had a trip scheduled to Lake Como and Bellagio.

bellagio13.jpg

My highlight of the year was July. The project was delivered, and while it was still busy, it was not as busy. I ended up arranging a very last-minute Fourth of July BBQ (which doubled as birthday and engagement parties) that a few friends came to. The weather was perfect; we had some beautiful weather in July.

julybbq-2018-07.jpg

I also went to Manchester to see friends visiting from the states later in the month, and at the end of month, I had a long weekend in Norfolk. I went to see the sculpture trail GoGoHares!, and I also had some time for sight-seeing. I visited Baconsthorpe CastleCaister Castle and Caister Castle Car Collection. I also saw some of the broads but want to go back to do a boat trip on them. The weather was perfect for the duration of the visit. One of the other highlights at the end of the month was a visit to Hell-Fire Caves in Buckinghamshire; Hell-Fire Caves are a series of man-made caves and became popular with a club called the Hell-Fire club.

caister-castle-08.jpg

The nice weather did not last in August. I had arranged a long weekend in Bristol to see Gromit Unleashed 2.0, the newest sculpture trail from Aardman. It was also over the Balloon Festival, and although I saw the balloons launch in the early morning, the weather on the day became extremely rainy, so the balloons were cancelled and I left disappointed.

gromitunleashed2018-01.jpg

At the start of September, the wonderful hot weather returned for the Bournemouth Air Show on the beach. This year marked 100 years of the RAF (Royal Air Force), so this aspect was brought into the display.

bournemouth-air-2018-03.jpg

We then had three weddings to attend in the autumn. The first wedding was Agnes' and Andrew's Wedding in the middle of September. The second wedding of Mini and Chris was at the end of September. The third wedding was at the wedding of my cousin and her partner in Hocking Hills, Ohio, in October.

cm-wedding-10.jpg

We had two weeks in Ohio, and I got to go to the Circleville Pumpkin Show at last. This is something that I had always wanted to go and do but never got to do. I also spent a little bit of time with friends and a lot of time with family. I enjoyed a visit with my friend to "Wine Your Way Out" wine-tasting in a corn maze

circleville-pumpkin19.jpg

One of the highlights of the trip was to Hocking Hills state park where part of my cousin's wedding celebrations were due to take place. I walked along some of the trails (Old Man's Cave, Cedar Falls, and Ash Cave) before the weather turned into a wash-out. You can read more about what I got up to in this post, many of which were tips from my cousin and her partner.

ash-cave-12.jpg

In the festive season, I went to the Christmas at Beaulieu event. This was the first year that Beaulieu has put on an illuminated lights show; a lot of places now do this.

beaulieu-xmas-22.jpg

I also really enjoyed my visit to have Christmas Cocktails @ Miracle at Henrietta, which was especially festive and one of the best festive moments in recent years.

miracle-xmas05.jpg

With all of the long hours put in in 2018, I was still feeling drained and over-worked. I did not get any time off except for a couple of weeks in the states (which wasn't exactly time off) and a couple of days in Milan and Norfolk. I wanted 2019 to be different. I didn't feel like I had a sense of stability.

2019 - a continuation of the past three years of feeling drained, over-worked, and lacking stability

2019: In 2019, I was still working on the project that I started at the end of 2017, but I had suspicions that all was not going to plan when they extended the developers until March. I was told that it would be at least three years of work, and I had cut my rates for a chance at some stability. So, I started to suspect the worst at the end of last year. 

gods-own-junkyard31.jpg

I started the year with a visit to Walthamstow to visit "God's Own Junkyard" (A Morning at God's Own Junkyard, London), a wonderful collection of neon signs and artwork. It's out of the way, but I would consider it a must-visit!

winter-lights-2019-01.jpg

In 2019, Winter Lights returned at Canary Wharf for a fifth year, and I went to visit it. This year of Canary Wharf Winter Lights 2019 was the best year yet with a lot of different illuminations. It also managed to attrack larger crowds and was much better organised.

Unfortunately, my suspicions about work were correct. The client decided to use a different supplier to cut costs, so the company had to let a lot of people go, including the developers for the work. This was the absolute worst time because Brexit was looming at the end of March. As a result of Brexit and the end of the financial year, companies were holding off, and budgets were not being signed off. I'd had some interest, but they either fell through or the company needed to sort out some budget. I was feeling worried.

brugges13.jpg

I also could not take off any time to go away or get my mind off of it because the bloke could not get the time off, and I felt that I needed to be around for interview. However, we managed to do a long weekned with a visit to Bruges (A Day and a Half in Bruges, Belgium) and Ghent (Half a Day in Ghent, Belgium) in Belgium.

I also finally got the chance to see Hamilton at Victoria Palace Theatre (Theatre Trip: "Hamilton" at Victoria Place Theatre), which I found refreshing. I saw the matinée performance during the week, which was the only good thing that came out of not having a job.

However, April came and one of the companies managed to get together the budget and sort out the masses of paperwork. Unfortunately, the project has had strange rolling-monthly contracts, so it has been impossible to plan. Like the other projects for the past three years, there has been too much work and too little time to deliver. So, I was able to begin something new but still have the instability hanging over me.

One of the most memorable times of the year was over Easter when the country had beautiful weather. I went out for one day to see Bekonscot Model Village and Railway (A Visit to Bekonscot Model Village and Railway). On another day, I went to Colchester to see the castle (A Visit to Colchester Castle, England) and St. Botolph's Priory ruins (A Visit to St. Botolph's Priory).

piel-castle04.jpg

I also had a long weekend off at the end of June with a visit to the Yorkshire Dales with a short drive through part of the Lake District (A Weekend in the Yorkshire Dales); the highlight for me was the short trip was to Piel Island. I saw a lot of castles and ate cheese at Wensleydale. I then went to Manchester for part of the weekend to see my friends from the states who were visiting. We went to the Peak District and had Sunday lunch and walked around Castleton.

chartwell01.jpg

In June, the bloke and I had joined the National Trust, so we spent some days out over the summer and autumn months to visit National Trust properties alone or with some of our friends: Winston Churchill's Family Home, ChartwellEmmett's GardenUpton House (National Trust Property in Warwickshire, England)Canons Ashby (National Trust Property in Northamptonshire, England)Hughenden ManorSissinghurst Castle and GardensStowe Landscape Gardens in Buckinghamshire, EnglandThe Vyne in Basingstoke (Hampshire, England)Apple Day at Fenton House (National Trust in Hampstead, London), and 2 Willow Road in Hampstead.

war-of-the-worlds09.jpg

One of the best immersive experiences that we visited this decade was Jeff Wayne's 'War of the Worlds' Immersive Experience, and it included virtual reality. It was not on the same scale as Secret Cinema, but it used virtual reality and acting to create the science fiction elements.

weald-downland-22.jpg

In late summer, I also visited The Weald and Downland Museum (Living Museum) on the south coast, and I spent the day wandering around the old buildings. It is really a fascinating place to visit to see how people lived and worked.

We did not plan to visit this year, but we did decide at the last minute to visit the annual Bournemouth Air Show and Fireworks 2019. The weather was not as warm as the previous year, but after a spell of rain in the morning, it did dry out. This year, I stayed to watch the fireworks on the beach. 

leeds-castle-flowers31.jpg

One of the other highlights was to visit Leeds Castle to see their annual "Festival of Flowers" ("Leeds Festival of Flowers" marks 900 years of Leeds Castle). Every September, the castle's rooms are decorated with beautiful flowers that have been arranged by professional florists, and seeing the rooms decorated with flowers was beautiful and creative. 

autumnleaves-2019-04.jpg

Home renovations (phase two) began in the middle of October after having a delay of about a month due to the other project over-running and poor weather. So, home life became a bit of a mess with dirt and boxes everywhere and no place to move. The work is still on-going.

I enjoyed the little things. In the middle of November, I walked around the lake on site to enjoy the fall colours, which were at their prime then (Autumn Photographs at Feltham/Sunbury "Chertsey Road" Lake/Pond). 

longleat-festival-light-02.jpg

At the end of November, I spent the day at Longleat and enjoyed the Festival of Lights (Longleat Festival of Lights: "Myths and Legends") and a visit to see the animals: Winter Safari and a Day Out at Longleat

waddestonmanor-xmas2019-01a.jpg

One of the other highlights for me this year was the visit with our friends to enjoy Christmas and Winter Light at Waddesdon Manor (Bucks, England)Christmas at National Trust's Kingston Lacy House (Dorset, England) and Winter Light Trail at National Trust's Kingston Lacy House (Dorset, England).

xmas-lunch9.jpg

For the first time this year, I went to London on Christmas Day and booked Christmas lunch at The Apple Tree, Gerrards Cross in Buckinghamshire. The house is still under renovation work, so it was a low key Christmas this year. I was not able to get into it at all.

That draws the end of the decade. The renovations are still on-going, but I anticipate that they should be finished by the end of January. The lack of stability and over-working has caused me to become drained over the past three and a half years now, but 2020 has promised some great changes that I am greatly looking forward to. I just hope that it all goes to plan because I am tired of being over-worked and missing being able to take time off without feeling pressured and missing stability.

Here is my verdict:

2010: A poor start with job redundancy and the keys to my first home (on the same day). Long commutes into London; I had three jobs this year. My brother got married. I got enagaged. Not a great year as lacked stability. 2/10

2011: Overall, a good year. Time spent in Ohio ahead of the wedding and then time off to visit Portugal for a long weekend and spend time with my parents in Hampshire ahead of the UK wedding party. Got to do some festive things. However, became over-worked at the end of the year. 9/10

2012: The London Olympics and Diamond Jubilee year. I started a new job, which ended up being awful. I travelled to Derbyshire/Hull, Malta, Croatia, and Bosnia before having to give up my passport for processing and then feeling stuck and missing my brother's wedding in January 2013. 2/10 but would have been 1/10 if not for Croatia and Malta

2013: One of the best years with visits to some wonderful places, stability in a nice workplace with a start at contracting, street art, time with friends and family, Thanksgiving in Ohio and a trip to Michigan. 10/10

2014: An average year with a continuation of a nice workplace and stability, a road trip around Ireland with my parents, German Christmas markets, and Liverpool Beatles tour. Also contained a lot of arty events such as Liverpool Giants, Secret Cinema, and Tower of London poppies. My first niece was born. 8/10

2015: A year of changes; moved from Basingstoke to Ruislip. A new job with instability later in the year but worked from home mainly. A wonderful visit over Easter to Harrogate and the area. Visits to Amsterdam for work and the SAIL Amsterdam event. Did some day trips locally and enjoyed Basingstoke. Got a kitten. 5/10

2016: One of the worst years. New job started in January, which was amazing at first but then became over-worked and stressful; mean and under-achieving colleagues and Brexit. First year for London Lumiere art winter light installations, messed around. Visit to Rutland, Newcastle, and Ohio for Christmas. Home renovations phase one started. Could not relax and over-worked. Messed around and had to start a new job in November. Gained a nephew and niece this year. 1/10

2017: A roller-coaster year of being drained, over-worked, and lacking stability. Three different workplaces this year and a continuation of being messed around. Got a new kitten. Only time off was a couple of weeks with parents to Austrian and German Christmas markets at the end of the year. Gained a nephew and niece. 2/10

2018: Drained and over-worked with much overtime and feeling of instability. A visit to Disneyland Paris in the spring and three weddings attended. Went to Ohio for a couple of weeks in October for my cousin's wedding and explored Hocking Hills and went to Circleville Pumpkin Festival. Had to cancel big birthday plans. Overall, a disappointing year. 3/10

2019: Drained, over-worked, and lacking stability. Feels like a repeat of the past couple of years. Messed around with contract and Brexit and budget issues meant being out of work for awhile. Felt alienated much of the time. Visited Belgium in spring, several National Trust properties, and had days out to the Dales and Lake District. 2/10

Archives

Recent Comments

  • jenn: Thank you. read more
  • Murge: Amazing post. read more
  • Herbert: good post. site read more
  • Frank Quake: Hey, This is great when you said that I had read more
  • Chappy: You mention peptides here? I have had first hand experience read more
  • jenn: Thanks! I love the work. I have got more recent read more
  • Fanakapan: Thanks for the write up. This was some of my read more
  • jenn: Yes.... but that's only for the islands. Mostar and Montenegro read more
  • jenn: Hello, the code is not mine to hand out. I'll read more
  • pantich: More info about the best day trips from Dubrovnik can read more
OpenID accepted here Learn more about OpenID