From 39dbba45f757444fa969553bf5dc4255d7840a8f Mon Sep 17 00:00:00 2001 From: Josh Date: Sun, 13 Feb 2022 19:33:50 +1000 Subject: [PATCH 1/2] Separated models, controllers and routers --- Ajax/Controller.fs | 15 ++++ Ajax/Router.fs | 14 +++ Authenticate/Controller.fs | 17 ++++ Session.module.fs => Authenticate/Model.fs | 28 ++++-- Authenticate/Router.fs | 18 ++++ Clerk.module.fs | 37 -------- Browser.module.fs => Core/Browser.module.fs | 0 Database.module.fs => Core/Database.module.fs | 0 .../DredgeFramework.module.fs | 0 .../GenericEntities.module.fs | 0 Language.module.fs => Core/Language.module.fs | 0 Theme.module.fs => Core/Theme.module.fs | 0 Types.fs => Core/Types.fs | 0 Decorations.module.fs | 48 ---------- DredgePos.fsproj | 40 +++++---- Entities/Floorplan_Decorations/Controller.fs | 27 ++++++ Entities/Floorplan_Decorations/Model.fs | 24 +++++ Entities/Floorplan_Decorations/Router.fs | 2 + AjaxController.fs => Floorplan/Controller.fs | 89 +++++++------------ Floorplan.module.fs => Floorplan/Model.fs | 17 +--- Floorplan/Router.fs | 24 +++++ .../Controller.fs | 83 +++++++---------- OrderScreen.module.fs => OrderScreen/Model.fs | 5 +- OrderScreen/Router.fs | 15 ++++ Orders.module.fs | 3 - Program.fs | 63 ++----------- Reservations/Controller.fs | 29 ++++++ .../Model.fs | 13 +-- Reservations/Router.fs | 13 +++ wwwroot/scripts/ts/dredgepos.authenticate.ts | 4 +- wwwroot/scripts/ts/dredgepos.floorplan.ts | 30 +++---- wwwroot/scripts/ts/dredgepos.orderScreen.ts | 6 +- .../themes/restaurant/decoratorItem.tpl.htm | 2 +- 33 files changed, 338 insertions(+), 328 deletions(-) create mode 100644 Ajax/Controller.fs create mode 100644 Ajax/Router.fs create mode 100644 Authenticate/Controller.fs rename Session.module.fs => Authenticate/Model.fs (86%) create mode 100644 Authenticate/Router.fs delete mode 100644 Clerk.module.fs rename Browser.module.fs => Core/Browser.module.fs (100%) rename Database.module.fs => Core/Database.module.fs (100%) rename DredgeFramework.module.fs => Core/DredgeFramework.module.fs (100%) rename GenericEntities.module.fs => Core/GenericEntities.module.fs (100%) rename Language.module.fs => Core/Language.module.fs (100%) rename Theme.module.fs => Core/Theme.module.fs (100%) rename Types.fs => Core/Types.fs (100%) delete mode 100644 Decorations.module.fs create mode 100644 Entities/Floorplan_Decorations/Controller.fs create mode 100644 Entities/Floorplan_Decorations/Model.fs create mode 100644 Entities/Floorplan_Decorations/Router.fs rename AjaxController.fs => Floorplan/Controller.fs (53%) rename Floorplan.module.fs => Floorplan/Model.fs (96%) create mode 100644 Floorplan/Router.fs rename PageController.fs => OrderScreen/Controller.fs (56%) rename OrderScreen.module.fs => OrderScreen/Model.fs (99%) create mode 100644 OrderScreen/Router.fs delete mode 100644 Orders.module.fs create mode 100644 Reservations/Controller.fs rename Reservations.module.fs => Reservations/Model.fs (61%) create mode 100644 Reservations/Router.fs diff --git a/Ajax/Controller.fs b/Ajax/Controller.fs new file mode 100644 index 0000000..ae0694c --- /dev/null +++ b/Ajax/Controller.fs @@ -0,0 +1,15 @@ +module DredgePos.Ajax.Controller + +open DredgeFramework +open language +open Giraffe + +let getLanguageVars = ajaxSuccess languageVars + +let getKeyboardLayout (language: string) = + let layout = $"""wwwroot/languages/{language}/keyboardLayout.json""" + |> GetFileContents + map [ + "status", "success" + "data", layout + ] |> json \ No newline at end of file diff --git a/Ajax/Router.fs b/Ajax/Router.fs new file mode 100644 index 0000000..a6313a5 --- /dev/null +++ b/Ajax/Router.fs @@ -0,0 +1,14 @@ +module DredgePos.Ajax.Router + +open Saturn +open Giraffe + +let pipeline = pipeline { + use_warbler +} + +let router = router { + getf "/getKeyboardLayout/%s" Controller.getKeyboardLayout + get "/languageVars" (json Controller.getLanguageVars) +} + diff --git a/Authenticate/Controller.fs b/Authenticate/Controller.fs new file mode 100644 index 0000000..af3a866 --- /dev/null +++ b/Authenticate/Controller.fs @@ -0,0 +1,17 @@ +module DredgePos.Authenticate.Controller + +open Giraffe +open DredgeFramework +open Microsoft.AspNetCore.Http + +let loadAuthenticatePage (): HttpHandler = + let variables = map ["title", "Log In"] + let scripts = ["dredgepos.authenticate.js"] + let styles = ["dredgepos.authenticate.css"] + + Theme.loadTemplateWithVarsScriptsAndStyles "authenticate" variables scripts styles + |> htmlString + +let loginWithLoginCode (context: HttpContext) (login_code: int) = + if Model.clerkLogin login_code context then ajaxSuccess "success" + else ajaxFail "fail" \ No newline at end of file diff --git a/Session.module.fs b/Authenticate/Model.fs similarity index 86% rename from Session.module.fs rename to Authenticate/Model.fs index 4395769..ddd65aa 100644 --- a/Session.module.fs +++ b/Authenticate/Model.fs @@ -1,13 +1,27 @@ -module Session +module DredgePos.Authenticate.Model open System open DredgeFramework open Dapper.FSharp -open Clerk open DredgePos open Thoth.Json.Net open Types +let getClerkByLoginCode (loginCode: int) = + let clerk = + select { + table "clerks" + where (eq "clerk_login_code" loginCode) + take 1 + } + |> db.Select + |> EnumerableToArray + + if (clerk |> length) > 0 then + Some (first clerk) + else + None + let deleteSession sessionId context = delete { table "sessions" @@ -65,12 +79,10 @@ let sessionExists (sessionId: string) context = let checkAuthentication clerk = let existingClerk = getClerkByLoginCode clerk.clerk_login_code - if existingClerk.IsSome - && existingClerk.Value.id = clerk.id - && existingClerk.Value.clerk_name = clerk.clerk_name - && existingClerk.Value.clerk_login_code = clerk.clerk_login_code - then true - else false + existingClerk.IsSome + && existingClerk.Value.id = clerk.id + && existingClerk.Value.clerk_name = clerk.clerk_name + && existingClerk.Value.clerk_login_code = clerk.clerk_login_code let getLoginCookie context = Browser.getCookie "dredgepos_clerk_logged_in" context diff --git a/Authenticate/Router.fs b/Authenticate/Router.fs new file mode 100644 index 0000000..3152206 --- /dev/null +++ b/Authenticate/Router.fs @@ -0,0 +1,18 @@ +module DredgePos.Authenticate.Router + +open Saturn +open Giraffe + +let homepage = (warbler (fun _ -> Controller.loadAuthenticatePage() )) +let handlePostRoute<'a> handlerFunction post next ctx = json (handlerFunction ctx post) next ctx + +let pipeline = pipeline{ + use_warbler +} + +let router = router { + pipe_through pipeline + get "/" homepage + get "" homepage + post "/authenticateClerk" (bindJson (handlePostRoute Controller.loginWithLoginCode) ) +} \ No newline at end of file diff --git a/Clerk.module.fs b/Clerk.module.fs deleted file mode 100644 index ba5d9e4..0000000 --- a/Clerk.module.fs +++ /dev/null @@ -1,37 +0,0 @@ -module Clerk - -open Dapper.FSharp -open DredgeFramework -open DredgePos -open Thoth.Json.Net -open Types - -let mutable loginCookie = "" - -let clerk_decoder : Decoder = - Decode.object - (fun get -> - { - id = get.Required.Field "clerk_id" Decode.int - clerk_name = get.Required.Field "clerk_name" Decode.string - clerk_login_code = get.Required.Field "clerk_login_code" Decode.int - clerk_usergroup = get.Required.Field "clerk_usergroup" Decode.int - }) - - -type user = {clerk_name:string} - -let getClerkByLoginCode (loginCode: int) = - let clerk = - select { - table "clerks" - where (eq "clerk_login_code" loginCode) - take 1 - } - |> db.Select - |> EnumerableToArray - - if (clerk |> length) > 0 then - Some (first clerk) - else - None \ No newline at end of file diff --git a/Browser.module.fs b/Core/Browser.module.fs similarity index 100% rename from Browser.module.fs rename to Core/Browser.module.fs diff --git a/Database.module.fs b/Core/Database.module.fs similarity index 100% rename from Database.module.fs rename to Core/Database.module.fs diff --git a/DredgeFramework.module.fs b/Core/DredgeFramework.module.fs similarity index 100% rename from DredgeFramework.module.fs rename to Core/DredgeFramework.module.fs diff --git a/GenericEntities.module.fs b/Core/GenericEntities.module.fs similarity index 100% rename from GenericEntities.module.fs rename to Core/GenericEntities.module.fs diff --git a/Language.module.fs b/Core/Language.module.fs similarity index 100% rename from Language.module.fs rename to Core/Language.module.fs diff --git a/Theme.module.fs b/Core/Theme.module.fs similarity index 100% rename from Theme.module.fs rename to Core/Theme.module.fs diff --git a/Types.fs b/Core/Types.fs similarity index 100% rename from Types.fs rename to Core/Types.fs diff --git a/Decorations.module.fs b/Decorations.module.fs deleted file mode 100644 index a401e14..0000000 --- a/Decorations.module.fs +++ /dev/null @@ -1,48 +0,0 @@ -module Decorations - -open System -open System.IO -open System.Text.RegularExpressions -open DredgeFramework -open Dapper.FSharp -open DredgePos -open Types - -let decorationsInRoom (roomId: int) = Entity.GetAllByColumn "decoration_room" roomId - -let getImageName (image: string, path: string) = - let imageName = - image - |> StringReplace "-" " " - |> StringReplace "_" " " - |> ToTitleCase - - imageName, path - -let isImageFile (fileName: string) = Regex.IsMatch(fileName |> ToLowerCase, @"^.+\.(jpg|jpeg|png|gif)$") - -let getImageHTML (imageName: string, imageUrl: string) = - let vars = map [ - "image_name", imageName - "image_url", imageUrl - ] - Theme.loadTemplateWithVars "decoratorItem" vars - -let GetFileNameWithoutExtension (path: string) = - let name = Path.GetFileNameWithoutExtension path - name, path |> Path.GetFileName - -let getImageRowHtml (imagesInRow: string[]) = - let vars = map ["decorations", String.Join("", imagesInRow)] - Theme.loadTemplateWithVars "decoratorRow" vars - -let generateDecorator () = - "wwwroot/images/decorations" - |> Directory.GetFiles - |> Array.filter isImageFile - |> Array.map GetFileNameWithoutExtension - |> Array.map getImageName - |> Array.map getImageHTML - |> Array.chunkBySize 4 - |> Array.map getImageRowHtml - |> JoinArray "" \ No newline at end of file diff --git a/DredgePos.fsproj b/DredgePos.fsproj index a447edc..bb0d3b8 100644 --- a/DredgePos.fsproj +++ b/DredgePos.fsproj @@ -5,23 +5,31 @@ - - - - - - - - - + + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/Entities/Floorplan_Decorations/Controller.fs b/Entities/Floorplan_Decorations/Controller.fs new file mode 100644 index 0000000..b45fa65 --- /dev/null +++ b/Entities/Floorplan_Decorations/Controller.fs @@ -0,0 +1,27 @@ +module DredgePos.Entities.Floorplan_Decorations.Controller + +open DredgeFramework +open System +open System.IO + +let getImageHTML (imageName: string, imageUrl: string) = + let vars = map [ + "image_name", imageName + "image_url", imageUrl + ] + Theme.loadTemplateWithVars "decoratorItem" vars + +let getImageRowHtml (imagesInRow: string[]) = + let vars = map ["decorations", String.Join("", imagesInRow)] + Theme.loadTemplateWithVars "decoratorRow" vars + +let generateDecorator () = + "wwwroot/images/decorations" + |> Directory.GetFiles + |> Array.filter Model.isImageFile + |> Array.map Model.GetFileNameWithoutExtension + |> Array.map Model.getImageName + |> Array.map getImageHTML + |> Array.chunkBySize 4 + |> Array.map getImageRowHtml + |> JoinArray "" \ No newline at end of file diff --git a/Entities/Floorplan_Decorations/Model.fs b/Entities/Floorplan_Decorations/Model.fs new file mode 100644 index 0000000..39160a8 --- /dev/null +++ b/Entities/Floorplan_Decorations/Model.fs @@ -0,0 +1,24 @@ +module DredgePos.Entities.Floorplan_Decorations.Model + +open System +open System.IO +open System.Text.RegularExpressions +open DredgeFramework + +let decorationsInRoom (roomId: int) = Entity.GetAllByColumn "decoration_room" roomId + +let getImageName (image: string, path: string) = + let imageName = + image + |> StringReplace "-" " " + |> StringReplace "_" " " + |> ToTitleCase + + imageName, path + +let isImageFile (fileName: string) = Regex.IsMatch(fileName |> ToLowerCase, @"^.+\.(jpg|jpeg|png|gif)$") + +let GetFileNameWithoutExtension (path: string) = + let name = Path.GetFileNameWithoutExtension path + name, path |> Path.GetFileName + diff --git a/Entities/Floorplan_Decorations/Router.fs b/Entities/Floorplan_Decorations/Router.fs new file mode 100644 index 0000000..87f6178 --- /dev/null +++ b/Entities/Floorplan_Decorations/Router.fs @@ -0,0 +1,2 @@ +module DredgePos.Entities.Floorplan_Decorations.Router + diff --git a/AjaxController.fs b/Floorplan/Controller.fs similarity index 53% rename from AjaxController.fs rename to Floorplan/Controller.fs index 205f026..9c79ee1 100644 --- a/AjaxController.fs +++ b/Floorplan/Controller.fs @@ -1,22 +1,21 @@ -module AjaxController +module DredgePos.Floorplan.Controller open DredgeFramework open DredgePos open DredgePos.Types -open Floorplan -open Microsoft.AspNetCore.Http -open Reservations -open language open Giraffe -open Types +open Microsoft.AspNetCore.Http +open Model -let loginWithLoginCode (context: HttpContext) (login_code: int) = - if Session.clerkLogin login_code context then ajaxSuccess "success" - else ajaxFail "fail" +let makeRoomButton (room: floorplan_room) = + let vars = map [ + "roomId", room.id |> string + "roomName", room.room_name + ] -let getLanguageVars = ajaxSuccess languageVars + Theme.loadTemplateWithVars "roomButton" vars -let getActiveTables venue = Floorplan.getActiveTables venue |> ajaxSuccess |> json +let getActiveTables venue = Model.getActiveTables venue |> ajaxSuccess |> json let mergeTables (tables: floorplan_table[]) = let status = @@ -24,14 +23,14 @@ let mergeTables (tables: floorplan_table[]) = let outputTables = map [ "parent", tables[0]; "child", tables[1]; - "merged", getTable tables[0].table_number; + "merged", Model.getTable tables[0].table_number; ] ajaxSuccess outputTables else ajaxFail "Could Not Merge Tables" status |> json let unmergeTable tableNumber = - let unmerged = Floorplan.unmergeTable tableNumber + let unmerged = unmergeTable tableNumber let unmergedTables = match unmerged with | Some (parent, child) -> @@ -47,32 +46,13 @@ let getFloorplanData (id: int) = {| tables = tableList decorations = Entity.GetAllInVenue - activeTableNumbers = Floorplan.getActiveTables (getCurrentVenue()) + activeTableNumbers = Model.getActiveTables (getCurrentVenue()) rooms = Entity.GetAllInVenue reservations = reservationList |} |> ajaxSuccess |> json -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 - table = getTable tableNumber - |} - |> ajaxSuccess - |> json - -let getKeyboardLayout (language: string) = - let layout = $"""wwwroot/languages/{language}/keyboardLayout.json""" - |> GetFileContents - map [ - "status", "success" - "data", layout - ] |> json - let transformTable (table: floorplan_table) = Entity.Update table |> ajaxSuccess @@ -90,7 +70,7 @@ let deleteTable (table: floorplan_table) = table |> ajaxSuccess |> json let transferTable (origin, destination) = - Floorplan.transferTable origin destination + Model.transferTable origin destination let data = map ["origin", getTable origin ; "destination", getTable destination] ajaxSuccess data |> json @@ -125,32 +105,23 @@ let DeleteDecoration (decorationToDelete: floorplan_decoration) = |> ajaxSuccess |> json -let newEmptyReservation (reservation: reservation) = - let newReservation = {reservation with - created_at = CurrentTime() - time = CurrentTime() - } +let loadFloorplan (ctx: HttpContext) : HttpHandler = + Authenticate.Model.RequireClerkAuthentication ctx - if reservation.floorplan_table_id > 0 then - let table = {(getTableById reservation.floorplan_table_id) with - status = 2 - default_covers = reservation.covers} - updateTablePosition table |> ignore + let roomMenu = + Entity.GetAllInVenue + |> Array.map makeRoomButton + |> joinWithNewLine - let createdReservation = Floorplan.createEmptyReservation newReservation - ajaxSuccess createdReservation |> json + let variables = map [ + "title", "Floorplan" + "roomMenu", roomMenu + "decorator", Entities.Floorplan_Decorations.Controller.generateDecorator() + ] + let styles = ["dredgepos.floorplan.css"] + let scripts = ["../external/konva.min.js" ; "dredgepos.floorplan.js"] + let currentClerk = recordToMap <| Authenticate.Model.getCurrentClerk ctx -let updateReservation (reservation: reservation) = updateReservation reservation |> ajaxSuccess |> json + let arrays = map ["clerk", currentClerk] -let unreserveTable (table: floorplan_table) = - let newTable = {table with status = 0} - updateTablePosition newTable |> ignore - DeleteReservation newTable.id - newTable |> ajaxSuccess |> json - -let loadGrid (gridId: int) = - let grid = Entity.GetById gridId - let gridHtml = OrderScreen.loadGrid gridId - if gridHtml = "Error" then ajaxFail gridHtml - else ajaxSuccess {|grid=grid;gridHtml=gridHtml|} - |> json \ No newline at end of file + htmlString <| Theme.loadTemplateWithVarsArraysScriptsAndStyles "floorplan" variables arrays scripts styles diff --git a/Floorplan.module.fs b/Floorplan/Model.fs similarity index 96% rename from Floorplan.module.fs rename to Floorplan/Model.fs index e04be62..b54081e 100644 --- a/Floorplan.module.fs +++ b/Floorplan/Model.fs @@ -1,19 +1,12 @@ -module Floorplan +module DredgePos.Floorplan.Model -open DredgePos open DredgePos.Types -open Org.BouncyCastle.Asn1.X509 -open Reservations - open System open System.IO open System.Xml.Linq open DredgeFramework -open Dapper open Dapper.FSharp open Thoth.Json.Net -open Types - let activeTablePath = "tables/active/" let getTableFile (tableNumber: int) = @@ -281,13 +274,7 @@ let unmergeTable tableNumber = //Separates a merged table into itself and the la Some (getTable currentTable.table_number, unmergedChild) | Error _ -> None -let makeRoomButton (room: floorplan_room) = - let vars = map [ - "roomId", room.id |> string - "roomName", room.room_name - ] - Theme.loadTemplateWithVars "roomButton" vars let getReservationList (tableList: floorplan_table[]) = tableList |> Array.collect Entity.GetAllRelated @@ -305,4 +292,4 @@ let newReservation name time covers = Entity.Create reservation -let tableList () = Entity.GetAllInVenue +let tableList () = Entity.GetAllInVenue \ No newline at end of file diff --git a/Floorplan/Router.fs b/Floorplan/Router.fs new file mode 100644 index 0000000..c7e1f9d --- /dev/null +++ b/Floorplan/Router.fs @@ -0,0 +1,24 @@ +module DredgePos.Floorplan.Router + +open DredgePos +open DredgePos.Types +open Saturn +open Giraffe + +let floorplan = (warbler (fun ctx -> DredgePos.Floorplan.Controller.loadFloorplan (snd ctx))) + +let router = router { + pipe_through Ajax.Router.pipeline + get "/" floorplan + get "" floorplan + post "/mergeTables" (bindJson Controller.mergeTables) + post "/transformTable" (bindJson Controller.transformTable) + post "/createTable" (bindJson Controller.createTable) + post "/addDecoration" (bindJson Controller.AddDecoration) + post "/updateDecoration" (bindJson Controller.UpdateDecoration) + post "/deleteDecoration" (bindJson Controller.DeleteDecoration) + post "/deleteTable" (bindJson Controller.deleteTable) + getf "/getFloorplanData/%i" Controller.getFloorplanData + getf "/transferTable/%i/%i" Controller.transferTable + getf "/unmergeTable/%i" Controller.unmergeTable +} \ No newline at end of file diff --git a/PageController.fs b/OrderScreen/Controller.fs similarity index 56% rename from PageController.fs rename to OrderScreen/Controller.fs index 1863307..17ac2d8 100644 --- a/PageController.fs +++ b/OrderScreen/Controller.fs @@ -1,46 +1,35 @@ -module PageController +module DredgePos.OrderScreen.Controller -open System -open DredgePos.Types -open FSharp.Data -open Microsoft.AspNetCore.Http -open Floorplan -open Giraffe +open DredgePos open DredgeFramework +open DredgePos.Types +open Giraffe +open Microsoft.AspNetCore.Http -let loadHomePage(): HttpHandler = - let variables = map ["title", "Log In"] - let scripts = ["dredgepos.authenticate.js"] - let styles = ["dredgepos.authenticate.css"] +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 + table = Floorplan.Model.getTable tableNumber + |} + |> ajaxSuccess + |> json - Theme.loadTemplateWithVarsScriptsAndStyles "authenticate" variables scripts styles - |> htmlString - -let loadFloorplan (ctx: HttpContext) : HttpHandler = - Session.RequireClerkAuthentication ctx - - let roomMenu = - Entity.GetAllInVenue - |> Array.map makeRoomButton - |> joinWithNewLine - - let variables = map [ - "title", "Floorplan" - "roomMenu", roomMenu - "decorator", Decorations.generateDecorator() - ] - let styles = ["dredgepos.floorplan.css"] - let scripts = ["../external/konva.min.js" ; "dredgepos.floorplan.js"] - let currentClerk = recordToMap <| Session.getCurrentClerk ctx - - let arrays = map ["clerk", currentClerk] - - htmlString <| Theme.loadTemplateWithVarsArraysScriptsAndStyles "floorplan" variables arrays scripts styles +let loadGrid (gridId: int) = + let grid = Entity.GetById gridId + let gridHtml = Model.loadGrid gridId + if gridHtml = "Error" then ajaxFail gridHtml + else ajaxSuccess {|grid=grid;gridHtml=gridHtml|} + |> json let loadOrderScreen (ctx: HttpContext) (tableNumber: int) : HttpHandler = - Session.RequireClerkAuthentication ctx + Authenticate.Model.RequireClerkAuthentication ctx - let covers = if tableNumber > 0 then (getTable tableNumber).default_covers else 0 + let table = Floorplan.Model.getTable tableNumber + + let covers = if tableNumber > 0 then table.default_covers else 0 let coverString = language.getAndReplace "covers" [covers] let changeCoverNumberButton = if tableNumber > 0 then Theme.loadTemplateWithVars "orderScreen/change_cover_number_button" (map ["covers", coverString]) else "" @@ -51,7 +40,7 @@ let loadOrderScreen (ctx: HttpContext) (tableNumber: int) : HttpHandler = let containerAttributes = if tableNumber > 0 then - map ["data-table", jsonEncode (getTable tableNumber)] + map ["data-table", jsonEncode table] |> Theme.htmlAttributes else "" @@ -67,8 +56,8 @@ let loadOrderScreen (ctx: HttpContext) (tableNumber: int) : HttpHandler = |> joinWithNewLine let grids = - OrderScreen.getAllPageGrids () - |> Array.map OrderScreen.getPagesHTML + Model.getAllPageGrids () + |> Array.map Model.getPagesHTML |> joinWithNewLine let coverSelectorButtons = @@ -87,26 +76,14 @@ let loadOrderScreen (ctx: HttpContext) (tableNumber: int) : HttpHandler = "orderNumber", orderNumber "changeCoverNumberButton", changeCoverNumberButton "covers", coverString - "salesCategoryOverrideButtons", OrderScreen.generateSalesCategoryOverrideButtons () + "salesCategoryOverrideButtons", Model.generateSalesCategoryOverrideButtons () "coverSelectorButtons", coverSelectorButtons ] let styles = ["dredgepos.orderScreen.css"] let scripts = ["dredgepos.tables.js";"../external/currency.min.js";"dredgepos.orderScreen.js"; ] - let currentClerk = recordToMap <| Session.getCurrentClerk ctx + let currentClerk = recordToMap <| Authenticate.Model.getCurrentClerk ctx let arrays = map ["clerk", currentClerk] Theme.loadTemplateWithVarsArraysScriptsAndStyles "orderScreen" variables arrays scripts styles |> htmlString - -let getOpenTables() = - let rows = openTables() - rows |> jsonEncode - -let mergeTables parent child = - mergeTables parent child |> ignore - "done" - -let unmergeTables table = - unmergeTable table |> ignore - "done" \ No newline at end of file diff --git a/OrderScreen.module.fs b/OrderScreen/Model.fs similarity index 99% rename from OrderScreen.module.fs rename to OrderScreen/Model.fs index 97e7bc0..a3f9bc9 100644 --- a/OrderScreen.module.fs +++ b/OrderScreen/Model.fs @@ -1,4 +1,5 @@ -module OrderScreen +module DredgePos.OrderScreen.Model + open DredgeFramework open DredgePos open DredgePos.Types @@ -133,5 +134,3 @@ let getPagesHTML (gridInfo: grid * order_screen_page_group) = renderGrid grid |> renderPageGroup pageGroup - - diff --git a/OrderScreen/Router.fs b/OrderScreen/Router.fs new file mode 100644 index 0000000..855b803 --- /dev/null +++ b/OrderScreen/Router.fs @@ -0,0 +1,15 @@ +module DredgePos.OrderScreen.Router + +open DredgePos +open DredgePos.Types +open Saturn +open Giraffe + +let router = router { + pipe_through Ajax.Router.pipeline + getf "/getOrderScreenData/%i" Controller.getOrderScreenData + 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))) +} \ No newline at end of file diff --git a/Orders.module.fs b/Orders.module.fs deleted file mode 100644 index 6a8ebb7..0000000 --- a/Orders.module.fs +++ /dev/null @@ -1,3 +0,0 @@ -module Orders - -let getHighestOrderNumber () = 6 \ No newline at end of file diff --git a/Program.fs b/Program.fs index 1b57684..ef98667 100644 --- a/Program.fs +++ b/Program.fs @@ -1,71 +1,26 @@ -namespace WebApplication - +namespace DredgePos open DredgePos -open DredgePos.Types -open Microsoft.AspNetCore.Server.Kestrel.Core -open Reservations open Saturn open Giraffe -open Types module Program = - - let handlePostRoute<'a> handlerFunction post next ctx = - json (handlerFunction ctx post) next ctx - - let browser = pipeline { - use_warbler - } - - let floorplanRouter = router { - pipe_through browser - post "/authenticateClerk" (bindJson (handlePostRoute AjaxController.loginWithLoginCode) ) - post "/transformTable" (bindJson AjaxController.transformTable) - post "/createTable" (bindJson AjaxController.createTable) - post "/addDecoration" (bindJson AjaxController.AddDecoration) - post "/updateDecoration" (bindJson AjaxController.UpdateDecoration) - post "/deleteDecoration" (bindJson AjaxController.DeleteDecoration) - post "/deleteTable" (bindJson AjaxController.deleteTable) - post "/mergeTables" (bindJson AjaxController.mergeTables) - post "/newEmptyReservation" (bindJson AjaxController.newEmptyReservation) - post "/updateReservation" (bindJson AjaxController.updateReservation) - post "/getReservation" (bindJson (fun reservation -> json <| GetReservationById reservation) ) - post "/unreserveTable" (bindJson AjaxController.unreserveTable ) - getf "/getKeyboardLayout/%s" AjaxController.getKeyboardLayout - get "/languageVars" (json <| AjaxController.getLanguageVars) - get "/getOpenTables" (json <| Floorplan.getActiveTables (DredgeFramework.getCurrentVenue())) - getf "/getFloorplanData/%i" AjaxController.getFloorplanData - getf "/tableIsOpen/%i" (fun tableNumber -> json <| Floorplan.tableNumberIsOpen tableNumber) - getf "/transferTable/%i/%i" AjaxController.transferTable - getf "/unmergeTable/%i" AjaxController.unmergeTable - getf "/tableExists/%i" (fun tableNumber -> json <| Floorplan.tableExists tableNumber) - } - let orderScreenRouter = router { - pipe_through browser - getf "/getOrderScreenData/%i" AjaxController.getOrderScreenData - getf "/getGridHtml/%i" AjaxController.loadGrid - post "/updateCovers" (bindJson (fun table -> Entity.Update table |> Array.head |> DredgeFramework.ajaxSuccess |> json)) - } - - let pageRouter = router { - pipe_through browser + let router = router { + pipe_through Ajax.Router.pipeline not_found_handler (setStatusCode 404 >=> text "404") get "/" (redirectTo true "/login") - get "/login" (warbler (fun _ -> PageController.loadHomePage() )) - get "/floorplan" (warbler (fun ctx -> PageController.loadFloorplan (snd ctx))) - get "/order" (warbler (fun ctx -> PageController.loadOrderScreen (snd ctx) 0)) - getf "/order/%i" (fun number -> (warbler (fun ctx -> PageController.loadOrderScreen (snd ctx) number))) - forward "/ajax" floorplanRouter - forward "/orderScreen" orderScreenRouter + forward "/ajax" Ajax.Router.router + forward "/floorplan" DredgePos.Floorplan.Router.router + forward "/order" DredgePos.OrderScreen.Router.router + forward "/login" DredgePos.Authenticate.Router.router + forward "/reservations" DredgePos.Reservations.Router.router } let app = application { use_mime_types [(".woff", "application/font-woff")] use_static "wwwroot" - use_router pageRouter + use_router router url "http://0.0.0.0:5001" } - run app diff --git a/Reservations/Controller.fs b/Reservations/Controller.fs new file mode 100644 index 0000000..e2b1ff2 --- /dev/null +++ b/Reservations/Controller.fs @@ -0,0 +1,29 @@ +module DredgePos.Reservations.Controller + +open DredgeFramework +open DredgePos +open DredgePos.Types +open Giraffe + +let newEmptyReservation (reservation: reservation) = + let newReservation = {reservation with + created_at = CurrentTime() + time = CurrentTime() + } + + if reservation.floorplan_table_id > 0 then + let table = {(Entity.GetById reservation.floorplan_table_id) with + status = 2 + default_covers = reservation.covers} + Floorplan.Model.updateTablePosition table |> ignore + + let createdReservation = Floorplan.Model.createEmptyReservation newReservation + ajaxSuccess createdReservation |> json + +let updateReservation (reservation: reservation) = Model.updateReservation reservation |> ajaxSuccess |> json + +let unreserveTable (table: floorplan_table) = + let newTable = {table with status = 0} + Floorplan.Model.updateTablePosition newTable |> ignore + Model.DeleteReservation newTable.id + newTable |> ajaxSuccess |> json \ No newline at end of file diff --git a/Reservations.module.fs b/Reservations/Model.fs similarity index 61% rename from Reservations.module.fs rename to Reservations/Model.fs index 35b71e6..2ab0e7b 100644 --- a/Reservations.module.fs +++ b/Reservations/Model.fs @@ -1,19 +1,10 @@ -module Reservations +module DredgePos.Reservations.Model -open System open DredgeFramework open Dapper.FSharp open DredgePos open Types -let GetReservationById (id: int) = - select { - table "reservations" - where (eq "id" id) - } - |> db.Select - |> first - let updateReservation (reservation: reservation) = update{ table "reservations" @@ -25,5 +16,5 @@ let updateReservation (reservation: reservation) = let DeleteReservation (tableId: int) = delete { table "reservations" - where (eq "reservation_table_id" tableId) + where (eq "floorplan_table_id" tableId) } |> db.Delete |> ignore \ No newline at end of file diff --git a/Reservations/Router.fs b/Reservations/Router.fs new file mode 100644 index 0000000..a32849c --- /dev/null +++ b/Reservations/Router.fs @@ -0,0 +1,13 @@ +module DredgePos.Reservations.Router + +open DredgePos +open DredgePos.Types +open Saturn +open Giraffe + +let router = router { + pipe_through Ajax.Router.pipeline + post "/newEmptyReservation" (bindJson Controller.newEmptyReservation) + post "/updateReservation" (bindJson Controller.updateReservation) + post "/unreserveTable" (bindJson Controller.unreserveTable ) +} \ No newline at end of file diff --git a/wwwroot/scripts/ts/dredgepos.authenticate.ts b/wwwroot/scripts/ts/dredgepos.authenticate.ts index e9c1e84..83af01f 100644 --- a/wwwroot/scripts/ts/dredgepos.authenticate.ts +++ b/wwwroot/scripts/ts/dredgepos.authenticate.ts @@ -1,9 +1,9 @@ let showLoginBox = () => showVirtualNumpad('Enter Login Code', 6, true, false, false, authenticate) let authenticate = (input : string) => { - let login = ajaxSync('/ajax/authenticateClerk', input) + let login = ajaxSync('/login/authenticateClerk', input) if(login === 'success'){ - location.assign('/floorplan') + location.assign('/floorplan/') } else showLoginBox() diff --git a/wwwroot/scripts/ts/dredgepos.floorplan.ts b/wwwroot/scripts/ts/dredgepos.floorplan.ts index bc55f50..3a901e9 100644 --- a/wwwroot/scripts/ts/dredgepos.floorplan.ts +++ b/wwwroot/scripts/ts/dredgepos.floorplan.ts @@ -50,7 +50,7 @@ const Floorplan: floorplan = { selectedDecorationId: 0 }; -$(() => ajax('/ajax/getFloorplanData/1', null, 'get', setupFloorplan, null, null) ) +$(() => ajax('/floorplan/getFloorplanData/1', null, 'get', setupFloorplan, null, null) ) const setupFloorplanEvents = () => { @@ -276,7 +276,7 @@ const saveTable = (tableToUpdate: floorplan_table) => { tables.push(tableToUpdate) Floorplan.tables = tables - ajax("/ajax/transformTable", tableToUpdate, 'post', null,null,null) + ajax("/floorplan/transformTable", tableToUpdate, 'post', null,null,null) } const setTransformerNodes = (nodes: Konva.Shape[]) => { @@ -347,7 +347,7 @@ const createEmptyReservation = (covers: number) => { time: 0, } - ajax('/ajax/newEmptyReservation', newReservation,'post', emptyReservationCreated, null, null ) + ajax('/reservations/newEmptyReservation', newReservation,'post', emptyReservationCreated, null, null ) } const emptyReservationCreated = (reservation: reservation) => { @@ -366,7 +366,7 @@ const addReservationName = (name: string) => { hideVirtualKeyboard() const reservation = Floorplan.reservations.filter(reservation => reservation.floorplan_table_id == getSelectedTableData().id)[0] reservation.name = name - ajax('/ajax/updateReservation', reservation, 'post', reservationNameAdded, null, null) + ajax('/reservations/updateReservation', reservation, 'post', reservationNameAdded, null, null) } const reservationNameAdded = (updatedReservation: reservation) => { @@ -386,7 +386,7 @@ const updateTableData = (tableToRemove: floorplan_table) => { const unreserveTable = () => { const selectedTable = getSelectedTableData() selectedTable.status = 0 - ajax('/ajax/unreserveTable', selectedTable, 'post', tableUnreserved, null, null) + ajax('/reservations/unreserveTable', selectedTable, 'post', tableUnreserved, null, null) } const tableUnreserved = (table: floorplan_table) => { @@ -500,7 +500,7 @@ const createDecorationShape = (decoration:decoration, select?: boolean) => { } } - decorationShape.src = 'images/decorations/' + decoration.decoration_image + decorationShape.src = '/images/decorations/' + decoration.decoration_image } const setupDecorationEvents = (decorationShape: Konva.Image) => { @@ -567,7 +567,7 @@ const saveDecoration = (decorationToUpdate: decoration) => { decorations.push(decorationToUpdate) Floorplan.decorations = decorations - ajax("/ajax/updateDecoration", decorationToUpdate, 'post', null,null,null) + ajax("/floorplan/updateDecoration", decorationToUpdate, 'post', null,null,null) } const showDecorator = () => $('#decorator').css('display', 'flex') @@ -588,7 +588,7 @@ const addDecoration = (e: Event) => { venue_id: Floorplan.currentRoom.venue_id } - ajax('/ajax/addDecoration', newDecoration, 'post', decorationAdded, null, null) + ajax('/floorplan/addDecoration', newDecoration, 'post', decorationAdded, null, null) } const decorationAdded = (decoration: decoration) => { @@ -600,7 +600,7 @@ const decorationAdded = (decoration: decoration) => { const deleteDecoration = () => ajax( - '/ajax/deleteDecoration', + '/floorplan/deleteDecoration', getDecorationDataById(Floorplan.selectedDecorationId), 'post', decorationDeleted, null, null) @@ -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`) } } @@ -735,7 +735,7 @@ const addTable = (tableNumber: number) => { venue_id: 1 }; - ajax('/ajax/createTable', newTable, 'post', tableAdded, tableNotAdded, null) + ajax('/floorplan/createTable', newTable, 'post', tableAdded, tableNotAdded, null) } const tableAdded = (table: floorplan_table) => { @@ -763,7 +763,7 @@ const deleteTable = (tableNumber: number) => { return false } - ajax(`/ajax/deleteTable`, tableToDelete, 'post', tableDeleted, null, null); + ajax(`/floorplan/deleteTable`, tableToDelete, 'post', tableDeleted, null, null); } const tableDeleted = (deletedTable: floorplan_table) => { @@ -782,7 +782,7 @@ const mergeTables = (table1: floorplan_table, table2: floorplan_table ) => { posAlert(lang('error_self_merge')) return false; } - ajax('/ajax/mergeTables', [table1, table2], 'post', tablesMerged, null, null) + ajax('/floorplan/mergeTables', [table1, table2], 'post', tablesMerged, null, null) } const tablesMerged = (tables: Record<'child'|'parent'|'merged', floorplan_table>) => { @@ -795,7 +795,7 @@ const tablesMerged = (tables: Record<'child'|'parent'|'merged', floorplan_table> tableGroup.draggable(true) } -const unmergeTable = () => ajax(`/ajax/unmergeTable/${Floorplan.selectedTableNumber}`, null, 'get', tablesUnmerged, null, null) +const unmergeTable = () => ajax(`/floorplan/unmergeTable/${Floorplan.selectedTableNumber}`, null, 'get', tablesUnmerged, null, null) const tablesUnmerged = (tables: Record<'child'|'parent', floorplan_table>) => { const parentTable = tables['parent'] @@ -815,7 +815,7 @@ const transferTables = (origin: floorplan_table, destination: floorplan_table) = return } - ajax(`/ajax/transferTable/${origin.table_number}/${destination.table_number}`, null, 'get', tableTransferred, null, null) + ajax(`/floorplan/transferTable/${origin.table_number}/${destination.table_number}`, null, 'get', tableTransferred, null, null) } const tableTransferred = (tables: Record<"origin"|"destination", floorplan_table>) => { diff --git a/wwwroot/scripts/ts/dredgepos.orderScreen.ts b/wwwroot/scripts/ts/dredgepos.orderScreen.ts index bc82483..ea05f2d 100644 --- a/wwwroot/scripts/ts/dredgepos.orderScreen.ts +++ b/wwwroot/scripts/ts/dredgepos.orderScreen.ts @@ -303,7 +303,7 @@ const itemButtonClicked = (e: JQuery.TriggeredEvent) => { const gridButtonClicked = (e: JQuery.TriggeredEvent) => { const button = $(e.target).closest('.posButton') const grid : number = button.data('grid') - ajax(`/orderScreen/getGridHtml/${grid}`, null, null,gridHtmlGenerated, null, null) + ajax(`/order/getGridHtml/${grid}`, null, null,gridHtmlGenerated, null, null) } @@ -571,7 +571,7 @@ const changeCoverNumberPromptSubmitted = (value: string) => updateCoverNumbers(N const updateCoverNumbers = (covers: number) => { let newTable = Object.assign({}, OrderScreen.table) newTable.default_covers = covers - ajax('/orderScreen/updateCovers', newTable, 'post', coverNumbersUpdated, null, null) + ajax('/order/updateCovers', newTable, 'post', coverNumbersUpdated, null, null) } const coverNumbersUpdated = (newTable: floorplan_table) => { @@ -600,5 +600,5 @@ const generateCoverSelector = () => { $(() => { OrderScreen.table = $('#pageContainer').data('table') || null - ajax('/orderScreen/getOrderScreenData/1', null, 'get', setupOrderScreen, null, null) + ajax('/order/getOrderScreenData/1', null, 'get', setupOrderScreen, null, null) }) \ No newline at end of file diff --git a/wwwroot/themes/restaurant/decoratorItem.tpl.htm b/wwwroot/themes/restaurant/decoratorItem.tpl.htm index c71fd0a..87e04b9 100644 --- a/wwwroot/themes/restaurant/decoratorItem.tpl.htm +++ b/wwwroot/themes/restaurant/decoratorItem.tpl.htm @@ -1,4 +1,4 @@ 
- +
\ No newline at end of file From e3794fc2225d0653b3f25814f08d2bfa83958a5a Mon Sep 17 00:00:00 2001 From: Josh Date: Sun, 13 Feb 2022 19:35:02 +1000 Subject: [PATCH 2/2] Unversioned file was tracking --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index a644b9c..c7e60c1 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ /.idea/ /wwwroot/scripts/js/ /wwwroot/styles/css/* +/Folder.DotSettings.user