{"version":3,"file":"tankTypes-AwuyWaEL.js","sources":["../../../Nitrogen.Client/src/models/RentalItem.js","../../../Nitrogen.Client/src/api/modules/rentalItems.js","../../../Nitrogen.Client/src/models/TankType.js","../../../Nitrogen.Client/src/api/modules/tankTypes.js"],"sourcesContent":["import { getDateTimeFromDto as getDate, getValueFromDto as getValue } from './_helpers.js';\r\n\r\nexport default class RentalItem {\r\n\tconstructor(dto) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\t// this.number = getValue(dto, 'number', 'number', 0);\r\n\t\tthis.name = getValue(dto, 'name', 'string', '');\r\n\t\tthis.rentalItemTypeId = getValue(dto, 'rentalItemTypeId', 'number', null);\r\n\t\tthis.rentalItemType = null;\r\n\t\tthis.datePurchased = getDate(dto, 'datePurchased', null);\r\n\t\tthis.dateRetired = getDate(dto, 'dateRetired', null);\r\n\t\tObject.defineProperty(this, 'rentalItemType', { enumerable: false });\r\n\t}\r\n\r\n\tisOrdered(now) { return now < this.datePurchased; }\r\n\tisRetired(now) { return this.dateRetired !== null && this.dateRetired <= now; }\r\n\tisActive(now) { return !this.isOrdered(now) && !this.isRetired(now); }\r\n\tisScheduled(scheduledIdsSet) { return scheduledIdsSet.has(this.id); }\r\n}\r\n","import { makeComparator, url as urlHelper } from '@/helpers/helpers';\r\nimport { getIdb, idbHelpers } from '@/idb';\r\nimport RentalItem from '@/models/RentalItem';\r\nimport { DateTime } from 'luxon';\r\nimport { fetchAllPages, fetchWrap, idbResponse, isIdbResponse, offlineResponse } from '../_helpers';\r\nimport cache from './cache';\r\n\r\nconst idbStore = 'rentalItems';\r\n\r\nexport default {\r\n\t/**\r\n\t * Get all rental item\r\n\t * @returns (async) Returns an array of rental item objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getAll() {\r\n\t\tconst idb = await getIdb();\r\n\t\tlet response, data = [], timestamp;\r\n\t\tlet useIdb = await cache.isCacheHit(idbStore);\r\n\t\tif (!useIdb) {\r\n\t\t\ttry {\r\n\t\t\t\ttimestamp = DateTime.now();\r\n\t\t\t\tresponse = await fetchAllPages('/api/RentalItems', x => data.push(x));\r\n\t\t\t} catch {\r\n\t\t\t\tuseIdb = true;\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (useIdb && idb) {\r\n\t\t\tdata = await idb.getAll(idbStore);\r\n\t\t\tdata.sort(makeComparator('name'));\r\n\t\t\tresponse = idbResponse(200);\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tif (idb && !isIdbResponse(response)) {\r\n\t\t\t\tawait idbHelpers.replaceAll(idb, idbStore, data);\r\n\t\t\t\tawait cache.setTimestamp(idbStore, timestamp);\r\n\t\t\t}\r\n\t\t\treturn data.map(x => new RentalItem(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get scheduled rental item IDs\r\n\t * @returns {Promise>} (async) Returns an array of rental item IDs if the request was successful, otherwise throws a Response.\r\n\t */\r\n\tasync getScheduled() {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/RentalItems/Scheduled');\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn await response.json();\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get rental items by ID\r\n\t * @returns (async) Returns an array of rental item objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getByIds(ids) {\r\n\t\tconst idb = await getIdb();\r\n\t\tlet response, data = [], timestamp;\r\n\t\tlet useIdb = await cache.isCacheHit(idbStore);\r\n\t\tif (!useIdb) {\r\n\t\t\ttry {\r\n\t\t\t\ttimestamp = DateTime.now();\r\n\t\t\t\tif (ids.length > 100) {\r\n\t\t\t\t\tids = ids.slice(0, 100);\r\n\t\t\t\t\tconsole.warn('rental items getByIds was called with more than 100 ids');\r\n\t\t\t\t}\r\n\t\t\t\tconst url = urlHelper('/api/RentalItems/ByIds', { ids: ids.join(',') });\r\n\t\t\t\tresponse = await fetchWrap(url);\r\n\t\t\t\tif (response.ok) { data = await response.json(); }\r\n\t\t\t} catch {\r\n\t\t\t\tuseIdb = true;\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (useIdb && idb) {\r\n\t\t\tdata = (await idb.getAll(idbStore)).filter(x => ids.includes(x.id)).sort(makeComparator('name'));\r\n\t\t\tresponse = idbResponse(200);\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\treturn data.map(x => new RentalItem(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get a rental item\r\n\t * @param {Number} id rental item ID\r\n\t * @returns (async) Returns a rental item if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getById(id) {\r\n\t\tlet response, data = null;\r\n\t\tlet useIdb = await cache.isCacheHit(idbStore);\r\n\t\tif (!useIdb && await cache.canCache()) {\r\n\t\t\t// cache all for future re-use\r\n\t\t\tif ((data = (await this.getAll()).find(x => x.id === id) ?? null)) {\r\n\t\t\t\treturn data;\r\n\t\t\t} else {\r\n\t\t\t\tthrow idbResponse(404);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!useIdb) {\r\n\t\t\ttry {\r\n\t\t\t\tresponse = await fetchWrap('/api/RentalItems/' + id);\r\n\t\t\t\tif (response.ok) { data = await response.json(); }\r\n\t\t\t} catch {\r\n\t\t\t\tuseIdb = true;\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tconst idb = await getIdb();\r\n\t\tif (useIdb && idb) {\r\n\t\t\tdata = await idb.get(idbStore, id);\r\n\t\t\tresponse = data ? idbResponse(200) : idbResponse(404);\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tif (idb && !isIdbResponse(response)) {\r\n\t\t\t\tawait idb.put(idbStore, data);\r\n\t\t\t}\r\n\t\t\treturn new RentalItem(data);\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Create a rental item\r\n\t * @param {RentalItem} model rental item to create.\r\n\t * @returns (async) Returns the new RentalItem if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync create(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/RentalItems', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn new RentalItem(await response.json());\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Update a rental item\r\n\t * @param {RentalItem} model rental item to update.\r\n\t * @returns (async) Returns the updated rental item if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync update(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/RentalItems/' + model.id, {\r\n\t\t\t\tmethod: 'PUT',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn new RentalItem(model);\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Delete a rental item\r\n\t * @param {Number} id RentalItem ID to delete.\r\n\t * @returns (async) Returns true if the request was successful (or not found), false if the rental item could not be deleted, otherwise a Response.\r\n\t */\r\n\tasync deleteById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/RentalItems/' + id, { method: 'DELETE' });\r\n\t\t} catch {\r\n\t\t\treturn offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 404) {\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 409) {\r\n\t\t\treturn false;\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t}\r\n};\r\n","import { getValueFromDto as getValue } from './_helpers.js';\r\nexport default class TankType {\r\n\tconstructor(dto) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.name = getValue(dto, 'name', 'string', '');\r\n\t\tthis.sortOrder = getValue(dto, 'sortOrder', 'number', 0);\r\n\t\tthis.active = getValue(dto, 'active', 'boolean', true);\r\n\t}\r\n}\r\n","import { makeComparator } from '@/helpers/helpers';\r\nimport { getIdb, idbHelpers } from '@/idb';\r\nimport TankType from '@/models/TankType';\r\nimport { DateTime } from 'luxon';\r\nimport { fetchAllPages, fetchWrap, idbResponse, isIdbResponse, offlineResponse } from '../_helpers';\r\nimport cache from './cache';\r\n\r\nconst idbStore = 'tankTypes';\r\n\r\nexport default {\r\n\t/**\r\n\t * Get all tank types\r\n\t * @returns (async) Returns an array of TankType objects if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getAll() {\r\n\t\tconst idb = await getIdb();\r\n\t\tlet response, data = [], timestamp;\r\n\t\tlet useIdb = await cache.isCacheHit(idbStore);\r\n\t\tif (!useIdb) {\r\n\t\t\ttry {\r\n\t\t\t\ttimestamp = DateTime.now();\r\n\t\t\t\tresponse = await fetchAllPages('/api/TankTypes', x => data.push(x), {}, 1000);\r\n\t\t\t} catch {\r\n\t\t\t\tuseIdb = true;\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (useIdb && idb) {\r\n\t\t\tdata = await idb.getAll(idbStore);\r\n\t\t\tresponse = idbResponse(200);\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tif (idb && !isIdbResponse(response)) {\r\n\t\t\t\tawait idbHelpers.replaceAll(idb, idbStore, data);\r\n\t\t\t\tawait cache.setTimestamp(idbStore, timestamp);\r\n\t\t\t}\r\n\t\t\tdata.sort(makeComparator('sortOrder', 'id'));\r\n\t\t\treturn data.map(x => new TankType(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get a tank type\r\n\t * @param {Number} id TankType ID\r\n\t * @returns (async) Returns a TankType if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getById(id) {\r\n\t\tconst idb = await getIdb();\r\n\t\tlet response, data = null;\r\n\t\tlet useIdb = await cache.isCacheHit(idbStore);\r\n\t\tif (!useIdb && await cache.canCache()) {\r\n\t\t\t// cache all for future re-use\r\n\t\t\tif ((data = (await this.getAll()).find(x => x.id === id) ?? null)) {\r\n\t\t\t\treturn data;\r\n\t\t\t} else {\r\n\t\t\t\tthrow idbResponse(404);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!useIdb) {\r\n\t\t\ttry {\r\n\t\t\t\tresponse = await fetchWrap('/api/TankTypes/' + id);\r\n\t\t\t\tif (response.ok) { data = await response.json(); }\r\n\t\t\t} catch {\r\n\t\t\t\tuseIdb = true;\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (useIdb && idb) {\r\n\t\t\tdata = await idb.get(idbStore, id);\r\n\t\t\tresponse = data ? idbResponse(200) : idbResponse(404);\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tif (idb && !isIdbResponse(response)) {\r\n\t\t\t\tawait idb.put(idbStore, data);\r\n\t\t\t}\r\n\t\t\treturn new TankType(data);\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Create a tank type\r\n\t * @param {TankType} model tank type to create.\r\n\t * @returns (async) Returns the new TankType if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync create(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/TankTypes', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn new TankType(await response.json());\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Update a tank type\r\n\t * @param {TankType} model tank type to update.\r\n\t * @returns (async) Returns the updated TankType if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync update(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/TankTypes/' + model.id, {\r\n\t\t\t\tmethod: 'PUT',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn new TankType(model);\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Delete a tank type\r\n\t * @param {Number} id TankType ID to delete.\r\n\t * @returns (async) Returns true if the request was successful (or not found), false if the tank type could not be deleted, otherwise a Response.\r\n\t */\r\n\tasync deleteById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/TankTypes/' + id, { method: 'DELETE' });\r\n\t\t} catch {\r\n\t\t\treturn offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 404) {\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 409) {\r\n\t\t\treturn false;\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t}\r\n};\r\n"],"names":["RentalItem","dto","getValue","getDate","now","scheduledIdsSet","idbStore","rentalItemsApi","idb","getIdb","response","data","timestamp","useIdb","cache","DateTime","fetchAllPages","x","offlineResponse","makeComparator","idbResponse","isIdbResponse","idbHelpers","fetchWrap","ids","url","urlHelper","id","model","TankType","tankTypesApi"],"mappings":"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"}