diff --git a/AjaxController.fs b/AjaxController.fs index d74c1c6..9ec7c9c 100644 --- a/AjaxController.fs +++ b/AjaxController.fs @@ -42,19 +42,27 @@ let unmergeTable tableNumber = unmergedTables |> json -let getFloorplanData venue = - let tableList = Floorplan.tableList venue +let getFloorplanData (id: int) = + let tableList = Entity.getAllInVenue let reservationList = getReservationList tableList {| tables = tableList - decorations = Decorations.decorationList venue - activeTableNumbers = Floorplan.getActiveTables venue - rooms = Floorplan.getRoomList venue + decorations = Entity.getAllInVenue + activeTableNumbers = Floorplan.getActiveTables (getCurrentVenue()) + rooms = Entity.getAllInVenue reservations = reservationList |} |> ajaxSuccess |> json +let getOrderScreenData (id: int) = + let pages = Entity.getAllInVenue + {| + order_screen_pages = pages + |} + |> ajaxSuccess + |> json + let getKeyboardLayout (language: string) = let layout = $"""wwwroot/languages/{language}/keyboardLayout.json""" |> GetFileContents map [ @@ -62,28 +70,13 @@ let getKeyboardLayout (language: string) = "data", layout ] |> json - -let getRoomTablesAndDecorations roomId = - let tables = Floorplan.tablesInRoom roomId - let decorations = Decorations.decorationsInRoom roomId - let data = {| - tables = tables - decorations = decorations - |} - - data |> ajaxSuccess |> json - -let getTableData tableNumber = json <| Floorplan.getTable tableNumber - -let updateTableShape (table: floorplan_table) = - Floorplan.updateTableShape table |> ignore - getTableData table.table_number - let transformTable (table: floorplan_table) = - Floorplan.updateTablePosition table |> ignore - getTableData table.table_number + Entity.updateInDatabase table + |> ajaxSuccess + |> json let createTable (tableData: floorplan_table) = + let result = if tableExists tableData.table_number = "False" then ajaxSuccess (addNewTable tableData) @@ -92,7 +85,8 @@ let createTable (tableData: floorplan_table) = result |> json let deleteTable (table: floorplan_table) = - Floorplan.deleteTable table.table_number + Entity.deleteById table.id + |> ignore table |> ajaxSuccess |> json let transferTable (origin, destination) = @@ -116,13 +110,19 @@ let AddDecoration (data: floorplan_decoration) = decoration_room = data.decoration_room } - Decorations.CreateDecoration decoration |> ajaxSuccess |> json + Entity.addToDatabase decoration + |> ajaxSuccess + |> json -let UpdateDecoration data = - Decorations.UpdateDecoration data |> ignore +let UpdateDecoration (data: floorplan_decoration) = + Entity.updateInDatabase data + |> ignore ajaxSuccess "true" |> json -let DeleteDecoration id = ajaxSuccess (Decorations.DeleteDecoration id) |> json +let DeleteDecoration (decorationToDelete: floorplan_decoration) = + Entity.deleteById decorationToDelete.id + |> ajaxSuccess + |> json let newEmptyReservation (reservation: reservation) = let newReservation = {reservation with diff --git a/Decorations.module.fs b/Decorations.module.fs index ef643cb..1fe2989 100644 --- a/Decorations.module.fs +++ b/Decorations.module.fs @@ -8,22 +8,7 @@ open Dapper.FSharp open DredgePos open Types -let decorationList venue = - select { - table "floorplan_decorations" - innerJoin "floorplan_rooms" "id" "decoration_room" - } - |> db.SelectJoin - |> Array.filter (fun (_, room) -> room.venue_id = venue ) - |> Array.map fst - -let decorationsInRoom (roomId: int) = - select { - table "floorplan_decorations" - where (eq "decoration_room" roomId) - } - |> db.Select - +let decorationsInRoom (roomId: int) = Entity.getAllByColumn "decoration_room" roomId let getImageName (image: string, path: string) = let imageName = @@ -60,27 +45,4 @@ let generateDecorator () = |> Array.map getImageHTML |> Array.chunkBySize 4 |> Array.map getImageRowHtml - |> JoinArray "" - -let CreateDecoration (decoration: floorplan_decoration) = - insert { - table "floorplan_decorations" - value decoration - } - |> db.InsertOutput - |> first - - -let UpdateDecoration (decoration: floorplan_decoration) = - update { - table "floorplan_decorations" - set decoration - where (eq "id" decoration.id ) - } |> db.Update - -let DeleteDecoration (decoration: floorplan_decoration) = - delete { - table "floorplan_decorations" - where (eq "id" decoration.id) - } |> db.Delete |> ignore - decoration \ No newline at end of file + |> JoinArray "" \ No newline at end of file diff --git a/DredgeFramework.module.fs b/DredgeFramework.module.fs index 245e541..481f7ef 100644 --- a/DredgeFramework.module.fs +++ b/DredgeFramework.module.fs @@ -16,6 +16,8 @@ open Thoth.Json.Net let (|?) lhs rhs = if lhs = null then rhs else lhs +let getCurrentVenue () = 1 + let map list = list |> Map.ofList let JoinArray (char: string) (array: 'a[]) = String.Join(char, array) diff --git a/DredgePos.fsproj b/DredgePos.fsproj index 6ae78fb..baec57e 100644 --- a/DredgePos.fsproj +++ b/DredgePos.fsproj @@ -14,6 +14,7 @@ + @@ -41,6 +42,7 @@ + @@ -63,6 +65,7 @@ + diff --git a/Floorplan.module.fs b/Floorplan.module.fs index 0c4c71a..d7a0a37 100644 --- a/Floorplan.module.fs +++ b/Floorplan.module.fs @@ -3,8 +3,6 @@ open DredgePos open Reservations -let currentVenue = 1 - open System open System.IO open System.Xml.Linq @@ -14,28 +12,6 @@ open Dapper.FSharp open Thoth.Json.Net open Types -let floorplan_table_decoder : Decoder = - Decode.object - (fun get -> - { - table_number = get.Required.Field "table_number" Decode.int - room_id = get.Required.Field "room_id" Decode.int - venue_id = get.Required.Field "venue_id" Decode.int - pos_x = get.Required.Field "pos_x" Decode.int - pos_y = get.Required.Field "pos_y" Decode.int - shape = get.Required.Field "shape" Decode.string - width = get.Required.Field "width" Decode.int - height = get.Required.Field "height" Decode.int - default_covers = get.Required.Field "default_covers" Decode.int - rotation = get.Required.Field "rotation" Decode.int - merged_children = get.Required.Field "merged_children" Decode.string - previous_state = get.Required.Field "previous_state" Decode.string - status = get.Required.Field "status" Decode.int - id = get.Required.Field "id" Decode.int - }) - - - let activeTablePath = "tables/active/" let getTableFile (tableNumber: int) = @@ -54,7 +30,7 @@ let fileNameToTableNumber (fileName: string) = //Takes a file name for a floorpl (fileName.Split "/table").[1] |> int else 0 -let openTables = //Get a list of all open tables. +let openTables () = //Get a list of all open tables. let tableList = Directory.GetFiles(activeTablePath) tableList @@ -117,12 +93,13 @@ let saveOrderToTable orderXML tableNumber = File.WriteAllText(tableFile, tableXML) let getTable (tableNumber : int) = - select { + let query = select { table "floorplan_tables" - where (eq "table_number" tableNumber + eq "venue_id" currentVenue) + where (eq "table_number" tableNumber + eq "venue_id" (getCurrentVenue())) } - |> db.Select - |> first + + let result = query |> db.Select + result |> first let getTableById (id : int) = select { @@ -138,12 +115,6 @@ let getRoom (roomId: int) = where (eq "id" roomId) } |> db.Select |> first -let getRoomList (venueId: int) = - select { - table "floorplan_rooms" - where (eq "venue_id" venueId) - } |> db.Select - let updateFloorplanTable (tableNumber:int) (column: string) value = //TODO: Make update query venue specific let sql = "Update floorplan_tables Set @column = @value Where table_number = @tableNumber" @@ -156,16 +127,11 @@ let updateTableShape (floorplanTable: floorplan_table) = update { table "floorplan_tables" set floorplanTable - where (eq "table_number" floorplanTable.table_number + eq "venue_id" currentVenue) + where (eq "table_number" floorplanTable.table_number + eq "venue_id" (getCurrentVenue())) } |> db.Update -let updateTablePosition (floorplanTable: floorplan_table) = - update { - table "floorplan_tables" - set floorplanTable - where (eq "table_number" floorplanTable.table_number + eq "venue_id" currentVenue) - } |> db.Update +let updateTablePosition (floorplanTable: floorplan_table) = Entity.updateInDatabase floorplanTable let createEmptyReservation (reservation: reservation) = update { @@ -174,12 +140,7 @@ let createEmptyReservation (reservation: reservation) = where(eq "id" reservation.reservation_table_id) } |> db.Update |> ignore - insert{ - table "reservations" - value reservation - } |> db.InsertOutput |> first - - + Entity.addToDatabase reservation let getChildTables tableNumber = let table = getTable tableNumber @@ -213,15 +174,13 @@ let tableExists (tableNumber: int) = let numberOfResults = select{ table "floorplan_tables" - where (eq "table_number" tableNumber + eq "venue_id" currentVenue) + where (eq "table_number" tableNumber + eq "venue_id" (getCurrentVenue())) } |> db.Select |> length match numberOfResults with | 0 -> let allTables = - select { - table "floorplan_tables" - } |> db.Select + Entity.getAllInVenue |> Array.map(findChildTable tableNumber) |> Array.filter(fun tableNumber -> tableNumber <> 0) @@ -248,21 +207,7 @@ let addNewTableWithoutOutput (newTable: floorplan_table) = } |> db.Insert -let addNewTable (newTable: floorplan_table) = - let newTableList = - insert{ - table "floorplan_tables" - value newTable - } - |> db.InsertOutput - - newTableList |> first - -let deleteTable (tableNumber: int) = - delete { - table "floorplan_tables" - where (eq "table_number" tableNumber + eq "venue_id" currentVenue) - } |> db.Delete |> ignore +let addNewTable (newTable: floorplan_table) = Entity.addToDatabase newTable let mergeTables parent child = //Merge two tables together if parent = child then false else @@ -292,13 +237,12 @@ let mergeTables parent child = //Merge two tables together let existingChildrenJson = parentTable.merged_children |> StringTrim let existingChildren = - existingChildrenJson - |> Decode.fromString(Decode.list floorplan_table_decoder) + existingChildrenJson |> Decode.Auto.fromString let tableList = match existingChildren with - | Error _ -> [newChildTable] - | Ok tables -> tables @ [newChildTable] + | Error _ -> [|newChildTable|] + | Ok tables -> [tables ; [|newChildTable|]] |> Array.concat let newChildrenJson = tableList |> jsonEncode let parentPreviousState = parentTable |> jsonEncode @@ -314,10 +258,11 @@ let mergeTables parent child = //Merge two tables together pos_y = newPosY default_covers = parentTable.default_covers + childTable.default_covers |} - where (eq "table_number" parent + eq "venue_id" currentVenue) + where (eq "table_number" parent + eq "venue_id" (getCurrentVenue())) } |> db.Update |> ignore - deleteTable child + Entity.deleteById newChildTable.id + |> ignore true @@ -326,7 +271,7 @@ let updateUnmergedTables parentTable childTable = update { table "floorplan_tables" set parentTable - where(eq "table_number" parentTable.table_number + eq "venue_id" currentVenue) + where(eq "table_number" parentTable.table_number + eq "venue_id" (getCurrentVenue())) } |> db.Update |> ignore addNewTableWithoutOutput childTable |> ignore @@ -350,7 +295,7 @@ let unmergeTable tableNumber = //Separates a merged table into itself and the la Some (getTable currentTable.table_number, unmergedChild) | Error _ -> None -let convertRoomListToLinks (room: floorplan_room) = +let makeRoomButton (room: floorplan_room) = let vars = map [ "roomId", room.id |> string "roomName", room.room_name @@ -377,17 +322,7 @@ let newReservation name time covers = reservation_created_at = CurrentTime() } - insert { - table "reservations" - value reservation - } |> db.Insert + Entity.addToDatabase reservation -let tableList venueId = - select{ - table "floorplan_tables" - innerJoin "floorplan_rooms" "id" "floorplan_tables.room_id" - } - |> db.SelectJoin - |> Array.filter (fun (_, room) -> room.venue_id = venueId ) - |> Array.map fst +let tableList () = Entity.getAllInVenue diff --git a/GenericEntities.module.fs b/GenericEntities.module.fs index 5e42c48..fe8b8d5 100644 --- a/GenericEntities.module.fs +++ b/GenericEntities.module.fs @@ -3,11 +3,16 @@ open DredgePos open Types open Dapper.FSharp open DredgeFramework +open Pluralize.NET.Core +open FSharp.Reflection +let getDatabaseTable<'x> = + let typeName = typeof<'x>.Name + Pluralizer().Pluralize typeName + -let getDatabaseTable (record: 'a) = record.GetType().ToString().ToLower() + "s" let addToDatabase (record: 'x)= - let tableName = getDatabaseTable record + let tableName = getDatabaseTable<'x> insert { table tableName value record @@ -15,12 +20,49 @@ let addToDatabase (record: 'x)= |> db.InsertOutput |> first -let updateInDatabase (record: 'x) = - let tableName = getDatabaseTable record + +let inline updateInDatabase (record: ^x) = + let tableName = getDatabaseTable<'x> + let id = ((^x) : (member id : int) (record)) (* Run an update query *) update { table tableName set record + where (eq "id" id) } |> db.Update |> ignore - record \ No newline at end of file + record + +let getAll<'x> = + let typeName = typeof<'x>.Name + let tableName = Pluralizer().Pluralize typeName + + select { + table tableName + } + |> db.Select<'x> + +let getAllByColumn<'x> (column: string) (value: obj) = + let typeName = typeof<'x>.Name + let tableName = Pluralizer().Pluralize typeName + + select { + table tableName + where (eq column value) + } |> db.Select<'x> + +let getAllInVenue<'x> = getAllByColumn<'x> "venue_id" (getCurrentVenue ()) +let getById<'x> (id: int) = getAllByColumn<'x> "id" id |> first + +let deleteById<'x> id = + let typeName = typeof<'x>.Name + let tableName = Pluralizer().Pluralize typeName + + let entity = getById<'x> id + + delete { + table tableName + where (eq "id" id) + } |> db.Delete |> ignore + + entity \ No newline at end of file diff --git a/OrderScreen.module.fs b/OrderScreen.module.fs new file mode 100644 index 0000000..338b108 --- /dev/null +++ b/OrderScreen.module.fs @@ -0,0 +1,104 @@ +module OrderScreen +open System.Security.Cryptography.Xml +open DredgeFramework +open DredgePos +open FSharp.Collections +open Thoth.Json.Net +open Types +open Theme + +let htmlAttributes (attributes: Map) = + " " + (attributes + |> Map.toArray + |> Array.map (fun (attribute, value) -> attribute+"="+value) + |> String.concat " ") + + +let getAllPageGrids () = 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 item = Entity.getAllByColumn "item_code" button.primary_action_value + |> first + + let extraData = + map [ + "data-item-code", item.item_code + "data-item-price", item.price1.ToString() + "data-item-name", item.item_name + "data-item-type", item.item_type + "data-item-category", item.item_category.ToString() + ] |> htmlAttributes + + {| + extra_data = extraData + text = item.item_name + |} + + +let renderButton (buttonId: int) = + let button = Entity.getById