From caae3a4380c38e77cc4760b5372270c3db548bd0 Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 25 Jul 2022 06:52:08 +1000 Subject: [PATCH 1/9] Most reactive features done --- typescript/dredgepos.core.ts | 31 ++- typescript/dredgepos.orderScreen.ts | 303 ++++++++++++++-------------- typescript/types.ts | 6 +- 3 files changed, 192 insertions(+), 148 deletions(-) diff --git a/typescript/dredgepos.core.ts b/typescript/dredgepos.core.ts index ffdb2d6..25fae76 100644 --- a/typescript/dredgepos.core.ts +++ b/typescript/dredgepos.core.ts @@ -186,15 +186,44 @@ const setElementVisibilityByMode = () => { const getPercentageOfPageContainerWidth = (pixels: number) => ( (pixels / $('#pageContainer').width()) * 100) + '%' -const pulseElement = (element: JQuery) => element.addClass('pulse').on('animationend', () => element.removeClass('pulse')) +const pulseElement = (element: JQuery) => { + const orderItem: orderItem = element.data('order-item') + removeOrderItemsToPulse(orderItem.id) + element + .addClass('pulse') + .on('animationend', () => element.removeClass('pulse')) +} + +Array.prototype.collect = function(this: x[], func: (item: x) => x[]) { + return this.map(func).flat(1) +} Array.prototype.where = function(this: x[], property: string, value: any) { return this.filter( item => (item as any)[property] === value)[0] || null } +Array.prototype.first = function(this: x[]) { + return this[0] +} +Array.prototype.last = function(this: x[]) { + return this[this.length-1] +} +Array.prototype.unique = function(this: x[]) { + return [... new Set(this)] +} + +const clone = (obj: x) => JSON.parse(JSON.stringify(obj)) as x const money = (amount: number, fromCents=true) => currency(amount, {fromCents: fromCents}) const moneyFromString = (amount: string) => currency(amount) +const array_push = (array: x[], value: x) => { + let copy = array.slice() + return [...copy, value] +}; +const array_remove = (array: x[], valueToRemove: x) => array.filter(item => item != valueToRemove) +const array_pop = (array:x[]) => array.slice(0,-1); +const array_unique = (array:x[]) => [... new Set(array)] + const toggle = (e: JQuery.TriggeredEvent) => { const button = $(e.target) const toggleGroup = button.closest('.toggleGroup') diff --git a/typescript/dredgepos.orderScreen.ts b/typescript/dredgepos.orderScreen.ts index 4276c5b..bbddb3a 100644 --- a/typescript/dredgepos.orderScreen.ts +++ b/typescript/dredgepos.orderScreen.ts @@ -13,6 +13,7 @@ type OrderScreen = { print_groups: print_group[] order_item_id_generator: Generator selected_item_ids: number[] + pulse_order_item_ids: number[] qty_override: number print_group_override: print_group custom_item: item, @@ -28,6 +29,7 @@ let OrderScreen : OrderScreen = { sales_categories: [], order_item_id_generator: newestId(), selected_item_ids: [], + pulse_order_item_ids: [], qty_override: 1, print_group_override: null, custom_item: null, @@ -57,32 +59,30 @@ const loadPageGroup = (e: Event) => { } const setupOrderScreen = (data: OrderScreenData) => { - - OrderScreen.order_screen_pages = data.order_screen_pages OrderScreen.sales_categories = data.sales_categories OrderScreen.print_groups = data.print_groups OrderScreen.custom_item = data.custom_item updateOrderBoxTotals() - let doc = $(document) - doc.on('click', '.nextButton', goToNextPage) - doc.on('click', '.prevButton', goToPrevPage) - doc.on('click', '.loadPageGroup', loadPageGroup) - doc.on('click', getElementsByAction('item'), itemButtonClicked) - doc.on('click', getElementsByAction('grid'), gridButtonClicked) - doc.on('click', '.closeGrid', hideGrids) - doc.on('click', '.freetextButton', freetext) - doc.on('click', '.openItemButton', customItem) - doc.on('click', '.orderBoxTable tbody tr', itemRowClicked) - doc.on('click', '.voidButton', voidButtonClicked) - doc.on('dblclick', '.voidButton', voidLastItem) - doc.on('click', '.numpadButton', overrideQty) - doc.on('click', '.accumulateButton', () => toggleMode('accumulate')) - doc.on('click', '.changeCoverNumberButton', changeCoverNumberPrompt) - doc.on('click', '.showCoverSelectorButton', showCoverSelector) - doc.on('click', '.coverSelectorButton', coverSelected) - doc.on('change', '[name=print_override]', printGroupOverride) + $(document) + .on('click', '.nextButton', goToNextPage) + .on('click', '.prevButton', goToPrevPage) + .on('click', '.loadPageGroup', loadPageGroup) + .on('click', getElementsByAction('item'), itemButtonClicked) + .on('click', getElementsByAction('grid'), gridButtonClicked) + .on('click', '.closeGrid', hideGrids) + .on('click', '.freetextButton', freetext) + .on('click', '.openItemButton', customItem) + .on('click', '.orderBoxTable tbody tr', itemRowClicked) + .on('click', '.voidButton', voidButtonClicked) + .on('dblclick', '.voidButton', voidLastItem) + .on('click', '.numpadButton', overrideQty) + .on('click', '.accumulateButton', () => toggleMode('accumulate')) + .on('click', '.changeCoverNumberButton', changeCoverNumberPrompt) + .on('click', '.showCoverSelectorButton', showCoverSelector) + .on('click', '.coverSelectorButton', coverSelected) + .on('change', '[name=print_override]', printGroupOverride) turnOnMode('accumulate') @@ -113,88 +113,128 @@ const navigatePage = (direction: number, button: JQuery) => { grid.get()[0].scrollLeft += grid.width() * direction } +const getOrderBox = () => $('.orderBoxTable tbody') const goToNextPage = (e: JQuery.TriggeredEvent) => navigatePage(1, $(e.target)) const goToPrevPage = (e: JQuery.TriggeredEvent) => navigatePage(-1, $(e.target)) -const addItemToOrderBox = (orderItem:orderItem) => { - const orderBox = $('.orderBoxTable tbody') - let selectedRows = orderBox.find('tr.selected') - let lastRow : JQuery = selectedRows.length ? getLastInstructionRow(selectedRows.first()) : orderBox.find('tr').last() - const existingRow = orderBox - .find('tr') - .filterByData('item', orderItem.item) - .filterByData('print_group', orderItem.print_group_id) - .filterByData('cover', orderItem.cover) - .last() +const setItemQty = (orderItem: orderItem, qty: number) => { + const newItems = qty > 0 + ? OrderScreen.order_items.map(existingOrderItem => { + if(existingOrderItem.id == orderItem.id){ + existingOrderItem.qty = qty + } + return existingOrderItem + }) + : array_remove(OrderScreen.order_items, orderItem) - - //If accumulating, just increase the quantity of the existing row. - if(existingRow.length > 0 && isInMode('accumulate')){ - incrementRowQty(existingRow, orderItem.qty) - scrollToElement(existingRow) - existingRow.pulse() - } else { - const newRow = createOrderRow(orderItem) - lastRow.length > 0 - ? lastRow.after(newRow) - : orderBox.append(newRow) - scrollToElement(newRow) - newRow.pulse() + if(qty < 1){ + OrderScreen.selected_item_ids = array_remove(OrderScreen.selected_item_ids, orderItem.id) } - deselectRow(orderBox.find('tr')) + setOrderItems(newItems) } +const incrementItemQty = (orderItem:orderItem) => setItemQty(orderItem, orderItem.qty+1) +const decrementItemQty = (orderItem:orderItem) => setItemQty(orderItem, orderItem.qty-1) -const addInstructionToOrderBox = (instruction: orderItem) => { - const orderBox = $('.orderBoxTable tbody') - let selectedRows = orderBox.find('tr.selected') - const newRow = createOrderRow(instruction) +const deselectAllRows = () => { + OrderScreen.selected_item_ids = [] + $('tr.selected').removeClass('selected') +} - //If no items are added, then you can't add an instruction row. - if(!orderBox.find('tr.itemRow').length) return +const addOrderItemsToPulse = (id: number) => OrderScreen.pulse_order_item_ids = array_push(OrderScreen.pulse_order_item_ids, id) +const removeOrderItemsToPulse = (id: number) => OrderScreen.pulse_order_item_ids = array_remove(OrderScreen.pulse_order_item_ids, id) - if(selectedRows.length > 0){ - selectedRows.each( (_, row) => { - const selectedRow = $(row) - const parentRow = getParentRow(selectedRow) - if(parentRow.is(selectedRow) || !parentRow.hasClass('selected')) { - const newRow = createOrderRow(instruction) - getLastInstructionRow(selectedRow).after(newRow) - newRow - .setColumnValue( lang('printgroup_header'), selectedRow.getColumnValue(lang('printgroup_header')) ) +const addItemToOrderBox = (newOrderItem:orderItem) => { + const existingItems = OrderScreen.order_items + .filter(existingOrderItem => + existingOrderItem.item.id == newOrderItem.item.id + && existingOrderItem.print_group.id == newOrderItem.print_group.id + && existingOrderItem.cover == newOrderItem.cover + ) - - if(parentRow.hasClass('selected')){ - selectRow(newRow) - } else { - newRow.pulse() - } - - scrollToElement(newRow) - } - }) + if(existingItems.length > 0 && isInMode('accumulate')) { + incrementItemQty(existingItems[0]) + addOrderItemsToPulse(existingItems[0].id) + } else { + addOrderItemsToPulse(newOrderItem.id) + if(!OrderScreen.selected_item_ids.length) { + const newItems = array_push(OrderScreen.order_items, newOrderItem) + setOrderItems(newItems) + } else { + const newItems = + OrderScreen.order_items + .collect(existingOrderItem => { + const firstSelectedItemId = getLastInstructionItem(OrderScreen.selected_item_ids.first())?.id + return firstSelectedItemId == existingOrderItem.id + ? [existingOrderItem, newOrderItem] + : [existingOrderItem] + }) + setOrderItems(newItems) + } } - const lastRow = orderBox.find('tr').last() - newRow - .setColumnValue(lang('printgroup_header'), lastRow.getColumnValue(lang('printgroup_header'))) - .appendTo(orderBox) - .pulse() - scrollToElement(newRow) + deselectAllRows() +} + +const getParentItem = (orderItemId: number) => { + const itemIndex = OrderScreen.order_items.findIndex(orderItem => orderItem.id === orderItemId); + if(OrderScreen.order_items[itemIndex].item.item_type == "item"){ + return OrderScreen.order_items[itemIndex] + } + return OrderScreen.order_items + .filter((orderItem, index) => index < itemIndex && orderItem.item.item_type === 'item') + .last() +} + +const getInstructionItems = (orderItemId: number) => { + const itemIndex = OrderScreen.order_items.findIndex(orderItem => orderItem.id === orderItemId); + + if(!OrderScreen.order_items[itemIndex+1] || OrderScreen.order_items[itemIndex+1].item.item_type == "item") + return [OrderScreen.order_items[itemIndex]] + + const nextItem = + OrderScreen.order_items + .filter((orderItem, index) => index > itemIndex && orderItem.item.item_type === 'item') + .first() + const nextItemIndex = OrderScreen.order_items.findIndex(orderItem => orderItem.id === nextItem.id); + return OrderScreen.order_items.slice(itemIndex, nextItemIndex) +} + +const getLastInstructionItem = (orderItemId: number) => getInstructionItems(orderItemId).last() + +const addInstructionToOrderBox = (instruction: orderItem) => { + //If no items are added, then you can't add an instruction row. + if(!OrderScreen.order_items.length) return + const addAfter = OrderScreen.selected_item_ids.length + ? OrderScreen.selected_item_ids.map(selectedItemId => getLastInstructionItem(selectedItemId).id).unique() + : [getLastInstructionItem(OrderScreen.order_items.last().id).id] + + const newItems = OrderScreen.order_items.collect(existingItem => { + const newInstruction = createNewOrderItem(instruction.item, instruction.qty, instruction.print_group) + addOrderItemsToPulse(newInstruction.id) + return addAfter.includes(existingItem.id) + ? [existingItem, newInstruction] + : [existingItem] + }) + setOrderItems(newItems) +} + +const createNewOrderItem = (item: item, qty: number, printGroup: print_group) : orderItem => { + return { + id: OrderScreen.order_item_id_generator.next().value, + item: clone(item), + qty: qty, + print_group: printGroup, + cover: OrderScreen.selected_cover, + } } const addNewItem = (item: item, qty = 1) => { const salesCategory = OrderScreen.sales_categories.where('id', item.sales_category_id) const printGroup = OrderScreen.print_group_override ?? OrderScreen.print_groups.where('id', salesCategory.print_group_id) - const orderItem : orderItem = { - id: OrderScreen.order_item_id_generator.next().value, - item: item, - qty: qty, - print_group_id: printGroup, - cover: OrderScreen.selected_cover, - } + const orderItem = createNewOrderItem(item, qty, printGroup) switch(item.item_type){ case 'instruction': @@ -207,55 +247,32 @@ const addNewItem = (item: item, qty = 1) => { } } -const getLastInstructionRow = (row: JQuery) => { - let stopCounting = false - let finalRow = row - row.nextAll().each(function (index, activeRow){ - if(!stopCounting){ - if($(activeRow).hasClass('instructionRow')){ - finalRow = $(activeRow) - } else { - stopCounting = true - } - } - }) - - return $(finalRow) -} - -const getParentRow = (row: JQuery) => - row.hasClass('instructionRow') - ? row.prevAll('.itemRow').first() - : row - - -const incrementRowQty = (row: JQuery, qty: number) => { - const existingQty = Number(row.getColumnValue(lang('qty_header'))) - const newQty = qty + existingQty - row.setColumnValue(lang('qty_header'), newQty) - calculateRowTotal(row) -} - const renderOrderBox = () => { - const orderBox = $('.orderBoxTable') - const tbody = orderBox.children('tbody') + const orderBox = getOrderBox() const newTbody = $('') OrderScreen.order_items.forEach(orderItem => { const newRow = createOrderRow(orderItem) newTbody.append(newRow) - newRow.pulse() + if(OrderScreen.selected_item_ids.includes(orderItem.id)){ - selectRow(newRow) + newRow.addClass('selected') + } + + if(OrderScreen.pulse_order_item_ids.includes(orderItem.id)){ + newRow.pulse() } }) - tbody.replaceWith(newTbody) - const element = orderBox.find('tbody tr').last().get()[0] - element.scrollIntoView() - OrderScreen.last_added_item = null - updateOrderBoxTotals() + orderBox.replaceWith(newTbody) + const element = newTbody.find('tr').last().get()[0] + if(element) { + element.scrollIntoView() + } + OrderScreen.last_added_item = null + updateOrderBoxTotals() } + const setOrderItems = (orderItems: orderItem[]) => { OrderScreen.order_items = orderItems renderOrderBox() @@ -271,10 +288,10 @@ const createOrderRow = (orderItem: orderItem) => { .setColumnValue(lang('price_header'), price) .setColumnValue(lang('id_header'), orderItem.item.id) .setColumnValue(lang('total_price_header'), price.multiply(orderItem.qty)) - .setColumnValue(lang('printgroup_header'), orderItem.print_group_id?.name) + .setColumnValue(lang('printgroup_header'), orderItem.print_group?.name) .data('order-item-id', orderItem.id) - .data('order-item-id', orderItem.id) - .data('print_group', orderItem.print_group_id) + .data('order-item', orderItem) + .data('print_group', orderItem.print_group) .data('cover', orderItem.cover) .data('item', orderItem.item) .find('td.itemCell') @@ -342,9 +359,10 @@ const gridHtmlGenerated = (gridData: {gridHtml:string, grid: grid}) => { const itemRowClicked = (e: JQuery.TriggeredEvent) => { const row = $(e.target).closest('tr') + const orderItem: orderItem = row.data('order-item') if(isInMode('void')){ - voidRows(row) + voidOrderItems([orderItem.id]) turnOffMode('void') return } @@ -355,25 +373,24 @@ const itemRowClicked = (e: JQuery.TriggeredEvent) => { } const selectRow = (row: JQuery) => { - row.addClass('selected') - const instructionRows = row.nextUntil('.itemRow') - - if(row.hasClass('itemRow') && instructionRows.length){ - instructionRows.each((index, row) => { - selectRow($(row)) - }) - } + const orderItem: orderItem = row.addClass('selected').data('order-item') + OrderScreen.selected_item_ids = array_push(OrderScreen.selected_item_ids, orderItem.id) } const deselectRow = (row: JQuery) => { row.removeClass('selected') const instructionRows = row.nextUntil('.itemRow') + const orderItemToDeselect: orderItem = row.data('order-item') + + OrderScreen.selected_item_ids = OrderScreen.selected_item_ids.filter(orderItemId => orderItemId != orderItemToDeselect.id) if(row.hasClass('itemRow') && instructionRows.length){ deselectRow(instructionRows) } } + + const deleteRow = (row: JQuery) => row.find('*:not(.hidden)').slideUp('fast', () => row.remove()) const voidInstructionRow = (row: JQuery) => { @@ -381,31 +398,25 @@ const voidInstructionRow = (row: JQuery) => { deleteRow(row) } -const voidItemRow = (row : JQuery) => decrementQty(row) - -const voidRow = (row: JQuery) => { - if(row.hasClass('itemRow')) voidItemRow(row) - else voidInstructionRow(row) +const voidOrderItems = (orderItemIds: number[]) => { + orderItemIds.forEach(orderItemId => { + decrementItemQty(OrderScreen.order_items.find(item => item.id == orderItemId)) + }) } -const voidRows = (rows: JQuery) => rows.each((index, row) => voidRow($(row))) - const voidButtonClicked = () => { - const selectedRows = $('.orderBox tr.selected') if(isInMode('void')){ turnOffMode('void') - } else if(selectedRows.length){ - voidRows(selectedRows) + } else if(OrderScreen.selected_item_ids.length){ + voidOrderItems(OrderScreen.selected_item_ids) } else { turnOnMode('void') } } const voidLastItem = () => { - const orderBox = $('.orderBoxTable tbody') - const allRows = orderBox.find('tr') - if(allRows.length < 1) return - voidRows(allRows.last()) + if (OrderScreen.order_items.length) + decrementItemQty(OrderScreen.order_items.last()) } const updateOrderBoxTotals = () => { diff --git a/typescript/types.ts b/typescript/types.ts index 9ef0149..362a223 100644 --- a/typescript/types.ts +++ b/typescript/types.ts @@ -10,7 +10,7 @@ interface order { interface orderItem { id: number qty: number - print_group_id: print_group + print_group: print_group item: item cover: number } @@ -108,4 +108,8 @@ type sales_category = { interface Array { where(property: string, value: any): T + first(): T + last(): T + unique(): this + collect(func: (item: T) => T[]): T[] } \ No newline at end of file From 0507fcff650fa01c8b1bc803e7d10903c34f3c2c Mon Sep 17 00:00:00 2001 From: dredgy <72254513+dredgy@users.noreply.github.com> Date: Mon, 25 Jul 2022 11:58:57 +1000 Subject: [PATCH 2/9] Adding instructions and items now complete --- package-lock.json | 656 ++++++++++++++-------------- tsconfig.json | 2 +- typescript/dredgepos.orderScreen.ts | 38 +- typescript/types.ts | 2 +- 4 files changed, 356 insertions(+), 342 deletions(-) diff --git a/package-lock.json b/package-lock.json index 664ff4a..d81530c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,28 +18,28 @@ } }, "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz", - "integrity": "sha512-4srsKPXWlIxp5Vbqz5uLfBN+du2fJChBoYn/f2h991WLdk7jUvcSk/McVLSv/X+xQIPI8eGD5GjrnygdyHnhPA==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", + "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", "dependencies": { - "detect-libc": "^1.0.3", + "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", "make-dir": "^3.1.0", - "node-fetch": "^2.6.1", + "node-fetch": "^2.6.7", "nopt": "^5.0.0", - "npmlog": "^4.1.2", + "npmlog": "^5.0.1", "rimraf": "^3.0.2", - "semver": "^7.3.4", - "tar": "^6.1.0" + "semver": "^7.3.5", + "tar": "^6.1.11" }, "bin": { "node-pre-gyp": "bin/node-pre-gyp" } }, "node_modules/@types/jquery": { - "version": "3.5.7", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.7.tgz", - "integrity": "sha512-Why+9t1KuqWtIqYKtbk6wgWbE1PjyXJOyGkpmTUh0RX5p4HL7nnRuBkjAO9P2r9tGQP6bLWxl77jRLew3V5xXg==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.14.tgz", + "integrity": "sha512-X1gtMRMbziVQkErhTQmSe2jFwwENA/Zr+PprCkF63vFq+Yt5PZ4AlKqgmeNlwgn7dhsXEK888eIW2520EpC+xg==", "dependencies": { "@types/sizzle": "*" } @@ -66,11 +66,11 @@ } }, "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/anymatch": { @@ -86,17 +86,20 @@ } }, "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, "node_modules/are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", "dependencies": { "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/balanced-match": { @@ -133,13 +136,13 @@ } }, "node_modules/canvas": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.8.0.tgz", - "integrity": "sha512-gLTi17X8WY9Cf5GZ2Yns8T5lfBOcGgFehDFb+JQwDqdOoBOcECS9ZWMEAqMSVcMYwXD659J8NyzjRY/2aE+C2Q==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.9.3.tgz", + "integrity": "sha512-WOUM7ghii5TV2rbhaZkh1youv/vW1/Canev6Yx6BG2W+1S07w8jKZqKkPnbiPpQEDsnJdN8ouDd7OvQEGXDcUw==", "hasInstallScript": true, "dependencies": { "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.14.0", + "nan": "^2.15.0", "simple-get": "^3.0.3" }, "engines": { @@ -147,9 +150,15 @@ } }, "node_modules/chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -174,28 +183,23 @@ "node": ">=10" } }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "engines": { - "node": ">=0.10.0" + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" } }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, "node_modules/currency.js": { "version": "2.0.4", @@ -206,9 +210,9 @@ } }, "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -235,19 +239,21 @@ "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", "engines": { - "node": ">=0.10" + "node": ">=8" } }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -273,7 +279,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.2", @@ -289,29 +295,33 @@ } }, "node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", "dependencies": { - "aproba": "^1.0.3", + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -336,12 +346,12 @@ "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dependencies": { "agent-base": "6", "debug": "4" @@ -350,10 +360,15 @@ "node": ">= 6" } }, + "node_modules/immutable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==" + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -378,20 +393,17 @@ "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dependencies": { - "number-is-nan": "^1.0.0" - }, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/is-glob": { @@ -413,15 +425,10 @@ "node": ">=0.12.0" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "node_modules/konva": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/konva/-/konva-8.2.2.tgz", - "integrity": "sha512-O6Ybw1V5x/PNX4Tc+h/U9LCuyoVZe+XaWc23XKxKs0xIbFyTkvdAJEsw3XQw+DsMDTO56UiTvspq5pfO75xEOg==", + "version": "8.3.10", + "resolved": "https://registry.npmjs.org/konva/-/konva-8.3.10.tgz", + "integrity": "sha512-5zOynjWBG9wWgpA634SDH+764eyoISpmHLTOCfQ3GFN8OBVd83Genk6H0R4D3hXV0kEGIFAv7RDcSVDtQpPOMw==", "funding": [ { "type": "patreon", @@ -482,9 +489,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -493,9 +500,9 @@ } }, "node_modules/minipass": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", - "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", + "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", "dependencies": { "yallist": "^4.0.0" }, @@ -532,9 +539,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", + "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==" }, "node_modules/node-fetch": { "version": "2.6.7", @@ -578,28 +585,20 @@ } }, "node_modules/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "engines": { - "node": ">=0.10.0" + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" } }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { "node": ">=0.10.0" } @@ -607,7 +606,7 @@ "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { "wrappy": "1" } @@ -615,15 +614,15 @@ "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "engines": { "node": ">=0.10.0" } }, "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { "node": ">=8.6" }, @@ -631,23 +630,17 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/readdirp": { @@ -676,28 +669,44 @@ } }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/sass": { - "version": "1.43.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.43.4.tgz", - "integrity": "sha512-/ptG7KE9lxpGSYiXn7Ar+lKOv37xfWsZRtFYal2QHNigyVQDx685VFT/h7ejVr+R8w7H4tmUgtulsKl5YpveOg==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.0.tgz", + "integrity": "sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { "sass": "sass.js" }, "engines": { - "node": ">=8.9.0" + "node": ">=12.0.0" } }, "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -711,12 +720,12 @@ "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "node_modules/signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/simple-concat": { "version": "1.0.1", @@ -747,36 +756,44 @@ "simple-concat": "^1.0.0" } }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, "node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/tar": { @@ -809,7 +826,7 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/tsc": { "version": "2.0.4", @@ -834,17 +851,17 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -861,7 +878,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/yallist": { "version": "4.0.0", @@ -871,25 +888,25 @@ }, "dependencies": { "@mapbox/node-pre-gyp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz", - "integrity": "sha512-4srsKPXWlIxp5Vbqz5uLfBN+du2fJChBoYn/f2h991WLdk7jUvcSk/McVLSv/X+xQIPI8eGD5GjrnygdyHnhPA==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", + "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", "requires": { - "detect-libc": "^1.0.3", + "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", "make-dir": "^3.1.0", - "node-fetch": "^2.6.1", + "node-fetch": "^2.6.7", "nopt": "^5.0.0", - "npmlog": "^4.1.2", + "npmlog": "^5.0.1", "rimraf": "^3.0.2", - "semver": "^7.3.4", - "tar": "^6.1.0" + "semver": "^7.3.5", + "tar": "^6.1.11" } }, "@types/jquery": { - "version": "3.5.7", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.7.tgz", - "integrity": "sha512-Why+9t1KuqWtIqYKtbk6wgWbE1PjyXJOyGkpmTUh0RX5p4HL7nnRuBkjAO9P2r9tGQP6bLWxl77jRLew3V5xXg==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.14.tgz", + "integrity": "sha512-X1gtMRMbziVQkErhTQmSe2jFwwENA/Zr+PprCkF63vFq+Yt5PZ4AlKqgmeNlwgn7dhsXEK888eIW2520EpC+xg==", "requires": { "@types/sizzle": "*" } @@ -913,9 +930,9 @@ } }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "anymatch": { "version": "3.1.2", @@ -927,17 +944,17 @@ } }, "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, "are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", "requires": { "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "readable-stream": "^3.6.0" } }, "balanced-match": { @@ -968,19 +985,19 @@ } }, "canvas": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.8.0.tgz", - "integrity": "sha512-gLTi17X8WY9Cf5GZ2Yns8T5lfBOcGgFehDFb+JQwDqdOoBOcECS9ZWMEAqMSVcMYwXD659J8NyzjRY/2aE+C2Q==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.9.3.tgz", + "integrity": "sha512-WOUM7ghii5TV2rbhaZkh1youv/vW1/Canev6Yx6BG2W+1S07w8jKZqKkPnbiPpQEDsnJdN8ouDd7OvQEGXDcUw==", "requires": { "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.14.0", + "nan": "^2.15.0", "simple-get": "^3.0.3" } }, "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -997,25 +1014,20 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, "currency.js": { "version": "2.0.4", @@ -1023,9 +1035,9 @@ "integrity": "sha512-6/OplJYgJ0RUlli74d93HJ/OsKVBi8lB1+Z6eJYS1YZzBuIp4qKKHpJ7ad+GvTlWmLR/hLJOWTykN5Nm8NJ7+w==" }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } @@ -1041,12 +1053,17 @@ "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "fill-range": { "version": "7.0.1", @@ -1067,7 +1084,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { "version": "2.3.2", @@ -1076,29 +1093,30 @@ "optional": true }, "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", "requires": { - "aproba": "^1.0.3", + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" } }, "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } @@ -1114,21 +1132,26 @@ "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "requires": { "agent-base": "6", "debug": "4" } }, + "immutable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "requires": { "once": "^1.3.0", "wrappy": "1" @@ -1150,15 +1173,12 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-glob": { "version": "4.0.3", @@ -1173,15 +1193,10 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "konva": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/konva/-/konva-8.2.2.tgz", - "integrity": "sha512-O6Ybw1V5x/PNX4Tc+h/U9LCuyoVZe+XaWc23XKxKs0xIbFyTkvdAJEsw3XQw+DsMDTO56UiTvspq5pfO75xEOg==" + "version": "8.3.10", + "resolved": "https://registry.npmjs.org/konva/-/konva-8.3.10.tgz", + "integrity": "sha512-5zOynjWBG9wWgpA634SDH+764eyoISpmHLTOCfQ3GFN8OBVd83Genk6H0R4D3hXV0kEGIFAv7RDcSVDtQpPOMw==" }, "lru-cache": { "version": "6.0.0", @@ -1212,17 +1227,17 @@ "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } }, "minipass": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", - "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", + "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", "requires": { "yallist": "^4.0.0" } @@ -1247,9 +1262,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", + "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==" }, "node-fetch": { "version": "2.6.7", @@ -1273,30 +1288,25 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "requires": { "wrappy": "1" } @@ -1304,30 +1314,21 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "readdirp": { @@ -1347,22 +1348,24 @@ } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "sass": { - "version": "1.43.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.43.4.tgz", - "integrity": "sha512-/ptG7KE9lxpGSYiXn7Ar+lKOv37xfWsZRtFYal2QHNigyVQDx685VFT/h7ejVr+R8w7H4tmUgtulsKl5YpveOg==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.0.tgz", + "integrity": "sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==", "requires": { - "chokidar": ">=3.0.0 <4.0.0" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "requires": { "lru-cache": "^6.0.0" } @@ -1370,12 +1373,12 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "simple-concat": { "version": "1.0.1", @@ -1392,30 +1395,35 @@ "simple-concat": "^1.0.0" } }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.1" } }, "tar": { @@ -1442,7 +1450,7 @@ "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "tsc": { "version": "2.0.4", @@ -1457,17 +1465,17 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -1484,7 +1492,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "yallist": { "version": "4.0.0", diff --git a/tsconfig.json b/tsconfig.json index ba2a254..adb2bab 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,7 +8,7 @@ "removeComments":false, "preserveConstEnums":true, "outDir":"wwwroot/scripts", - "target":"ES2016", + "target":"ESNext", "sourceMap":true, "moduleResolution": "node" }, diff --git a/typescript/dredgepos.orderScreen.ts b/typescript/dredgepos.orderScreen.ts index bbddb3a..603f2bb 100644 --- a/typescript/dredgepos.orderScreen.ts +++ b/typescript/dredgepos.orderScreen.ts @@ -7,34 +7,34 @@ type OrderScreenData = { type OrderScreen = { order_screen_pages: order_screen_page[] - last_added_item: orderItem order_items: orderItem[] sales_categories: sales_category[] print_groups: print_group[] order_item_id_generator: Generator selected_item_ids: number[] - pulse_order_item_ids: number[] + order_item_ids_to_pulse: number[] qty_override: number print_group_override: print_group custom_item: item, selected_cover: number table: floorplan_table, + last_added_item_ids: number[] } let OrderScreen : OrderScreen = { order_screen_pages: null, - last_added_item: null, order_items: [], print_groups: [], sales_categories: [], order_item_id_generator: newestId(), selected_item_ids: [], - pulse_order_item_ids: [], + order_item_ids_to_pulse: [], qty_override: 1, print_group_override: null, custom_item: null, selected_cover: 0, table: null, + last_added_item_ids: [], } const loadPageGroup = (e: Event) => { @@ -142,8 +142,8 @@ const deselectAllRows = () => { $('tr.selected').removeClass('selected') } -const addOrderItemsToPulse = (id: number) => OrderScreen.pulse_order_item_ids = array_push(OrderScreen.pulse_order_item_ids, id) -const removeOrderItemsToPulse = (id: number) => OrderScreen.pulse_order_item_ids = array_remove(OrderScreen.pulse_order_item_ids, id) +const addOrderItemsToPulse = (id: number) => OrderScreen.order_item_ids_to_pulse = array_push(OrderScreen.order_item_ids_to_pulse, id) +const removeOrderItemsToPulse = (id: number) => OrderScreen.order_item_ids_to_pulse = array_remove(OrderScreen.order_item_ids_to_pulse, id) const addItemToOrderBox = (newOrderItem:orderItem) => { const existingItems = OrderScreen.order_items @@ -154,8 +154,9 @@ const addItemToOrderBox = (newOrderItem:orderItem) => { ) if(existingItems.length > 0 && isInMode('accumulate')) { - incrementItemQty(existingItems[0]) addOrderItemsToPulse(existingItems[0].id) + incrementItemQty(existingItems[0]) + OrderScreen.last_added_item_ids = [existingItems[0].id] } else { addOrderItemsToPulse(newOrderItem.id) if(!OrderScreen.selected_item_ids.length) { @@ -165,15 +166,15 @@ const addItemToOrderBox = (newOrderItem:orderItem) => { const newItems = OrderScreen.order_items .collect(existingOrderItem => { - const firstSelectedItemId = getLastInstructionItem(OrderScreen.selected_item_ids.first())?.id + const firstSelectedItemId = getLastInstructionItem(OrderScreen.selected_item_ids.first()).id return firstSelectedItemId == existingOrderItem.id ? [existingOrderItem, newOrderItem] : [existingOrderItem] }) setOrderItems(newItems) } + OrderScreen.last_added_item_ids = [newOrderItem.id] } - deselectAllRows() } @@ -189,16 +190,19 @@ const getParentItem = (orderItemId: number) => { const getInstructionItems = (orderItemId: number) => { const itemIndex = OrderScreen.order_items.findIndex(orderItem => orderItem.id === orderItemId); - if(!OrderScreen.order_items[itemIndex+1] || OrderScreen.order_items[itemIndex+1].item.item_type == "item") return [OrderScreen.order_items[itemIndex]] - + const nextItem = OrderScreen.order_items - .filter((orderItem, index) => index > itemIndex && orderItem.item.item_type === 'item') - .first() + .filter((orderItem, index) => index > itemIndex && orderItem.item.item_type === 'item') + ?.first() + if(!nextItem) { + return OrderScreen.order_items.filter((orderItem, index) => index > itemIndex) + } const nextItemIndex = OrderScreen.order_items.findIndex(orderItem => orderItem.id === nextItem.id); return OrderScreen.order_items.slice(itemIndex, nextItemIndex) + } const getLastInstructionItem = (orderItemId: number) => getInstructionItems(orderItemId).last() @@ -206,10 +210,13 @@ const getLastInstructionItem = (orderItemId: number) => getInstructionItems(orde const addInstructionToOrderBox = (instruction: orderItem) => { //If no items are added, then you can't add an instruction row. if(!OrderScreen.order_items.length) return + const addAfter = OrderScreen.selected_item_ids.length ? OrderScreen.selected_item_ids.map(selectedItemId => getLastInstructionItem(selectedItemId).id).unique() - : [getLastInstructionItem(OrderScreen.order_items.last().id).id] + : OrderScreen.last_added_item_ids.map(itemId => getLastInstructionItem(itemId).id) + console.log(addAfter) + const newItems = OrderScreen.order_items.collect(existingItem => { const newInstruction = createNewOrderItem(instruction.item, instruction.qty, instruction.print_group) addOrderItemsToPulse(newInstruction.id) @@ -258,7 +265,7 @@ const renderOrderBox = () => { newRow.addClass('selected') } - if(OrderScreen.pulse_order_item_ids.includes(orderItem.id)){ + if(OrderScreen.order_item_ids_to_pulse.includes(orderItem.id)){ newRow.pulse() } }) @@ -268,7 +275,6 @@ const renderOrderBox = () => { if(element) { element.scrollIntoView() } - OrderScreen.last_added_item = null updateOrderBoxTotals() } diff --git a/typescript/types.ts b/typescript/types.ts index 362a223..a8a098a 100644 --- a/typescript/types.ts +++ b/typescript/types.ts @@ -111,5 +111,5 @@ interface Array { first(): T last(): T unique(): this - collect(func: (item: T) => T[]): T[] + collect(func: (item: T) => any[]): any[] } \ No newline at end of file From 983b7ae909e32fafbdf4efc520dd65ea0b26c2e8 Mon Sep 17 00:00:00 2001 From: dredgy <72254513+dredgy@users.noreply.github.com> Date: Mon, 25 Jul 2022 12:59:23 +1000 Subject: [PATCH 3/9] Void functions mostly working, pending testing. --- typescript/dredgepos.core.ts | 2 +- typescript/dredgepos.orderScreen.ts | 13 ++++++++----- typescript/types.ts | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/typescript/dredgepos.core.ts b/typescript/dredgepos.core.ts index 25fae76..8ba02b2 100644 --- a/typescript/dredgepos.core.ts +++ b/typescript/dredgepos.core.ts @@ -194,7 +194,7 @@ const pulseElement = (element: JQuery) => { .on('animationend', () => element.removeClass('pulse')) } -Array.prototype.collect = function(this: x[], func: (item: x) => x[]) { +Array.prototype.collect = function(this: x[], func: (item: x) => y[]) { return this.map(func).flat(1) } diff --git a/typescript/dredgepos.orderScreen.ts b/typescript/dredgepos.orderScreen.ts index 603f2bb..f81f0be 100644 --- a/typescript/dredgepos.orderScreen.ts +++ b/typescript/dredgepos.orderScreen.ts @@ -118,6 +118,7 @@ const goToNextPage = (e: JQuery.TriggeredEvent) => navigatePage(1, $(e.target)) const goToPrevPage = (e: JQuery.TriggeredEvent) => navigatePage(-1, $(e.target)) const setItemQty = (orderItem: orderItem, qty: number) => { + const instructionIds = getInstructionItems(orderItem.id).map(orderItem => orderItem.id) const newItems = qty > 0 ? OrderScreen.order_items.map(existingOrderItem => { if(existingOrderItem.id == orderItem.id){ @@ -125,13 +126,17 @@ const setItemQty = (orderItem: orderItem, qty: number) => { } return existingOrderItem }) - : array_remove(OrderScreen.order_items, orderItem) + : OrderScreen.order_items.filter(existingOrderItem => existingOrderItem.id != orderItem.id && !instructionIds.includes(existingOrderItem.id)) + if(qty < 1){ OrderScreen.selected_item_ids = array_remove(OrderScreen.selected_item_ids, orderItem.id) + const lastItem = newItems.filter(orderItem => orderItem.item.item_type == "item")?.last() + OrderScreen.last_added_item_ids = newItems.length > 0 ? [lastItem.id] : [] } - + setOrderItems(newItems) + } const incrementItemQty = (orderItem:orderItem) => setItemQty(orderItem, orderItem.qty+1) @@ -214,9 +219,7 @@ const addInstructionToOrderBox = (instruction: orderItem) => { const addAfter = OrderScreen.selected_item_ids.length ? OrderScreen.selected_item_ids.map(selectedItemId => getLastInstructionItem(selectedItemId).id).unique() : OrderScreen.last_added_item_ids.map(itemId => getLastInstructionItem(itemId).id) - - console.log(addAfter) - + const newItems = OrderScreen.order_items.collect(existingItem => { const newInstruction = createNewOrderItem(instruction.item, instruction.qty, instruction.print_group) addOrderItemsToPulse(newInstruction.id) diff --git a/typescript/types.ts b/typescript/types.ts index a8a098a..7129634 100644 --- a/typescript/types.ts +++ b/typescript/types.ts @@ -111,5 +111,5 @@ interface Array { first(): T last(): T unique(): this - collect(func: (item: T) => any[]): any[] + collect(func: (item: T) => y[]): y[] } \ No newline at end of file From 9fa1f7c88888f6e7d2a6c08f5658923ce04e767d Mon Sep 17 00:00:00 2001 From: dredgy <72254513+dredgy@users.noreply.github.com> Date: Mon, 25 Jul 2022 15:46:51 +1000 Subject: [PATCH 4/9] Void stuff not working still --- typescript/dredgepos.orderScreen.ts | 104 ++++++++++++---------------- 1 file changed, 46 insertions(+), 58 deletions(-) diff --git a/typescript/dredgepos.orderScreen.ts b/typescript/dredgepos.orderScreen.ts index f81f0be..3263719 100644 --- a/typescript/dredgepos.orderScreen.ts +++ b/typescript/dredgepos.orderScreen.ts @@ -117,30 +117,44 @@ const getOrderBox = () => $('.orderBoxTable tbody') const goToNextPage = (e: JQuery.TriggeredEvent) => navigatePage(1, $(e.target)) const goToPrevPage = (e: JQuery.TriggeredEvent) => navigatePage(-1, $(e.target)) +const voidInstructionRow = (instructionId: number) => { + OrderScreen.order_items = OrderScreen.order_items.filter(orderItem => orderItem.id != instructionId) + OrderScreen.selected_item_ids = array_remove(OrderScreen.selected_item_ids, instructionId) + renderOrderBox() +} + +const voidAllInstructions = (instructions: number[]) => instructions.forEach(voidInstructionRow) + const setItemQty = (orderItem: orderItem, qty: number) => { + if(!orderItem || !OrderScreen.order_items.find(existingItem => orderItem.id == existingItem.id)) return; + const instructionIds = getInstructionItems(orderItem.id).map(orderItem => orderItem.id) - const newItems = qty > 0 - ? OrderScreen.order_items.map(existingOrderItem => { + + if(qty < 1){ + const newItems = OrderScreen.order_items.filter(existingOrderItem => existingOrderItem.id != orderItem.id) + + OrderScreen.selected_item_ids = array_remove(OrderScreen.selected_item_ids, orderItem.id) + if(orderItem.item.item_type == "item") { + const lastItem = newItems.filter(orderItem => orderItem.item.item_type == "item")?.last() + OrderScreen.last_added_item_ids = newItems.length > 0 ? [lastItem.id] : [] + } + setOrderItems(newItems) + voidAllInstructions(instructionIds) + return; + } + + const newItems = OrderScreen.order_items.map(existingOrderItem => { if(existingOrderItem.id == orderItem.id){ existingOrderItem.qty = qty } return existingOrderItem }) - : OrderScreen.order_items.filter(existingOrderItem => existingOrderItem.id != orderItem.id && !instructionIds.includes(existingOrderItem.id)) - - if(qty < 1){ - OrderScreen.selected_item_ids = array_remove(OrderScreen.selected_item_ids, orderItem.id) - const lastItem = newItems.filter(orderItem => orderItem.item.item_type == "item")?.last() - OrderScreen.last_added_item_ids = newItems.length > 0 ? [lastItem.id] : [] - } - setOrderItems(newItems) - } -const incrementItemQty = (orderItem:orderItem) => setItemQty(orderItem, orderItem.qty+1) -const decrementItemQty = (orderItem:orderItem) => setItemQty(orderItem, orderItem.qty-1) +const incrementItemQty = (orderItem:orderItem) => setItemQty(orderItem, orderItem?.qty+1) +const decrementItemQty = (orderItem:orderItem) => setItemQty(orderItem, orderItem?.qty-1) const deselectAllRows = () => { OrderScreen.selected_item_ids = [] @@ -195,9 +209,13 @@ const getParentItem = (orderItemId: number) => { const getInstructionItems = (orderItemId: number) => { const itemIndex = OrderScreen.order_items.findIndex(orderItem => orderItem.id === orderItemId); - if(!OrderScreen.order_items[itemIndex+1] || OrderScreen.order_items[itemIndex+1].item.item_type == "item") + if(!OrderScreen.order_items[itemIndex+1] + || OrderScreen.order_items[itemIndex+1].item.item_type == "item" + || OrderScreen.order_items[itemIndex].item.item_type == "instruction" + ) return [OrderScreen.order_items[itemIndex]] - + + const nextItem = OrderScreen.order_items .filter((orderItem, index) => index > itemIndex && orderItem.item.item_type === 'item') @@ -376,40 +394,23 @@ const itemRowClicked = (e: JQuery.TriggeredEvent) => { return } - if(!row.hasClass('selected')) selectRow(row) - else deselectRow(row) - -} - -const selectRow = (row: JQuery) => { - const orderItem: orderItem = row.addClass('selected').data('order-item') - OrderScreen.selected_item_ids = array_push(OrderScreen.selected_item_ids, orderItem.id) -} - -const deselectRow = (row: JQuery) => { - row.removeClass('selected') - const instructionRows = row.nextUntil('.itemRow') - const orderItemToDeselect: orderItem = row.data('order-item') - - OrderScreen.selected_item_ids = OrderScreen.selected_item_ids.filter(orderItemId => orderItemId != orderItemToDeselect.id) - - if(row.hasClass('itemRow') && instructionRows.length){ - deselectRow(instructionRows) + if(!row.hasClass('selected')) { + OrderScreen.selected_item_ids = array_push(OrderScreen.selected_item_ids, orderItem.id) + getInstructionItems(orderItem.id).forEach(instruction => OrderScreen.selected_item_ids = array_push(OrderScreen.selected_item_ids, instruction.id)) } -} - - - -const deleteRow = (row: JQuery) => row.find('*:not(.hidden)').slideUp('fast', () => row.remove()) - -const voidInstructionRow = (row: JQuery) => { - if(!row.prevAll('.itemRow').first().hasClass('selected')) - deleteRow(row) + else { + OrderScreen.selected_item_ids = array_remove(OrderScreen.selected_item_ids, orderItem.id) + getInstructionItems(orderItem.id).forEach(instruction => OrderScreen.selected_item_ids = array_remove(OrderScreen.selected_item_ids, instruction.id)) + } + + renderOrderBox() } const voidOrderItems = (orderItemIds: number[]) => { orderItemIds.forEach(orderItemId => { - decrementItemQty(OrderScreen.order_items.find(item => item.id == orderItemId)) + const orderItemToVoid = OrderScreen.order_items.find(item => item.id == orderItemId) + if(orderItemToVoid) + decrementItemQty(orderItemToVoid) }) } @@ -457,19 +458,6 @@ const calculateRowTotal = (row: JQuery) => { row.setColumnValue(lang('total_price_header'), price.multiply(qty)) } -const decrementQty = (row: JQuery, qty=1) => { - const existingQty = getQty(row) - - if(existingQty <= 1){ - const childRows = row.nextUntil('.itemRow') - deleteRow(row) - deleteRow(childRows) - return - } - row.setColumnValue(lang('qty_header'), existingQty - qty) - calculateRowTotal(row) -} - const scrollToElement = (JQueryElement: JQuery) => { const element = JQueryElement.get()[0] const container = JQueryElement.closest('.orderBox').get()[0] @@ -600,7 +588,7 @@ const changeCoverNumberPrompt = () => const changeCoverNumberPromptSubmitted = (value: string) => updateCoverNumbers(Number(value)) const updateCoverNumbers = (covers: number) => { - let newTable = Object.assign({}, OrderScreen.table) + let newTable = clone(OrderScreen.table) newTable.default_covers = covers ajax('/order/updateCovers', newTable, 'post', coverNumbersUpdated, null, null) } From 76b7fdea6c629024131ff61f1fe76ba78b049cde Mon Sep 17 00:00:00 2001 From: dredgy <72254513+dredgy@users.noreply.github.com> Date: Tue, 26 Jul 2022 15:54:09 +1000 Subject: [PATCH 5/9] Void functionality complete --- typescript/dredgepos.orderScreen.ts | 34 ++++++++++++++--------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/typescript/dredgepos.orderScreen.ts b/typescript/dredgepos.orderScreen.ts index 3263719..8777c5c 100644 --- a/typescript/dredgepos.orderScreen.ts +++ b/typescript/dredgepos.orderScreen.ts @@ -116,14 +116,6 @@ const navigatePage = (direction: number, button: JQuery) => { const getOrderBox = () => $('.orderBoxTable tbody') const goToNextPage = (e: JQuery.TriggeredEvent) => navigatePage(1, $(e.target)) const goToPrevPage = (e: JQuery.TriggeredEvent) => navigatePage(-1, $(e.target)) - -const voidInstructionRow = (instructionId: number) => { - OrderScreen.order_items = OrderScreen.order_items.filter(orderItem => orderItem.id != instructionId) - OrderScreen.selected_item_ids = array_remove(OrderScreen.selected_item_ids, instructionId) - renderOrderBox() -} - -const voidAllInstructions = (instructions: number[]) => instructions.forEach(voidInstructionRow) const setItemQty = (orderItem: orderItem, qty: number) => { if(!orderItem || !OrderScreen.order_items.find(existingItem => orderItem.id == existingItem.id)) return; @@ -136,10 +128,9 @@ const setItemQty = (orderItem: orderItem, qty: number) => { OrderScreen.selected_item_ids = array_remove(OrderScreen.selected_item_ids, orderItem.id) if(orderItem.item.item_type == "item") { const lastItem = newItems.filter(orderItem => orderItem.item.item_type == "item")?.last() - OrderScreen.last_added_item_ids = newItems.length > 0 ? [lastItem.id] : [] + OrderScreen.last_added_item_ids = newItems.length > 0 && lastItem ? [lastItem.id] : [] } setOrderItems(newItems) - voidAllInstructions(instructionIds) return; } @@ -197,12 +188,12 @@ const addItemToOrderBox = (newOrderItem:orderItem) => { deselectAllRows() } -const getParentItem = (orderItemId: number) => { - const itemIndex = OrderScreen.order_items.findIndex(orderItem => orderItem.id === orderItemId); - if(OrderScreen.order_items[itemIndex].item.item_type == "item"){ - return OrderScreen.order_items[itemIndex] +const getParentItem = (orderItemId: number, itemList:orderItem[]) => { + const itemIndex = itemList.findIndex(orderItem => orderItem.id === orderItemId); + if(itemList[itemIndex].item.item_type == "item"){ + return itemList[itemIndex] } - return OrderScreen.order_items + return itemList .filter((orderItem, index) => index < itemIndex && orderItem.item.item_type === 'item') .last() } @@ -397,6 +388,7 @@ const itemRowClicked = (e: JQuery.TriggeredEvent) => { if(!row.hasClass('selected')) { OrderScreen.selected_item_ids = array_push(OrderScreen.selected_item_ids, orderItem.id) getInstructionItems(orderItem.id).forEach(instruction => OrderScreen.selected_item_ids = array_push(OrderScreen.selected_item_ids, instruction.id)) + OrderScreen.selected_item_ids = OrderScreen.selected_item_ids.unique() } else { OrderScreen.selected_item_ids = array_remove(OrderScreen.selected_item_ids, orderItem.id) @@ -407,10 +399,18 @@ const itemRowClicked = (e: JQuery.TriggeredEvent) => { } const voidOrderItems = (orderItemIds: number[]) => { + const originalOrderItemList = clone(OrderScreen.order_items) + const originalSelectedIds = clone(OrderScreen.selected_item_ids) orderItemIds.forEach(orderItemId => { const orderItemToVoid = OrderScreen.order_items.find(item => item.id == orderItemId) - if(orderItemToVoid) - decrementItemQty(orderItemToVoid) + if(orderItemToVoid) { + if(orderItemToVoid.item.item_type == "instruction") { + const parentItem = getParentItem(orderItemToVoid.id, originalOrderItemList) + if(originalSelectedIds.includes(parentItem.id) && parentItem.qty-1 < 1){ + decrementItemQty(orderItemToVoid) + } + } else decrementItemQty(orderItemToVoid) + } }) } From 334391eb38251332f421510b313a404efec85311 Mon Sep 17 00:00:00 2001 From: Josh Date: Sun, 31 Jul 2022 18:50:11 +1000 Subject: [PATCH 6/9] Corrected double stacking of instruction items --- typescript/dredgepos.orderScreen.ts | 33 +++++++++++++++++------------ 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/typescript/dredgepos.orderScreen.ts b/typescript/dredgepos.orderScreen.ts index 8777c5c..fec6d1c 100644 --- a/typescript/dredgepos.orderScreen.ts +++ b/typescript/dredgepos.orderScreen.ts @@ -116,15 +116,15 @@ const navigatePage = (direction: number, button: JQuery) => { const getOrderBox = () => $('.orderBoxTable tbody') const goToNextPage = (e: JQuery.TriggeredEvent) => navigatePage(1, $(e.target)) const goToPrevPage = (e: JQuery.TriggeredEvent) => navigatePage(-1, $(e.target)) - + const setItemQty = (orderItem: orderItem, qty: number) => { if(!orderItem || !OrderScreen.order_items.find(existingItem => orderItem.id == existingItem.id)) return; - + const instructionIds = getInstructionItems(orderItem.id).map(orderItem => orderItem.id) - + if(qty < 1){ const newItems = OrderScreen.order_items.filter(existingOrderItem => existingOrderItem.id != orderItem.id) - + OrderScreen.selected_item_ids = array_remove(OrderScreen.selected_item_ids, orderItem.id) if(orderItem.item.item_type == "item") { const lastItem = newItems.filter(orderItem => orderItem.item.item_type == "item")?.last() @@ -133,7 +133,7 @@ const setItemQty = (orderItem: orderItem, qty: number) => { setOrderItems(newItems) return; } - + const newItems = OrderScreen.order_items.map(existingOrderItem => { if(existingOrderItem.id == orderItem.id){ existingOrderItem.qty = qty @@ -200,13 +200,13 @@ const getParentItem = (orderItemId: number, itemList:orderItem[]) => { const getInstructionItems = (orderItemId: number) => { const itemIndex = OrderScreen.order_items.findIndex(orderItem => orderItem.id === orderItemId); - if(!OrderScreen.order_items[itemIndex+1] - || OrderScreen.order_items[itemIndex+1].item.item_type == "item" + if(!OrderScreen.order_items[itemIndex+1] + || OrderScreen.order_items[itemIndex+1].item.item_type == "item" || OrderScreen.order_items[itemIndex].item.item_type == "instruction" ) return [OrderScreen.order_items[itemIndex]] - - + + const nextItem = OrderScreen.order_items .filter((orderItem, index) => index > itemIndex && orderItem.item.item_type === 'item') @@ -224,11 +224,18 @@ const getLastInstructionItem = (orderItemId: number) => getInstructionItems(orde const addInstructionToOrderBox = (instruction: orderItem) => { //If no items are added, then you can't add an instruction row. if(!OrderScreen.order_items.length) return - + const addAfter = OrderScreen.selected_item_ids.length - ? OrderScreen.selected_item_ids.map(selectedItemId => getLastInstructionItem(selectedItemId).id).unique() + ? OrderScreen.selected_item_ids + .filter(selectedItemId => { + const orderItem = OrderScreen.order_items.find(orderItem => orderItem.id == selectedItemId) + const parentItem = getParentItem(selectedItemId, OrderScreen.order_items) + return !(orderItem.item.item_type == "instruction" && OrderScreen.selected_item_ids.includes(parentItem.id)) + }) + .map(selectedItemId => getLastInstructionItem(selectedItemId).id) + .unique() : OrderScreen.last_added_item_ids.map(itemId => getLastInstructionItem(itemId).id) - + const newItems = OrderScreen.order_items.collect(existingItem => { const newInstruction = createNewOrderItem(instruction.item, instruction.qty, instruction.print_group) addOrderItemsToPulse(newInstruction.id) @@ -394,7 +401,7 @@ const itemRowClicked = (e: JQuery.TriggeredEvent) => { OrderScreen.selected_item_ids = array_remove(OrderScreen.selected_item_ids, orderItem.id) getInstructionItems(orderItem.id).forEach(instruction => OrderScreen.selected_item_ids = array_remove(OrderScreen.selected_item_ids, instruction.id)) } - + renderOrderBox() } From 42e96b1769f102069728e8ea629bb35bf986c388 Mon Sep 17 00:00:00 2001 From: dredgy <72254513+dredgy@users.noreply.github.com> Date: Sun, 31 Jul 2022 22:16:08 +1000 Subject: [PATCH 7/9] Can now void individual instruction rows --- typescript/dredgepos.orderScreen.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/typescript/dredgepos.orderScreen.ts b/typescript/dredgepos.orderScreen.ts index fec6d1c..286002d 100644 --- a/typescript/dredgepos.orderScreen.ts +++ b/typescript/dredgepos.orderScreen.ts @@ -413,7 +413,7 @@ const voidOrderItems = (orderItemIds: number[]) => { if(orderItemToVoid) { if(orderItemToVoid.item.item_type == "instruction") { const parentItem = getParentItem(orderItemToVoid.id, originalOrderItemList) - if(originalSelectedIds.includes(parentItem.id) && parentItem.qty-1 < 1){ + if(originalSelectedIds.includes(parentItem.id) && parentItem.qty-1 < 1 || !originalSelectedIds.includes(parentItem.id)){ decrementItemQty(orderItemToVoid) } } else decrementItemQty(orderItemToVoid) @@ -629,4 +629,4 @@ $(() => { $('.coverSelector, .gridContainer').hide() if(OrderScreen.table) ajax(`/order/getOrderScreenData/${OrderScreen.table.table_number}`, null, 'get', setupOrderScreen, null, null) -}) \ No newline at end of file +}) From f824dd3bebd3815d1418c787465f6bb4e172d154 Mon Sep 17 00:00:00 2001 From: dredgy <72254513+dredgy@users.noreply.github.com> Date: Mon, 1 Aug 2022 09:59:53 +1000 Subject: [PATCH 8/9] Orderscreen fully reactive --- typescript/dredgepos.orderScreen.ts | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/typescript/dredgepos.orderScreen.ts b/typescript/dredgepos.orderScreen.ts index 286002d..8ae3b02 100644 --- a/typescript/dredgepos.orderScreen.ts +++ b/typescript/dredgepos.orderScreen.ts @@ -409,15 +409,13 @@ const voidOrderItems = (orderItemIds: number[]) => { const originalOrderItemList = clone(OrderScreen.order_items) const originalSelectedIds = clone(OrderScreen.selected_item_ids) orderItemIds.forEach(orderItemId => { - const orderItemToVoid = OrderScreen.order_items.find(item => item.id == orderItemId) - if(orderItemToVoid) { - if(orderItemToVoid.item.item_type == "instruction") { - const parentItem = getParentItem(orderItemToVoid.id, originalOrderItemList) - if(originalSelectedIds.includes(parentItem.id) && parentItem.qty-1 < 1 || !originalSelectedIds.includes(parentItem.id)){ - decrementItemQty(orderItemToVoid) - } - } else decrementItemQty(orderItemToVoid) - } + const orderItemToVoid = originalOrderItemList.find(item => item.id == orderItemId) + if(orderItemToVoid.item.item_type == "instruction") { + const parentItem = getParentItem(orderItemToVoid.id, originalOrderItemList) + if(originalSelectedIds.includes(parentItem.id) && parentItem.qty-1 < 1 || !originalSelectedIds.includes(parentItem.id)){ + decrementItemQty(orderItemToVoid) + } + } else decrementItemQty(orderItemToVoid) }) } From 5094bbaf2b455073ba84232b4ceb92e57e10ac8d Mon Sep 17 00:00:00 2001 From: dredgy <72254513+dredgy@users.noreply.github.com> Date: Mon, 1 Aug 2022 10:52:15 +1000 Subject: [PATCH 9/9] Order Screen is now Reactive --- typescript/dredgepos.orderScreen.ts | 38 ++++++++++++----------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/typescript/dredgepos.orderScreen.ts b/typescript/dredgepos.orderScreen.ts index 8ae3b02..02a6bb6 100644 --- a/typescript/dredgepos.orderScreen.ts +++ b/typescript/dredgepos.orderScreen.ts @@ -434,35 +434,27 @@ const voidLastItem = () => { decrementItemQty(OrderScreen.order_items.last()) } +const getSelectedTotals = () => + OrderScreen.selected_item_ids + .map(selectedId => OrderScreen.order_items.find(orderItem => orderItem.id == selectedId)) + .reduce((resultSoFar, currentOrderItem) => { + return resultSoFar.add(currentOrderItem.item.price1 * currentOrderItem.qty) + }, money(0)) + +const getTotals = () => + OrderScreen.order_items + .reduce((resultSoFar, currentOrderItem) => { + return resultSoFar.add(currentOrderItem.item.price1 * currentOrderItem.qty) + }, money(0)) + const updateOrderBoxTotals = () => { - const allRows = $('.orderBoxTable tbody tr') - const selectedRows = $('.orderBoxTable tbody tr.selected') - const completeTotal = lang('totalPrice', getTotalOfRows(allRows)) - const selectedTotal = lang('selectedPrice', getTotalOfRows(selectedRows)) + const completeTotal = lang('totalPrice', getTotals().format()) + const selectedTotal = lang('selectedPrice', getSelectedTotals().format()) $('.orderBoxTotal').text(completeTotal) $('.orderBoxSelectedTotal').text(selectedTotal) } -const getTotalOfRows = (rows: JQuery) => { - return money(rows - .find('td.totalPriceCell') - .get() - .map(cell => Number(cell.innerText)) - .filter(number => !isNaN(number)) - .reduce( (total, number) => total + number , 0), false) - .format() -} - -const getQty = (row: JQuery) => Number(row.getColumnValue(lang('qty_header'))) -const getUnitPrice = (row: JQuery) => moneyFromString(row.getColumnValue(lang('price_header'))) - -const calculateRowTotal = (row: JQuery) => { - let price = getUnitPrice(row) - let qty = getQty(row) - row.setColumnValue(lang('total_price_header'), price.multiply(qty)) -} - const scrollToElement = (JQueryElement: JQuery) => { const element = JQueryElement.get()[0] const container = JQueryElement.closest('.orderBox').get()[0]