From 05a1a71e6bfca62f8cc8f9d5f38a0ed16ee46d94 Mon Sep 17 00:00:00 2001 From: Josh Date: Sat, 26 Feb 2022 22:31:59 +1000 Subject: [PATCH 1/8] CSS background in quotes --- typescript/dredgepos.floorplan.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typescript/dredgepos.floorplan.ts b/typescript/dredgepos.floorplan.ts index 271ec0b..05d06c8 100644 --- a/typescript/dredgepos.floorplan.ts +++ b/typescript/dredgepos.floorplan.ts @@ -616,7 +616,7 @@ const setRoomBackground = (roomToLoad: room) => { const height = Floorplan.floorplanDiv.height() if(roomToLoad.background_image) { - Floorplan.floorplanDiv.css("background-image", `url(/images/rooms/${roomToLoad.background_image})`) + Floorplan.floorplanDiv.css("background-image", `url('/images/rooms/${roomToLoad.background_image}')`) Floorplan.floorplanDiv.css("background-size", `${width}px ${height}px`) } else { Floorplan.floorplanDiv.css("background-image", "none") From cc7d06e78b78387f45e2d0a0c00c511c7790ecd2 Mon Sep 17 00:00:00 2001 From: Josh Date: Sun, 27 Feb 2022 11:57:52 +1000 Subject: [PATCH 2/8] Change to background image loader --- typescript/dredgepos.floorplan.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typescript/dredgepos.floorplan.ts b/typescript/dredgepos.floorplan.ts index 05d06c8..834ffb5 100644 --- a/typescript/dredgepos.floorplan.ts +++ b/typescript/dredgepos.floorplan.ts @@ -615,7 +615,7 @@ const setRoomBackground = (roomToLoad: room) => { const width = Floorplan.floorplanDiv.width() const height = Floorplan.floorplanDiv.height() - if(roomToLoad.background_image) { + if(roomToLoad.background_image != "") { Floorplan.floorplanDiv.css("background-image", `url('/images/rooms/${roomToLoad.background_image}')`) Floorplan.floorplanDiv.css("background-size", `${width}px ${height}px`) } else { From a587423d3e8dc09052ac4c2c8ff31df800fc9721 Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 7 Mar 2022 21:36:38 +1000 Subject: [PATCH 3/8] view progression --- DredgePos.fsproj | 1 + Floorplan/View.fs | 4 +- Global/View.fs | 12 ++++- OrderScreen/Controller.fs | 2 +- OrderScreen/Model.fs | 2 +- OrderScreen/View.fs | 108 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 123 insertions(+), 6 deletions(-) create mode 100644 OrderScreen/View.fs diff --git a/DredgePos.fsproj b/DredgePos.fsproj index dfd31b3..a5df94d 100644 --- a/DredgePos.fsproj +++ b/DredgePos.fsproj @@ -36,6 +36,7 @@ + diff --git a/Floorplan/View.fs b/Floorplan/View.fs index 7dc3a7d..5e6d51f 100644 --- a/Floorplan/View.fs +++ b/Floorplan/View.fs @@ -8,9 +8,7 @@ open Giraffe.ViewEngine open DredgeFramework -let VisibleInMode (value: string list) = value |> jsonEncode |> (attr "data-visible-in-mode") -let InvisibleInMode (value: string list) = value |> jsonEncode |> (attr "data-invisible-in-mode") -let ActiveInMode (value: string) = value |> (attr "data-active-in-mode") + let pageContainer (clerk: clerk) roomMenu = diff --git a/Global/View.fs b/Global/View.fs index 543800d..fc7c93c 100644 --- a/Global/View.fs +++ b/Global/View.fs @@ -1,12 +1,18 @@ module DredgePos.Global.View -open Giraffe.ViewEngine open DredgeFramework +open Giraffe.ViewEngine let Value = attr "data-value" + +let VisibleInMode (value: string list) = value |> jsonEncode |> (attr "data-visible-in-mode") +let InvisibleInMode (value: string list) = value |> jsonEncode |> (attr "data-invisible-in-mode") +let ActiveInMode (value: string) = value |> (attr "data-active-in-mode") let innerText = str let lang key = language.get key |> str +let template = tag "template" + let scriptToHTML (scriptFile: string) = let scriptPath = $"/scripts/{scriptFile}" match FileExists ("wwwroot" + scriptPath) with @@ -89,6 +95,10 @@ let keyboards = [| alert |] +let posButton (extraClasses: string) attrs content = + let allAttrs = [_class $"posButton {extraClasses}"] |> List.append attrs + a allAttrs content + let HtmlPage pageTitle scripts styles tags content = html [] [ head [] [ diff --git a/OrderScreen/Controller.fs b/OrderScreen/Controller.fs index 803f170..77548fb 100644 --- a/OrderScreen/Controller.fs +++ b/OrderScreen/Controller.fs @@ -11,7 +11,7 @@ let getOrderScreenData (tableNumber: int) = order_screen_pages = Entity.GetAllInVenue sales_categories = Entity.GetAllInVenue print_groups = Entity.GetAllInVenue - custom_item = Entity.GetAllByColumn "item_code" "OPEN000" |> first + custom_item = Entity.GetAllByColumn "code" "OPEN000" |> first table = Floorplan.Model.getTable tableNumber |} |> ajaxSuccess diff --git a/OrderScreen/Model.fs b/OrderScreen/Model.fs index 36337bf..027eb7d 100644 --- a/OrderScreen/Model.fs +++ b/OrderScreen/Model.fs @@ -17,7 +17,7 @@ let getImageButtonData (button: button) = if button.primary_action = "item" then button.primary_action_value else button.secondary_action_value - let item = Entity.GetAllByColumn "item_code" itemCode + let item = Entity.GetAllByColumn "code" itemCode |> first let extraData = diff --git a/OrderScreen/View.fs b/OrderScreen/View.fs new file mode 100644 index 0000000..e5f66a7 --- /dev/null +++ b/OrderScreen/View.fs @@ -0,0 +1,108 @@ +module DredgePos.OrderScreen.View + +open DredgePos.Types +open DredgePos.Global.View +open DredgePos.Global.Controller +open Giraffe.ViewEngine +open language + +let pageContainer orderNumber (clerk: clerk) = + div [_id "pageContainer"] [ + div [_id "leftColumn"] [ + h1 [_class "tableHeading"] [str (string orderNumber)] + div [_class "tableInfo"] [ + (* Cover Change Button *) + posButton "" [] [str (getAndReplace "logged_in_as" [clerk.name])] + ] + div [_class "orderBox"] [ + table [_class "orderBoxTable"] [ + thead [] [ + tr [] [ + th [_class "orderBoxCell qtyCell"] [str (get "qty_header")] + th [_class "orderBoxCell itemIdCell"] [str (get "id_header")] + th [_class "orderBoxCell itemCell"] [str (get "item_header")] + th [_class "orderBoxCell unitPriceCell"] [str (get "price_header")] + th [_class "orderBoxCell totalPriceCell"] [str (get "total_price_header")] + th [_class "orderBoxCell printGroupCell"] [str (get "printgroup_header")] + ] + ] + tbody [] [] + ] + ] + div [_class "orderBoxInfo"] [ + span [_class "voidModeWarning"; VisibleInMode ["void"]] [str (get "void_mode")] + ] + div [_class "orderBoxFooter"] [ + span [_class "totalPrice"] [str (getAndReplace "totalPrice" ["0.00"])] + small [_class "selectedPrice"] [str (getAndReplace "selectedPrice" ["0.00"])] + + ] + ] + div [_id "rightColumn"] [ + div [_id "topHalf"] [ + div [_class "functionButtons"] [ + div [_class "printGroupButtons toggleGroup"] [ + input [_type "hidden"; _class "value"] + (* Sales category override buttons *) + ] + div [_class "functionColumn"] [ + posButton "accumulateButton" [ActiveInMode "accumulate"] [str (get "accumulate_function")] + posButton "showCoverSelectorButton" [] [str (get "select_covers")] + ] + div [_class "functionColumn"] [ + posButton "voidButton" [ActiveInMode "void"] [str (get "void")] + posButton "open_item_button" [] [str (get "custom_item_button")] + posButton "freetextButton" [] [str (get "freetext_button")] + posButton "numpadButton" [] [str (get "numpad_button")] + ] + div [_class "functionColumn"] [ + posButton "" [] ["pay_function" |> get |> str] + posButton "" [] ["print_function" |> get |> str] + ] + ] + div [_id "pageList"] [ + (* Category List *) + ] + div [_id "pageGroupContainer"] [ + (* Page Groups *) + ] + div [_class "pagNavigation"] [ + posButton "prevButton" [] ["prev_page" |> get |> str] + posButton "nextButton" [] ["next_page" |> get |> str] + ] + ] + ] + ] + (* Grid Container, Cover Selector *) + +let posButtonTemplate = + template [_id "posButtonTemplate"] [ + posButton "" [] [] + ] + +let gridContainer = + div [_class "gridContainer"] [ + div [_class "gridContainerHeader"] [ + span [] [] + div [_class "posButton closeGrid"] [str "×"] + ] + div [_class "gridContainerGrid"] [ + div [_class "pageGroup"] [] + ] + div [_class "pageNavigation"] [ + posButton "prevButton" [] ["prev_page" |> get |> str] + posButton "nextButton" [] ["next_page" |> get |> str] + ] + ] + +let coverSelector = + div [_class "coverSelector"] [] + +let index orderNumber clerk styles scripts tags = + [| + pageContainer orderNumber clerk + posButtonTemplate + gridContainer + coverSelector + |] + |> HtmlPage "Order" (GetScripts scripts) (GetStyles styles) (GetMetaTags tags) \ No newline at end of file From 100a772297b7a55ea2d7545e049d53ff0a42d07b Mon Sep 17 00:00:00 2001 From: Josh Date: Thu, 12 May 2022 20:03:39 +1000 Subject: [PATCH 4/8] Updates to Order Screen --- Global/Router.fs | 7 +++++++ Global/View.fs | 2 ++ OrderScreen/Controller.fs | 15 +++++++++++++++ OrderScreen/Model.fs | 1 - OrderScreen/Router.fs | 2 +- OrderScreen/View.fs | 24 +++++++++++++++--------- typescript/dredgepos.orderScreen.ts | 6 ++++-- 7 files changed, 44 insertions(+), 13 deletions(-) diff --git a/Global/Router.fs b/Global/Router.fs index 3330747..50842ca 100644 --- a/Global/Router.fs +++ b/Global/Router.fs @@ -8,4 +8,11 @@ let htmlViewWithContext func = func (snd ctx) |> htmlView ) + |> warbler + +let htmlViewWithContextAndId (id: int) func = + (fun ctx -> + func (snd ctx) id + |> htmlView + ) |> warbler \ No newline at end of file diff --git a/Global/View.fs b/Global/View.fs index fc7c93c..9a63587 100644 --- a/Global/View.fs +++ b/Global/View.fs @@ -1,9 +1,11 @@ module DredgePos.Global.View open DredgeFramework +open DredgePos.Types open Giraffe.ViewEngine let Value = attr "data-value" +let _table (value: floorplan_table) = value |> jsonEncode |> (attr "data-table") let VisibleInMode (value: string list) = value |> jsonEncode |> (attr "data-visible-in-mode") let InvisibleInMode (value: string list) = value |> jsonEncode |> (attr "data-invisible-in-mode") diff --git a/OrderScreen/Controller.fs b/OrderScreen/Controller.fs index 77548fb..fa4e713 100644 --- a/OrderScreen/Controller.fs +++ b/OrderScreen/Controller.fs @@ -3,6 +3,7 @@ open DredgePos open DredgeFramework open DredgePos.Types +open DredgePos.Global.Controller open Giraffe open Microsoft.AspNetCore.Http @@ -24,6 +25,20 @@ let loadGrid (gridId: int) = else ajaxSuccess {|grid=grid;gridHtml=gridHtml|} |> json +let loadOrderScreenView (ctx: HttpContext) (tableNumber: int) = + Authenticate.Model.RequireClerkAuthentication ctx + let currentClerk = Authenticate.Model.getCurrentClerk ctx + let styles = [|"dredgepos.orderScreen.css"|] |> addDefaultStyles + let scripts = [|"dredgepos.tables.js";"./external/currency.min.js";"dredgepos.orderScreen.js"; |] |> addDefaultScripts + let metaTags = [|"viewport", "user-scalable = no, initial-scale=0.8,maximum-scale=0.8 ,shrink-to-fit=yes"|] |> addDefaultMetaTags + + let orderScreenPageGroups = + Entity.GetAllInVenue + |> Array.filter (fun page_group -> page_group.id <> 0) + |> Array.sortBy (fun {order=order} -> order) + + View.index tableNumber styles scripts metaTags currentClerk orderScreenPageGroups + let loadOrderScreen (ctx: HttpContext) (tableNumber: int) : HttpHandler = Authenticate.Model.RequireClerkAuthentication ctx diff --git a/OrderScreen/Model.fs b/OrderScreen/Model.fs index 027eb7d..f7e59f8 100644 --- a/OrderScreen/Model.fs +++ b/OrderScreen/Model.fs @@ -128,7 +128,6 @@ let renderGrid (grid: grid) = let loadGrid gridId = renderGrid (Entity.GetById gridId) - let getPagesHTML (gridInfo: grid * order_screen_page_group) = let grid, pageGroup = gridInfo diff --git a/OrderScreen/Router.fs b/OrderScreen/Router.fs index 855b803..2038009 100644 --- a/OrderScreen/Router.fs +++ b/OrderScreen/Router.fs @@ -11,5 +11,5 @@ let router = router { getf "/getGridHtml/%i" Controller.loadGrid post "/updateCovers" (bindJson (fun table -> Entity.Update table |> Array.head |> DredgeFramework.ajaxSuccess |> json)) get "/" (warbler (fun ctx -> Controller.loadOrderScreen (snd ctx) 0)) - getf "/%i" (fun number -> (warbler (fun ctx -> Controller.loadOrderScreen (snd ctx) number))) + getf "/%i" (fun number -> (warbler (fun ctx -> htmlView <| Controller.loadOrderScreenView (snd ctx) number))) } \ No newline at end of file diff --git a/OrderScreen/View.fs b/OrderScreen/View.fs index e5f66a7..77a8ead 100644 --- a/OrderScreen/View.fs +++ b/OrderScreen/View.fs @@ -6,12 +6,14 @@ open DredgePos.Global.Controller open Giraffe.ViewEngine open language -let pageContainer orderNumber (clerk: clerk) = - div [_id "pageContainer"] [ +let coverSelector = div [_class "coverSelector"] [] + +let pageContainer floorplanTable (clerk: clerk) orderScreenPageGroups = + div [_id "pageContainer" ; _table floorplanTable] [ div [_id "leftColumn"] [ - h1 [_class "tableHeading"] [str (string orderNumber)] + h1 [_class "tableHeading"] [str (getAndReplace "active_table" [floorplanTable.table_number])] div [_class "tableInfo"] [ - (* Cover Change Button *) + coverSelector posButton "" [] [str (getAndReplace "logged_in_as" [clerk.name])] ] div [_class "orderBox"] [ @@ -61,7 +63,7 @@ let pageContainer orderNumber (clerk: clerk) = ] ] div [_id "pageList"] [ - (* Category List *) + yield! orderScreenPageGroups ] div [_id "pageGroupContainer"] [ (* Page Groups *) @@ -95,12 +97,16 @@ let gridContainer = ] ] -let coverSelector = - div [_class "coverSelector"] [] +let pageGroupButton (pageGroup: order_screen_page_group) = posButton "loadPageGroup" [] [str pageGroup.label] + +let index orderNumber styles scripts tags clerk (orderScreenPageGroups: order_screen_page_group[]) = + + let orderScreenPageGroupButtons = + orderScreenPageGroups + |> Array.map pageGroupButton -let index orderNumber clerk styles scripts tags = [| - pageContainer orderNumber clerk + pageContainer (DredgePos.Floorplan.Model.getTable orderNumber) clerk orderScreenPageGroupButtons posButtonTemplate gridContainer coverSelector diff --git a/typescript/dredgepos.orderScreen.ts b/typescript/dredgepos.orderScreen.ts index 34f6060..9c5a67c 100644 --- a/typescript/dredgepos.orderScreen.ts +++ b/typescript/dredgepos.orderScreen.ts @@ -59,7 +59,6 @@ const loadPageGroup = (e: Event) => { const setupOrderScreen = (data: OrderScreenData) => { - $('.coverSelector, .gridContainer').hide() OrderScreen.order_screen_pages = data.order_screen_pages OrderScreen.sales_categories = data.sales_categories @@ -426,6 +425,7 @@ const getTotalOfRows = (rows: JQuery) => { 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) @@ -600,5 +600,7 @@ const generateCoverSelector = () => { $(() => { OrderScreen.table = $('#pageContainer').data('table') || null - ajax('/order/getOrderScreenData/1', null, 'get', setupOrderScreen, null, null) + $('.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 420c6530e0d7ddfd60724fe09d7e441043a5f5d4 Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 29 Jun 2022 22:03:45 +1000 Subject: [PATCH 5/8] Lost source code, switching back to main branch --- OrderScreen/Controller.fs | 9 ++++++++- OrderScreen/Model.fs | 7 ++++--- OrderScreen/View.fs | 7 ++++++- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/OrderScreen/Controller.fs b/OrderScreen/Controller.fs index fa4e713..92a4b18 100644 --- a/OrderScreen/Controller.fs +++ b/OrderScreen/Controller.fs @@ -37,6 +37,13 @@ let loadOrderScreenView (ctx: HttpContext) (tableNumber: int) = |> Array.filter (fun page_group -> page_group.id <> 0) |> Array.sortBy (fun {order=order} -> order) +(* let grids = + Model.getAllPageGridsInVenue () + |> Array.map(fun (grid, page_group) -> + + ) + |>*) + View.index tableNumber styles scripts metaTags currentClerk orderScreenPageGroups let loadOrderScreen (ctx: HttpContext) (tableNumber: int) : HttpHandler = @@ -71,7 +78,7 @@ let loadOrderScreen (ctx: HttpContext) (tableNumber: int) : HttpHandler = |> joinWithNewLine let grids = - Model.getAllPageGrids () + Model.getAllPageGridsInVenue () |> Array.map Model.getPagesHTML |> joinWithNewLine diff --git a/OrderScreen/Model.fs b/OrderScreen/Model.fs index f7e59f8..646e8ce 100644 --- a/OrderScreen/Model.fs +++ b/OrderScreen/Model.fs @@ -8,9 +8,10 @@ open Thoth.Json.Net open Theme -let getAllPageGrids () = Entity.GetAllInVenue - |> Array.filter(fun pageGroup -> pageGroup.grid_id <> 0) - |> Array.map(fun pageGroup -> (Entity.GetById pageGroup.grid_id), pageGroup) +let getAllPageGridsInVenue () = + Entity.GetAllInVenue + |> Array.filter(fun pageGroup -> pageGroup.grid_id <> 0) + |> Array.map(fun pageGroup -> (Entity.GetById pageGroup.grid_id), pageGroup) let getImageButtonData (button: button) = let itemCode = diff --git a/OrderScreen/View.fs b/OrderScreen/View.fs index 77a8ead..f742acd 100644 --- a/OrderScreen/View.fs +++ b/OrderScreen/View.fs @@ -66,7 +66,7 @@ let pageContainer floorplanTable (clerk: clerk) orderScreenPageGroups = yield! orderScreenPageGroups ] div [_id "pageGroupContainer"] [ - (* Page Groups *) + ] div [_class "pagNavigation"] [ posButton "prevButton" [] ["prev_page" |> get |> str] @@ -99,6 +99,11 @@ let gridContainer = let pageGroupButton (pageGroup: order_screen_page_group) = posButton "loadPageGroup" [] [str pageGroup.label] +let pageGroup grids = + div [_class "pageGroup"] [ + yield! grids + ] + let index orderNumber styles scripts tags clerk (orderScreenPageGroups: order_screen_page_group[]) = let orderScreenPageGroupButtons = From 5e78701b0b20baa34861664b3b9c66d48b95ab18 Mon Sep 17 00:00:00 2001 From: Josh Date: Thu, 30 Jun 2022 23:43:16 +1000 Subject: [PATCH 6/8] Buttons now render entirely in Giraffe --- Migrations/PopulateTestData.fs | 2 +- OrderScreen/Controller.fs | 40 ++++++++++++--- OrderScreen/View.fs | 76 +++++++++++++++++++++-------- typescript/dredgepos.orderScreen.ts | 1 - 4 files changed, 90 insertions(+), 29 deletions(-) diff --git a/Migrations/PopulateTestData.fs b/Migrations/PopulateTestData.fs index 7d11b33..0567f7c 100644 --- a/Migrations/PopulateTestData.fs +++ b/Migrations/PopulateTestData.fs @@ -310,7 +310,7 @@ let CreateItemFromFileName (index: int) (dirName: string) (file: string) = | "beer" | "dessert" -> "doubleHeight" | "mains" | "wine" | "steak temperatures" -> "doubleHeight doubleWidth" | "entrees" -> "doubleWidth" - | _ -> "" + | _ -> "normal" Entity.Create { id=0 diff --git a/OrderScreen/Controller.fs b/OrderScreen/Controller.fs index 92a4b18..0abd6f3 100644 --- a/OrderScreen/Controller.fs +++ b/OrderScreen/Controller.fs @@ -4,8 +4,10 @@ open DredgePos open DredgeFramework open DredgePos.Types open DredgePos.Global.Controller +open Thoth.Json.Net open Giraffe open Microsoft.AspNetCore.Http +open FSharp.Collections let getOrderScreenData (tableNumber: int) = {| @@ -25,6 +27,24 @@ let loadGrid (gridId: int) = else ajaxSuccess {|grid=grid;gridHtml=gridHtml|} |> json + +let renderGrid (grid: grid) = + let gridData = grid.data |> Decode.Auto.fromString> + match gridData with + | Error message -> failwith message + | Ok data -> + data + |> Map.toArray + |> Array.map snd + |> Array.map( + fun buttonIds -> + buttonIds + |> Array.map Entity.GetById