// What the warranty list's search box matches against. // // Pulled out of WarrantiesList.vue so the field list is somewhere a test can // see it. It went wrong the way a field list usually does: silently, by a // column being added to the table and not to the filter. // // THE MACHINE NUMBER IS THE POINT. _related_machine in the warranty API exists // precisely because "a shopfloor PC is bought, warranted and replaced as a PC, // but it is FOUND by the machine it drives - nobody walks the floor looking for // an asset number". The payload carries it, the table renders it in a chip, and // the filter did not look at it - so the one identifier the feature was built // around was the one thing the search box could not find. /** * Does this warranty match the search term? * * @param {object} warranty - a row from GET /api/warranties * @param {string} term - the raw search box contents * @returns {boolean} true when the term is empty or any searched field contains it */ export function matchesWarrantySearch(warranty, term) { const needle = (term || '').trim().toLowerCase() if (!needle) return true if (!warranty) return false const has = (value) => String(value ?? '').toLowerCase().includes(needle) if (has(warranty.vendor) || has(warranty.servicelevel) || has(warranty.servicetag)) { return true } return (warranty.assets || []).some((asset) => { if (has(asset?.assetnumber)) return true // The related machine is optional: a warranty on something that drives no // machine has none, and a machine that was never linked leaves it null. const machine = asset?.machine return !!machine && (has(machine.machinenumber) || has(machine.name)) }) } /** The fields above, in the order the placeholder should name them. */ export const WARRANTY_SEARCH_FIELDS = [ 'vendor', 'service level', 'tag', 'asset number', 'machine', ]