Millennials in charge of millennials

As reported by Ankita Varma in Straight Times. Original post can be found here.

Love, Bonito's open-plan office, which boasts a 4,000 sq ft warehouse, in-house photo studio and large pantry, was created with the millennial worker in mind.

Tables are shared, with no cubicle divisions. In a corner sits a table overflowing with snacks. Propped against a wall is a cork board titled #LBempowers, covered in colourful post-its highlighting the goals and desires of team members, including wanting to learn Muay Thai and throwing a durian party.

This plugged-in and lively work culture has been 10 years in the making for the founders Viola Tan, 32, and Rachel Lim, 29. The third co-founder Velda Tan is no longer involved in the daily operations of the business.

Both of them are daughters of taxi drivers and had no background in business. Their journey has been one of trial and error, but experience has made them better at managing teams and people their own age

/** * helper function to take the form and * get back a js object with field/value mappings * ignoring submit fields and fields whose name we can't ascertain */ function serialize(form){ return Array.prototype.slice.call(form.elements) .filter(isInputElement) .filter(isNotSubmit) .filter(hasFieldName) .reduce(function(data, node, index) { data[getFieldName(node)] = node.value return data; }, {}); } /** * Check if this form element is of type input */ function isInputElement(node) { return node.tagName.toLowerCase() === 'input'; } /** * Check if this is a 'submit' input element */ function isNotSubmit(node) { return node.type !== 'submit'; } /** * Ensure field has a derived name */ function hasFieldName(node) { return getFieldName(node) !== 'unknown'; } /** * Attempt to ascertain "name" of field. * * they don't give inputs real `name` attributes, so * best guess is to hack around the element's label text, * falling back to the placeholder text. (their html is * not semantic and often labels erroneously reference * parent divs instead of sibling input elements) * * strip out the stars they show when validation fails * * if label is misplaced _and_ there's no placeholder, * this function is insufficient */ function getFieldName(input) { if (!input.labels.length) return input.placeholder || 'unknown'; var labelText = input.labels[0].textContent.trim(); return ~labelText.indexOf(' *') ? labelText.slice(0, labelText.indexOf(' *')) : labelText; } /** * Listen for form submissions and send identify * if you'd like an event too, just delete the '//' in the track line */ document.forms[0].addEventListener('submit', function(e) { analytics.identify(serialize(e.target)); // analytics.track('Submitted Form'); });