diff --git a/.idea/.idea.DredgePos.dir/.idea/.name b/.idea/.idea.DredgePos.dir/.idea/.name
deleted file mode 100644
index ef3c4c6..0000000
--- a/.idea/.idea.DredgePos.dir/.idea/.name
+++ /dev/null
@@ -1 +0,0 @@
-DredgePos
\ No newline at end of file
diff --git a/.idea/config/applicationhost.config b/.idea/config/applicationhost.config
index b3f06c7..03a4e12 100644
--- a/.idea/config/applicationhost.config
+++ b/.idea/config/applicationhost.config
@@ -156,7 +156,7 @@
-
+
@@ -974,21 +974,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/AjaxController.fs b/AjaxController.fs
index 7828b6c..e35477d 100644
--- a/AjaxController.fs
+++ b/AjaxController.fs
@@ -1,9 +1,12 @@
module AjaxController
open DredgeFramework
+open Floorplan
open Microsoft.AspNetCore.Http
+open Reservations
open language
open Giraffe
+open Dapper.FSharp
let loginWithLoginCode (context: HttpContext) (login_code: int) =
if Session.clerkLogin login_code context then ajaxSuccess "success"
@@ -15,28 +18,50 @@ let getActiveTables venue = Floorplan.getActiveTables venue |> ajaxSuccess |> js
let getRoomData roomId = Floorplan.getRoom roomId |> ajaxSuccess |> json
-let mergeTables (parent, child) =
+let mergeTables (tables: floorplan_table[]) =
let status =
- if Floorplan.mergeTables parent child then "success"
- else "fail"
-
- map [
- "status", status
- "data" , parent |> Floorplan.getTable |> jsonEncode
- ]
- |> json
+ if mergeTables tables.[0].table_number tables.[1].table_number then
+ let outputTables = map [
+ "parent", tables.[0];
+ "child", tables.[1];
+ "merged", getTable tables.[0].table_number;
+ ]
+ ajaxSuccess outputTables
+ else ajaxFail "Could Not Merge Tables"
+ status |> json
let unmergeTable tableNumber =
- let status =
- if Floorplan.unmergeTable tableNumber then "success"
- else "fail"
+ let unmerged = Floorplan.unmergeTable tableNumber
+ let unmergedTables =
+ match unmerged with
+ | Some (parent, child) ->
+ map["parent", parent; "child", child] |> ajaxSuccess
+ | None -> ajaxFail "Could not Unmerge Table"
- map [
- "status", status
- "data" , "[true]"
- ]
+ unmergedTables |> json
+
+
+let getFloorplanData venue =
+ let tableList = Floorplan.tableList venue
+ let reservationList = getReservationList tableList
+ {|
+ tables = tableList
+ decorations = Decorations.decorationList venue
+ activeTableNumbers = Floorplan.getActiveTables venue
+ rooms = Floorplan.getRoomList venue
+ reservations = reservationList
+ |}
+ |> ajaxSuccess
|> json
+let getKeyboardLayout (language: string) =
+ let layout = $"""wwwroot/languages/{language}/keyboardLayout.json""" |> GetFileContents
+ map [
+ "status", "success"
+ "data", layout
+ ] |> json
+
+
let getRoomTablesAndDecorations roomId =
let tables = Floorplan.tablesInRoom roomId
let decorations = Decorations.decorationsInRoom roomId
@@ -53,50 +78,70 @@ let updateTableShape (table: Floorplan.floorplan_table_shape) =
Floorplan.updateTableShape table |> ignore
getTableData table.table_number
-let transformTable (table: Floorplan.floorplan_table_transform) =
+let transformTable (table: Floorplan.floorplan_table) =
Floorplan.updateTablePosition table |> ignore
getTableData table.table_number
-let createTable (tableData) =
- let newTableCreated = Floorplan.addNewTable tableData
+let createTable (tableData: floorplan_table) =
let result =
- if newTableCreated then Floorplan.getTable tableData.table_number |> jsonEncode |> ajaxSuccess
- else Floorplan.tableExists tableData.table_number |> jsonEncode |> ajaxFail
+ if tableExists tableData.table_number = "False" then
+ ajaxSuccess (addNewTable tableData)
+ else ajaxFail (tableExists tableData.table_number)
- json result
+ result |> json
+
+let deleteTable (table: floorplan_table) =
+ Floorplan.deleteTable table.table_number
+ table |> ajaxSuccess |> json
let transferTable (origin, destination) =
Floorplan.transferTable origin destination
- ajaxSuccess "true" |> json
+ let data = map ["origin", getTable origin ; "destination", getTable destination]
+ ajaxSuccess data |> json
-let AddDecoration (data: Decorations.decoration_creator) =
+let AddDecoration (data: Decorations.floorplan_decoration) =
let image = "wwwroot/images/decorations/" + data.decoration_image
let width, height = image |> GetImageSize
let aspectRatio = decimal width / decimal height
let decoration : Decorations.floorplan_decoration = {
- decoration_id = 0
+ id = 0
decoration_height = (200m / aspectRatio) |> int
decoration_width = 200
decoration_rotation = 0
decoration_image = data.decoration_image
- decoration_pos_x = data.basis/2
- decoration_pos_y = data.basis/2
+ decoration_pos_x = data.decoration_pos_x
+ decoration_pos_y = data.decoration_pos_y
decoration_room = data.decoration_room
}
- Decorations.CreateDecoration decoration |> ignore
- ajaxSuccess "true" |> json
+ Decorations.CreateDecoration decoration |> ajaxSuccess |> json
let UpdateDecoration data =
Decorations.UpdateDecoration data |> ignore
ajaxSuccess "true" |> json
-let DeleteDecoration id =
- Decorations.DeleteDecorationById id |> ignore
- ajaxSuccess "true" |> json
+let DeleteDecoration id = ajaxSuccess (Decorations.DeleteDecoration id) |> json
-let newEmptyReservation tableNumber =
- Floorplan.createEmptyReservation tableNumber 2
+let newEmptyReservation (reservation: reservation) =
+ let newReservation = {reservation with
+ reservation_created_at = CurrentTime()
+ reservation_time = CurrentTime()
+ }
- json <| ajaxSuccess "true"
+ if reservation.reservation_table_id > 0 then
+ let table = {(getTableById reservation.reservation_table_id) with
+ status = 2
+ default_covers = reservation.reservation_covers}
+ updateTablePosition table |> ignore
+
+ let createdReservation = Floorplan.createEmptyReservation newReservation
+ ajaxSuccess createdReservation |> json
+
+let updateReservation (reservation: reservation) = updateReservation reservation |> ajaxSuccess |> json
+
+let unreserveTable (table: floorplan_table) =
+ let newTable = {table with status = 0}
+ updateTablePosition newTable |> ignore
+ DeleteReservation newTable.id
+ newTable |> ajaxSuccess |> json
diff --git a/Clerk.module.fs b/Clerk.module.fs
index 0f0d082..9d2ad91 100644
--- a/Clerk.module.fs
+++ b/Clerk.module.fs
@@ -8,12 +8,12 @@ open Thoth.Json.Net
let mutable loginCookie = ""
-type clerk = {clerk_id: int; clerk_name: string; clerk_login_code: int; clerk_usergroup: int}
+type clerk = {id: int; clerk_name: string; clerk_login_code: int; clerk_usergroup: int}
let clerk_decoder : Decoder =
Decode.object
(fun get ->
{
- clerk_id = get.Required.Field "clerk_id" Decode.int
+ 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
diff --git a/Database.module.fs b/Database.module.fs
index 74f9794..a8b1f74 100644
--- a/Database.module.fs
+++ b/Database.module.fs
@@ -1,5 +1,7 @@
module db
+open Dapper
+open Dapper.FSharp
open Dapper.FSharp.MySQL
open MySql.Data.MySqlClient
open DredgeFramework
@@ -24,6 +26,16 @@ let Insert<'a> asyncQuery =
|> connection.InsertAsync<'a>
|> RunSynchronously
+let InsertOutput<'a> asyncQuery =
+ asyncQuery
+ |> connection.InsertAsync<'a>
+ |> RunSynchronously
+ |> ignore
+
+ let table = asyncQuery.Table
+ connection.Query<'a>($"""Select * From {table} Where id = (select last_insert_id())""")
+ |> EnumerableToArray
+
let Update<'a> asyncQuery =
asyncQuery
|> connection.UpdateAsync<'a>
diff --git a/Decorations.module.fs b/Decorations.module.fs
index 4fcab24..6fc2b54 100644
--- a/Decorations.module.fs
+++ b/Decorations.module.fs
@@ -6,10 +6,11 @@ open System.Text.RegularExpressions
open DredgeFramework
open Dapper
open Dapper.FSharp
+open Floorplan
[]
type floorplan_decoration = {
- decoration_id: int
+ id: int
decoration_room: int
decoration_pos_x: int
decoration_pos_y: int
@@ -19,12 +20,14 @@ type floorplan_decoration = {
decoration_image: string
}
-type decoration_creator = {
- decoration_room: int
- decoration_image: string
- basis: int
-}
-
+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 {
@@ -43,8 +46,6 @@ let getImageName (image: string, path: string) =
imageName, path
-
-
let isImageFile (fileName: string) = Regex.IsMatch(fileName |> ToLowerCase, @"^.+\.(jpg|jpeg|png|gif)$")
let getImageHTML (imageName: string, imageUrl: string) =
@@ -77,20 +78,21 @@ let CreateDecoration (decoration: floorplan_decoration) =
insert {
table "floorplan_decorations"
value decoration
- } |> db.Insert
+ }
+ |> db.InsertOutput
+ |> first
+
let UpdateDecoration (decoration: floorplan_decoration) =
- let imageFile = GetFileName decoration.decoration_image
- let updatedDecoration = {decoration with decoration_image = imageFile}
-
update {
table "floorplan_decorations"
- set updatedDecoration
- where (eq "decoration_id" decoration.decoration_id )
+ set decoration
+ where (eq "id" decoration.id )
} |> db.Update
-let DeleteDecorationById (id: int) =
+let DeleteDecoration (decoration: floorplan_decoration) =
delete {
table "floorplan_decorations"
- where (eq "decoration_id" id)
- } |> db.Delete
\ No newline at end of file
+ where (eq "id" decoration.id)
+ } |> db.Delete |> ignore
+ decoration
\ No newline at end of file
diff --git a/DredgeFramework.module.fs b/DredgeFramework.module.fs
index 5c20022..245e541 100644
--- a/DredgeFramework.module.fs
+++ b/DredgeFramework.module.fs
@@ -18,9 +18,7 @@ let (|?) lhs rhs = if lhs = null then rhs else lhs
let map list = list |> Map.ofList
-let JoinArray (char: string) (array: string[]) = String.Join(char, array)
-
-let first (array: 'a[]) = array.[0]
+let JoinArray (char: string) (array: 'a[]) = String.Join(char, array)
let StringReplace (search:string) (replace:string) (string:string) = (search, replace) |> string.Replace
@@ -37,6 +35,9 @@ let GetFileContents (file: string) = File.ReadAllText file
let GetFileName (file: string) = Path.GetFileName file
let length (variable: 'T[]) = variable.Length
+let first (array: 'a[]) = array.[0]
+let last (array: 'a[]) = array.[array.Length-1]
+
let removeFalseValues (variable: bool[]) = variable |> Array.filter id
@@ -67,14 +68,15 @@ let RunSynchronously task =
|> Async.AwaitTask
|> Async.RunSynchronously
+let AppendToArray (element: 'T) (array : 'T[]) = Array.append [|element|] array
+
let ToLowerCase (string: string) = string.ToLower()
let ToUpperCase (string: string) = string.ToUpper()
let ToTitleCase (string: string) = CultureInfo.CurrentCulture.TextInfo.ToTitleCase <| string
let recordToMap (record: 'T) =
seq {
- for prop in FSharpType.GetRecordFields(typeof<'T>) ->
- prop.Name, prop.GetValue(record) |> string
+ for prop in FSharpType.GetRecordFields(typeof<'T>) -> prop.Name, prop.GetValue(record) |> string
}
|> Map.ofSeq
diff --git a/DredgePos.fsproj b/DredgePos.fsproj
index 65bede8..d7950d2 100644
--- a/DredgePos.fsproj
+++ b/DredgePos.fsproj
@@ -9,6 +9,7 @@
+
@@ -31,6 +32,7 @@
PreserveNewest
+
diff --git a/Floorplan.module.fs b/Floorplan.module.fs
index 1d046dc..dbd50b1 100644
--- a/Floorplan.module.fs
+++ b/Floorplan.module.fs
@@ -38,13 +38,13 @@ type floorplan_table = {
rotation: int
merged_children: string
previous_state: string
- status: string
- table_id: int
+ status: int
+ id: int
}
[]
type floorplan_room = {
- room_id: int
+ id: int
room_name: string
background_image: string
venue_id: int
@@ -66,8 +66,8 @@ let floorplan_table_decoder : Decoder =
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.string
- table_id = get.Required.Field "table_id" Decode.int
+ status = get.Required.Field "status" Decode.int
+ id = get.Required.Field "id" Decode.int
})
@@ -78,10 +78,12 @@ let getTableFile (tableNumber: int) =
let tableNumberString = tableNumber |> string
activeTablePath + "table" + tableNumberString + ".table"
-let tableIsOpen (tableNumber: int) =
+let tableNumberIsOpen (tableNumber: int) =
let tableFile = getTableFile tableNumber
File.Exists tableFile
+let tableIsOpen (table: floorplan_table) = tableNumberIsOpen table.table_number
+
let fileNameToTableNumber (fileName: string) = //Takes a file name for a floorplan table and returns the table number
if fileName.Contains ".table" then
let fileName = (fileName.Split ".").[0]
@@ -105,15 +107,14 @@ let tablesInRoom (roomId: int) = //Get a list of all tables in a particular room
|> db.Select
-
let getActiveTables (venueId: int) =
select{
table "floorplan_tables"
where (eq "venue_id" venueId)
}
|> db.Select
- |> Array.map getTableNumber
|> Array.filter tableIsOpen
+ |> Array.map (fun table -> table.table_number)
let openNewTable tableNumber = //Create a new table file pre-populated with skeleton data
let tableFile = getTableFile tableNumber
@@ -128,10 +129,10 @@ let transferTable origin destination = //Transfers a table from one to another
let originFile = getTableFile origin
let destinationFile = getTableFile destination
- if tableIsOpen origin then
+ if tableNumberIsOpen origin then
(* If the destination is not an already open table,
then we simply have to rename the origin to destination *)
- if not <| tableIsOpen destination then
+ if not <| tableNumberIsOpen destination then
let content = File.ReadAllText originFile
let newContent = content.Replace($"number=\"{origin|>string}\">", $"number=\"{destination|>string}\">")
File.WriteAllText(originFile, newContent)
@@ -159,10 +160,18 @@ let getTable (tableNumber : int) =
|> db.Select
|> first
+let getTableById (id : int) =
+ select {
+ table "floorplan_tables"
+ where (eq "id" id)
+ }
+ |> db.Select
+ |> first
+
let getRoom (roomId: int) =
select {
table "floorplan_rooms"
- where (eq "room_id" roomId)
+ where (eq "id" roomId)
} |> db.Select |> first
let getRoomList (venueId: int) =
@@ -172,6 +181,7 @@ let getRoomList (venueId: int) =
} |> 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"
let parameters = [("column", box column); ("value", box value); ("tableNumber", box tableNumber)]
db.connection.Execute(sql, parameters) |> ignore
@@ -185,25 +195,26 @@ let updateTableShape (floorplanTable: floorplan_table_shape) =
where (eq "table_number" floorplanTable.table_number + eq "venue_id" currentVenue)
} |> db.Update
-let updateTablePosition (floorplanTable: floorplan_table_transform) =
+
+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 createEmptyReservation tableNumber covers =
- let table = getTable tableNumber
- let status = if table.status = "" then "reserved" else table.status
-
- //let res = newReservation "" 0 covers
-
- update{
+let createEmptyReservation (reservation: reservation) =
+ update {
table "floorplan_tables"
- set {| status = status |}
- where(eq "table_number" tableNumber)
+ set {| status = 2 |}
+ where(eq "id" reservation.reservation_table_id)
} |> db.Update |> ignore
+ insert{
+ table "reservations"
+ value reservation
+ } |> db.InsertOutput |> first
+
let getChildTables tableNumber =
@@ -217,7 +228,7 @@ let matchTable (tableNumberToMatch: int) (floorplanTableToCheck: floorplan_table
let findChildTable (childTable: int) (parentTable: floorplan_table) =
let json = parentTable.merged_children
- let childTables = json |> Decode.fromString(Decode.array floorplan_table_decoder)
+ let childTables = json |> Decode.Auto.fromString
let matchedTables =
match childTables with
@@ -262,16 +273,24 @@ let tableExists (tableNumber: int) =
language.getAndReplace "error_table_exists" [room.room_name]
-let addNewTable newTable =
- if tableExists newTable.table_number = "False" then
- insert{
- table "floorplan_tables"
- value newTable
- } |> db.Insert |> ignore
- true
- else false
+let addNewTableWithoutOutput (newTable: floorplan_table) =
+ insert{
+ table "floorplan_tables"
+ value newTable
+ }
+ |> db.Insert
-let deleteTable tableNumber =
+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)
@@ -342,7 +361,7 @@ let updateUnmergedTables parentTable childTable =
where(eq "table_number" parentTable.table_number + eq "venue_id" currentVenue)
} |> db.Update |> ignore
- addNewTable childTable |> ignore
+ addNewTableWithoutOutput childTable |> ignore
true
let processUnmerge originalTable unmergedChild =
@@ -354,25 +373,35 @@ let processUnmerge originalTable unmergedChild =
let unmergeTable tableNumber = //Separates a merged table into itself and the last table merged into it.
let currentTable = getTable tableNumber
- let mergedChildren = currentTable.merged_children |> Decode.fromString(Decode.list floorplan_table_decoder)
+ let mergedChildren = currentTable.merged_children |> Decode.Auto.fromString
match mergedChildren with
| Ok listOfChildTables ->
- let unmergedChild = listOfChildTables |> List.last
- processUnmerge currentTable unmergedChild
- | Error _ -> false
+ let unmergedChild = listOfChildTables |> last
+ processUnmerge currentTable unmergedChild |> ignore
+ Some (getTable currentTable.table_number, unmergedChild)
+ | Error _ -> None
let convertRoomListToLinks (room: floorplan_room) =
let vars = map [
- "roomId", room.room_id |> string
+ "roomId", room.id |> string
"roomName", room.room_name
]
Theme.loadTemplateWithVars "roomButton" vars
+let getReservationList (tableList: floorplan_table[]) =
+ let tableIds =
+ tableList
+ |> Array.map(fun table -> table.id)
+ |> JoinArray ","
+
+ db.connection.Query($"""Select * From reservations Where reservation_table_id In ({tableIds})""")
+ |> EnumerableToArray
+
let newReservation name time covers =
let reservation = {
- reservation_id = 0
+ id = 0
reservation_name = name
reservation_time = time
reservation_covers = covers
@@ -385,12 +414,12 @@ let newReservation name time covers =
value reservation
} |> db.Insert
-let unReserveTable tableNumber =
- let table = getTable tableNumber
- DeleteReservation table.table_id
- if table.status = "reserved" then
- update {
- table "floorplan_tables"
- set {| status = "" ; reservation_id = 0 |}
- } |> db.Update |> ignore
+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
diff --git a/GenericEntities.module.fs b/GenericEntities.module.fs
new file mode 100644
index 0000000..d2badc2
--- /dev/null
+++ b/GenericEntities.module.fs
@@ -0,0 +1 @@
+module GenericEntities
diff --git a/Program.fs b/Program.fs
index 0a6dea3..bba4273 100644
--- a/Program.fs
+++ b/Program.fs
@@ -1,6 +1,7 @@
namespace WebApplication
open Clerk
+open Floorplan
open Microsoft.AspNetCore.Http
open Microsoft.AspNetCore.Mvc.RazorPages
open Microsoft.Extensions.Hosting;
@@ -23,25 +24,28 @@ module Program =
post "/authenticateClerk" (bindJson (handlePostRoute AjaxController.loginWithLoginCode) )
post "/getTableData" (bindJson AjaxController.getTableData)
post "/updateTableShape" (bindJson AjaxController.updateTableShape)
- post "/transformTable" (bindJson AjaxController.transformTable)
+ post "/transformTable" (bindJson AjaxController.transformTable)
post "/createTable" (bindJson AjaxController.createTable)
- post "/addDecoration" (bindJson AjaxController.AddDecoration)
+ post "/addDecoration" (bindJson AjaxController.AddDecoration)
post "/updateDecoration" (bindJson AjaxController.UpdateDecoration)
- post "/deleteDecoration" (bindJson AjaxController.DeleteDecoration)
- post "/newEmptyReservation" (bindJson AjaxController.newEmptyReservation)
+ 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 (fun tableNumber -> json <| Floorplan.unReserveTable tableNumber) )
+ post "/unreserveTable" (bindJson AjaxController.unreserveTable )
getf "/getRoomData/%i" AjaxController.getRoomData
+ getf "/getKeyboardLayout/%s" AjaxController.getKeyboardLayout
getf "/getTablesAndDecorations/%i" AjaxController.getRoomTablesAndDecorations
get "/languageVars" (json <| AjaxController.getLanguageVars)
get "/getOpenTables" (json <| Floorplan.getActiveTables Floorplan.currentVenue)
getf "/getActiveTables/%i" AjaxController.getActiveTables
- getf "/tableIsOpen/%i" (fun tableNumber -> json <| Floorplan.tableIsOpen tableNumber)
- getf "/transferTables/%i/%i" AjaxController.transferTable
- getf "/mergeTables/%i/%i" AjaxController.mergeTables
+ 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)
- getf "/deleteTable/%i" (fun tableNumber -> json <| Floorplan.deleteTable tableNumber)
}
let pageRouter = router {
@@ -56,6 +60,7 @@ module Program =
let app = application {
use_static "wwwroot"
use_router pageRouter
+
}
run app
diff --git a/Reservations.module.fs b/Reservations.module.fs
index f58c9f5..c161ae1 100644
--- a/Reservations.module.fs
+++ b/Reservations.module.fs
@@ -3,9 +3,9 @@
open System
open DredgeFramework
open Dapper.FSharp
-
+[]
type reservation = {
- reservation_id: int
+ id: int
reservation_name: string
reservation_time: int
reservation_covers: int
@@ -16,13 +16,21 @@ type reservation = {
let GetReservationById (id: int) =
select {
table "reservations"
- where (eq "reservation_id" id)
+ where (eq "id" id)
}
|> db.Select
|> first
+let updateReservation (reservation: reservation) =
+ update{
+ table "reservations"
+ set reservation
+ where(eq "id" reservation.id)
+ } |> db.Update |> ignore
+ reservation
+
let DeleteReservation (tableId: int) =
delete {
table "reservations"
- where (eq "table_id" tableId)
+ where (eq "reservation_table_id" tableId)
} |> db.Delete |> ignore
\ No newline at end of file
diff --git a/Session.module.fs b/Session.module.fs
index 62e8e5c..674dbc0 100644
--- a/Session.module.fs
+++ b/Session.module.fs
@@ -6,7 +6,8 @@ open Dapper.FSharp
open Clerk
open Thoth.Json.Net
-type session = {session_id: string; clerk_json: string; clerk_id: int; expires: int}
+[]
+type session = {id: int; session_id: string; clerk_json: string; clerk_id: int; expires: int}
let deleteSession sessionId context =
delete {
@@ -25,19 +26,22 @@ let deleteSessionByClerkId clerk_id context =
let createNewSession (clerk: clerk) context =
if (getClerkByLoginCode clerk.clerk_login_code).IsSome then
- deleteSessionByClerkId clerk.clerk_id context
+ deleteSessionByClerkId clerk.id context
let newSessionId = (Guid.NewGuid().ToString "N") + (Guid.NewGuid().ToString "N")
- let newSession = { session_id = newSessionId
+ let newSession = {
+ id = 0
+ session_id = newSessionId
clerk_json = clerk |> jsonEncode
- clerk_id = clerk.clerk_id
+ clerk_id = clerk.id
expires = int <| DateTimeOffset.Now.AddHours(24.0).ToUnixTimeSeconds()
}
-
insert {
table "sessions"
value newSession
- } |> db.Insert |> ignore
+ }
+ |> db.Insert
+ |> ignore
Browser.setCookie "dredgepos_clerk_logged_in" newSessionId (DateTimeOffset.UtcNow.AddHours(24.0)) context
@@ -63,7 +67,7 @@ let sessionExists (sessionId: string) context =
let checkAuthentication clerk =
let existingClerk = getClerkByLoginCode clerk.clerk_login_code
if existingClerk.IsSome
- && existingClerk.Value.clerk_id = clerk.clerk_id
+ && existingClerk.Value.id = clerk.id
&& existingClerk.Value.clerk_name = clerk.clerk_name
&& existingClerk.Value.clerk_login_code = clerk.clerk_login_code
then true
@@ -79,12 +83,12 @@ let getSession (sessionId: string) =
} |> db.Select
match sessions |> length with
- | 0 -> {session_id = ""; clerk_json = ""; clerk_id= 0; expires= 0}
+ | 0 -> {session_id = ""; clerk_json = ""; clerk_id= 0; expires= 0; id=0}
| _ -> sessions |> first
let getCurrentClerk context =
let cookie = getLoginCookie context
- let emptyClerk = {clerk_id=0; clerk_login_code=0; clerk_usergroup=0; clerk_name=""}
+ let emptyClerk = {id=0; clerk_login_code=0; clerk_usergroup=0; clerk_name=""}
match cookie with
| "" ->
Browser.redirect "/login" context
diff --git a/bin/Debug/net6.0/DredgePos.dll b/bin/Debug/net6.0/DredgePos.dll
index f5f221f..e866682 100644
Binary files a/bin/Debug/net6.0/DredgePos.dll and b/bin/Debug/net6.0/DredgePos.dll differ
diff --git a/bin/Debug/net6.0/DredgePos.pdb b/bin/Debug/net6.0/DredgePos.pdb
index 7d767ea..dbb1f8f 100644
Binary files a/bin/Debug/net6.0/DredgePos.pdb and b/bin/Debug/net6.0/DredgePos.pdb differ
diff --git a/bin/Debug/net6.0/site.map b/bin/Debug/net6.0/site.map
index 83f96fd..c1320de 100644
--- a/bin/Debug/net6.0/site.map
+++ b/bin/Debug/net6.0/site.map
@@ -7,7 +7,6 @@
/ajax/getActiveTables/%i, GET,
/ajax/tableIsOpen/%i, GET,
/ajax/tableExists/%i, GET,
-/ajax/deleteTable/%i, GET,
/ajax/authenticateClerk, POST,
/ajax/getTableData, POST,
/ajax/updateTableShape, POST,
@@ -16,7 +15,10 @@
/ajax/addDecoration, POST,
/ajax/updateDecoration, POST,
/ajax/deleteDecoration, POST,
+/ajax/deleteTable, POST,
+/ajax/mergeTables, POST,
/ajax/newEmptyReservation, POST,
+/ajax/updateReservation, POST,
/ajax/getReservation, POST,
/ajax/unreserveTable, POST,
, NotFoundHandler,
\ No newline at end of file
diff --git a/bin/Debug/net6.0/wwwroot/languages/english/keyboardlayout.json b/bin/Debug/net6.0/wwwroot/languages/english/keyboardlayout.json
index 7613c07..07d54e9 100644
--- a/bin/Debug/net6.0/wwwroot/languages/english/keyboardlayout.json
+++ b/bin/Debug/net6.0/wwwroot/languages/english/keyboardlayout.json
@@ -117,10 +117,10 @@
"<",
">",
"?"
- ],
+ ],
"row5": [
"[space]space"
- ],
+ ],
"row5_shift": [
"[space] "
]
diff --git a/bin/Debug/net6.0/wwwroot/languages/english/main.json b/bin/Debug/net6.0/wwwroot/languages/english/main.json
index 3546af1..a1fa358 100644
--- a/bin/Debug/net6.0/wwwroot/languages/english/main.json
+++ b/bin/Debug/net6.0/wwwroot/languages/english/main.json
@@ -14,7 +14,7 @@
"logged_in_as":"Logged in as [1]",
"covers":"[1] Covers",
"selected_cover":"Cover [1]",
- "activeTable":"Table [1]",
+ "active_table":"Table [1]",
"totalPrice":"Total Price: [1]",
"selectedPrice":"([1] Selected)",
"next_page":"Next Page",
@@ -60,7 +60,8 @@
"delete_table":"Delete Table",
"change_shape":"Change Shape",
"new_table_number":"New Table Number",
- "transfer_table":"Transfer to New Table",
+ "transfer_table":"Transfer to Other Table",
+ "transfer_self_error":"Cannot transfer a table to itself.",
"add_decoration":"Add Decoration",
"choose_decoration":"Choose a Decoration",
"delete_decoration":"Delete Decoration",
@@ -68,9 +69,11 @@
"reserved_for":"Reserved for [1]",
"reserved":"Reserved",
"confirm_delete_reservation":"Are you sure you want to delete the reservation on table [1]?",
+ "confirm_reservation_name":"Who is this reservation for?",
"error_table_exists":"Table already exists in room \"[1]\"",
"error_table_exists_merged":"Table already exists in room \"[1]\", it is merged with table [2].",
"error_delete_existing_table":"Can't delete a table that's currently active.",
+ "error_self_merge" : "You can't merge a table with itself",
"confirm_delete_table":"Are you sure you want to delete table [1]?",
"orig_qty_header":"Original Qty",
"selected_qty_header":"Selected Qty",
diff --git a/obj/Debug/net6.0/DredgePos.dll b/obj/Debug/net6.0/DredgePos.dll
index f5f221f..e866682 100644
Binary files a/obj/Debug/net6.0/DredgePos.dll and b/obj/Debug/net6.0/DredgePos.dll differ
diff --git a/obj/Debug/net6.0/DredgePos.fsproj.CoreCompileInputs.cache b/obj/Debug/net6.0/DredgePos.fsproj.CoreCompileInputs.cache
index 002c746..739d1ed 100644
--- a/obj/Debug/net6.0/DredgePos.fsproj.CoreCompileInputs.cache
+++ b/obj/Debug/net6.0/DredgePos.fsproj.CoreCompileInputs.cache
@@ -1 +1 @@
-4ce3c2bb1d8bbd35c1b58d110118bb059ac6cd85
+6de23b71f021bbbc1f858685dc5809960956a0bb
diff --git a/obj/Debug/net6.0/DredgePos.fsprojAssemblyReference.cache b/obj/Debug/net6.0/DredgePos.fsprojAssemblyReference.cache
index ad8425d..edad874 100644
Binary files a/obj/Debug/net6.0/DredgePos.fsprojAssemblyReference.cache and b/obj/Debug/net6.0/DredgePos.fsprojAssemblyReference.cache differ
diff --git a/obj/Debug/net6.0/DredgePos.pdb b/obj/Debug/net6.0/DredgePos.pdb
index 7d767ea..dbb1f8f 100644
Binary files a/obj/Debug/net6.0/DredgePos.pdb and b/obj/Debug/net6.0/DredgePos.pdb differ
diff --git a/wwwroot/languages/english/keyboardLayout.json b/wwwroot/languages/english/keyboardLayout.json
index 7613c07..07d54e9 100644
--- a/wwwroot/languages/english/keyboardLayout.json
+++ b/wwwroot/languages/english/keyboardLayout.json
@@ -117,10 +117,10 @@
"<",
">",
"?"
- ],
+ ],
"row5": [
"[space]space"
- ],
+ ],
"row5_shift": [
"[space] "
]
diff --git a/wwwroot/languages/english/main.json b/wwwroot/languages/english/main.json
index 3546af1..a1fa358 100644
--- a/wwwroot/languages/english/main.json
+++ b/wwwroot/languages/english/main.json
@@ -14,7 +14,7 @@
"logged_in_as":"Logged in as [1]",
"covers":"[1] Covers",
"selected_cover":"Cover [1]",
- "activeTable":"Table [1]",
+ "active_table":"Table [1]",
"totalPrice":"Total Price: [1]",
"selectedPrice":"([1] Selected)",
"next_page":"Next Page",
@@ -60,7 +60,8 @@
"delete_table":"Delete Table",
"change_shape":"Change Shape",
"new_table_number":"New Table Number",
- "transfer_table":"Transfer to New Table",
+ "transfer_table":"Transfer to Other Table",
+ "transfer_self_error":"Cannot transfer a table to itself.",
"add_decoration":"Add Decoration",
"choose_decoration":"Choose a Decoration",
"delete_decoration":"Delete Decoration",
@@ -68,9 +69,11 @@
"reserved_for":"Reserved for [1]",
"reserved":"Reserved",
"confirm_delete_reservation":"Are you sure you want to delete the reservation on table [1]?",
+ "confirm_reservation_name":"Who is this reservation for?",
"error_table_exists":"Table already exists in room \"[1]\"",
"error_table_exists_merged":"Table already exists in room \"[1]\", it is merged with table [2].",
"error_delete_existing_table":"Can't delete a table that's currently active.",
+ "error_self_merge" : "You can't merge a table with itself",
"confirm_delete_table":"Are you sure you want to delete table [1]?",
"orig_qty_header":"Original Qty",
"selected_qty_header":"Selected Qty",
diff --git a/wwwroot/scripts/js/dredgepos.core.js b/wwwroot/scripts/js/dredgepos.core.js
index d71c222..8d9c851 100644
--- a/wwwroot/scripts/js/dredgepos.core.js
+++ b/wwwroot/scripts/js/dredgepos.core.js
@@ -1,11 +1,11 @@
let Application = {
keyboard: null,
- mode: "default",
+ mode: [],
languageVars: {}
};
/** Parses a language variable. */
let lang = (key, replacements) => {
- let finalValue = Application.languageVars[key];
+ let finalValue = Application.languageVars[key] || '';
if (!replacements)
return finalValue;
if (typeof replacements === 'string')
@@ -28,16 +28,19 @@ let ajax = (endpoint, data, method = 'POST', successFunction, errorFunction, bef
method: method,
data: data,
success: (response) => {
- if (successFunction)
+ if (successFunction && response.status == 'success')
successFunction(JSON.parse(response.data));
+ else if (errorFunction && response.status != 'success') {
+ errorFunction(JSON.parse(response.data));
+ }
},
- error: errorFunction,
+ error: (error) => console.log(error.statusCode),
beforeSend: beforeFunction
});
};
/*
For the flow of the app, synchronous is commonly preferred
- though trying to keep it's usage as low as possible.
+ though trying to keep its usage as low as possible.
*/
let ajaxSync = (endpoint, data, method = 'POST') => {
let response = JSON.parse($.ajax({
@@ -56,11 +59,14 @@ let ajaxSync = (endpoint, data, method = 'POST') => {
let redirect = (url) => {
window.location.href = url;
};
-let setLanguageVariables = () => {
- Application.languageVars = ajaxSync('/ajax/languageVars', null, 'GET');
+let setupCore = (languageVars) => {
+ Application.languageVars = languageVars;
+ const doc = $(document);
+ doc.on('click', '#alertNo, #alertOk', hideAlerts);
+ setElementVisibilityByMode();
};
// @ts-ignore
-let alert = (message, title = 'Message') => {
+let posAlert = (message, title = 'Message') => {
let alertBox = $('#alert');
alertBox.css('display', 'flex');
alertBox.data('value', '');
@@ -70,12 +76,11 @@ let alert = (message, title = 'Message') => {
$('#alertYes').css('display', 'none');
$('#alertNo').css('display', 'none');
};
-// @ts-ignore
-let confirm = (message, data, title = 'Confirm', submitFunction = (data) => { hideAlerts(); }) => {
+let confirmation = (message, data, title = 'Confirm', submitFunction = (data) => { hideAlerts(); }) => {
let alert = $('#alert');
$(document).on('click', '#alert #alertYes', () => {
- submitFunction(data);
hideAlerts();
+ submitFunction(data);
$(document).off('click', '#alert #alertYes');
});
alert.css('display', 'flex');
@@ -85,12 +90,58 @@ let confirm = (message, data, title = 'Confirm', submitFunction = (data) => { hi
$('#alertYes').css('display', 'flex');
$('#alertNo').css('display', 'flex');
};
-let hideAlerts = () => {
- $('#alert').hide();
+let hideAlerts = () => $('#alert').hide();
+let turnOnMode = (mode) => {
+ Application.mode.push(mode);
+ setElementVisibilityByMode();
};
-$(() => {
- let doc = $(document);
- setLanguageVariables();
- doc.on('click', '#alertNo, #alertOk', () => $('#alert').hide());
-});
+let turnOffMode = (mode) => {
+ Application.mode = Application.mode.filter((value) => value != mode);
+ setElementVisibilityByMode();
+};
+let toggleMode = (mode) => {
+ if (!isInMode(mode))
+ turnOnMode(mode);
+ else
+ turnOffMode(mode);
+};
+let clearModes = () => { Application.mode = []; };
+let isInMode = (mode) => Application.mode.includes(mode);
+let setElementVisibilityByMode = () => {
+ const mode = Application.mode;
+ const elements = $('[data-visible-in-mode]');
+ elements.each((index, elem) => {
+ let element = $(elem);
+ let visibleInModes = element.data('visible-in-mode');
+ let showElement = visibleInModes.every(visibleMode => {
+ return mode.includes(visibleMode);
+ });
+ if (element.hasClass('useVisibility')) {
+ if (showElement) {
+ element.css('visibility', 'visible');
+ }
+ else
+ element.css('visibility', 'hidden');
+ }
+ else
+ element.toggle(showElement);
+ });
+ const invisibleElements = $('[data-invisible-in-mode]');
+ invisibleElements.each((index, elem) => {
+ let element = $(elem);
+ let inVisibleInModes = element.data('invisible-in-mode');
+ let hideElement = inVisibleInModes.every(invisibleMode => {
+ return mode.includes(invisibleMode);
+ });
+ element.toggle(!hideElement);
+ });
+ $('[data-active-in-mode]').each((index, elem) => {
+ const button = $(elem);
+ const activeInMode = button.data('active-in-mode');
+ mode.includes(activeInMode)
+ ? button.addClass('active')
+ : button.removeClass('active');
+ });
+};
+$(() => ajax('/ajax/languageVars', null, 'GET', setupCore, null, null));
//# sourceMappingURL=dredgepos.core.js.map
\ No newline at end of file
diff --git a/wwwroot/scripts/js/dredgepos.core.js.map b/wwwroot/scripts/js/dredgepos.core.js.map
index 528d941..77a1276 100644
--- a/wwwroot/scripts/js/dredgepos.core.js.map
+++ b/wwwroot/scripts/js/dredgepos.core.js.map
@@ -1 +1 @@
-{"version":3,"file":"dredgepos.core.js","sourceRoot":"","sources":["../ts/dredgepos.core.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"dredgepos.core.js","sourceRoot":"","sources":["../ts/dredgepos.core.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/wwwroot/scripts/js/dredgepos.floorplan.js b/wwwroot/scripts/js/dredgepos.floorplan.js
index 734010a..991d481 100644
--- a/wwwroot/scripts/js/dredgepos.floorplan.js
+++ b/wwwroot/scripts/js/dredgepos.floorplan.js
@@ -1,301 +1,107 @@
///
-let stage;
-let transformer;
-let tableLayer;
-let editMode = false;
-let activeTables = [];
-let selectedTable;
-let selectedTableNumber;
-let currentRoom;
-let basis = 1280;
-let scale = 1;
-let newTable;
-let roomName;
-//Makes sure canvas always fits inside the div
-function getDimensions(parentDiv) {
- let tableMap = $('#tableMap');
- let outerWidth = parentDiv.outerWidth();
- let outerHeight = parentDiv.outerHeight();
- let width = outerWidth;
- let height = outerWidth;
- if (outerWidth >= outerHeight) {
- width = outerHeight;
- height = outerHeight;
- }
- tableMap.height(height);
- tableMap.width(width);
- scale = width / basis;
- return { width: width, height: height };
-}
-function setupTableMap() {
- let doc = $(document);
- activeTables = ajaxSync('/ajax/getActiveTables/1', null, 'GET');
- let dimensions = getDimensions($('#mapContainer'));
- roomName = 'Deck & Courtyard';
- stage = new Konva.Stage({
- container: 'tableMap',
- width: dimensions.width,
- height: dimensions.height,
- });
- $('body').on('click', '.editModeButton', () => { toggleEditMode(); });
- $('.roomButton').on('click', function () {
- roomName = $(this).text();
- loadRoom($(this).data('value'));
- });
- $('.transferTableButton').on('click', function () {
- transferModeOn();
- });
- $('.addDecoration').on('click', function () {
- $('#decorator').css('display', 'flex');
- });
- $('.deleteDecoration').on('click', function () {
- deleteDecoration(selectedDecoration);
- });
- $('.decoratorItem').on('click', function () {
- addDecoration(this);
- });
- $('.changeShapeButton').on('click', function () {
- changeTableShape(selectedTableNumber);
- });
- $('.reserveTableButton').on('click', function () {
- if ($(this).text() === lang('reserve_table')) {
- reserveTable();
+const Floorplan = {
+ rooms: [],
+ tables: [],
+ decorations: [],
+ reservations: [],
+ activeTableNumbers: [],
+ stage: null,
+ transformer: null,
+ tableLayer: null,
+ selectedTableNumber: 0,
+ currentRoom: null,
+ roomToLoad: null,
+ visualScale: 1,
+ visualScaleBasis: 1280,
+ floorplanDiv: null,
+ selectedDecorationId: 0
+};
+$(() => ajax('/ajax/getFloorplanData/1', null, 'get', setupFloorplan, null, null));
+const setupFloorplanEvents = () => {
+ const doc = $(document);
+ doc.on('click', '.roomButton', roomButtonClicked);
+ doc.on('click', '.editModeButton', editModeButtonClicked);
+ doc.on('click', '.changeShapeButton', changeTableShape);
+ doc.on('click', '.addTableButton', showAddTablePopup);
+ doc.on('click', '.deleteTableButton', confirmDeleteTable);
+ doc.on('click', '.addDecoration', showDecorator);
+ doc.on('click', '.deleteDecoration', deleteDecoration);
+ doc.on('click', '.decoratorItem', addDecoration);
+ doc.on('click', '.mergeButton', toggleMergeMode);
+ doc.on('click', '.unmergeButton', unmergeTable);
+ doc.on('click', '.transferTableButton', toggleTransferMode);
+ doc.on('click', '.reserveTableButton', reserveTable);
+ doc.on('click', '.unreserveTableButton', unreserveTable);
+};
+const roomButtonClicked = (e) => {
+ const button = $(e.target);
+ const roomId = button.data('value');
+ loadRoom(getRoomById(roomId));
+};
+const editModeButtonClicked = (e) => {
+ const button = $(e.target);
+ button.toggleClass('active');
+ toggleMode('edit');
+ if (isInMode('edit')) {
+ Floorplan.stage.find('Group, Image').forEach(table => table.draggable(true));
+ if (isInMode('tableSelected')) {
+ const selectedTableShape = getTableShapeFromTableNumber(Floorplan.selectedTableNumber);
+ selectTable(selectedTableShape);
}
- else {
- unreserveTable();
- }
- });
- $('.addTableButton').on('click', function () {
- addTable();
- });
- $('.deleteTableButton').on('click', function () {
- deleteTable();
- });
- loadRoom(roomToLoad);
-}
-let updateTableShape = (tableData) => {
- return ajaxSync('/ajax/updateTableShape', tableData);
-};
-//Change the shape of a table in edit mode.
-function changeTableShape(tableNumber) {
- let tableData = getTableData(tableNumber);
- let tableShape = tableData['shape'];
- let tableWidth = tableData['width'];
- let tableHeight = tableData['height'];
- let tableRotation = tableData['rotation'];
- let order = ['square', 'rect', 'longrect', 'diamond', 'circle', 'ellipse', 'longellipse'];
- if (order.indexOf(tableShape) === -1)
- tableShape = 'square';
- //What the next shape is
- let currentIndex = order.indexOf(tableShape);
- let nextIndex = currentIndex + 1;
- if (nextIndex > (order.length) - 1)
- nextIndex = 0;
- let nextShape = order[nextIndex];
- switch (nextShape) {
- case 'square':
- case 'circle':
- tableHeight = tableWidth;
- tableRotation = 0;
- break;
- case 'diamond':
- tableHeight = tableWidth;
- tableRotation = 45;
- break;
- case 'rect':
- case 'ellipse':
- tableHeight = tableWidth * 2;
- tableRotation = 0;
- break;
- case 'longrect':
- case 'longellipse':
- tableRotation = 90;
- break;
- }
- let updateData = {
- table_number: tableNumber,
- shape: nextShape,
- height: tableHeight,
- width: tableWidth,
- rotation: tableRotation
- };
- tableData = updateTableShape(updateData);
- let tableGroup = stage.find('#' + tableNumber)[0];
- transformer.nodes([]);
- tableGroup.destroy();
- let newTable = createTableElement(tableData);
- tableLayer.add(newTable);
- stage.draw();
- selectTable(tableNumber);
- loadRoom(currentRoom, tableNumber);
-}
-let createTable = (tableData) => {
- return ajaxSync('/ajax/createTable', tableData);
-};
-let tableExists = (tableNumber) => {
- return ajaxSync(`/ajax/tableExists/${tableNumber}`);
-};
-function addTable(tableNumber) {
- if (!tableNumber) {
- showVirtualNumpad(lang('new_table_number'), 4, false, false, true, addTable);
}
else {
- let newTableInfo = {
- table_number: tableNumber,
- room_id: currentRoom,
- default_covers: 2,
- width: 200,
- height: 200,
- rotation: 0,
- pos_x: basis / 2,
- pos_y: basis / 2,
- shape: 'square',
- merged_children: '',
- previous_state: '',
- status: 0,
- reservation: 0,
- venue_id: 1
- };
- let newTableData = createTable(newTableInfo);
- if (!newTableData.table_number) {
- alert(newTableData);
- return false;
- }
- newTable = createTableElement(newTableData);
- tableLayer.add(newTable);
- tableLayer.draw();
- selectTable(tableNumber);
+ setTransformerNodes([]);
+ Floorplan.stage.find('Group, Image').forEach(table => table.draggable(false));
}
-}
-function selectTable(tableNumber) {
- let table = stage.find('#' + tableNumber)[0];
- table.fire('click');
-}
-function deleteTable(tableNumber = 0) {
- if (!tableNumber) {
- confirm(lang('confirm_delete_table', selectedTableNumber), selectedTableNumber, 'Confirm', deleteTable);
- }
- else {
- if (tableIsOpen(selectedTableNumber)) {
- alert(lang('error_delete_existing_table'));
- }
- else {
- ajax(`/ajax/deleteTable/${selectedTableNumber}`, null, 'GET');
- let table = stage.find('#' + tableNumber)[0];
- transformer.nodes([]);
- table.destroy();
- tableLayer.draw();
- selectedTable = null;
- selectedTableNumber = null;
- }
- }
-}
-// Rotate a shape around any point.
-// shape is a Konva shape
-// angleDegrees is the angle to rotate by, in degrees.
-// point is an object {x: posX, y: posY}
-function rotateAroundPoint(shape, angleDegrees, point) {
- let angleRadians = angleDegrees * Math.PI / 180;
- // they lied, I did have to use trigonometry
- const x = point.x +
- (shape.x() - point.x) * Math.cos(angleRadians) -
- (shape.y() - point.y) * Math.sin(angleRadians);
- const y = point.y +
- (shape.x() - point.x) * Math.sin(angleRadians) +
- (shape.y() - point.y) * Math.cos(angleRadians);
- shape.rotation(shape.rotation() + angleDegrees); // rotate the shape in place
- shape.x(x); // move the rotated shape in relation to the rotation point.
- shape.y(y);
-}
-function createDecoration(data, idToSelect = false) {
- let draggable = editMode;
- var decoration = new Image();
- decoration.onload = function () {
- var dec = new Konva.Image({
- id: data.decoration_id.toString(),
- x: data.decoration_pos_x * scale,
- y: data.decoration_pos_y * scale,
- image: decoration,
- offsetX: data.decoration_width * 0.5 * scale,
- offsetY: data.decoration_height * 0.5 * scale,
- rotation: data.decoration_rotation,
- width: data.decoration_width * scale,
- height: data.decoration_height * scale,
- draggable: draggable,
- });
- if (editMode && dec.id() === idToSelect) {
- transformer.nodes([dec]);
- transformer.moveToTop();
- }
- dec.on('click', function () {
- selectDecoration(this);
- });
- dec.on('tap', function () {
- selectDecoration(this);
- });
- dec.on('dragend', function () {
- saveDecTransformation(this);
- });
- dec.on('transformend', function () {
- saveDecTransformation(this);
- });
- // add the shape to the layer
- tableLayer.add(dec);
- tableLayer.draw();
- dec.moveToBottom();
- };
- decoration.src = 'images/decorations/' + data.decoration_image;
- return decoration;
-}
-var selectedDecoration = false;
-function selectDecoration(decoration) {
- if (editMode) {
- if ((transformer.nodes().length > 0 && transformer.nodes()[0] != decoration) || transformer.nodes().length == 0) {
- resetActiveTable();
- transformer.nodes([decoration]);
- decoration.moveToTop();
- transformer.moveToTop();
- selectedDecoration = decoration;
- toggleFloorplanControls();
- }
- else {
- transformer.nodes([]);
- selectedDecoration = false;
- $('.deleteDecoration').css('display', 'none');
- }
- }
-}
-function createTableElement(data, selectTable = false) {
- // Create container group
- let draggable = editMode || newTable === data.table_number;
- let table = new Konva.Group({
- x: data.pos_x * scale,
- y: data.pos_y * scale,
+};
+const setupFloorplan = (floorplanData) => {
+ Floorplan.tables = floorplanData.tables;
+ Floorplan.activeTableNumbers = floorplanData.activeTableNumbers;
+ Floorplan.rooms = floorplanData.rooms;
+ Floorplan.decorations = floorplanData.decorations;
+ Floorplan.reservations = floorplanData.reservations;
+ getDimensions();
+ setupFloorplanEvents();
+ loadRoom(Floorplan.rooms[0]);
+};
+const loadRoom = (roomToLoad) => {
+ setRoomBackground(roomToLoad);
+ setupKonva();
+ const tablesInRoom = Floorplan.tables.filter(table => table.room_id == roomToLoad.id);
+ const decorationsInRoom = Floorplan.decorations.filter(decoration => decoration.decoration_room == roomToLoad.id);
+ decorationsInRoom.forEach(decoration => createDecorationShape(decoration, false));
+ tablesInRoom.forEach(createTableShape);
+ Floorplan.currentRoom = roomToLoad;
+};
+const getRoomById = (roomId) => {
+ return Floorplan.rooms.find((room) => room.id == roomId);
+};
+const tableIsOpen = (table) => Floorplan.activeTableNumbers.includes(table.table_number);
+const createTableShape = (table) => {
+ const draggable = isInMode('edit');
+ const tableGroup = new Konva.Group({
+ x: table.pos_x * Floorplan.visualScale,
+ y: table.pos_y * Floorplan.visualScale,
draggable: draggable,
listening: true,
- id: data.table_number.toString()
+ id: table.table_number.toString()
});
- let fillColor = 'gray';
- if (data.status === 'reserved') {
- fillColor = 'lightgreen';
- }
- if (activeTables.includes(data.table_number)) {
- fillColor = 'lightblue';
- }
- data.width = data.width * scale;
- data.height = data.height * scale;
- // Create background shape
- let shape;
- switch (data.shape) {
+ const fillColor = tableIsOpen(table)
+ ? 'lightblue'
+ : table.status == 2
+ ? 'lightgreen'
+ : 'gray';
+ let tableShape;
+ switch (table.shape) {
case "circle": // fall-through
case "ellipse": // fall-through
case "longellipse":
- shape = new Konva.Ellipse({
+ tableShape = new Konva.Ellipse({
x: 0,
y: 0,
- radiusX: data.width * 0.5,
- radiusY: data.height * 0.5,
- rotation: data.rotation,
+ radiusX: table.width * 0.5 * Floorplan.visualScale,
+ radiusY: table.height * 0.5 * Floorplan.visualScale,
+ rotation: table.rotation,
fill: fillColor,
stroke: "black",
strokeWidth: 4,
@@ -304,14 +110,14 @@ function createTableElement(data, selectTable = false) {
});
break;
default:
- shape = new Konva.Rect({
+ tableShape = new Konva.Rect({
x: 0,
y: 0,
- offsetX: data.width * 0.5,
- offsetY: data.height * 0.5,
- width: data.width,
- height: data.height,
- rotation: data.rotation,
+ offsetX: table.width * 0.5 * Floorplan.visualScale,
+ offsetY: table.height * 0.5 * Floorplan.visualScale,
+ width: table.width * Floorplan.visualScale,
+ height: table.height * Floorplan.visualScale,
+ rotation: table.rotation,
fill: fillColor,
stroke: "black",
strokeWidth: 4,
@@ -319,466 +125,514 @@ function createTableElement(data, selectTable = false) {
listening: true
});
break;
- } // End switch
- // Create label
- let label = new Konva.Text({
- x: data.width * -0.5,
- y: data.height * -0.5,
- width: data.width,
- height: data.height,
- text: data.table_number.toString(),
- fontSize: 40 * scale,
+ }
+ const label = new Konva.Text({
+ x: table.width * -0.5 * Floorplan.visualScale,
+ y: table.height * -0.5 * Floorplan.visualScale,
+ width: table.width * Floorplan.visualScale,
+ height: table.height * Floorplan.visualScale,
+ text: table.table_number.toString(),
+ fontSize: 40 * Floorplan.visualScale,
fill: "black",
align: "center",
verticalAlign: "middle",
draggable: false,
listening: false
});
- tableNumber = data.tablenumber;
- table.add(shape, label);
- table.on('dblclick', function () {
- tableNumber = parseInt(getTableNumber(this));
- if (!editMode) {
- loadScreen('orderScreen', 'table=' + tableNumber);
- }
- });
- table.on('dbltap', function () {
- tableNumber = getTableNumber(this);
- loadScreen('orderScreen', 'table=' + tableNumber);
- });
- table.on('dragend', function () {
- saveTransformation(table);
- });
- innerShape = getTableShape(table);
- table.on('click', function () {
- selectTableShape(this);
- });
- table.on('tap', function () {
- selectTableShape(this);
- });
- innerShape.on('transformend', function () {
- saveTransformation(table);
- });
- // add the shape to the layer
- tableLayer.add(table);
- table.moveToTop();
- if (tableNumber === selectedTableNumber) {
- selectTable = table;
- }
- if (selectTable) {
- if (selectTable === tableNumber) {
- table.fire('click');
- }
- }
- return table;
-}
-function loadRoom(room, selectTable = 0, selectDecoration = false) {
- //if (room === currentRoom) return false
- ajax(`/ajax/getRoomData/${room}`, null, 'GET', (response) => {
- let floorplanDiv = $('#tableMap');
- let backgroundImage = response.background_image;
- floorplanDiv.css("background-image", `url(images/rooms/${backgroundImage})`);
- floorplanDiv.css("background-size", `${width}px ${height}px`);
- }, null, null);
- $('.roomButton').removeClass('active');
- let selector = ".roomButton:contains('" + roomName + "')";
- $(selector).addClass('active');
- currentRoom = room;
- resetActiveTable();
- stage.destroy();
- stage = new Konva.Stage({
- container: 'tableMap',
- width: width,
- height: height,
- });
- transformer = new Konva.Transformer({
- rotationSnaps: [0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180, 225, 270, -15, -30, -45, -60, -75, -90, -105, -120, -135, -150, -165, -180, -225, -270, 360, -360],
- anchorSize: 40 * scale,
- ignoreStroke: true,
- centeredScaling: true
- });
- let tablesAndDecorations = ajaxSync(`/ajax/getTablesAndDecorations/${room}`, null, 'GET');
- let decorations = tablesAndDecorations['decorations'];
- let tables = tablesAndDecorations['tables'];
- tableLayer = new Konva.Layer();
- tableLayer.add(transformer);
- // Loop data and call the creation method for each decoration/table.
- decorations.forEach(itemData => {
- createDecoration(itemData, selectDecoration);
- });
- tables.forEach(itemData => {
- tableLayer.add(createTableElement(itemData, selectTable));
- });
- activeTables = getOpenTables();
- stage.add(tableLayer);
-}
-var mergeMode = false;
-var parentMergeTable;
-var childMergeTable;
-var tableTransferOrigin;
-var transferMode = false;
-function transferModeOn() {
- mergeModeOff();
- if (!transferMode) {
- tableTransferOrigin = selectedTableNumber;
- transferMode = true;
- $('.transferTableButton').addClass('active');
- $('.transferTableButton').text('Select a table to transfer items to');
- }
- else {
- transferModeOff();
- }
-}
-function transferModeOff() {
- transferMode = false;
- $('.transferTableButton').removeClass('active');
- $('.transferTableButton').text(lang('transfer_table'));
-}
-let getOpenTables = () => {
- return ajaxSync('/ajax/getActiveTables/1', null, 'GET');
+ tableGroup.add(tableShape, label);
+ setupTableEvents(tableGroup);
+ Floorplan.tableLayer.add(tableGroup);
+ return tableGroup;
};
-let transferTableAjax = (origin, destination) => {
- ajax(`/ajax/transferTables/${origin}/${destination}`, null, 'GET');
+const setupTableEvents = (tableGroup) => {
+ const tableShape = getTableShapeFromGroup(tableGroup);
+ tableGroup.on('click', (e) => tableClicked(e.target));
+ tableGroup.on('tap', (e) => tableClicked(e.target));
+ tableGroup.on('dragend', (e) => saveTableTransformation(e.target));
+ tableShape.on('transformend', (e) => {
+ const group = getTableGroupFromShape(e.target);
+ saveTableTransformation(group);
+ });
};
-function transferTables() {
- destination = selectedTableNumber;
- origin = tableTransferOrigin;
- if (destination !== origin) {
- transferTableAjax(origin, destination);
- activeTables = getOpenTables();
- transferModeOff();
- getTableShape(selectedTable).fill('lightblue');
- getTableShape(getTableGroup(origin)).fill('gray');
- }
- else {
- alert("Can't transfer a table to itself.");
- transferModeOff();
- }
-}
-function mergeModeOn() {
- transferModeOff();
- if (!mergeMode) {
- mergeMode = true;
- $('.mergeButton').addClass('active');
- $('.mergeButton').text('Select a table to merge with Table ' + selectedTableNumber);
- parentMergeTable = selectedTableNumber;
- }
- else {
- mergeModeOff();
- }
-}
-function mergeModeOff() {
- mergeMode = false;
- $('.mergeButton').removeClass('active');
- $('.mergeButton').text(lang('merge_table'));
-}
-let ajaxMergeTables = (parent, child) => {
- return ajaxSync(`/ajax/mergeTables/${parent}/${child}`, null, 'GET');
+const getTableShapeFromGroup = (group) => group.getChildren()[0];
+const getTableGroupFromShape = (shape) => shape.parent;
+const saveTableTransformation = (tableGroup) => {
+ const originalTable = getTableDataFromGroup(tableGroup);
+ const tableShape = getTableShapeFromGroup(tableGroup);
+ const newTableInfo = {
+ table_number: originalTable.table_number,
+ previous_state: originalTable.previous_state,
+ merged_children: originalTable.merged_children,
+ id: originalTable.id,
+ width: Math.round(tableShape.scaleX() * tableShape.width() / Floorplan.visualScale),
+ height: Math.round(tableShape.scaleY() * tableShape.height() / Floorplan.visualScale),
+ pos_x: Math.round(tableGroup.x() / Floorplan.visualScale),
+ pos_y: Math.round(tableGroup.y() / Floorplan.visualScale),
+ rotation: Math.round(tableShape.rotation()),
+ room_id: originalTable.room_id,
+ status: originalTable.status,
+ venue_id: originalTable.venue_id,
+ shape: originalTable.shape,
+ default_covers: originalTable.default_covers,
+ };
+ saveTable(newTableInfo);
+ redrawTable(tableGroup);
};
-let ajaxUnmergeTable = (parent) => {
- return ajaxSync(`/ajax/unmergeTable/${parent}`, null, 'GET');
+const saveTable = (tableToUpdate) => {
+ const tables = Floorplan
+ .tables
+ .filter(table => {
+ return table.id != tableToUpdate.id;
+ });
+ tables.push(tableToUpdate);
+ Floorplan.tables = tables;
+ ajax("/ajax/transformTable", tableToUpdate, 'post', null, null, null);
};
-function mergeTables() {
- parentMergeTable = parseInt(parentMergeTable);
- childMergeTable = parseInt(childMergeTable);
- if (childMergeTable !== parentMergeTable) {
- let result = ajaxMergeTables(parentMergeTable, childMergeTable);
- mergeModeOff();
- loadRoom(currentRoom);
- newTable = getTableGroup(parentMergeTable);
- newTable.draggable(true);
- if (tableIsOpen(parentMergeTable)) {
- getTableShape(newTable).fill('lightblue');
- }
- }
- else {
- alert("Can't merge a table with itself!");
- mergeModeOff();
- }
-}
-//When a table is passed (a group of the shape plus the text), returns the number as string.
-function getTableNumber(tableGroup) {
- textItem = tableGroup.getChildren()[1];
- return textItem.getText();
-}
-function getTableGroup(tableNumber) {
- return stage.find('#' + tableNumber)[0];
-}
-function getTableShape(tableGroup) {
+const setTransformerNodes = (nodes) => {
+ Floorplan.transformer.moveToTop();
+ if (nodes.length < 1)
+ Floorplan.transformer.moveToBottom();
+ Floorplan.transformer.nodes(nodes);
+};
+const getTableDataFromTableNumber = (tableNumber) => {
+ return Floorplan.tables.filter(table => table.table_number == tableNumber)[0];
+};
+const getTableDataFromGroup = (tableGroup) => {
+ const tableNumber = tableGroup.attrs.id;
+ return Floorplan.tables.find(table => tableNumber == table.table_number);
+};
+const getTableDataFromShape = (tableShape) => getTableDataFromGroup(tableShape.parent);
+const getTableShapeFromTableNumber = (tableNumber) => {
+ const tableGroup = Floorplan.stage.find('Group').find((group) => {
+ return group.attrs.id == tableNumber;
+ });
return tableGroup.getChildren()[0];
-}
-function getReservation(id) {
- return ajaxSync('/ajax/getReservation', id);
-}
-//When a user selects a table.
-function selectTableShape(table) {
- let tableNumber = getTableNumber(table);
- let shape = getTableShape(table);
- let strokeColor = shape.stroke();
- selectedTable = table;
- selectedTableNumber = tableNumber;
- if (transferMode)
- transferTables();
- if (mergeMode) {
- childMergeTable = tableNumber;
- mergeTables();
- }
- else {
- //If table is not selected
- if (strokeColor !== "yellow") {
- let tableData = getTableData(selectedTableNumber);
- let coverNumberString = lang('covers', tableData.default_covers.toString());
- let tableString = '' + lang('activeTable', selectedTableNumber.toString()) + '';
- $('.reserveTableButton').text(lang('reserve_table'));
- if (tableData.status === 'reserved') {
- let reservation = getReservation(tableData.reservation_id);
- console.log(reservation);
- $('.reserveTableButton').text(lang('unreserve_table'));
- if (reservation.reservation_name) {
- reservationString = lang('reserved_for', reservation.reservation_name);
- }
- else {
- reservationString = lang('reserved');
- }
- tableString += '' + reservationString + '';
- }
- tableString += " (" + coverNumberString + ")";
- $('.currentTable').html(tableString);
- stage.find('Rect').forEach(function (rect, index) {
- rect.stroke("black");
- });
- stage.find('Ellipse').forEach(function (circ, index) {
- circ.stroke("black");
- });
- shape.stroke("yellow");
- toggleEditControls(true);
- if (editMode) {
- toggleFloorplanControls();
- $('.deleteDecoration').css('display', 'none');
- transformer.nodes([getTableShape(table)]);
- table.moveToTop();
- transformer.moveToTop();
- }
- tableLayer.draw();
- //If the table is already selected
- }
- else {
- resetActiveTable();
- transformer.nodes([]);
- tableLayer.draw();
- }
- }
-}
-let getTableData = (tableNumber) => {
- return ajaxSync('/ajax/getTableData', tableNumber);
};
-let isTableMerged = (tableNumber) => {
- let mergeData = getTableData(tableNumber).merged_children;
- return mergeData !== "";
+const getTableGroupFromTableNumber = (tableNumber) => {
+ const tableShape = getTableShapeFromTableNumber(tableNumber);
+ return getTableGroupFromShape(tableShape);
};
-function resetActiveTable() {
- if (!transferMode) {
- if (selectedTable) {
- getTableShape(selectedTable).stroke('black');
- }
- selectedTable = null;
- selectedTableNumber = "";
- toggleFloorplanControls(false, editMode);
- toggleEditControls(false);
- }
- else {
- $('.editControls').css('display', 'none');
- }
-}
-function addDecoration(button) {
- let insertData = {
- decoration_room: currentRoom,
- basis: basis,
- decoration_image: $(button).data('image')
- };
- ajaxSync('/ajax/addDecoration', insertData);
- $('#decorator').css('display', 'none');
- selectedDecoration = false;
- loadRoom(currentRoom);
-}
-function deleteDecoration(decoration) {
- ajax('/ajax/deleteDecoration', decoration.id());
- $('.deleteDecoration').css('display', 'none');
- decoration.destroy();
- selectedDecoration = false;
- transformer.nodes([]);
-}
-function saveDecTransformation(decoration) {
- let newData = {
- decoration_id: decoration.id(),
- decoration_pos_x: decoration.x() / scale,
- decoration_pos_y: decoration.y() / scale,
- decoration_width: parseInt((decoration.scaleX() * decoration.width()) / scale),
- decoration_height: parseInt((decoration.scaleY() * decoration.height()) / scale),
- decoration_rotation: parseInt(decoration.rotation()),
- decoration_image: decodeURIComponent(decoration.image().src),
- decoration_room: currentRoom
- };
- if (editMode) {
- idToSelect = decoration.id();
- }
- ajax('/ajax/updateDecoration', newData);
-}
-//When a table has been resized, rotated etc.
-function saveTransformation(table) {
- tableNumber = getTableNumber(table);
- shape = getTableShape(table);
- newRotation = parseInt(shape.rotation());
- newWidth = parseInt(shape.scaleX() * shape.width() / scale);
- newHeight = parseInt((shape.scaleY() * shape.height()) / scale);
- newXPos = parseInt(table.x() / scale);
- newYPos = parseInt(table.y() / scale);
- updateData = {
- table_number: tableNumber,
- rotation: newRotation,
- width: newWidth,
- height: newHeight,
- pos_x: newXPos,
- pos_y: newYPos
- };
- transformTable(updateData);
-}
-let transformTable = (tableData) => {
- return ajax("/ajax/transformTable", tableData);
-};
-function unmergeTable() {
- ajaxUnmergeTable(selectedTableNumber);
- loadRoom(currentRoom);
-}
-function reserveTable(covers) {
- if (!covers) {
- showVirtualNumpad(lang('how_many_covers'), 2, false, false, true, reserveTable);
- }
- else {
- let table = getTableGroup(selectedTableNumber);
- let newReservation = ajaxSync('/ajax/newEmptyReservation', selectedTableNumber);
- table.fire('click');
- let tableShape = getTableShape(table);
+const setReservationStatus = (table) => {
+ const reservationText = $('.reservationStatus');
+ const tableShape = getTableShapeFromTableNumber(table.table_number);
+ reservationText.text('');
+ if (table.status == 2) {
tableShape.fill('lightgreen');
- table.draw();
- table.fire('click');
- completeReservation(newReservation);
- }
-}
-function unreserveTable(input) {
- if (!input) {
- confirm(lang('confirm_delete_reservation', selectedTableNumber), selectedTableNumber, lang('confirm'), unreserveTable);
- }
- else {
- ajaxSync('/ajax/unreserveTable', input);
- hideAlerts();
- table = getTableGroup(input);
- table.fire('click');
- tableShape = getTableShape(table);
- tableShape.fill('gray');
- table.draw();
- table.fire('click');
- }
-}
-function completeReservation(resName) {
- if (!resName) {
- showVirtualKeyboard(lang('enter_reservation_name'));
- }
- else {
- //callPhpFunction('updateTableMapTable', [selectedTableNumber, 'reservation_name', resName]);
- loadRoom(currentRoom, selectedTableNumber);
- }
-}
-function toggleEditMode() {
- let editModeButton = $('.editModeButton');
- if (editMode === true) {
- editMode = false;
- loadRoom(currentRoom);
- editModeButton.removeClass('active');
- editModeButton.html(lang('edit_floorplan'));
- toggleFloorplanControls(false);
- if (selectedTable)
- selectedTable.fire('click');
- stage.find('Group').forEach(function (table, index) {
- table.draggable(false);
- });
- }
- else {
- editMode = true;
- stage.find('Group').forEach(function (table, index) {
- table.draggable(true);
- if (getTableShape(table).stroke() === "yellow") {
- table.moveToTop();
- transformer.nodes([getTableShape(table)]);
- transformer.moveToTop();
+ const reservations = Floorplan.reservations.filter(reservation => reservation.reservation_table_id == table.id);
+ if (reservations.length) {
+ turnOnMode('reservedTableSelected');
+ reservationText.text(lang('reserved'));
+ let reservation = reservations[0];
+ if (reservation.reservation_name != '') {
+ reservationText.text(lang('reserved_for', reservation.reservation_name));
}
- });
- stage.find('Image').forEach(function (img, index) {
- img.draggable(true);
- });
- toggleFloorplanControls();
- transformer.moveToTop();
- tableLayer.draw();
- editModeButton.addClass('active');
- editModeButton.html(lang('stop_edit_floorplan'));
- }
-}
-function toggleFloorplanControls(onOrOff = true, subControlsOnly = false) {
- if (onOrOff || subControlsOnly) {
- $('.floorplanControls').css('visibility', 'visible');
+ }
}
else {
- $('.floorplanControls').css('visibility', 'hidden');
+ let fillColor = tableIsOpen(table) ? 'lightblue' : 'gray';
+ tableShape.fill(fillColor);
+ turnOffMode('reservedTableSelected');
}
- if (selectedTable) {
- $('.changeShapeButton').css('visibility', 'visible');
- $('.deleteTableButton').css('visibility', 'visible');
- }
- else {
- $('.changeShapeButton').css('visibility', 'hidden');
- $('.deleteTableButton').css('visibility', 'hidden');
- }
- if (selectedDecoration) {
- $('.deleteDecoration').css('display', 'flex');
- }
- else {
- $('.deleteDecoration').css('display', 'none');
- }
-}
-let tableIsOpen = (tableNumber) => {
- return ajaxSync(`/ajax/tableIsOpen/${tableNumber}`, null, 'GET');
};
-function toggleEditControls(onOrOff = true) {
- if (onOrOff) {
- $('.editControls').css("display", "flex");
- if (isTableMerged(selectedTableNumber)) {
- $('.mergeControls').css("visibility", "visible");
- $('.unmergeButton').css('display', 'flex');
- $('.mergeButton').css('display', 'flex');
+const reserveTable = () => {
+ showVirtualNumpad(lang('how_many_covers'), 2, false, false, true, createEmptyReservation);
+};
+const createEmptyReservation = (covers) => {
+ const newReservation = {
+ id: 0,
+ reservation_covers: covers,
+ reservation_created_at: 0,
+ reservation_table_id: getSelectedTableData().id,
+ reservation_name: '',
+ reservation_time: 0,
+ };
+ ajax('/ajax/newEmptyReservation', newReservation, 'post', emptyReservationCreated, null, null);
+};
+const emptyReservationCreated = (reservation) => {
+ Floorplan.reservations.push(reservation);
+ const selectedTable = getSelectedTableData();
+ selectedTable.status = 2;
+ selectedTable.default_covers = reservation.reservation_covers;
+ updateTableData(selectedTable);
+ updateCoverText(selectedTable);
+ setReservationStatus(getSelectedTableData());
+ showVirtualKeyboard(lang('confirm_reservation_name'), 32, false, addReservationName);
+};
+const addReservationName = (name) => {
+ hideVirtualKeyboard();
+ const reservation = Floorplan.reservations.filter(reservation => reservation.reservation_table_id == getSelectedTableData().id)[0];
+ reservation.reservation_name = name;
+ ajax('/ajax/updateReservation', reservation, 'post', reservationNameAdded, null, null);
+};
+const reservationNameAdded = (updatedReservation) => {
+ console.log(updatedReservation);
+ Floorplan.reservations = Floorplan.reservations.filter(reservation => reservation.id != updatedReservation.id);
+ Floorplan.reservations.push(updatedReservation);
+ setReservationStatus(getSelectedTableData());
+};
+const getReservationsOnTable = (table) => Floorplan.reservations.filter(reservation => reservation.reservation_table_id == table.id);
+const updateTableData = (tableToRemove) => {
+ Floorplan.tables = Floorplan.tables.filter(table => table.id != tableToRemove.id);
+ Floorplan.tables.push(tableToRemove);
+};
+const unreserveTable = () => {
+ const selectedTable = getSelectedTableData();
+ selectedTable.status = 0;
+ ajax('/ajax/unreserveTable', selectedTable, 'post', tableUnreserved, null, null);
+};
+const tableUnreserved = (table) => {
+ Floorplan.reservations = Floorplan.reservations.filter(reservation => reservation.reservation_table_id != table.id);
+ updateTableData(table);
+ setReservationStatus(table);
+};
+const getSelectedTableData = () => getTableDataFromTableNumber(Floorplan.selectedTableNumber);
+const deselectTables = () => {
+ Floorplan.stage.find('Rect, Ellipse').forEach((shape, index) => {
+ shape.stroke('black');
+ });
+ Floorplan.selectedDecorationId = 0;
+ Floorplan.selectedTableNumber = 0;
+ turnOffMode('tableSelected');
+ turnOffMode('activeTableSelected');
+ turnOffMode('decorationSelected');
+ turnOffMode('merge');
+ turnOffMode('transfer');
+ setTransformerNodes([]);
+};
+const selectTable = (tableShape) => {
+ tableShape.stroke('yellow');
+ const table = getTableDataFromShape(tableShape);
+ Floorplan.selectedTableNumber = table.table_number;
+ if (isInMode('edit')) {
+ setTransformerNodes([tableShape]);
+ }
+ if (tableIsOpen(table)) {
+ turnOnMode('activeTableSelected');
+ }
+ $('.reservationStatus').html('' + lang('active_table', table.table_number.toString() + ''));
+ updateCoverText(table);
+ $('.selectedTableNumber').text(lang('active_table', table.table_number.toString()));
+ setReservationStatus(table);
+ const unmergeVisibility = table.merged_children ? 'visible' : 'hidden';
+ $('.unmergeButton').css('visibility', unmergeVisibility);
+ turnOnMode('tableSelected');
+};
+const updateCoverText = (table) => $('.selectedTableCovers').text(lang('covers', table.default_covers.toString()));
+const tableClicked = (tableShape) => {
+ const table = getTableDataFromShape(tableShape);
+ if (isInMode('merge')) {
+ mergeTables(getTableDataFromTableNumber(Floorplan.selectedTableNumber), table);
+ return;
+ }
+ if (isInMode('transfer')) {
+ transferTables(getTableDataFromTableNumber(Floorplan.selectedTableNumber), table);
+ }
+ const selectedTableNumber = Floorplan.selectedTableNumber;
+ deselectTables();
+ if (selectedTableNumber != table.table_number) {
+ selectTable(tableShape);
+ }
+};
+const createDecorationShape = (decoration, select) => {
+ const draggable = isInMode('edit');
+ const decorationShape = new Image();
+ decorationShape.onload = () => {
+ const decorationImage = new Konva.Image({
+ id: decoration.id.toString(),
+ x: decoration.decoration_pos_x * Floorplan.visualScale,
+ y: decoration.decoration_pos_y * Floorplan.visualScale,
+ image: decorationShape,
+ offsetX: decoration.decoration_width * 0.5 * Floorplan.visualScale,
+ offsetY: decoration.decoration_height * 0.5 * Floorplan.visualScale,
+ rotation: decoration.decoration_rotation,
+ width: decoration.decoration_width * Floorplan.visualScale,
+ height: decoration.decoration_height * Floorplan.visualScale,
+ draggable: draggable,
+ });
+ // add the shape to the layer
+ Floorplan.tableLayer.add(decorationImage);
+ Floorplan.tableLayer.draw();
+ decorationImage.moveToBottom();
+ setupDecorationEvents(decorationImage);
+ if (select) {
+ decorationImage.moveToTop();
+ selectDecorationShape(decorationImage);
+ }
+ };
+ decorationShape.src = 'images/decorations/' + decoration.decoration_image;
+};
+const setupDecorationEvents = (decorationShape) => {
+ decorationShape.on('click', e => {
+ decorationClicked(e.target);
+ });
+ decorationShape.on('transformend', e => {
+ decorationTransformed(e.target);
+ });
+ decorationShape.on('dragend', e => {
+ decorationTransformed(e.target);
+ });
+};
+const decorationClicked = (decorationShape) => {
+ if (isInMode('edit')) {
+ turnOffMode('tableSelected');
+ if ((Floorplan.transformer.nodes().length > 0 && Floorplan.transformer.nodes()[0] != decorationShape) || Floorplan.transformer.nodes().length == 0) {
+ selectDecorationShape(decorationShape);
}
else {
- $('.mergeControls').css("visibility", "visible");
- $('.mergeButton').css('display', 'flex');
- $('.unmergeButton').css('display', 'none');
- }
- if (tableIsOpen(selectedTableNumber)) {
- $('.payTableButton').css('display', 'flex');
- $('.viewTableButton').css('display', 'flex');
- $('.reserveTableButton').css('display', 'none');
- $('.transferTableButton').css('display', 'flex');
- }
- else {
- $('.payTableButton').css('display', 'none');
- $('.viewTableButton').css('display', 'none');
- $('.reserveTableButton').css('display', 'flex');
- $('.transferTableButton').css('display', 'none');
+ deselectTables();
+ decorationShape.moveToBottom();
}
}
- else {
- $('.editControls').css("display", "none");
- $('.mergeControls').css("visibility", "hidden");
- $('.mergeButton').css("display", "none");
- $('.unmergeButton').css("display", "none");
+};
+const selectDecorationShape = (decorationShape) => {
+ deselectTables();
+ Floorplan.transformer.nodes([decorationShape]);
+ Floorplan.selectedDecorationId = Number(decorationShape.id());
+ decorationShape.moveToTop();
+ Floorplan.transformer.moveToTop();
+ turnOnMode('decorationSelected');
+};
+const getDecorationDataById = (id) => {
+ return Floorplan.decorations.find(decoration => id == decoration.id);
+};
+const decorationTransformed = (decorationShape) => {
+ const oldDecorationData = getDecorationDataById(Number(decorationShape.id()));
+ const newDecoration = {
+ id: oldDecorationData.id,
+ decoration_room: oldDecorationData.decoration_room,
+ decoration_pos_x: Math.round(decorationShape.x() / Floorplan.visualScale),
+ decoration_pos_y: Math.round(decorationShape.y() / Floorplan.visualScale),
+ decoration_rotation: Math.round(decorationShape.rotation()),
+ decoration_width: Math.round((decorationShape.scaleX() * decorationShape.width()) / Floorplan.visualScale),
+ decoration_height: Math.round((decorationShape.scaleY() * decorationShape.height()) / Floorplan.visualScale),
+ decoration_image: oldDecorationData.decoration_image,
+ };
+ saveDecoration(newDecoration);
+};
+const saveDecoration = (decorationToUpdate) => {
+ const decorations = Floorplan
+ .decorations
+ .filter(decoration => {
+ return decoration.id != decorationToUpdate.id;
+ });
+ decorations.push(decorationToUpdate);
+ Floorplan.decorations = decorations;
+ ajax("/ajax/updateDecoration", decorationToUpdate, 'post', null, null, null);
+};
+const showDecorator = () => $('#decorator').css('display', 'flex');
+const hideDecorator = () => $('#decorator').css('display', 'flex').hide();
+const addDecoration = (e) => {
+ const button = $(e.currentTarget);
+ const newDecoration = {
+ id: 0,
+ decoration_room: Floorplan.currentRoom.id,
+ decoration_pos_x: Floorplan.visualScaleBasis / 2,
+ decoration_pos_y: Floorplan.visualScaleBasis / 2,
+ decoration_rotation: 0,
+ decoration_width: 200,
+ decoration_height: 200,
+ decoration_image: button.data('image')
+ };
+ ajax('/ajax/addDecoration', newDecoration, 'post', decorationAdded, null, null);
+};
+const decorationAdded = (decoration) => {
+ Floorplan.decorations.push(decoration);
+ createDecorationShape(decoration, true);
+ hideDecorator();
+};
+const deleteDecoration = () => ajax('/ajax/deleteDecoration', getDecorationDataById(Floorplan.selectedDecorationId), 'post', decorationDeleted, null, null);
+const decorationDeleted = (deletedDecoration) => {
+ Floorplan.decorations = Floorplan.decorations.filter(decoration => decoration.id != deletedDecoration.id);
+ const decorationShape = Floorplan.stage.findOne(`#${deletedDecoration.id}`);
+ decorationShape.destroy();
+ deselectTables();
+};
+const setRoomBackground = (roomToLoad) => {
+ const width = Floorplan.floorplanDiv.width();
+ const height = Floorplan.floorplanDiv.height();
+ Floorplan.floorplanDiv.css("background-image", `url(images/rooms/${roomToLoad.background_image})`);
+ Floorplan.floorplanDiv.css("background-size", `${width}px ${height}px`);
+};
+const setupKonva = () => {
+ const dimensions = getDimensions();
+ if (Floorplan.stage !== null)
+ Floorplan.stage.destroy();
+ Floorplan.stage = new Konva.Stage({
+ container: 'tableMap',
+ width: dimensions.width,
+ height: dimensions.height,
+ });
+ Floorplan.stage.on('click', e => {
+ if (e.target == Floorplan.stage) {
+ deselectTables();
+ }
+ });
+ Floorplan.transformer = new Konva.Transformer({
+ rotationSnaps: [0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180, 225, 270, -15, -30, -45, -60, -75, -90, -105, -120, -135, -150, -165, -180, -225, -270, 360, -360],
+ anchorSize: 30 * Floorplan.visualScale,
+ ignoreStroke: true,
+ centeredScaling: true,
+ anchorCornerRadius: 10,
+ });
+ Floorplan.tableLayer = new Konva.Layer();
+ Floorplan.tableLayer.add(Floorplan.transformer);
+ Floorplan.stage.add(Floorplan.tableLayer);
+};
+const resetKonva = setupKonva;
+const changeTableShape = () => {
+ if (!Floorplan.selectedTableNumber)
+ return;
+ const table = getTableDataFromTableNumber(Floorplan.selectedTableNumber);
+ const tableGroup = getTableGroupFromTableNumber(table.table_number);
+ const order = ['square', 'rect', 'longrect', 'diamond', 'circle', 'ellipse', 'longellipse'];
+ if (order.indexOf(table.shape) === -1)
+ table.shape = 'square';
+ const currentIndex = order.indexOf(table.shape);
+ let nextIndex = currentIndex + 1;
+ if (nextIndex > (order.length) - 1)
+ nextIndex = 0;
+ table.shape = order[nextIndex];
+ switch (table.shape) {
+ case 'square':
+ case 'circle':
+ // noinspection JSSuspiciousNameCombination
+ table.height = table.width;
+ table.rotation = 0;
+ break;
+ case 'diamond':
+ // noinspection JSSuspiciousNameCombination
+ table.height = table.width;
+ table.rotation = 45;
+ break;
+ case 'rect':
+ case 'ellipse':
+ table.height = table.width * 2;
+ table.rotation = 0;
+ break;
+ case 'longrect':
+ case 'longellipse':
+ table.rotation = 90;
+ break;
}
-}
+ saveTable(table);
+ deselectTables();
+ redrawTable(tableGroup);
+};
+const redrawTable = (tableGroup) => {
+ deselectTables();
+ const draggable = tableGroup.draggable();
+ const table = getTableDataFromGroup(tableGroup);
+ tableGroup.destroy();
+ const newTableGroup = createTableShape(table);
+ const newTableShape = getTableShapeFromTableNumber(table.table_number);
+ selectTable(newTableShape);
+ newTableGroup.draggable(draggable);
+};
+const showAddTablePopup = () => showVirtualNumpad(lang('new_table_number'), 4, false, false, true, addTable);
+const addTable = (tableNumber) => {
+ const newTable = {
+ id: 0,
+ table_number: tableNumber,
+ room_id: Floorplan.currentRoom.id,
+ default_covers: 2,
+ width: 200,
+ height: 200,
+ rotation: 0,
+ pos_x: Floorplan.visualScaleBasis / 2,
+ pos_y: Floorplan.visualScaleBasis / 2,
+ shape: 'square',
+ merged_children: '',
+ previous_state: '',
+ status: 0,
+ venue_id: 1
+ };
+ ajax('/ajax/createTable', newTable, 'post', tableAdded, tableNotAdded, null);
+};
+const tableAdded = (table) => {
+ deselectTables();
+ const newTableGroup = createTableShape(table);
+ Floorplan.tables.push(table);
+ selectTable(getTableShapeFromGroup(newTableGroup));
+};
+const tableNotAdded = (response) => {
+ posAlert(response);
+};
+const confirmDeleteTable = () => confirmation(lang('confirm_delete_table', Floorplan.selectedTableNumber.toString()), Floorplan.selectedTableNumber, 'Confirm', deleteTable);
+const deleteTable = (tableNumber) => {
+ if (!tableNumber)
+ return false;
+ const tableToDelete = getTableDataFromTableNumber(tableNumber);
+ if (tableIsOpen(tableToDelete)) {
+ posAlert(lang('error_delete_existing_table'));
+ return false;
+ }
+ ajax(`/ajax/deleteTable`, tableToDelete, 'post', tableDeleted, null, null);
+};
+const tableDeleted = (deletedTable) => {
+ Floorplan.tables = Floorplan.tables.filter(table => table.table_number != deletedTable.table_number);
+ const tableGroup = getTableGroupFromTableNumber(deletedTable.table_number);
+ deselectTables();
+ tableGroup.destroy();
+};
+const toggleMergeMode = () => toggleMode('merge');
+const mergeTables = (table1, table2) => {
+ toggleMergeMode();
+ if (table1.table_number == table2.table_number) {
+ posAlert(lang('error_self_merge'));
+ return false;
+ }
+ ajax('/ajax/mergeTables', [table1, table2], 'post', tablesMerged, null, null);
+};
+const tablesMerged = (tables) => {
+ tableDeleted(tables['child']);
+ tableDeleted(tables['parent']);
+ tableAdded(tables['merged']);
+ deselectTables();
+ const tableGroup = getTableGroupFromTableNumber(tables['merged'].table_number);
+ selectTable(getTableShapeFromGroup(tableGroup));
+ tableGroup.draggable(true);
+};
+const unmergeTable = () => ajax(`/ajax/unmergeTable/${Floorplan.selectedTableNumber}`, null, 'get', tablesUnmerged, null, null);
+const tablesUnmerged = (tables) => {
+ const parentTable = tables['parent'];
+ const childTable = tables['child'];
+ tableDeleted(parentTable);
+ tableAdded(parentTable);
+ tableAdded(childTable);
+ deselectTables();
+};
+const toggleTransferMode = () => toggleMode('transfer');
+const transferTables = (origin, destination) => {
+ if (origin.table_number == destination.table_number) {
+ posAlert(lang('transfer_self_error'));
+ return;
+ }
+ ajax(`/ajax/transferTable/${origin.table_number}/${destination.table_number}`, null, 'get', tableTransferred, null, null);
+};
+const tableTransferred = (tables) => {
+ const origin = tables['origin'];
+ const destination = tables['destination'];
+ Floorplan.activeTableNumbers = Floorplan.activeTableNumbers.filter(tableNumber => tableNumber != origin.table_number);
+ Floorplan.activeTableNumbers.push(destination.table_number);
+ if (Floorplan.currentRoom.id == origin.room_id) {
+ redrawTable(getTableGroupFromTableNumber(origin.table_number));
+ }
+ redrawTable(getTableGroupFromTableNumber(destination.table_number));
+};
+const getDimensions = () => {
+ Floorplan.floorplanDiv = $('#tableMap');
+ const parentDiv = $('#mapContainer');
+ const outerWidth = parentDiv.outerWidth();
+ const outerHeight = parentDiv.outerHeight();
+ let width = outerWidth;
+ let height = outerWidth;
+ if (outerWidth >= outerHeight) {
+ width = outerHeight;
+ height = outerHeight;
+ }
+ Floorplan.floorplanDiv.height(height);
+ Floorplan.floorplanDiv.width(width);
+ Floorplan.visualScale = width / Floorplan.visualScaleBasis;
+ return { width: width, height: height };
+};
//# sourceMappingURL=dredgepos.floorplan.js.map
\ No newline at end of file
diff --git a/wwwroot/scripts/js/dredgepos.floorplan.js.map b/wwwroot/scripts/js/dredgepos.floorplan.js.map
index 51005a1..b091686 100644
--- a/wwwroot/scripts/js/dredgepos.floorplan.js.map
+++ b/wwwroot/scripts/js/dredgepos.floorplan.js.map
@@ -1 +1 @@
-{"version":3,"file":"dredgepos.floorplan.js","sourceRoot":"","sources":["../ts/dredgepos.floorplan.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"dredgepos.floorplan.js","sourceRoot":"","sources":["../ts/dredgepos.floorplan.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/wwwroot/scripts/js/keyboards.js b/wwwroot/scripts/js/keyboards.js
index c9f7cdc..d6b1b02 100644
--- a/wwwroot/scripts/js/keyboards.js
+++ b/wwwroot/scripts/js/keyboards.js
@@ -17,8 +17,8 @@ let showVirtualNumpad = (heading, maxlength = 4, isPassword, allowDecimals = tru
numpad.data('submitfunction', submitFunction);
numpad.data('password', isPassword);
numpad.data('allowdecimals', allowDecimals);
- $(document).unbind('keyup');
- $(document).keyup(e => {
+ $(document).off('keyup');
+ $(document).on('keyup', e => {
let key = e.key;
switch (key) {
case 'Backspace':
@@ -52,7 +52,6 @@ let virtualNumpadInput = (input) => {
let submitFunction = numpad.data('submitfunction');
let allowedValues = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'submit', 'clear'];
let currentValue = numpad.data('value').toString();
- //Test
if (allowDecimals)
allowedValues.push('.', ',');
let validInput = allowedValues.includes(input);
@@ -91,11 +90,12 @@ let setupVirtualNumpad = () => {
hideVirtualNumpad();
});
};
-let setupVirtualKeyboard = () => {
+let setupVirtualKeyboard = (keyboardLayouts) => {
Application.keyboard = {
capsLock: false,
shift: false,
- layout: 'default'
+ layouts: keyboardLayouts,
+ currentLayout: 'default',
};
$(document).on('click', '.virtualKeyboardButton', e => {
virtualKeyboardInput($(e.target).data('value'));
@@ -138,7 +138,7 @@ let virtualKeyboardInput = (input) => {
case 'submit':
hideVirtualKeyboard();
let submitFunction = keyboard.data('submitfunction');
- submitFunction();
+ submitFunction(inputBox.text());
break;
case 'shift':
if (Application.keyboard.capsLock)
@@ -174,16 +174,17 @@ let virtualKeyboardInput = (input) => {
}
};
let setKeyboardLayout = (layout, modifier = '') => {
- let keyboardLayout = ajaxSync('/languages/english/keyboardLayout.json', null, 'get');
if (modifier != '')
modifier = `_${modifier}`;
+ Application.keyboard.currentLayout = layout;
+ let layoutToLoad = Application.keyboard.layouts[layout];
$('.virtualKeyboardRow').each((index, row) => {
/*
We start at 1 instead of 0. Makes it easier for non-programmers
and translators making their own language packs
*/
index = index + 1;
- let currentRow = keyboardLayout[layout]["row" + index + modifier];
+ let currentRow = layoutToLoad[`row${index}${modifier}`];
$(row).children('a').each((keyIndex, button) => {
let key = $(button);
let keyValue = currentRow[keyIndex];
@@ -211,6 +212,6 @@ let setKeyboardLayout = (layout, modifier = '') => {
};
$(() => {
setupVirtualNumpad();
- setupVirtualKeyboard();
+ ajax('/ajax/getKeyboardLayout/english', null, 'get', setupVirtualKeyboard, null, null);
});
//# sourceMappingURL=keyboards.js.map
\ No newline at end of file
diff --git a/wwwroot/scripts/js/keyboards.js.map b/wwwroot/scripts/js/keyboards.js.map
index 2db3eeb..ecd7e1d 100644
--- a/wwwroot/scripts/js/keyboards.js.map
+++ b/wwwroot/scripts/js/keyboards.js.map
@@ -1 +1 @@
-{"version":3,"file":"keyboards.js","sourceRoot":"","sources":["../ts/keyboards.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"keyboards.js","sourceRoot":"","sources":["../ts/keyboards.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/wwwroot/scripts/ts/dredgepos.core.ts b/wwwroot/scripts/ts/dredgepos.core.ts
index 04fc556..73c8be3 100644
--- a/wwwroot/scripts/ts/dredgepos.core.ts
+++ b/wwwroot/scripts/ts/dredgepos.core.ts
@@ -1,13 +1,13 @@
let Application : ApplicationState = {
keyboard : null,
- mode: "default",
+ mode: [],
languageVars: {}
}
/** Parses a language variable. */
let lang = (key: string, replacements?: string[] | string) => {
- let finalValue = Application.languageVars[key]
+ let finalValue = Application.languageVars[key] || ''
if(!replacements) return finalValue
if(typeof replacements === 'string') replacements = [replacements]
@@ -26,17 +26,20 @@
}
/** Call an Ajax function asynchronously */
- let ajax = (endpoint : string, data: any, method = 'POST', successFunction : Function , errorFunction : JQuery.Ajax.ErrorCallback, beforeFunction: any) => {
+ let ajax = (endpoint : string, data: any, method = 'POST', successFunction : Function , errorFunction : Function, beforeFunction: any) => {
data = (data == null) ? data : JSON.stringify(data)
return $.ajax({
url: endpoint,
method: method,
data: data,
- success: (response) => {
- if(successFunction)
+ success: (response: ajaxResult) => {
+ if(successFunction && response.status == 'success')
successFunction(JSON.parse(response.data))
+ else if (errorFunction && response.status != 'success'){
+ errorFunction(JSON.parse(response.data))
+ }
},
- error: errorFunction,
+ error: (error) => console.log(error.statusCode),
beforeSend: beforeFunction
})
}
@@ -44,7 +47,7 @@
/*
For the flow of the app, synchronous is commonly preferred
- though trying to keep it's usage as low as possible.
+ though trying to keep its usage as low as possible.
*/
let ajaxSync = (endpoint : string, data?: any, method = 'POST') => {
let response = JSON.parse(
@@ -69,12 +72,17 @@
}
- let setLanguageVariables = () => {
- Application.languageVars = ajaxSync('/ajax/languageVars', null, 'GET')
- }
+ let setupCore = (languageVars: Record) => {
+ Application.languageVars = languageVars
+ const doc = $(document)
+ doc.on('click', '#alertNo, #alertOk', hideAlerts)
+
+ setElementVisibilityByMode()
+ }
+
// @ts-ignore
- let alert = (message: string, title='Message') => {
+ let posAlert = (message: string, title='Message') => {
let alertBox = $('#alert')
alertBox.css('display', 'flex');
alertBox.data('value', '');
@@ -86,13 +94,12 @@
$('#alertNo').css('display', 'none');
}
- // @ts-ignore
- let confirm = (message: string, data: any, title='Confirm', submitFunction = (data: any) => {hideAlerts()}) => {
+ let confirmation = (message: string, data: any, title='Confirm', submitFunction = (data: any) => {hideAlerts()}) => {
let alert = $('#alert')
$(document).on('click', '#alert #alertYes', () => {
- submitFunction(data)
hideAlerts()
+ submitFunction(data)
$(document).off('click', '#alert #alertYes')
})
@@ -106,13 +113,69 @@
}
- let hideAlerts = () => {
- $('#alert').hide()
- }
+ let hideAlerts = () => $('#alert').hide()
-$( () => {
- let doc = $(document)
- setLanguageVariables()
+ let turnOnMode = (mode : PosMode) => {
+ Application.mode.push(mode)
+ setElementVisibilityByMode()
+ }
- doc.on('click', '#alertNo, #alertOk', () => $('#alert').hide())
-})
\ No newline at end of file
+ let turnOffMode = (mode : PosMode) => {
+ Application.mode = Application.mode.filter((value) => value != mode)
+ setElementVisibilityByMode()
+
+ }
+
+ let toggleMode = (mode: PosMode) => {
+ if(!isInMode(mode))
+ turnOnMode(mode)
+ else
+ turnOffMode(mode)
+ }
+
+ let clearModes = () => {Application.mode = []}
+ let isInMode = (mode: PosMode) => Application.mode.includes(mode)
+
+ let setElementVisibilityByMode = () => {
+ const mode = Application.mode
+ const elements = $('[data-visible-in-mode]')
+
+ elements.each((index, elem) => {
+ let element = $(elem)
+ let visibleInModes : PosModes = element.data('visible-in-mode')
+
+ let showElement = visibleInModes.every( visibleMode => {
+ return mode.includes(visibleMode)
+ });
+
+ if(element.hasClass('useVisibility')){
+ if(showElement) {
+ element.css('visibility', 'visible')
+ } else element.css('visibility', 'hidden')
+ } else element.toggle(showElement)
+ })
+
+ const invisibleElements = $('[data-invisible-in-mode]')
+ invisibleElements.each((index, elem) => {
+ let element = $(elem)
+ let inVisibleInModes: PosModes = element.data('invisible-in-mode')
+ let hideElement = inVisibleInModes.every(invisibleMode => {
+ return mode.includes(invisibleMode)
+ })
+ element.toggle(!hideElement)
+ })
+
+
+ $('[data-active-in-mode]').each((index, elem) =>{
+ const button = $(elem)
+ const activeInMode : PosMode = button.data('active-in-mode')
+
+ mode.includes(activeInMode)
+ ? button.addClass('active')
+ : button.removeClass('active')
+
+ })
+
+ }
+
+$( () => ajax('/ajax/languageVars', null, 'GET', setupCore, null, null))
\ No newline at end of file
diff --git a/wwwroot/scripts/ts/dredgepos.floorplan.ts b/wwwroot/scripts/ts/dredgepos.floorplan.ts
index 787e9c5..8ed9686 100644
--- a/wwwroot/scripts/ts/dredgepos.floorplan.ts
+++ b/wwwroot/scripts/ts/dredgepos.floorplan.ts
@@ -1,335 +1,163 @@
///
-let stage : Konva.Stage
-let transformer: Konva.Transformer;
-let tableLayer: Konva.Layer;
-let editMode = false;
-let activeTables : number[] = [];
-let selectedTable : table;
-let selectedTableNumber : number;
-let currentRoom : number;
-let basis = 1280;
-let scale : number = 1;
-let newTable : number;
-let roomName : string;
-//Makes sure canvas always fits inside the div
-function getDimensions(parentDiv : JQuery) {
- let tableMap = $('#tableMap')
- let outerWidth = parentDiv.outerWidth();
- let outerHeight = parentDiv.outerHeight();
-
- let width = outerWidth;
- let height = outerWidth;
-
- if (outerWidth >= outerHeight) {
- width = outerHeight;
- height = outerHeight;
- }
-
- tableMap.height(height)
- tableMap.width(width)
- scale = width / basis
-
- return {width: width, height:height}
+interface dimensions{
+ height:number
+ width:number
}
-function setupTableMap() {
- let doc = $(document)
- activeTables = ajaxSync('/ajax/getActiveTables/1', null, 'GET');
+interface floorplan{
+ stage: Konva.Stage
+ transformer: Konva.Transformer
+ tableLayer: Konva.Layer
+ rooms: room[]
+ tables: table[]
+ decorations: decoration[]
+ activeTableNumbers: number[]
+ selectedTableNumber: number
+ selectedDecorationId: number
+ currentRoom: room
+ roomToLoad: room
+ visualScale: number
+ visualScaleBasis: number
+ floorplanDiv: JQuery
+ reservations: reservation[]
+}
- let dimensions = getDimensions($('#mapContainer'));
- roomName = 'Deck & Courtyard';
- stage = new Konva.Stage({
- container: 'tableMap',
- width: dimensions.width,
- height: dimensions.height,
- });
+interface floorplan_data{
+ tables: table[]
+ decorations: decoration[]
+ activeTableNumbers: number[]
+ rooms: room[]
+ reservations:reservation[]
+}
- $('body').on('click', '.editModeButton', () => {toggleEditMode()} )
- $('.roomButton').on('click', function () {
- roomName = $(this).text();
- loadRoom($(this).data('value'));
- });
- $('.transferTableButton').on('click', function () {
- transferModeOn();
- });
- $('.addDecoration').on('click', function () {
- $('#decorator').css('display', 'flex');
- });
- $('.deleteDecoration').on('click', function () {
- deleteDecoration(selectedDecoration);
- });
- $('.decoratorItem').on('click', function () {
- addDecoration(this);
- });
- $('.changeShapeButton').on('click', function () {
- changeTableShape(selectedTableNumber);
- });
- $('.reserveTableButton').on('click', function () {
- if ($(this).text() === lang('reserve_table')) {
- reserveTable();
+const Floorplan: floorplan = {
+ rooms: [],
+ tables: [],
+ decorations:[],
+ reservations:[],
+ activeTableNumbers: [],
+ stage: null,
+ transformer:null,
+ tableLayer: null,
+ selectedTableNumber: 0,
+ currentRoom: null,
+ roomToLoad: null,
+ visualScale: 1,
+ visualScaleBasis: 1280,
+ floorplanDiv: null,
+ selectedDecorationId: 0
+};
+
+$(() => ajax('/ajax/getFloorplanData/1', null, 'get', setupFloorplan, null, null) )
+
+
+const setupFloorplanEvents = () => {
+ const doc = $(document)
+ doc.on('click', '.roomButton', roomButtonClicked)
+ doc.on('click', '.editModeButton', editModeButtonClicked)
+ doc.on('click', '.changeShapeButton', changeTableShape)
+ doc.on('click', '.addTableButton', showAddTablePopup)
+ doc.on('click', '.deleteTableButton', confirmDeleteTable)
+ doc.on('click', '.addDecoration', showDecorator)
+ doc.on('click', '.deleteDecoration', deleteDecoration)
+ doc.on('click', '.decoratorItem', addDecoration)
+ doc.on('click', '.mergeButton', toggleMergeMode)
+ doc.on('click', '.unmergeButton', unmergeTable)
+ doc.on('click', '.transferTableButton', toggleTransferMode)
+ doc.on('click', '.reserveTableButton', reserveTable)
+ doc.on('click', '.unreserveTableButton', unreserveTable)
+}
+
+const roomButtonClicked = (e: Event) => {
+ const button = $(e.target)
+ const roomId = button.data('value')
+ loadRoom(getRoomById(roomId))
+}
+
+const editModeButtonClicked = (e: Event) => {
+ const button = $(e.target)
+ button.toggleClass('active')
+ toggleMode('edit')
+
+ if(isInMode('edit')){
+ Floorplan.stage.find('Group, Image').forEach(table => table.draggable(true))
+
+ if(isInMode('tableSelected')){
+ const selectedTableShape = getTableShapeFromTableNumber(Floorplan.selectedTableNumber)
+ selectTable(selectedTableShape)
}
- else {
- unreserveTable();
- }
- });
- $('.addTableButton').on('click', function () {
- addTable();
- });
- $('.deleteTableButton').on('click', function () {
- deleteTable();
- });
- loadRoom(roomToLoad);
-}
-
-let updateTableShape = (tableData) => {
- return ajaxSync('/ajax/updateTableShape', tableData)
-}
-
-//Change the shape of a table in edit mode.
-function changeTableShape(tableNumber: number) {
- let tableData = getTableData(tableNumber)
- let tableShape = tableData['shape']
- let tableWidth = tableData['width']
- let tableHeight = tableData['height']
- let tableRotation = tableData['rotation']
-
- let order = ['square', 'rect', 'longrect', 'diamond', 'circle', 'ellipse', 'longellipse']
-
- if (order.indexOf(tableShape) === -1) tableShape = 'square'
-
- //What the next shape is
- let currentIndex = order.indexOf(tableShape)
- let nextIndex = currentIndex + 1
- if (nextIndex > (order.length) - 1) nextIndex = 0
-
- let nextShape = order[nextIndex]
-
- switch(nextShape) {
- case 'square':
- case 'circle':
- tableHeight = tableWidth
- tableRotation = 0
- break
- case 'diamond':
- tableHeight = tableWidth
- tableRotation = 45
- break
- case 'rect':
- case 'ellipse':
- tableHeight = tableWidth * 2
- tableRotation = 0
- break
- case 'longrect':
- case 'longellipse':
- tableRotation = 90
- break
- }
-
- let updateData = {
- table_number: tableNumber,
- shape: nextShape,
- height: tableHeight,
- width: tableWidth,
- rotation: tableRotation
- }
-
- tableData = updateTableShape(updateData)
- let tableGroup = stage.find('#' + tableNumber)[0]
- transformer.nodes([]);
- tableGroup.destroy();
-
- let newTable = createTableElement(tableData);
- tableLayer.add(newTable);
- stage.draw();
-
- selectTable(tableNumber);
- loadRoom(currentRoom, tableNumber);
-}
-
-let createTable = (tableData) => {
- return ajaxSync('/ajax/createTable', tableData)
-}
-
-let tableExists = (tableNumber : number) => {
- return ajaxSync(`/ajax/tableExists/${tableNumber}`)
-}
-
-function addTable(tableNumber : number) {
- if (!tableNumber) {
- showVirtualNumpad(lang('new_table_number'), 4, false, false, true, addTable);
- }
- else {
- let newTableInfo = {
- table_number: tableNumber,
- room_id: currentRoom,
- default_covers: 2,
- width: 200,
- height: 200,
- rotation: 0,
- pos_x: basis / 2,
- pos_y: basis / 2,
- shape: 'square',
- merged_children : '',
- previous_state: '',
- status: 0,
- reservation: 0,
- venue_id: 1
- };
-
- let newTableData = createTable(newTableInfo)
-
- if (!newTableData.table_number){
- alert(newTableData)
- return false
- }
-
- newTable = createTableElement(newTableData);
- tableLayer.add(newTable);
- tableLayer.draw();
- selectTable(tableNumber);
-
+ } else {
+ setTransformerNodes([])
+ Floorplan.stage.find('Group, Image').forEach(table => table.draggable(false))
}
}
-function selectTable(tableNumber: number) {
- let table = stage.find('#' + tableNumber)[0];
- table.fire('click');
+
+const setupFloorplan = (floorplanData : floorplan_data) => {
+
+ Floorplan.tables = floorplanData.tables
+ Floorplan.activeTableNumbers = floorplanData.activeTableNumbers
+ Floorplan.rooms = floorplanData.rooms
+ Floorplan.decorations = floorplanData.decorations
+ Floorplan.reservations = floorplanData.reservations
+
+ getDimensions()
+ setupFloorplanEvents()
+
+ loadRoom(Floorplan.rooms[0])
}
-function deleteTable(tableNumber = 0) {
- if (!tableNumber) {
- confirm(lang('confirm_delete_table', selectedTableNumber), selectedTableNumber, 'Confirm', deleteTable);
- }
- else {
- if (tableIsOpen(selectedTableNumber)) {
- alert(lang('error_delete_existing_table'));
- }
- else {
- ajax(`/ajax/deleteTable/${selectedTableNumber}`, null, 'GET');
- let table = stage.find('#' + tableNumber)[0];
- transformer.nodes([]);
- table.destroy();
- tableLayer.draw();
- selectedTable = null
- selectedTableNumber = null
- }
- }
-}
-// Rotate a shape around any point.
-// shape is a Konva shape
-// angleDegrees is the angle to rotate by, in degrees.
-// point is an object {x: posX, y: posY}
-function rotateAroundPoint(shape, angleDegrees, point) {
- let angleRadians = angleDegrees * Math.PI / 180;
- // they lied, I did have to use trigonometry
- const x = point.x +
- (shape.x() - point.x) * Math.cos(angleRadians) -
- (shape.y() - point.y) * Math.sin(angleRadians);
- const y = point.y +
- (shape.x() - point.x) * Math.sin(angleRadians) +
- (shape.y() - point.y) * Math.cos(angleRadians);
- shape.rotation(shape.rotation() + angleDegrees); // rotate the shape in place
- shape.x(x); // move the rotated shape in relation to the rotation point.
- shape.y(y);
+const loadRoom = (roomToLoad: room) => {
+ setRoomBackground(roomToLoad)
+ setupKonva()
+
+ const tablesInRoom = Floorplan.tables.filter(table => table.room_id == roomToLoad.id)
+ const decorationsInRoom = Floorplan.decorations.filter(decoration => decoration.decoration_room == roomToLoad.id)
+ decorationsInRoom.forEach(decoration => createDecorationShape(decoration, false))
+ tablesInRoom.forEach(createTableShape)
+
+ Floorplan.currentRoom = roomToLoad
}
-function createDecoration(data, idToSelect = false) {
- let draggable = editMode;
- var decoration = new Image();
- decoration.onload = function () {
- var dec = new Konva.Image({
- id: data.decoration_id.toString(),
- x: data.decoration_pos_x * scale,
- y: data.decoration_pos_y * scale,
- image: decoration,
- offsetX: data.decoration_width * 0.5 * scale,
- offsetY: data.decoration_height * 0.5 * scale,
- rotation: data.decoration_rotation,
- width: data.decoration_width * scale,
- height: data.decoration_height * scale,
- draggable: draggable,
- });
-
- if (editMode && dec.id() === idToSelect) {
- transformer.nodes([dec]);
- transformer.moveToTop();
- }
-
-
- dec.on('click', function () {
- selectDecoration(this);
- });
- dec.on('tap', function () {
- selectDecoration(this);
- });
- dec.on('dragend', function () {
- saveDecTransformation(this);
- });
-
- dec.on('transformend', function () {
- saveDecTransformation(this);
- });
- // add the shape to the layer
- tableLayer.add(dec);
- tableLayer.draw();
- dec.moveToBottom();
- };
- decoration.src = 'images/decorations/' + data.decoration_image;
- return decoration;
+const getRoomById = (roomId: number) => {
+ return Floorplan.rooms.find(
+ (room) => room.id == roomId
+ )
}
-var selectedDecoration = false;
-function selectDecoration(decoration) {
- if (editMode) {
- if ((transformer.nodes().length > 0 && transformer.nodes()[0] != decoration) || transformer.nodes().length == 0) {
- resetActiveTable();
- transformer.nodes([decoration]);
- decoration.moveToTop();
- transformer.moveToTop();
- selectedDecoration = decoration;
- toggleFloorplanControls();
- }
- else {
- transformer.nodes([]);
- selectedDecoration = false;
- $('.deleteDecoration').css('display', 'none');
- }
- }
-}
-function createTableElement(data, selectTable = false) {
- // Create container group
+const tableIsOpen = (table: table) => Floorplan.activeTableNumbers.includes(table.table_number)
- let draggable = editMode || newTable === data.table_number;
+const createTableShape = (table: table) => {
+ const draggable = isInMode('edit')
- let table = new Konva.Group({
- x: data.pos_x * scale,
- y: data.pos_y * scale,
+ const tableGroup = new Konva.Group({
+ x: table.pos_x * Floorplan.visualScale,
+ y: table.pos_y * Floorplan.visualScale,
draggable: draggable,
listening: true,
- id: data.table_number.toString()
+ id: table.table_number.toString()
});
- let fillColor = 'gray';
- if (data.status === 'reserved') {
- fillColor = 'lightgreen';
- }
- if (activeTables.includes(data.table_number)) {
- fillColor = 'lightblue';
- }
- data.width = data.width * scale;
- data.height = data.height * scale;
- // Create background shape
- let shape;
- switch (data.shape) {
+
+ const fillColor = tableIsOpen(table)
+ ? 'lightblue'
+ : table.status == 2
+ ? 'lightgreen'
+ : 'gray'
+
+
+ let tableShape: Konva.Shape
+
+ switch(table.shape){
case "circle": // fall-through
case "ellipse": // fall-through
case "longellipse":
- shape = new Konva.Ellipse({
+ tableShape = new Konva.Ellipse({
x: 0,
y: 0,
- radiusX: data.width * 0.5,
- radiusY: data.height * 0.5,
- rotation: data.rotation,
+ radiusX: table.width * 0.5 * Floorplan.visualScale,
+ radiusY: table.height * 0.5 * Floorplan.visualScale,
+ rotation: table.rotation,
fill: fillColor,
stroke: "black",
strokeWidth: 4,
@@ -338,14 +166,14 @@ function createTableElement(data, selectTable = false) {
});
break;
default:
- shape = new Konva.Rect({
+ tableShape = new Konva.Rect({
x: 0,
y: 0,
- offsetX: data.width * 0.5,
- offsetY: data.height * 0.5,
- width: data.width,
- height: data.height,
- rotation: data.rotation,
+ offsetX: table.width * 0.5 * Floorplan.visualScale,
+ offsetY: table.height * 0.5 * Floorplan.visualScale,
+ width: table.width * Floorplan.visualScale,
+ height: table.height * Floorplan.visualScale,
+ rotation: table.rotation,
fill: fillColor,
stroke: "black",
strokeWidth: 4,
@@ -353,497 +181,643 @@ function createTableElement(data, selectTable = false) {
listening: true
});
break;
- } // End switch
- // Create label
- let label = new Konva.Text({
- x: data.width * -0.5,
- y: data.height * -0.5,
- width: data.width,
- height: data.height,
- text: data.table_number.toString(),
- fontSize: 40 * scale,
+ }
+
+ const label = new Konva.Text({
+ x: table.width * -0.5 * Floorplan.visualScale,
+ y: table.height * -0.5 * Floorplan.visualScale,
+ width: table.width * Floorplan.visualScale,
+ height: table.height * Floorplan.visualScale,
+ text: table.table_number.toString(),
+ fontSize: 40 * Floorplan.visualScale,
fill: "black",
align: "center",
verticalAlign: "middle",
draggable: false,
listening: false
});
- tableNumber = data.tablenumber;
- table.add(shape, label);
- table.on('dblclick', function () {
- tableNumber = parseInt(getTableNumber(this));
- if (!editMode) {
- loadScreen('orderScreen', 'table=' + tableNumber);
- }
- });
- table.on('dbltap', function () {
- tableNumber = getTableNumber(this);
- loadScreen('orderScreen', 'table=' + tableNumber);
- });
- table.on('dragend', function () {
- saveTransformation(table);
- });
- innerShape = getTableShape(table);
- table.on('click', function () {
- selectTableShape(this);
- });
- table.on('tap', function () {
- selectTableShape(this);
- });
- innerShape.on('transformend', function () {
- saveTransformation(table);
- });
- // add the shape to the layer
- tableLayer.add(table);
- table.moveToTop();
- if (tableNumber === selectedTableNumber) {
- selectTable = table;
- }
- if (selectTable) {
- if (selectTable === tableNumber) {
- table.fire('click');
- }
- }
- return table;
+
+ tableGroup.add(tableShape, label)
+
+ setupTableEvents(tableGroup)
+
+ Floorplan.tableLayer.add(tableGroup)
+ return tableGroup
}
-function loadRoom(room: number, selectTable : number = 0, selectDecoration = false) {
- //if (room === currentRoom) return false
- ajax(`/ajax/getRoomData/${room}`, null, 'GET', (response) => {
- let floorplanDiv = $('#tableMap')
- let backgroundImage = response.background_image
- floorplanDiv.css("background-image", `url(images/rooms/${backgroundImage})`)
- floorplanDiv.css("background-size", `${width}px ${height}px`)
- }, null, null)
+const setupTableEvents = (tableGroup: Konva.Group) => {
+ const tableShape = getTableShapeFromGroup(tableGroup)
- $('.roomButton').removeClass('active');
- let selector = ".roomButton:contains('" + roomName + "')";
- $(selector).addClass('active');
- currentRoom = room;
- resetActiveTable();
- stage.destroy();
- stage = new Konva.Stage({
+ tableGroup.on('click', (e) => tableClicked(e.target as Konva.Shape))
+ tableGroup.on('tap', (e) => tableClicked(e.target as Konva.Shape))
+ tableGroup.on('dragend', (e) => saveTableTransformation(e.target as Konva.Group))
+ tableShape.on('transformend', (e) => {
+ const group = getTableGroupFromShape(e.target as Konva.Shape)
+ saveTableTransformation(group)
+ })
+}
+
+const getTableShapeFromGroup = (group: Konva.Group) => group.getChildren()[0] as Konva.Shape
+const getTableGroupFromShape = (shape: Konva.Shape) => shape.parent as Konva.Group
+
+const saveTableTransformation = (tableGroup: Konva.Group) => {
+ const originalTable = getTableDataFromGroup(tableGroup)
+ const tableShape = getTableShapeFromGroup(tableGroup)
+
+ const newTableInfo : table = {
+ table_number : originalTable.table_number,
+ previous_state : originalTable.previous_state,
+ merged_children : originalTable.merged_children,
+ id : originalTable.id,
+ width : Math.round(tableShape.scaleX() * tableShape.width()/Floorplan.visualScale),
+ height: Math.round(tableShape.scaleY() * tableShape.height()/Floorplan.visualScale),
+ pos_x: Math.round(tableGroup.x()/Floorplan.visualScale),
+ pos_y: Math.round(tableGroup.y()/Floorplan.visualScale),
+ rotation: Math.round(tableShape.rotation()),
+ room_id: originalTable.room_id,
+ status: originalTable.status,
+ venue_id: originalTable.venue_id,
+ shape : originalTable.shape,
+ default_covers: originalTable.default_covers,
+ }
+
+ saveTable(newTableInfo)
+ redrawTable(tableGroup)
+}
+
+
+const saveTable = (tableToUpdate: table) => {
+ const tables =
+ Floorplan
+ .tables
+ .filter(table => {
+ return table.id != tableToUpdate.id
+ })
+
+ tables.push(tableToUpdate)
+
+ Floorplan.tables = tables
+ ajax("/ajax/transformTable", tableToUpdate, 'post', null,null,null)
+}
+
+const setTransformerNodes = (nodes: Konva.Shape[]) => {
+ Floorplan.transformer.moveToTop()
+ if (nodes.length < 1) Floorplan.transformer.moveToBottom()
+ Floorplan.transformer.nodes(nodes)
+}
+
+const getTableDataFromTableNumber = (tableNumber: number) => {
+ return Floorplan.tables.filter(table => table.table_number == tableNumber)[0]
+}
+
+const getTableDataFromGroup = (tableGroup: Konva.Node) => {
+ const tableNumber = tableGroup.attrs.id
+ return Floorplan.tables.find(table => tableNumber == table.table_number)
+}
+
+const getTableDataFromShape = (tableShape: Konva.Shape) => getTableDataFromGroup(tableShape.parent)
+
+const getTableShapeFromTableNumber = (tableNumber: number) => {
+ const tableGroup = Floorplan.stage.find('Group').find((group: Konva.Shape) => {
+ return group.attrs.id == tableNumber
+ }) as Konva.Group
+
+ return tableGroup.getChildren()[0] as Konva.Shape
+}
+
+const getTableGroupFromTableNumber = (tableNumber : number) => {
+ const tableShape = getTableShapeFromTableNumber(tableNumber)
+ return getTableGroupFromShape(tableShape)
+}
+
+const setReservationStatus = (table: table) => {
+ const reservationText = $('.reservationStatus')
+ const tableShape = getTableShapeFromTableNumber(table.table_number)
+ reservationText.text('')
+
+ if(table.status == 2) {
+ tableShape.fill('lightgreen')
+ const reservations = Floorplan.reservations.filter(reservation => reservation.reservation_table_id == table.id)
+ if (reservations.length) {
+ turnOnMode('reservedTableSelected')
+ reservationText.text(lang('reserved'))
+ let reservation = reservations[0]
+ if (reservation.reservation_name != '') {
+ reservationText.text(lang('reserved_for', reservation.reservation_name))
+ }
+ }
+ } else {
+ let fillColor = tableIsOpen(table) ? 'lightblue' : 'gray'
+ tableShape.fill(fillColor)
+ turnOffMode('reservedTableSelected')
+ }
+
+}
+
+const reserveTable = () => {
+ showVirtualNumpad(lang('how_many_covers'), 2, false, false, true, createEmptyReservation)
+}
+
+const createEmptyReservation = (covers: number) => {
+ const newReservation: reservation = {
+ id: 0,
+ reservation_covers: covers,
+ reservation_created_at: 0,
+ reservation_table_id: getSelectedTableData().id,
+ reservation_name: '',
+ reservation_time: 0,
+ }
+
+ ajax('/ajax/newEmptyReservation', newReservation,'post', emptyReservationCreated, null, null )
+}
+
+const emptyReservationCreated = (reservation: reservation) => {
+ Floorplan.reservations.push(reservation)
+ const selectedTable = getSelectedTableData()
+ selectedTable.status = 2
+ selectedTable.default_covers = reservation.reservation_covers
+ updateTableData(selectedTable)
+ updateCoverText(selectedTable)
+ setReservationStatus(getSelectedTableData())
+
+ showVirtualKeyboard(lang('confirm_reservation_name'), 32, false, addReservationName)
+}
+
+const addReservationName = (name: string) => {
+ hideVirtualKeyboard()
+ const reservation = Floorplan.reservations.filter(reservation => reservation.reservation_table_id == getSelectedTableData().id)[0]
+ reservation.reservation_name = name
+ ajax('/ajax/updateReservation', reservation, 'post', reservationNameAdded, null, null)
+}
+
+const reservationNameAdded = (updatedReservation: reservation) => {
+ console.log(updatedReservation)
+ Floorplan.reservations = Floorplan.reservations.filter(reservation => reservation.id != updatedReservation.id)
+ Floorplan.reservations.push(updatedReservation)
+ setReservationStatus(getSelectedTableData())
+}
+
+const getReservationsOnTable = (table: table) => Floorplan.reservations.filter(reservation => reservation.reservation_table_id == table.id)
+
+const updateTableData = (tableToRemove: table) => {
+ Floorplan.tables = Floorplan.tables.filter(table => table.id != tableToRemove.id)
+ Floorplan.tables.push(tableToRemove)
+}
+
+const unreserveTable = () => {
+ const selectedTable = getSelectedTableData()
+ selectedTable.status = 0
+ ajax('/ajax/unreserveTable', selectedTable, 'post', tableUnreserved, null, null)
+}
+
+const tableUnreserved = (table: table) => {
+ Floorplan.reservations = Floorplan.reservations.filter(reservation => reservation.reservation_table_id != table.id)
+ updateTableData(table)
+ setReservationStatus(table)
+}
+
+const getSelectedTableData = () => getTableDataFromTableNumber(Floorplan.selectedTableNumber)
+
+const deselectTables = () => {
+ Floorplan.stage.find('Rect, Ellipse').forEach( (shape: Konva.Shape, index) => {
+ shape.stroke('black')
+ });
+
+ Floorplan.selectedDecorationId = 0
+ Floorplan.selectedTableNumber = 0
+ turnOffMode('tableSelected')
+ turnOffMode('activeTableSelected')
+ turnOffMode('decorationSelected')
+ turnOffMode('merge')
+ turnOffMode('transfer')
+
+ setTransformerNodes([])
+}
+
+const selectTable = (tableShape: Konva.Shape) => {
+ tableShape.stroke('yellow')
+ const table = getTableDataFromShape(tableShape)
+ Floorplan.selectedTableNumber = table.table_number
+
+ if(isInMode('edit')){
+ setTransformerNodes([tableShape])
+ }
+
+ if(tableIsOpen(table)){
+ turnOnMode('activeTableSelected')
+ }
+
+ $('.reservationStatus').html(''+lang('active_table', table.table_number.toString()+''))
+
+
+ updateCoverText(table)
+ $('.selectedTableNumber').text(lang('active_table', table.table_number.toString()))
+ setReservationStatus(table)
+
+ const unmergeVisibility = table.merged_children ? 'visible' : 'hidden'
+ $('.unmergeButton').css('visibility', unmergeVisibility)
+ turnOnMode('tableSelected')
+}
+
+const updateCoverText = (table:table) => $('.selectedTableCovers').text(lang('covers', table.default_covers.toString()))
+
+const tableClicked = (tableShape: Konva.Shape) => {
+ const table = getTableDataFromShape(tableShape)
+
+ if(isInMode('merge')) {
+ mergeTables(getTableDataFromTableNumber(Floorplan.selectedTableNumber), table)
+ return;
+ }
+
+ if(isInMode('transfer')){
+ transferTables(getTableDataFromTableNumber(Floorplan.selectedTableNumber), table)
+ }
+
+ const selectedTableNumber = Floorplan.selectedTableNumber
+ deselectTables()
+
+ if(selectedTableNumber != table.table_number){
+ selectTable(tableShape)
+ }
+
+}
+
+const createDecorationShape = (decoration:decoration, select?: boolean) => {
+ const draggable = isInMode('edit')
+ const decorationShape = new Image()
+
+ decorationShape.onload = () => {
+ const decorationImage = new Konva.Image({
+ id: decoration.id.toString(),
+ x: decoration.decoration_pos_x * Floorplan.visualScale,
+ y: decoration.decoration_pos_y * Floorplan.visualScale,
+ image: decorationShape,
+ offsetX: decoration.decoration_width * 0.5 * Floorplan.visualScale,
+ offsetY: decoration.decoration_height * 0.5 * Floorplan.visualScale,
+ rotation: decoration.decoration_rotation,
+ width: decoration.decoration_width * Floorplan.visualScale,
+ height: decoration.decoration_height * Floorplan.visualScale,
+ draggable: draggable,
+ });
+
+ // add the shape to the layer
+ Floorplan.tableLayer.add(decorationImage)
+ Floorplan.tableLayer.draw()
+ decorationImage.moveToBottom()
+
+ setupDecorationEvents(decorationImage)
+
+ if(select){
+ decorationImage.moveToTop()
+ selectDecorationShape(decorationImage)
+ }
+ }
+
+ decorationShape.src = 'images/decorations/' + decoration.decoration_image
+}
+
+const setupDecorationEvents = (decorationShape: Konva.Image) => {
+ decorationShape.on('click', e => {
+ decorationClicked(e.target as Konva.Image)
+ })
+
+ decorationShape.on('transformend', e => {
+ decorationTransformed(e.target as Konva.Image)
+ })
+
+ decorationShape.on('dragend', e => {
+ decorationTransformed(e.target as Konva.Image)
+ })
+}
+
+const decorationClicked = (decorationShape: Konva.Image) => {
+ if(isInMode('edit')){
+ turnOffMode('tableSelected')
+ if ((Floorplan.transformer.nodes().length > 0 && Floorplan.transformer.nodes()[0] != decorationShape) || Floorplan.transformer.nodes().length == 0) {
+ selectDecorationShape(decorationShape)
+ } else {
+ deselectTables()
+ decorationShape.moveToBottom()
+ }
+ }
+}
+
+const selectDecorationShape = (decorationShape: Konva.Image) => {
+ deselectTables()
+ Floorplan.transformer.nodes([decorationShape])
+ Floorplan.selectedDecorationId = Number(decorationShape.id())
+ decorationShape.moveToTop()
+ Floorplan.transformer.moveToTop()
+ turnOnMode('decorationSelected')
+}
+
+const getDecorationDataById = (id: number) => {
+ return Floorplan.decorations.find(decoration => id == decoration.id)
+}
+
+const decorationTransformed = (decorationShape: Konva.Image) => {
+
+ const oldDecorationData = getDecorationDataById(Number(decorationShape.id()))
+ const newDecoration: decoration = {
+ id: oldDecorationData.id,
+ decoration_room: oldDecorationData.decoration_room,
+ decoration_pos_x: Math.round(decorationShape.x() / Floorplan.visualScale),
+ decoration_pos_y: Math.round(decorationShape.y() / Floorplan.visualScale),
+ decoration_rotation: Math.round(decorationShape.rotation()),
+ decoration_width: Math.round((decorationShape.scaleX() * decorationShape.width()) / Floorplan.visualScale),
+ decoration_height: Math.round((decorationShape.scaleY() * decorationShape.height()) / Floorplan.visualScale),
+ decoration_image: oldDecorationData.decoration_image,
+ }
+
+ saveDecoration(newDecoration)
+}
+
+const saveDecoration = (decorationToUpdate: decoration) => {
+ const decorations =
+ Floorplan
+ .decorations
+ .filter(decoration => {
+ return decoration.id != decorationToUpdate.id
+ })
+
+ decorations.push(decorationToUpdate)
+
+ Floorplan.decorations = decorations
+ ajax("/ajax/updateDecoration", decorationToUpdate, 'post', null,null,null)
+}
+
+const showDecorator = () => $('#decorator').css('display', 'flex')
+const hideDecorator = () => $('#decorator').css('display', 'flex').hide()
+
+const addDecoration = (e: Event) => {
+ const button = $(e.currentTarget)
+
+ const newDecoration: decoration = {
+ id: 0,
+ decoration_room: Floorplan.currentRoom.id,
+ decoration_pos_x: Floorplan.visualScaleBasis / 2,
+ decoration_pos_y: Floorplan.visualScaleBasis / 2,
+ decoration_rotation: 0,
+ decoration_width: 200,
+ decoration_height: 200,
+ decoration_image: button.data('image')
+ }
+
+ ajax('/ajax/addDecoration', newDecoration, 'post', decorationAdded, null, null)
+}
+
+const decorationAdded = (decoration: decoration) => {
+ Floorplan.decorations.push(decoration)
+ createDecorationShape(decoration, true)
+
+ hideDecorator()
+}
+
+
+const deleteDecoration = () => ajax(
+ '/ajax/deleteDecoration',
+ getDecorationDataById(Floorplan.selectedDecorationId),
+ 'post', decorationDeleted, null, null)
+
+const decorationDeleted = (deletedDecoration:decoration) => {
+ Floorplan.decorations = Floorplan.decorations.filter(decoration => decoration.id != deletedDecoration.id)
+ const decorationShape = Floorplan.stage.findOne(`#${deletedDecoration.id}`)
+ decorationShape.destroy()
+ deselectTables()
+}
+
+const setRoomBackground = (roomToLoad: room) => {
+ const width = Floorplan.floorplanDiv.width()
+ const height = Floorplan.floorplanDiv.height()
+
+ Floorplan.floorplanDiv.css("background-image", `url(images/rooms/${roomToLoad.background_image})`)
+ Floorplan.floorplanDiv.css("background-size", `${width}px ${height}px`)
+}
+
+const setupKonva = () => {
+ const dimensions = getDimensions()
+
+ if(Floorplan.stage !== null) Floorplan.stage.destroy()
+
+ Floorplan.stage = new Konva.Stage({
container: 'tableMap',
- width: width,
- height: height,
- });
+ width: dimensions.width,
+ height: dimensions.height,
+ })
- transformer = new Konva.Transformer({
+ Floorplan.stage.on('click', e => {
+ if(e.target == Floorplan.stage){
+ deselectTables()
+ }
+ })
+
+ Floorplan.transformer = new Konva.Transformer({
rotationSnaps: [0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180, 225, 270, -15, -30, -45, -60, -75, -90, -105, -120, -135, -150, -165, -180, -225, -270, 360, -360],
- anchorSize: 40 * scale,
+ anchorSize: 30 * Floorplan.visualScale,
ignoreStroke: true,
- centeredScaling: true
+ centeredScaling: true,
+ anchorCornerRadius: 10,
});
- let tablesAndDecorations = ajaxSync(`/ajax/getTablesAndDecorations/${room}`, null, 'GET');
- let decorations = tablesAndDecorations['decorations']
- let tables = tablesAndDecorations['tables']
+ Floorplan.tableLayer = new Konva.Layer()
+ Floorplan.tableLayer.add(Floorplan.transformer)
-
- tableLayer = new Konva.Layer();
- tableLayer.add(transformer);
-
- // Loop data and call the creation method for each decoration/table.
- decorations.forEach(itemData => {
- createDecoration(itemData, selectDecoration);
- });
-
- tables.forEach(itemData => {
- tableLayer.add(createTableElement(itemData, selectTable));
- });
- activeTables = getOpenTables()
- stage.add(tableLayer);
+ Floorplan.stage.add(Floorplan.tableLayer)
}
-var mergeMode = false;
-var parentMergeTable;
-var childMergeTable;
-var tableTransferOrigin;
-var transferMode = false;
-function transferModeOn() {
- mergeModeOff();
- if (!transferMode) {
- tableTransferOrigin = selectedTableNumber;
- transferMode = true;
- $('.transferTableButton').addClass('active');
- $('.transferTableButton').text('Select a table to transfer items to');
- }
- else {
- transferModeOff();
- }
-}
-function transferModeOff() {
- transferMode = false;
- $('.transferTableButton').removeClass('active');
- $('.transferTableButton').text(lang('transfer_table'));
-}
+const resetKonva = setupKonva
-let getOpenTables = () => {
- return ajaxSync('/ajax/getActiveTables/1', null, 'GET');
-}
+const changeTableShape = () => {
-let transferTableAjax = (origin, destination) => {
- ajax(`/ajax/transferTables/${origin}/${destination}`, null, 'GET')
-}
+ if(!Floorplan.selectedTableNumber) return
-function transferTables() {
- destination = selectedTableNumber;
- origin = tableTransferOrigin;
- if (destination !== origin) {
- transferTableAjax(origin, destination)
- activeTables = getOpenTables()
- transferModeOff();
- getTableShape(selectedTable).fill('lightblue')
- getTableShape( getTableGroup(origin) ).fill('gray')
- }
- else {
- alert("Can't transfer a table to itself.");
- transferModeOff();
- }
-}
-function mergeModeOn() {
- transferModeOff();
- if (!mergeMode) {
- mergeMode = true;
- $('.mergeButton').addClass('active');
- $('.mergeButton').text('Select a table to merge with Table ' + selectedTableNumber);
- parentMergeTable = selectedTableNumber;
- }
- else {
- mergeModeOff();
- }
-}
-function mergeModeOff() {
- mergeMode = false;
- $('.mergeButton').removeClass('active');
- $('.mergeButton').text(lang('merge_table'));
-}
+ const table = getTableDataFromTableNumber(Floorplan.selectedTableNumber)
+ const tableGroup = getTableGroupFromTableNumber(table.table_number)
-let ajaxMergeTables = (parent, child) => {
- return ajaxSync(`/ajax/mergeTables/${parent}/${child}`, null, 'GET')
-}
+ const order = ['square', 'rect', 'longrect', 'diamond', 'circle', 'ellipse', 'longellipse']
+ if (order.indexOf(table.shape) === -1)
+ table.shape = 'square'
-let ajaxUnmergeTable = (parent) => {
- return ajaxSync(`/ajax/unmergeTable/${parent}`, null, 'GET')
-}
+ const currentIndex = order.indexOf(table.shape)
+ let nextIndex = currentIndex + 1
+ if (nextIndex > (order.length) - 1)
+ nextIndex = 0
-function mergeTables() {
- parentMergeTable = parseInt(parentMergeTable);
- childMergeTable = parseInt(childMergeTable);
- if (childMergeTable !== parentMergeTable) {
- let result = ajaxMergeTables(parentMergeTable, childMergeTable)
- mergeModeOff();
+ table.shape = order[nextIndex]
- loadRoom(currentRoom)
- newTable = getTableGroup(parentMergeTable);
- newTable.draggable(true);
-
- if (tableIsOpen(parentMergeTable)) {
- getTableShape(newTable).fill('lightblue');
- }
- }
- else {
- alert("Can't merge a table with itself!");
- mergeModeOff();
- }
-}
-//When a table is passed (a group of the shape plus the text), returns the number as string.
-function getTableNumber(tableGroup) {
- textItem = tableGroup.getChildren()[1];
- return textItem.getText();
-}
-function getTableGroup(tableNumber) {
- return stage.find('#' + tableNumber)[0];
-}
-function getTableShape(tableGroup) {
- return tableGroup.getChildren()[0];
-}
-
-function getReservation(id) {
- return ajaxSync('/ajax/getReservation', id)
-}
-
-//When a user selects a table.
-function selectTableShape(table) {
- let tableNumber = getTableNumber(table);
- let shape = getTableShape(table);
- let strokeColor = shape.stroke();
- selectedTable = table;
- selectedTableNumber = tableNumber;
- if(transferMode) transferTables()
- if (mergeMode) {
- childMergeTable = tableNumber;
- mergeTables();
- }
- else {
- //If table is not selected
- if (strokeColor !== "yellow") {
- let tableData = getTableData(selectedTableNumber)
-
- let coverNumberString = lang('covers', tableData.default_covers.toString());
- let tableString = '' + lang('activeTable', selectedTableNumber.toString()) + '';
- $('.reserveTableButton').text(lang('reserve_table'));
- if (tableData.status === 'reserved') {
- let reservation = getReservation(tableData.reservation_id)
- console.log(reservation)
- $('.reserveTableButton').text(lang('unreserve_table'));
- if (reservation.reservation_name) {
- reservationString = lang('reserved_for', reservation.reservation_name);
- }
- else {
- reservationString = lang('reserved');
- }
- tableString += '' + reservationString + '';
- }
- tableString += " (" + coverNumberString + ")";
- $('.currentTable').html(tableString);
-
- stage.find('Rect').forEach(function (rect, index) {
- rect.stroke("black");
- });
- stage.find('Ellipse').forEach(function (circ, index) {
- circ.stroke("black");
- });
- shape.stroke("yellow");
- toggleEditControls(true);
- if (editMode) {
- toggleFloorplanControls();
- $('.deleteDecoration').css('display', 'none');
- transformer.nodes([getTableShape(table)]);
- table.moveToTop();
- transformer.moveToTop();
- }
- tableLayer.draw();
- //If the table is already selected
- }
- else {
- resetActiveTable();
- transformer.nodes([]);
- tableLayer.draw();
- }
- }
-}
-
-let getTableData = (tableNumber) => {
- return ajaxSync('/ajax/getTableData', tableNumber)
-}
-
-let isTableMerged = (tableNumber) => {
- let mergeData = getTableData(tableNumber).merged_children
- return mergeData !== ""
-}
-
-function resetActiveTable() {
- if (!transferMode) {
- if (selectedTable) {
- getTableShape(selectedTable).stroke('black');
- }
- selectedTable = null;
- selectedTableNumber = "";
- toggleFloorplanControls(false, editMode);
- toggleEditControls(false);
- }
- else {
- $('.editControls').css('display', 'none');
- }
-}
-function addDecoration(button) {
- let insertData = {
- decoration_room: currentRoom,
- basis: basis,
- decoration_image: $(button).data('image')
+ switch(table.shape) {
+ case 'square':
+ case 'circle':
+ // noinspection JSSuspiciousNameCombination
+ table.height = table.width
+ table.rotation = 0
+ break
+ case 'diamond':
+ // noinspection JSSuspiciousNameCombination
+ table.height = table.width
+ table.rotation = 45
+ break
+ case 'rect':
+ case 'ellipse':
+ table.height = table.width * 2
+ table.rotation = 0
+ break
+ case 'longrect':
+ case 'longellipse':
+ table.rotation = 90
+ break
}
- ajaxSync('/ajax/addDecoration', insertData)
- $('#decorator').css('display', 'none');
- selectedDecoration = false;
- loadRoom(currentRoom);
-}
-function deleteDecoration(decoration) {
- ajax('/ajax/deleteDecoration', decoration.id());
- $('.deleteDecoration').css('display', 'none');
- decoration.destroy()
- selectedDecoration = false;
- transformer.nodes([])
-}
-function saveDecTransformation(decoration: Konva.Shape) {
- let newData = {
- decoration_id: decoration.id(),
- decoration_pos_x: decoration.x() / scale,
- decoration_pos_y: decoration.y() / scale,
- decoration_width: parseInt((decoration.scaleX() * decoration.width()) / scale),
- decoration_height: parseInt((decoration.scaleY() * decoration.height()) / scale),
- decoration_rotation: parseInt(decoration.rotation()),
- decoration_image: decodeURIComponent(decoration.image().src),
- decoration_room: currentRoom
- };
- if (editMode) {
- idToSelect = decoration.id();
- }
- ajax('/ajax/updateDecoration', newData)
+ saveTable(table)
+ deselectTables()
+ redrawTable(tableGroup)
}
-//When a table has been resized, rotated etc.
-function saveTransformation(table) {
- tableNumber = getTableNumber(table);
- shape = getTableShape(table);
- newRotation = parseInt(shape.rotation());
- newWidth = parseInt(shape.scaleX() * shape.width() / scale);
- newHeight = parseInt((shape.scaleY() * shape.height()) / scale);
- newXPos = parseInt(table.x() / scale);
- newYPos = parseInt(table.y() / scale);
- updateData = {
+
+const redrawTable = (tableGroup: Konva.Group) => {
+ deselectTables()
+ const draggable = tableGroup.draggable()
+ const table = getTableDataFromGroup(tableGroup)
+ tableGroup.destroy()
+ const newTableGroup = createTableShape(table)
+ const newTableShape = getTableShapeFromTableNumber(table.table_number)
+ selectTable(newTableShape)
+ newTableGroup.draggable(draggable)
+}
+
+const showAddTablePopup = () => showVirtualNumpad(lang('new_table_number'), 4, false, false, true, addTable);
+
+const addTable = (tableNumber: number) => {
+ const newTable : table = {
+ id: 0,
table_number: tableNumber,
- rotation: newRotation,
- width: newWidth,
- height: newHeight,
- pos_x: newXPos,
- pos_y: newYPos
+ room_id: Floorplan.currentRoom.id,
+ default_covers: 2,
+ width: 200,
+ height: 200,
+ rotation: 0,
+ pos_x: Floorplan.visualScaleBasis / 2,
+ pos_y: Floorplan.visualScaleBasis / 2,
+ shape: 'square',
+ merged_children : '',
+ previous_state: '',
+ status: 0,
+ venue_id: 1
};
- transformTable(updateData)
+
+ ajax('/ajax/createTable', newTable, 'post', tableAdded, tableNotAdded, null)
}
-let transformTable = (tableData) => {
- return ajax("/ajax/transformTable", tableData)
+const tableAdded = (table: table) => {
+ deselectTables()
+ const newTableGroup = createTableShape(table)
+ Floorplan.tables.push(table)
+ selectTable(getTableShapeFromGroup(newTableGroup))
}
-function unmergeTable() {
-
- ajaxUnmergeTable(selectedTableNumber)
- loadRoom(currentRoom);
-}
-function reserveTable(covers) {
- if (!covers) {
- showVirtualNumpad(lang('how_many_covers'), 2, false, false, true, reserveTable);
- }
- else {
- let table = getTableGroup(selectedTableNumber);
- let newReservation = ajaxSync('/ajax/newEmptyReservation', selectedTableNumber)
-
- table.fire('click');
- let tableShape = getTableShape(table);
- tableShape.fill('lightgreen');
- table.draw();
- table.fire('click');
- completeReservation(newReservation);
- }
+const tableNotAdded = (response: string) => {
+ posAlert(response)
}
-function unreserveTable(input) {
- if (!input) {
- confirm(lang('confirm_delete_reservation', selectedTableNumber), selectedTableNumber, lang('confirm'), unreserveTable);
- }
- else {
- ajaxSync('/ajax/unreserveTable', input)
- hideAlerts()
- table = getTableGroup(input);
- table.fire('click');
- tableShape = getTableShape(table);
- tableShape.fill('gray');
- table.draw();
- table.fire('click');
- }
-}
-function completeReservation(resName) {
- if (!resName) {
- showVirtualKeyboard(lang('enter_reservation_name'));
- }
- else {
- //callPhpFunction('updateTableMapTable', [selectedTableNumber, 'reservation_name', resName]);
- loadRoom(currentRoom, selectedTableNumber);
- }
-}
-function toggleEditMode() {
- let editModeButton = $('.editModeButton');
- if (editMode === true) {
- editMode = false;
- loadRoom(currentRoom);
- editModeButton.removeClass('active');
- editModeButton.html(lang('edit_floorplan'));
- toggleFloorplanControls(false);
- if (selectedTable)
- selectedTable.fire('click');
- stage.find('Group').forEach(function (table, index) {
- table.draggable(false);
- });
- }
- else {
- editMode = true;
- stage.find('Group').forEach(function (table, index) {
- table.draggable(true);
- if (getTableShape(table).stroke() === "yellow") {
- table.moveToTop();
- transformer.nodes([getTableShape(table)]);
- transformer.moveToTop();
- }
- });
- stage.find('Image').forEach(function (img, index) {
- img.draggable(true);
- });
- toggleFloorplanControls();
- transformer.moveToTop();
- tableLayer.draw();
- editModeButton.addClass('active');
- editModeButton.html(lang('stop_edit_floorplan'));
- }
-}
-function toggleFloorplanControls(onOrOff = true, subControlsOnly = false) {
- if (onOrOff || subControlsOnly) {
- $('.floorplanControls').css('visibility', 'visible');
- }
- else {
- $('.floorplanControls').css('visibility', 'hidden');
- }
- if (selectedTable) {
- $('.changeShapeButton').css('visibility', 'visible');
- $('.deleteTableButton').css('visibility', 'visible');
- }
- else {
- $('.changeShapeButton').css('visibility', 'hidden');
- $('.deleteTableButton').css('visibility', 'hidden');
- }
- if (selectedDecoration) {
- $('.deleteDecoration').css('display', 'flex');
- }
- else {
- $('.deleteDecoration').css('display', 'none');
+const confirmDeleteTable = () => confirmation(
+ lang('confirm_delete_table', Floorplan.selectedTableNumber.toString()),
+ Floorplan.selectedTableNumber,
+ 'Confirm', deleteTable)
+
+const deleteTable = (tableNumber: number) => {
+ if(!tableNumber) return false
+ const tableToDelete = getTableDataFromTableNumber(tableNumber)
+
+ if(tableIsOpen(tableToDelete)){
+ posAlert(lang('error_delete_existing_table'))
+ return false
}
+
+ ajax(`/ajax/deleteTable`, tableToDelete, 'post', tableDeleted, null, null);
}
-let tableIsOpen = (tableNumber) => {
- return ajaxSync(`/ajax/tableIsOpen/${tableNumber}`, null, 'GET')
+const tableDeleted = (deletedTable: table) => {
+ Floorplan.tables = Floorplan.tables.filter(table => table.table_number != deletedTable.table_number)
+ const tableGroup = getTableGroupFromTableNumber(deletedTable.table_number)
+ deselectTables()
+ tableGroup.destroy()
}
-function toggleEditControls(onOrOff = true) {
- if (onOrOff) {
- $('.editControls').css("display", "flex");
- if (isTableMerged(selectedTableNumber)) {
- $('.mergeControls').css("visibility", "visible");
- $('.unmergeButton').css('display', 'flex');
- $('.mergeButton').css('display', 'flex');
- }
- else {
- $('.mergeControls').css("visibility", "visible");
- $('.mergeButton').css('display', 'flex');
- $('.unmergeButton').css('display', 'none');
- }
- if (tableIsOpen(selectedTableNumber)) {
- $('.payTableButton').css('display', 'flex');
- $('.viewTableButton').css('display', 'flex');
- $('.reserveTableButton').css('display', 'none');
- $('.transferTableButton').css('display', 'flex');
- }
- else {
- $('.payTableButton').css('display', 'none');
- $('.viewTableButton').css('display', 'none');
- $('.reserveTableButton').css('display', 'flex');
- $('.transferTableButton').css('display', 'none');
- }
- }
- else {
- $('.editControls').css("display", "none");
- $('.mergeControls').css("visibility", "hidden");
- $('.mergeButton').css("display", "none");
- $('.unmergeButton').css("display", "none");
+const toggleMergeMode = () => toggleMode('merge')
+
+
+const mergeTables = (table1: table, table2: table ) => {
+ toggleMergeMode()
+ if(table1.table_number == table2.table_number){
+ posAlert(lang('error_self_merge'))
+ return false;
}
+ ajax('/ajax/mergeTables', [table1, table2], 'post', tablesMerged, null, null)
}
+
+const tablesMerged = (tables: Record<'child'|'parent'|'merged', table>) => {
+ tableDeleted(tables['child'])
+ tableDeleted(tables['parent'])
+ tableAdded(tables['merged'])
+ deselectTables()
+ const tableGroup = getTableGroupFromTableNumber(tables['merged'].table_number)
+ selectTable(getTableShapeFromGroup(tableGroup))
+ tableGroup.draggable(true)
+}
+
+const unmergeTable = () => ajax(`/ajax/unmergeTable/${Floorplan.selectedTableNumber}`, null, 'get', tablesUnmerged, null, null)
+
+const tablesUnmerged = (tables: Record<'child'|'parent', table>) => {
+ const parentTable = tables['parent']
+ const childTable = tables['child']
+
+ tableDeleted(parentTable)
+ tableAdded(parentTable)
+ tableAdded(childTable)
+ deselectTables()
+}
+
+const toggleTransferMode = () => toggleMode('transfer')
+
+const transferTables = (origin: table, destination: table) => {
+ if(origin.table_number == destination.table_number){
+ posAlert(lang('transfer_self_error'))
+ return
+ }
+
+ ajax(`/ajax/transferTable/${origin.table_number}/${destination.table_number}`, null, 'get', tableTransferred, null, null)
+}
+
+const tableTransferred = (tables: Record<"origin"|"destination", table>) => {
+ const origin = tables['origin']
+ const destination = tables['destination']
+
+ Floorplan.activeTableNumbers = Floorplan.activeTableNumbers.filter(tableNumber => tableNumber != origin.table_number)
+ Floorplan.activeTableNumbers.push(destination.table_number)
+ if(Floorplan.currentRoom.id == origin.room_id) {
+ redrawTable(getTableGroupFromTableNumber(origin.table_number))
+ }
+ redrawTable(getTableGroupFromTableNumber(destination.table_number))
+}
+
+const getDimensions = () => {
+
+ Floorplan.floorplanDiv = $('#tableMap')
+ const parentDiv = $('#mapContainer')
+ const outerWidth = parentDiv.outerWidth()
+ const outerHeight = parentDiv.outerHeight()
+
+ let width = outerWidth;
+ let height = outerWidth;
+
+ if (outerWidth >= outerHeight) {
+ width = outerHeight
+ height = outerHeight
+ }
+
+ Floorplan.floorplanDiv.height(height)
+ Floorplan.floorplanDiv.width(width)
+ Floorplan.visualScale = width / Floorplan.visualScaleBasis
+
+ return {width: width, height:height}
+}
\ No newline at end of file
diff --git a/wwwroot/scripts/ts/keyboards.ts b/wwwroot/scripts/ts/keyboards.ts
index f328615..3c13858 100644
--- a/wwwroot/scripts/ts/keyboards.ts
+++ b/wwwroot/scripts/ts/keyboards.ts
@@ -1,4 +1,9 @@
- let showVirtualNumpad = (heading: string, maxlength = 4, isPassword: boolean, allowDecimals = true, allowClose = true, submitFunction: Function) => {
+type KeyboardRowName = `row${number}${"" | "_"}${string}`;
+interface VirtualKeyboard {
+ [layoutName: string]: Partial>;
+}
+
+let showVirtualNumpad = (heading: string, maxlength = 4, isPassword: boolean, allowDecimals = true, allowClose = true, submitFunction: Function) => {
let numpad = $('#virtualNumpad');
let inputBox = $('#virtualNumpadInput')
let closeKeyboardButton = $('.closeKeyboards')
@@ -23,10 +28,9 @@
numpad.data('password', isPassword);
numpad.data('allowdecimals', allowDecimals);
- $(document).unbind('keyup');
- $(document).keyup(e => {
+ $(document).off('keyup');
+ $(document).on('keyup', e => {
let key = e.key;
-
switch (key) {
case 'Backspace':
case 'Delete':
@@ -64,7 +68,7 @@
let submitFunction = numpad.data('submitfunction')
let allowedValues = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'submit', 'clear']
let currentValue = numpad.data('value').toString()
- //Test
+
if (allowDecimals)
allowedValues.push('.', ',')
@@ -96,7 +100,7 @@
let clearNumpadInput = () => {
$('#virtualNumpadInput').text("")
$('#virtualNumpad').data('value', '')
- }
+ }
let setupVirtualNumpad = () => {
$(document).on('click', '.virtualNumpadButton', e => {
@@ -109,11 +113,12 @@
});
}
- let setupVirtualKeyboard = () => {
+ let setupVirtualKeyboard = (keyboardLayouts: VirtualKeyboard) => {
Application.keyboard = {
capsLock: false,
shift: false,
- layout: 'default'
+ layouts: keyboardLayouts,
+ currentLayout: 'default',
}
$(document).on('click', '.virtualKeyboardButton', e => {
@@ -123,7 +128,7 @@
setKeyboardLayout('default')
}
- let showVirtualKeyboard = (heading: string, maxlength = 32, isPassword = false, submitFunction = () => {
+ let showVirtualKeyboard = (heading: string, maxlength = 32, isPassword = false, submitFunction :Function = () => {
hideVirtualKeyboard()
}) => {
let keyboard = $('#virtualKeyboard')
@@ -166,7 +171,7 @@
case 'submit':
hideVirtualKeyboard();
let submitFunction = keyboard.data('submitfunction')
- submitFunction();
+ submitFunction(inputBox.text());
break;
case 'shift':
if (Application.keyboard.capsLock) break;
@@ -206,8 +211,10 @@
}
let setKeyboardLayout = (layout: string, modifier = '') => {
- let keyboardLayout = ajaxSync('/languages/english/keyboardLayout.json', null, 'get')
+
if (modifier != '') modifier = `_${modifier}`
+ Application.keyboard.currentLayout = layout
+ let layoutToLoad = Application.keyboard.layouts[layout]
$('.virtualKeyboardRow').each((index, row) => {
/*
@@ -215,7 +222,7 @@
and translators making their own language packs
*/
index = index + 1;
- let currentRow: Record = keyboardLayout[layout]["row" + index + modifier]
+ let currentRow = layoutToLoad[`row${index}${modifier}`]
$(row).children('a').each((keyIndex, button) => {
let key = $(button);
@@ -251,6 +258,6 @@
}
$(() => {
- setupVirtualNumpad()
- setupVirtualKeyboard();
+ setupVirtualNumpad()
+ ajax('/ajax/getKeyboardLayout/english', null, 'get',setupVirtualKeyboard, null, null)
})
diff --git a/wwwroot/scripts/ts/test.ts b/wwwroot/scripts/ts/test.ts
new file mode 100644
index 0000000..5f28270
--- /dev/null
+++ b/wwwroot/scripts/ts/test.ts
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/wwwroot/scripts/ts/types.ts b/wwwroot/scripts/ts/types.ts
index 821a8d7..88c5d4a 100644
--- a/wwwroot/scripts/ts/types.ts
+++ b/wwwroot/scripts/ts/types.ts
@@ -1,4 +1,5 @@
-type PosMode = "edit" | "void" | "transfer" | "default"
+type PosMode = "edit" | "void" | "transfer" | "default" | "tableSelected" | "decorationSelected" | "activeTableSelected" | "merge" | "reservedTableSelected"
+type PosModes = PosMode[]
interface ajaxResult {
status: string
@@ -7,11 +8,10 @@ interface ajaxResult {
interface ApplicationState {
keyboard: keyboard
- mode: PosMode
+ mode: PosModes
languageVars: Record
}
-
interface table {
table_number: number,
room_id: number
@@ -25,20 +25,41 @@ interface table {
rotation: number
merged_children: string
previous_state: string
- status: string
- table_id: number
+ status: number
+ id: number
+}
+
+interface decoration {
+ id: number
+ decoration_room: number
+ decoration_pos_x: number
+ decoration_pos_y: number
+ decoration_rotation: number
+ decoration_width: number
+ decoration_height: number
+ decoration_image: string
}
interface room {
- room_id: number
+ id: number
room_name: string
background_image: string
venue_id: number
}
+interface reservation {
+ id: number,
+ reservation_name: string,
+ reservation_time: number,
+ reservation_covers: number,
+ reservation_created_at: number,
+ reservation_table_id: number,
+}
+
interface keyboard {
capsLock: boolean
shift: boolean
- layout: string
+ layouts: VirtualKeyboard
+ currentLayout: string
}
\ No newline at end of file
diff --git a/wwwroot/styles/screen.css b/wwwroot/styles/screen.css
index 8b42ae3..9864baf 100644
--- a/wwwroot/styles/screen.css
+++ b/wwwroot/styles/screen.css
@@ -26,7 +26,7 @@ body{
display:flex;
align-items:center;
justify-content:center;
-
+
}
#tableDetails div{
@@ -154,7 +154,7 @@ body{
#bottomHalf{
flex:1;
overflow-x:auto;
- overflow-y:hidden;
+ overflow-y:hidden;
scroll-behavior: smooth;
}
@@ -233,7 +233,7 @@ td .posButton.normal.hasImage a:first-of-type{
flex-basis:24%;
background-size:contain;
background-repeat:no-repeat;
- background-position:center;
+ background-position:center;
align-items:center;
}
@@ -242,7 +242,7 @@ td .posButton.normal.hasImage a:nth-of-type(2){
}
td .posButton.doubleHeight{
- flex-direction:column;
+ flex-direction:column;
}
td .posButton.doubleHeight.hasImage a:first-of-type{
@@ -254,7 +254,7 @@ td .posButton.doubleHeight.hasImage a:first-of-type{
flex-basis:66%;
background-size:contain;
background-repeat:no-repeat;
- background-position:center 20%;
+ background-position:center 20%;
}
.mobile td .posButton.doubleHeight.hasImage a:first-of-type{
@@ -274,7 +274,7 @@ td .posButton.doubleWidth.hasImage a:first-of-type{
flex-basis:24%;
background-size:contain;
background-repeat:no-repeat;
- background-position:0 center;
+ background-position:0 center;
display:flex;
align-items:center;
}
@@ -294,7 +294,7 @@ td .posButton.doubleWidth.doubleHeight.hasImage a:first-of-type{
height:100%;
background-size:contain;
background-repeat:no-repeat;
- background-position:center;
+ background-position:center;
}
td .posButton.doubleWidth.doubleHeight.hasImage a:nth-of-type(2){
@@ -326,7 +326,7 @@ td .posButton.doubleWidth.doubleHeight.hasImage a:nth-of-type(2){
.instructionRow td{
font-weight:lighter !important;
font-size:1em !important;
-
+
}
td.itemCell{
@@ -489,7 +489,7 @@ a.logOut{
.bottomCell{
flex-basis:10%;
- width:100%;
+ width:100%;
}
@@ -498,7 +498,7 @@ a.logOut{
display:flex;
flex-direction:column;
flex-basis:80%;
-
+
}
#tablemapLeftColumn a,
@@ -553,14 +553,14 @@ a.logOut{
.floorplanControls,
.mergeControls{
- visibility:hidden;
width:100%;
flex-basis:33%;
display:flex;
flex-direction:column;
}
-.editControls a{
+.editControls > a,
+.editControls .posHeader{
height:100%;
display:flex;
flex-wrap:wrap;
@@ -568,12 +568,23 @@ a.logOut{
align-items:center;
justify-content:center;
text-align:center;
+ padding:0.5em;
}
-
.editControls .posHeader{
flex-direction:column;
}
+.posHeader.currentTable > * {
+ width: 100%;
+ flex:1;
+ align-items: center;
+ display: flex;
+ justify-content: center;
+}
+
+.posHeader.currentTable b {align-items: flex-end}
+.posHeader.currentTable small {align-items: flex-start}
+
.floorplanControls a,
.mergeControls a{
display:flex;
diff --git a/wwwroot/themes/restaurant/tableMap.tpl.htm b/wwwroot/themes/restaurant/tableMap.tpl.htm
index 43b9a62..7fb4e23 100644
--- a/wwwroot/themes/restaurant/tableMap.tpl.htm
+++ b/wwwroot/themes/restaurant/tableMap.tpl.htm
@@ -27,13 +27,17 @@
@@ -43,22 +47,22 @@
@@ -70,14 +74,5 @@
-