Compare commits
25 Commits
orderscree
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3f4d6b650e | ||
| c146a7209d | |||
|
|
2e213d95ad | ||
|
|
89e9e0b7a7 | ||
|
|
dd74054930 | ||
|
|
5094bbaf2b | ||
|
|
f824dd3beb | ||
|
|
42e96b1769 | ||
| 334391eb38 | |||
|
|
76b7fdea6c | ||
|
|
9fa1f7c888 | ||
|
|
983b7ae909 | ||
|
|
0507fcff65 | ||
| caae3a4380 | |||
|
|
89b881e081 | ||
| 9698671de7 | |||
|
|
f133284309 | ||
|
|
9558074c4f | ||
|
|
ac30d8147e | ||
|
|
b9a0b578e3 | ||
|
|
0a2ffa123a | ||
| 510bd8cfb9 | |||
|
|
b33db1987b | ||
| aa37b24293 | |||
|
|
627843f3a3 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -10,3 +10,4 @@
|
|||||||
/wwwroot/scripts/*.js.map
|
/wwwroot/scripts/*.js.map
|
||||||
/wwwroot/styles/*
|
/wwwroot/styles/*
|
||||||
/Folder.DotSettings.user
|
/Folder.DotSettings.user
|
||||||
|
sql.log
|
||||||
|
|||||||
@@ -7,12 +7,11 @@ let attr = Giraffe.ViewEngine.HtmlElements.attr
|
|||||||
|
|
||||||
let getItemActionAttributes (itemCode: string) =
|
let getItemActionAttributes (itemCode: string) =
|
||||||
let item = Entity.GetFirstByColumn<item> "code" (StringTrim itemCode)
|
let item = Entity.GetFirstByColumn<item> "code" (StringTrim itemCode)
|
||||||
[(attr "data-item") <| jsonEncode item]
|
[item |> jsonEncode |> attr "data-item"]
|
||||||
|
|
||||||
let getGridActionAttributes (gridId: int) = [(attr "data-grid") <| jsonEncode gridId]
|
let getGridActionAttributes (gridId: int) = [(attr "data-grid") <| jsonEncode gridId]
|
||||||
|
|
||||||
let getActionAttributes (action: string) (actionValue: string) =
|
let getActionAttributes (action: string) (actionValue: string) =
|
||||||
|
|
||||||
match action with
|
match action with
|
||||||
| "item" -> getItemActionAttributes actionValue
|
| "item" -> getItemActionAttributes actionValue
|
||||||
| "grid" -> actionValue |> int |> getGridActionAttributes
|
| "grid" -> actionValue |> int |> getGridActionAttributes
|
||||||
|
|||||||
@@ -13,10 +13,10 @@ let decoratorItem (imageName, imageUrl) =
|
|||||||
let decoratorRow decoratorItems = div [_class "decoratorRow"] [yield! decoratorItems]
|
let decoratorRow decoratorItems = div [_class "decoratorRow"] [yield! decoratorItems]
|
||||||
|
|
||||||
let decorator (decorationRows: XmlNode[]) =
|
let decorator (decorationRows: XmlNode[]) =
|
||||||
div [_id "decorator"] [
|
div [_id "decorator"; _class "modal"] [
|
||||||
div [_id "decoratorHeader"] [
|
div [_id "decoratorHeader"] [
|
||||||
h2 [] [lang "choose_decoration"]
|
h2 [] [lang "choose_decoration"]
|
||||||
a [_class "posButton hideDecorator"] [str "×"]
|
a [_class "posButton hideModals"] [str "×"]
|
||||||
]
|
]
|
||||||
div [_id "decoratorContent"] [
|
div [_id "decoratorContent"] [
|
||||||
yield! decorationRows
|
yield! decorationRows
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ let getTableById (id : int) =
|
|||||||
|
|
||||||
let getRoom (roomId: int) =
|
let getRoom (roomId: int) =
|
||||||
select {
|
select {
|
||||||
table "floorplan_rooms"
|
table "rooms"
|
||||||
where (eq "id" roomId)
|
where (eq "id" roomId)
|
||||||
} |> Database.Select<room> |> first
|
} |> Database.Select<room> |> first
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,10 @@ open DredgePos
|
|||||||
open Saturn
|
open Saturn
|
||||||
open Giraffe
|
open Giraffe
|
||||||
|
|
||||||
|
let installer = (warbler (fun _ -> htmlString (Controller.RunAllMigrations ())))
|
||||||
|
|
||||||
let router = router {
|
let router = router {
|
||||||
pipe_through Ajax.Router.pipeline
|
pipe_through Ajax.Router.pipeline
|
||||||
get "/" (warbler (fun _ -> htmlString (Controller.RunAllMigrations ())))
|
get "/" installer
|
||||||
|
get "" installer
|
||||||
}
|
}
|
||||||
@@ -6,13 +6,24 @@ open System.IO
|
|||||||
|
|
||||||
let spaceButton () = (Entity.GetFirstByColumn<button> "primary_action" "spacer").id
|
let spaceButton () = (Entity.GetFirstByColumn<button> "primary_action" "spacer").id
|
||||||
|
|
||||||
|
let getPageOrder pageName =
|
||||||
|
match pageName with
|
||||||
|
| "entrees" -> 1
|
||||||
|
| "mains" -> 2
|
||||||
|
| "dessert" -> 3
|
||||||
|
| "beer" -> 4
|
||||||
|
| "wine" -> 5
|
||||||
|
| _ -> 0
|
||||||
|
|
||||||
let CreatePageFromDirectory index (dir: string) =
|
let CreatePageFromDirectory index (dir: string) =
|
||||||
let dirName = DirectoryInfo(dir).Name
|
let dirName = DirectoryInfo(dir).Name
|
||||||
|
|
||||||
let printGroup =
|
let printGroup =
|
||||||
match dirName.ToLower() with
|
match dirName.ToLower() with
|
||||||
| "beer" | "wine" -> (Entity.GetFirstByColumn<print_group> "name" "Beverage").id
|
| "beer" | "wine" -> (Entity.GetFirstByColumn<print_group> "name" "Drinks").id
|
||||||
| _ -> (Entity.GetFirstByColumn<print_group> "name" "Food").id
|
| "entrees" | "dips" -> (Entity.GetFirstByColumn<print_group> "name" "Entrees").id
|
||||||
|
| "dessert" -> (Entity.GetFirstByColumn<print_group> "name" "Desserts").id
|
||||||
|
| _ -> (Entity.GetFirstByColumn<print_group> "name" "Mains").id
|
||||||
|
|
||||||
let parentName =
|
let parentName =
|
||||||
match dirName.ToLower() with
|
match dirName.ToLower() with
|
||||||
@@ -20,7 +31,7 @@ let CreatePageFromDirectory index (dir: string) =
|
|||||||
| _ -> "Food"
|
| _ -> "Food"
|
||||||
let parentCategory = Entity.GetFirstByColumn<sales_category> "name" parentName
|
let parentCategory = Entity.GetFirstByColumn<sales_category> "name" parentName
|
||||||
|
|
||||||
if dirName.ToLower() <> "dips" && dirName.ToLower() <> "Steak Temperatures" then
|
if dirName.ToLower() <> "dips" && dirName.ToLower() <> "steak temperatures" then
|
||||||
let NewGrid = Entity.Create {
|
let NewGrid = Entity.Create {
|
||||||
id=0
|
id=0
|
||||||
name=dirName
|
name=dirName
|
||||||
@@ -31,11 +42,19 @@ let CreatePageFromDirectory index (dir: string) =
|
|||||||
|
|
||||||
Entity.Create {
|
Entity.Create {
|
||||||
id=0
|
id=0
|
||||||
order=index
|
order= getPageOrder (dirName.ToLower())
|
||||||
venue_id=1
|
venue_id=1
|
||||||
label=dirName
|
label=dirName
|
||||||
grid_id=NewGrid.id
|
grid_id=NewGrid.id
|
||||||
} |> ignore
|
} |> ignore
|
||||||
|
elif dirName.ToLower() = "steak temperatures" then
|
||||||
|
Entity.Create {
|
||||||
|
id=0
|
||||||
|
name=dirName
|
||||||
|
rows=4
|
||||||
|
cols=6
|
||||||
|
data=""
|
||||||
|
} |> ignore
|
||||||
else ()
|
else ()
|
||||||
|
|
||||||
Entity.Create {
|
Entity.Create {
|
||||||
@@ -51,38 +70,52 @@ let CreatePageFromDirectory index (dir: string) =
|
|||||||
let CreateDefaultPrintGroups (path: string) =
|
let CreateDefaultPrintGroups (path: string) =
|
||||||
Entity.Create {
|
Entity.Create {
|
||||||
id=0
|
id=0
|
||||||
name="Food"
|
name="Entrees"
|
||||||
printer_id=1
|
printer_id=1
|
||||||
venue_id=1
|
venue_id=1
|
||||||
} |> ignore
|
} |> ignore
|
||||||
|
|
||||||
Entity.Create {
|
Entity.Create {
|
||||||
id=0
|
id=0
|
||||||
name="Beverage"
|
name="Mains"
|
||||||
printer_id=1
|
printer_id=1
|
||||||
venue_id=1
|
venue_id=1
|
||||||
} |> ignore
|
} |> ignore
|
||||||
|
|
||||||
|
Entity.Create {
|
||||||
|
id=0
|
||||||
|
name="Desserts"
|
||||||
|
printer_id=1
|
||||||
|
venue_id=1
|
||||||
|
} |> ignore
|
||||||
|
|
||||||
|
Entity.Create {
|
||||||
|
id=0
|
||||||
|
name="Drinks"
|
||||||
|
printer_id=2
|
||||||
|
venue_id=1
|
||||||
|
} |> ignore
|
||||||
|
|
||||||
|
|
||||||
path
|
path
|
||||||
|
|
||||||
let CreateDefaultVenue (path: string) =
|
let CreateDefaultVenue (path: string) =
|
||||||
let venue: venue = {
|
{
|
||||||
id=0
|
id=0
|
||||||
name="Megalomania"
|
name="Megalomania"
|
||||||
}
|
}
|
||||||
Entity.Create venue
|
|> Entity.Create
|
||||||
|>ignore
|
|>ignore
|
||||||
path
|
path
|
||||||
|
|
||||||
let CreateDefaultClerk (path: string) =
|
let CreateDefaultClerk (path: string) =
|
||||||
let venue: clerk = {
|
{
|
||||||
id=0
|
id=0
|
||||||
name="Josh"
|
name="Josh"
|
||||||
login_code=1408
|
login_code=1408
|
||||||
user_group_id=1
|
user_group_id=1
|
||||||
}
|
}
|
||||||
Entity.Create venue
|
|> Entity.Create
|
||||||
|>ignore
|
|>ignore
|
||||||
path
|
path
|
||||||
|
|
||||||
@@ -91,7 +124,7 @@ let CreateDefaultSalesCategories (path: string) =
|
|||||||
id=0
|
id=0
|
||||||
parent=0
|
parent=0
|
||||||
name="Food"
|
name="Food"
|
||||||
print_group_id=(Entity.GetFirstByColumn<print_group> "name" "Food").id
|
print_group_id=(Entity.GetFirstByColumn<print_group> "name" "Mains").id
|
||||||
venue_id=1
|
venue_id=1
|
||||||
} |> ignore
|
} |> ignore
|
||||||
|
|
||||||
@@ -99,7 +132,7 @@ let CreateDefaultSalesCategories (path: string) =
|
|||||||
id=0
|
id=0
|
||||||
parent=0
|
parent=0
|
||||||
name="Beverage"
|
name="Beverage"
|
||||||
print_group_id=(Entity.GetFirstByColumn<print_group> "name" "Beverage").id
|
print_group_id=(Entity.GetFirstByColumn<print_group> "name" "Drinks").id
|
||||||
venue_id=1
|
venue_id=1
|
||||||
} |> ignore
|
} |> ignore
|
||||||
|
|
||||||
@@ -228,7 +261,7 @@ let populateDessertGrid () =
|
|||||||
[|
|
[|
|
||||||
getId 0; space; getId 1; space; space ; space;
|
getId 0; space; getId 1; space; space ; space;
|
||||||
space; space; space; space; space; space;
|
space; space; space; space; space; space;
|
||||||
space; getId 2; space; getId 4; space; space;
|
space; getId 2; space; getId 3; space; space;
|
||||||
space; space; space; space; space; space;
|
space; space; space; space; space; space;
|
||||||
space; space; space; space; space; space;
|
space; space; space; space; space; space;
|
||||||
space; space; space; space; space; space;
|
space; space; space; space; space; space;
|
||||||
@@ -283,9 +316,7 @@ let populateSteakTemperaturesGrid () =
|
|||||||
let space = spaceButton()
|
let space = spaceButton()
|
||||||
let SalesCategory = Entity.GetFirstByColumn<sales_category> "name" "Steak Temperatures"
|
let SalesCategory = Entity.GetFirstByColumn<sales_category> "name" "Steak Temperatures"
|
||||||
let Temps = Entity.GetAllByColumn<item> "sales_category_id" SalesCategory.id
|
let Temps = Entity.GetAllByColumn<item> "sales_category_id" SalesCategory.id
|
||||||
let grid =
|
let grid = Entity.GetFirstByColumn<grid> "name" "Steak Temperatures"
|
||||||
Entity.GetFirstByColumn<order_screen_page_group> "label" "Steak Temperatures"
|
|
||||||
|> Entity.GetRelated<grid, order_screen_page_group>
|
|
||||||
|
|
||||||
let getId index =
|
let getId index =
|
||||||
match Temps |> Array.tryItem index with
|
match Temps |> Array.tryItem index with
|
||||||
@@ -320,14 +351,13 @@ let CreateItemFromFileName (index: int) (dirName: string) (file: string) =
|
|||||||
let fileName = Path.GetFileNameWithoutExtension file
|
let fileName = Path.GetFileNameWithoutExtension file
|
||||||
let itemType =
|
let itemType =
|
||||||
match dirName.ToLower() with
|
match dirName.ToLower() with
|
||||||
| "dips" -> "instruction"
|
| "dips" | "steak temperatures" -> "instruction"
|
||||||
| "steak temperatures" -> "instruction"
|
|
||||||
| _ -> "item"
|
| _ -> "item"
|
||||||
|
|
||||||
let categories = (Entity.GetAllByColumn<sales_category> "name" dirName)
|
let categories = (Entity.GetAllByColumn<sales_category> "name" dirName)
|
||||||
let categoryID =
|
let categoryID =
|
||||||
if categories.Length > 0 then categories[0].id
|
if categories.Length > 0 then categories[0].id
|
||||||
else 1
|
else (Entity.GetFirstByColumn<sales_category> "name" "Mains").id
|
||||||
|
|
||||||
let newItem = Entity.Create {
|
let newItem = Entity.Create {
|
||||||
id = 0
|
id = 0
|
||||||
@@ -335,7 +365,7 @@ let CreateItemFromFileName (index: int) (dirName: string) (file: string) =
|
|||||||
sales_category_id=categoryID
|
sales_category_id=categoryID
|
||||||
name=fileName
|
name=fileName
|
||||||
item_type=itemType
|
item_type=itemType
|
||||||
price1=10
|
price1=1000
|
||||||
}
|
}
|
||||||
|
|
||||||
let classes =
|
let classes =
|
||||||
@@ -365,6 +395,80 @@ let CreateItemsAndButtons (dir: string) =
|
|||||||
|> Array.filter (fun file -> Path.GetExtension file = ".png" || Path.GetExtension file = ".jpg")
|
|> Array.filter (fun file -> Path.GetExtension file = ".png" || Path.GetExtension file = ".jpg")
|
||||||
|> Array.iteri (fun index -> CreateItemFromFileName index dirName)
|
|> Array.iteri (fun index -> CreateItemFromFileName index dirName)
|
||||||
|
|
||||||
|
let addFloorplanTable tableNumber x y shape width height rotation (room:room) =
|
||||||
|
Entity.Create {
|
||||||
|
id=0
|
||||||
|
table_number=tableNumber
|
||||||
|
pos_x=x
|
||||||
|
pos_y=y
|
||||||
|
shape=shape
|
||||||
|
width=width
|
||||||
|
height=height
|
||||||
|
rotation=rotation
|
||||||
|
room_id=room.id
|
||||||
|
venue_id=1
|
||||||
|
default_covers=2
|
||||||
|
merged_children=""
|
||||||
|
previous_state=""
|
||||||
|
status=0
|
||||||
|
} |> ignore
|
||||||
|
room
|
||||||
|
|
||||||
|
|
||||||
|
let PopulateRooms () =
|
||||||
|
Entity.GetFirstByColumn<room> "name" "Deck & Courtyard"
|
||||||
|
|> addFloorplanTable 1 1151 1145 "square" 115 115 45
|
||||||
|
|> addFloorplanTable 2 827 1152 "square" 115 115 0
|
||||||
|
|> addFloorplanTable 3 836 922 "square" 115 115 0
|
||||||
|
|> addFloorplanTable 4 956 712 "square" 115 115 0
|
||||||
|
|> addFloorplanTable 5 535 704 "square" 115 115 0
|
||||||
|
|> addFloorplanTable 6 265 861 "square" 115 115 0
|
||||||
|
|> addFloorplanTable 7 265 1031 "square" 115 115 0
|
||||||
|
|> addFloorplanTable 8 265 1197 "square" 115 115 0
|
||||||
|
|> addFloorplanTable 19 90 533 "square" 115 115 0
|
||||||
|
|> addFloorplanTable 20 90 378 "square" 115 115 0
|
||||||
|
|> addFloorplanTable 21 90 233 "square" 115 115 0
|
||||||
|
|> addFloorplanTable 22 90 77 "square" 115 115 0
|
||||||
|
|> addFloorplanTable 23 622 80 "square" 115 115 0
|
||||||
|
|> addFloorplanTable 24 613 296 "square" 115 115 -45
|
||||||
|
|> addFloorplanTable 25 498 539 "square" 115 115 0
|
||||||
|
|> addFloorplanTable 26 854 546 "square" 115 115 0
|
||||||
|
|> addFloorplanTable 27 932 191 "square" 115 115 45
|
||||||
|
|> addFloorplanTable 28 1136 79 "square" 115 115 0
|
||||||
|
|> addFloorplanTable 29 1145 317 "square" 115 115 0
|
||||||
|
|> addFloorplanTable 30 1145 522 "square" 115 115 0
|
||||||
|
|> ignore
|
||||||
|
|
||||||
|
Entity.GetFirstByColumn<room> "name" "Inside"
|
||||||
|
|> addFloorplanTable 31 943 1196 "square" 215 90 0
|
||||||
|
|> addFloorplanTable 32 943 952 "square" 215 90 0
|
||||||
|
|> addFloorplanTable 33 927 565 "circle" 150 150 0
|
||||||
|
|> addFloorplanTable 39 725 67 "square" 115 115 0
|
||||||
|
|> addFloorplanTable 40 685 222 "square" 115 115 0
|
||||||
|
|> addFloorplanTable 41 685 357 "square" 115 115 0
|
||||||
|
|> addFloorplanTable 42 725 531 "square" 115 115 0
|
||||||
|
|> addFloorplanTable 43 185 452 "square" 100 100 0
|
||||||
|
|> addFloorplanTable 44 185 326 "square" 100 100 0
|
||||||
|
|> addFloorplanTable 45 185 199 "square" 100 100 0
|
||||||
|
|> addFloorplanTable 46 185 69 "square" 100 100 0
|
||||||
|
|> addFloorplanTable 51 685 948 "square" 200 100 0
|
||||||
|
|> addFloorplanTable 52 685 1198 "square" 200 100 0
|
||||||
|
|> addFloorplanTable 61 415 762 "circle" 100 100 0
|
||||||
|
|> addFloorplanTable 62 415 901 "circle" 100 100 0
|
||||||
|
|> addFloorplanTable 63 415 1039 "circle" 100 100 0
|
||||||
|
|> addFloorplanTable 64 415 1176 "circle" 100 100 0
|
||||||
|
|> ignore
|
||||||
|
|
||||||
|
Entity.GetFirstByColumn<room> "name" "Function Room"
|
||||||
|
|> addFloorplanTable 71 1039 361 "square" 110 110 0
|
||||||
|
|> addFloorplanTable 72 1000 652 "square" 200 100 0
|
||||||
|
|> addFloorplanTable 73 976 966 "square" 130 130 0
|
||||||
|
|> addFloorplanTable 74 658 962 "square" 120 115 0
|
||||||
|
|> addFloorplanTable 75 567 629 "square" 110 200 0
|
||||||
|
|> addFloorplanTable 76 120 511 "square" 230 100 0
|
||||||
|
|> addFloorplanTable 77 120 847 "square" 230 100 0
|
||||||
|
|
||||||
|
|
||||||
let run () =
|
let run () =
|
||||||
"wwwroot/images/items"
|
"wwwroot/images/items"
|
||||||
|> CreateDefaultVenue
|
|> CreateDefaultVenue
|
||||||
@@ -377,4 +481,5 @@ let run () =
|
|||||||
|> Array.mapi CreatePageFromDirectory
|
|> Array.mapi CreatePageFromDirectory
|
||||||
|> Array.iter CreateItemsAndButtons
|
|> Array.iter CreateItemsAndButtons
|
||||||
|> CreateRooms
|
|> CreateRooms
|
||||||
|> PopulateGrids
|
|> PopulateGrids
|
||||||
|
|> PopulateRooms
|
||||||
@@ -62,7 +62,7 @@ let loadOrderScreenView (ctx: HttpContext) (tableNumber: int) =
|
|||||||
let metaTags = [|"viewport", "user-scalable = no, initial-scale=0.8,maximum-scale=0.8 ,shrink-to-fit=yes"|] |> addDefaultMetaTags
|
let metaTags = [|"viewport", "user-scalable = no, initial-scale=0.8,maximum-scale=0.8 ,shrink-to-fit=yes"|] |> addDefaultMetaTags
|
||||||
|
|
||||||
let printGroupButtons =
|
let printGroupButtons =
|
||||||
Entity.GetAllInVenue<sales_category>
|
Entity.GetAllInVenue<print_group>
|
||||||
|> Array.map View.printGroupButton
|
|> Array.map View.printGroupButton
|
||||||
|
|
||||||
let orderScreenPageGroupButtons =
|
let orderScreenPageGroupButtons =
|
||||||
|
|||||||
@@ -39,8 +39,8 @@ let pageContainer floorplanTable (clerk: clerk) printGroupButtons orderScreenPag
|
|||||||
span [_class "voidModeWarning"; VisibleInMode ["void"]] [str (get "void_mode")]
|
span [_class "voidModeWarning"; VisibleInMode ["void"]] [str (get "void_mode")]
|
||||||
]
|
]
|
||||||
div [_class "orderBoxFooter"] [
|
div [_class "orderBoxFooter"] [
|
||||||
span [_class "totalPrice"] [str (getAndReplace "totalPrice" ["0.00"])]
|
span [_class "orderBoxTotal"] [str (getAndReplace "totalPrice" ["0.00"])]
|
||||||
small [_class "selectedPrice"] [str (getAndReplace "selectedPrice" ["0.00"])]
|
small [_class "orderBoxSelectedTotal"] [str (getAndReplace "selectedPrice" ["0.00"])]
|
||||||
|
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
@@ -48,7 +48,12 @@ let pageContainer floorplanTable (clerk: clerk) printGroupButtons orderScreenPag
|
|||||||
div [_id "topHalf"] [
|
div [_id "topHalf"] [
|
||||||
div [_class "functionButtons"] [
|
div [_class "functionButtons"] [
|
||||||
div [_class "printGroupButtons toggleGroup"] [
|
div [_class "printGroupButtons toggleGroup"] [
|
||||||
input [_type "hidden"; _class "value"]
|
input [_type "hidden"; _class "value"; _name "print_override"]
|
||||||
|
posButton "printGroupOverrideButton toggle default" [
|
||||||
|
(attr "data-value") (string 0)
|
||||||
|
] [
|
||||||
|
["default"] |> getAndReplace "print_with" |> str
|
||||||
|
]
|
||||||
yield! printGroupButtons
|
yield! printGroupButtons
|
||||||
]
|
]
|
||||||
div [_class "functionColumn"] [
|
div [_class "functionColumn"] [
|
||||||
@@ -103,7 +108,7 @@ let gridContainer =
|
|||||||
]
|
]
|
||||||
|
|
||||||
let pageGroupButton (pageGroup: order_screen_page_group) = posButton "loadPageGroup" [(attr "data-page-group-id") (string pageGroup.id)] [str pageGroup.label]
|
let pageGroupButton (pageGroup: order_screen_page_group) = posButton "loadPageGroup" [(attr "data-page-group-id") (string pageGroup.id)] [str pageGroup.label]
|
||||||
let printGroupButton (printGroup: sales_category) = posButton "" [(attr "data-print-group-id") (string printGroup.id)] [str printGroup.name]
|
let printGroupButton (printGroup: print_group) = posButton "toggle printGroupOverrideButton" [(attr "data-value") (string printGroup.id)] [ [printGroup.name] |> getAndReplace "print_with" |> str ]
|
||||||
|
|
||||||
let itemButtonImage (button: button) =
|
let itemButtonImage (button: button) =
|
||||||
span [
|
span [
|
||||||
@@ -111,6 +116,9 @@ let itemButtonImage (button: button) =
|
|||||||
_style $"background-image:url(\"/images/items/{button.image}\");"
|
_style $"background-image:url(\"/images/items/{button.image}\");"
|
||||||
] []
|
] []
|
||||||
|
|
||||||
|
let _data_primary_action = attr "data-primary-action"
|
||||||
|
let _data_secondary_action = attr "data-secondary-action"
|
||||||
|
|
||||||
let itemButton (button: button) =
|
let itemButton (button: button) =
|
||||||
let extraClasses =
|
let extraClasses =
|
||||||
if button.image.Length > 0 then button.extra_classes + " hasImage"
|
if button.image.Length > 0 then button.extra_classes + " hasImage"
|
||||||
@@ -123,8 +131,8 @@ let itemButton (button: button) =
|
|||||||
yield! primaryAttributes
|
yield! primaryAttributes
|
||||||
yield! secondaryAttributes
|
yield! secondaryAttributes
|
||||||
_style button.extra_styles
|
_style button.extra_styles
|
||||||
(attr "data-primary-action") button.primary_action
|
_data_primary_action button.primary_action
|
||||||
(attr "data-secondary-action") button.secondary_action
|
_data_secondary_action button.secondary_action
|
||||||
] [
|
] [
|
||||||
if button.image.Length > 0 then itemButtonImage button
|
if button.image.Length > 0 then itemButtonImage button
|
||||||
span [_class "text "] [str button.text]
|
span [_class "text "] [str button.text]
|
||||||
|
|||||||
15
Program.fs
15
Program.fs
@@ -17,11 +17,14 @@ module Program =
|
|||||||
forward "/install" DredgePos.Installer.Router.router
|
forward "/install" DredgePos.Installer.Router.router
|
||||||
}
|
}
|
||||||
|
|
||||||
let app = application {
|
let app =
|
||||||
use_mime_types [(".woff", "application/font-woff")]
|
let ipAddress = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList[2];
|
||||||
use_static "wwwroot"
|
printf $"DredgePOS is now running at http://{ipAddress}:5001\n"
|
||||||
use_router router
|
application {
|
||||||
url "http://0.0.0.0:5001"
|
use_mime_types [(".woff", "application/font-woff")]
|
||||||
}
|
use_static "wwwroot"
|
||||||
|
use_router router
|
||||||
|
url "http://0.0.0.0:5001"
|
||||||
|
}
|
||||||
|
|
||||||
run app
|
run app
|
||||||
|
|||||||
1214
package-lock.json
generated
1214
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@
|
|||||||
"konva": "^8.2.2",
|
"konva": "^8.2.2",
|
||||||
"sass": "^1.43.4",
|
"sass": "^1.43.4",
|
||||||
"tsc": "^2.0.4",
|
"tsc": "^2.0.4",
|
||||||
"typescript": "^4.4.4"
|
"typescript": "^4.7.4"
|
||||||
},
|
},
|
||||||
"description": "",
|
"description": "",
|
||||||
"license": "",
|
"license": "",
|
||||||
|
|||||||
10
sql.log
Normal file
10
sql.log
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
create table if not exists migrations
|
||||||
|
(
|
||||||
|
id serial
|
||||||
|
constraint migrations_pk
|
||||||
|
primary key,
|
||||||
|
"name" varchar(100) not null,
|
||||||
|
"timestamp" int not null
|
||||||
|
);
|
||||||
|
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
"removeComments":false,
|
"removeComments":false,
|
||||||
"preserveConstEnums":true,
|
"preserveConstEnums":true,
|
||||||
"outDir":"wwwroot/scripts",
|
"outDir":"wwwroot/scripts",
|
||||||
"target":"ES2016",
|
"target":"ESNext",
|
||||||
"sourceMap":true,
|
"sourceMap":true,
|
||||||
"moduleResolution": "node"
|
"moduleResolution": "node"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -23,9 +23,7 @@ const lang = (key: string, replacements?: string[] | string) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Check if a variable is defined */
|
/** Check if a variable is defined */
|
||||||
const defined = (variable: any) => {
|
const defined = (variable: any) => typeof variable !== 'undefined'
|
||||||
return typeof variable !== 'undefined'
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Call an Ajax function asynchronously */
|
/** Call an Ajax function asynchronously */
|
||||||
const ajax = (endpoint: string, data: any, method = 'POST', successFunction: Function, errorFunction: Function, beforeFunction: any) => {
|
const ajax = (endpoint: string, data: any, method = 'POST', successFunction: Function, errorFunction: Function, beforeFunction: any) => {
|
||||||
@@ -69,18 +67,17 @@ const ajaxSync = (endpoint: string, data?: any, method = 'POST') => {
|
|||||||
/* Redirect to a specific URL */
|
/* Redirect to a specific URL */
|
||||||
const redirect = (url: string): void => location.assign(url)
|
const redirect = (url: string): void => location.assign(url)
|
||||||
|
|
||||||
const resize = () => {
|
const resize = () => $('#pageContainer').height(window.innerHeight + "px");
|
||||||
$('#pageContainer').height(window.innerHeight + "px");
|
|
||||||
}
|
|
||||||
|
|
||||||
const setupCore = (languageVars: Record<string, string>) => {
|
const setupCore = (languageVars: Record<string, string>) => {
|
||||||
Application.languageVars = languageVars
|
Application.languageVars = languageVars
|
||||||
const doc = $(document)
|
$(document)
|
||||||
doc.on('click', '#alertNo, #alertOk', hideAlerts)
|
.on('click', '#alertNo, #alertOk', hideAlerts)
|
||||||
doc.on('click', '.toggle', toggle)
|
.on('click', '.toggle', toggle)
|
||||||
|
.on('click', '.hideModals', hideModals)
|
||||||
|
|
||||||
window.addEventListener('resize', resize)
|
window.addEventListener('resize', resize)
|
||||||
resize()
|
resize()
|
||||||
|
|
||||||
setElementVisibilityByMode()
|
setElementVisibilityByMode()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,6 +114,7 @@ const confirmation = (message: string, data: any, title = 'Confirm', submitFunct
|
|||||||
|
|
||||||
|
|
||||||
const hideAlerts = () => $('#alert').hide()
|
const hideAlerts = () => $('#alert').hide()
|
||||||
|
const hideModals = () => $('.modal').hide()
|
||||||
|
|
||||||
const turnOnMode = (mode: PosMode) => {
|
const turnOnMode = (mode: PosMode) => {
|
||||||
Application.mode.push(mode)
|
Application.mode.push(mode)
|
||||||
@@ -184,15 +182,46 @@ const setElementVisibilityByMode = () => {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const pulseElement = (element: JQuery) => element.addClass('pulse').on('animationend', () => element.removeClass('pulse'))
|
const getPercentageOfPageContainerWidth = (pixels: number) => ( (pixels / $('#pageContainer').width()) * 100) + '%'
|
||||||
|
|
||||||
|
const pulseElement = (element: JQuery) => {
|
||||||
|
const orderItem: orderItem = element.data('order-item')
|
||||||
|
removeOrderItemsToPulse(orderItem.id)
|
||||||
|
element
|
||||||
|
.addClass('pulse')
|
||||||
|
.on('animationend', () => element.removeClass('pulse'))
|
||||||
|
}
|
||||||
|
|
||||||
|
Array.prototype.collect = function<x, y>(this: x[], func: (item: x) => y[]) {
|
||||||
|
return this.map(func).flat(1)
|
||||||
|
}
|
||||||
|
|
||||||
Array.prototype.where = function<x>(this: x[], property: string, value: any) {
|
Array.prototype.where = function<x>(this: x[], property: string, value: any) {
|
||||||
return this.filter( item => (item as any)[property] === value)[0] || null
|
return this.filter( item => (item as any)[property] === value)[0] || null
|
||||||
}
|
}
|
||||||
|
Array.prototype.first = function<x>(this: x[]) {
|
||||||
|
return this[0]
|
||||||
|
}
|
||||||
|
Array.prototype.last = function<x>(this: x[]) {
|
||||||
|
return this[this.length-1]
|
||||||
|
}
|
||||||
|
Array.prototype.unique = function<x>(this: x[]) {
|
||||||
|
return [... new Set(this)]
|
||||||
|
}
|
||||||
|
|
||||||
|
const clone = <x>(obj: x) => JSON.parse(JSON.stringify(obj)) as x
|
||||||
|
|
||||||
const money = (amount: number, fromCents=true) => currency(amount, {fromCents: fromCents})
|
const money = (amount: number, fromCents=true) => currency(amount, {fromCents: fromCents})
|
||||||
const moneyFromString = (amount: string) => currency(amount)
|
const moneyFromString = (amount: string) => currency(amount)
|
||||||
|
|
||||||
|
const array_push = <x>(array: x[], value: x) => {
|
||||||
|
let copy = array.slice()
|
||||||
|
return [...copy, value]
|
||||||
|
};
|
||||||
|
const array_remove = <x>(array: x[], valueToRemove: x) => array.filter(item => item != valueToRemove)
|
||||||
|
const array_pop = <x>(array:x[]) => array.slice(0,-1);
|
||||||
|
const array_unique = <x>(array:x[]) => [... new Set(array)]
|
||||||
|
|
||||||
const toggle = (e: JQuery.TriggeredEvent) => {
|
const toggle = (e: JQuery.TriggeredEvent) => {
|
||||||
const button = $(e.target)
|
const button = $(e.target)
|
||||||
const toggleGroup = button.closest('.toggleGroup')
|
const toggleGroup = button.closest('.toggleGroup')
|
||||||
|
|||||||
@@ -7,32 +7,34 @@ type OrderScreenData = {
|
|||||||
|
|
||||||
type OrderScreen = {
|
type OrderScreen = {
|
||||||
order_screen_pages: order_screen_page[]
|
order_screen_pages: order_screen_page[]
|
||||||
last_added_item: orderItem
|
|
||||||
order_items: orderItem[]
|
order_items: orderItem[]
|
||||||
sales_categories: sales_category[]
|
sales_categories: sales_category[]
|
||||||
print_groups: print_group[]
|
print_groups: print_group[]
|
||||||
order_item_id_generator: Generator
|
order_item_id_generator: Generator
|
||||||
selected_item_ids: number[]
|
selected_item_ids: number[]
|
||||||
|
order_item_ids_to_pulse: number[]
|
||||||
qty_override: number
|
qty_override: number
|
||||||
print_group_override: print_group
|
print_group_override: print_group
|
||||||
custom_item: item,
|
custom_item: item,
|
||||||
selected_cover: number
|
selected_cover: number
|
||||||
table: floorplan_table,
|
table: floorplan_table,
|
||||||
|
last_added_item_ids: number[]
|
||||||
}
|
}
|
||||||
|
|
||||||
let OrderScreen : OrderScreen = {
|
let OrderScreen : OrderScreen = {
|
||||||
order_screen_pages: null,
|
order_screen_pages: null,
|
||||||
last_added_item: null,
|
|
||||||
order_items: [],
|
order_items: [],
|
||||||
print_groups: [],
|
print_groups: [],
|
||||||
sales_categories: [],
|
sales_categories: [],
|
||||||
order_item_id_generator: newestId(),
|
order_item_id_generator: newestId(),
|
||||||
selected_item_ids: [],
|
selected_item_ids: [],
|
||||||
|
order_item_ids_to_pulse: [],
|
||||||
qty_override: 1,
|
qty_override: 1,
|
||||||
print_group_override: null,
|
print_group_override: null,
|
||||||
custom_item: null,
|
custom_item: null,
|
||||||
selected_cover: 0,
|
selected_cover: 0,
|
||||||
table: null,
|
table: null,
|
||||||
|
last_added_item_ids: [],
|
||||||
}
|
}
|
||||||
|
|
||||||
const loadPageGroup = (e: Event) => {
|
const loadPageGroup = (e: Event) => {
|
||||||
@@ -57,32 +59,30 @@ const loadPageGroup = (e: Event) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const setupOrderScreen = (data: OrderScreenData) => {
|
const setupOrderScreen = (data: OrderScreenData) => {
|
||||||
|
|
||||||
|
|
||||||
OrderScreen.order_screen_pages = data.order_screen_pages
|
OrderScreen.order_screen_pages = data.order_screen_pages
|
||||||
OrderScreen.sales_categories = data.sales_categories
|
OrderScreen.sales_categories = data.sales_categories
|
||||||
OrderScreen.print_groups = data.print_groups
|
OrderScreen.print_groups = data.print_groups
|
||||||
OrderScreen.custom_item = data.custom_item
|
OrderScreen.custom_item = data.custom_item
|
||||||
|
|
||||||
updateOrderBoxTotals()
|
updateOrderBoxTotals()
|
||||||
let doc = $(document)
|
$(document)
|
||||||
doc.on('click', '.nextButton', goToNextPage)
|
.on('click', '.nextButton', goToNextPage)
|
||||||
doc.on('click', '.prevButton', goToPrevPage)
|
.on('click', '.prevButton', goToPrevPage)
|
||||||
doc.on('click', '.loadPageGroup', loadPageGroup)
|
.on('click', '.loadPageGroup', loadPageGroup)
|
||||||
doc.on('click', '[data-primary-action=item]', itemButtonClicked)
|
.on('click', getElementsByAction('item'), itemButtonClicked)
|
||||||
doc.on('click', '[data-primary-action=grid],[data-secondary-action=grid]', gridButtonClicked)
|
.on('click', getElementsByAction('grid'), gridButtonClicked)
|
||||||
doc.on('click', '.closeGrid', hideGrids)
|
.on('click', '.closeGrid', hideGrids)
|
||||||
doc.on('click', '.freetextButton', freetext)
|
.on('click', '.freetextButton', freetext)
|
||||||
doc.on('click', '.openItemButton', customItem)
|
.on('click', '.openItemButton', customItem)
|
||||||
doc.on('click', '.orderBoxTable tbody tr', itemRowClicked)
|
.on('click', '.orderBoxTable tbody tr', itemRowClicked)
|
||||||
doc.on('click', '.voidButton', voidButtonClicked)
|
.on('click', '.voidButton', voidButtonClicked)
|
||||||
doc.on('dblclick', '.voidButton', voidLastItem)
|
.on('dblclick', '.voidButton', voidLastItem)
|
||||||
doc.on('click', '.numpadButton', overrideQty)
|
.on('click', '.numpadButton', overrideQty)
|
||||||
doc.on('click', '.accumulateButton', () => toggleMode('accumulate'))
|
.on('click', '.accumulateButton', () => toggleMode('accumulate'))
|
||||||
doc.on('click', '.changeCoverNumberButton', changeCoverNumberPrompt)
|
.on('click', '.changeCoverNumberButton', changeCoverNumberPrompt)
|
||||||
doc.on('click', '.showCoverSelectorButton', showCoverSelector)
|
.on('click', '.showCoverSelectorButton', showCoverSelector)
|
||||||
doc.on('click', '.coverSelectorButton', coverSelected)
|
.on('click', '.coverSelectorButton', coverSelected)
|
||||||
doc.on('change', '[name=print_override]', printGroupOverride)
|
.on('change', '[name=print_override]', printGroupOverride)
|
||||||
|
|
||||||
turnOnMode('accumulate')
|
turnOnMode('accumulate')
|
||||||
|
|
||||||
@@ -98,6 +98,8 @@ const setupOrderScreen = (data: OrderScreenData) => {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const getElementsByAction = (action: string) => `[data-primary-action=${action}], [data-secondary-action=${action}]`
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param direction 1 for forward, -1 for backwards.
|
* @param direction 1 for forward, -1 for backwards.
|
||||||
* @param button
|
* @param button
|
||||||
@@ -111,88 +113,156 @@ const navigatePage = (direction: number, button: JQuery) => {
|
|||||||
grid.get()[0].scrollLeft += grid.width() * direction
|
grid.get()[0].scrollLeft += grid.width() * direction
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const getOrderBox = () => $('.orderBoxTable tbody')
|
||||||
const goToNextPage = (e: JQuery.TriggeredEvent) => navigatePage(1, $(e.target))
|
const goToNextPage = (e: JQuery.TriggeredEvent) => navigatePage(1, $(e.target))
|
||||||
const goToPrevPage = (e: JQuery.TriggeredEvent) => navigatePage(-1, $(e.target))
|
const goToPrevPage = (e: JQuery.TriggeredEvent) => navigatePage(-1, $(e.target))
|
||||||
|
|
||||||
const addItemToOrderBox = (orderItem:orderItem) => {
|
const setItemQty = (orderItem: orderItem, qty: number) => {
|
||||||
const orderBox = $('.orderBoxTable tbody')
|
if(!orderItem || !OrderScreen.order_items.find(existingItem => orderItem.id == existingItem.id)) return;
|
||||||
let selectedRows = orderBox.find('tr.selected')
|
|
||||||
let lastRow : JQuery = selectedRows.length ? getLastInstructionRow(selectedRows.first()) : orderBox.find('tr').last()
|
|
||||||
const existingRow = orderBox
|
|
||||||
.find('tr')
|
|
||||||
.filterByData('item', orderItem.item)
|
|
||||||
.filterByData('print_group', orderItem.print_group_id)
|
|
||||||
.filterByData('cover', orderItem.cover)
|
|
||||||
.last()
|
|
||||||
|
|
||||||
|
const instructionIds = getInstructionItems(orderItem.id).map(orderItem => orderItem.id)
|
||||||
|
|
||||||
//If accumulating, just increase the quantity of the existing row.
|
if(qty < 1){
|
||||||
if(existingRow.length > 0 && isInMode('accumulate')){
|
const newItems = OrderScreen.order_items.filter(existingOrderItem =>
|
||||||
incrementRowQty(existingRow, orderItem.qty)
|
(existingOrderItem.id != orderItem.id) && !instructionIds.includes(existingOrderItem.id)
|
||||||
scrollToElement(existingRow)
|
)
|
||||||
existingRow.pulse()
|
|
||||||
} else {
|
OrderScreen.selected_item_ids = array_remove(OrderScreen.selected_item_ids, orderItem.id)
|
||||||
const newRow = createOrderRow(orderItem)
|
if(orderItem.item.item_type == "item") {
|
||||||
lastRow.length > 0
|
const lastItem = newItems.filter(orderItem => orderItem.item.item_type == "item")?.last()
|
||||||
? lastRow.after(newRow)
|
OrderScreen.last_added_item_ids = newItems.length > 0 && lastItem ? [lastItem.id] : []
|
||||||
: orderBox.append(newRow)
|
}
|
||||||
scrollToElement(newRow)
|
setOrderItems(newItems)
|
||||||
newRow.pulse()
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
deselectRow(orderBox.find('tr'))
|
const newItems = OrderScreen.order_items.map(existingOrderItem => {
|
||||||
|
if(existingOrderItem.id == orderItem.id){
|
||||||
|
existingOrderItem.qty = qty
|
||||||
|
}
|
||||||
|
return existingOrderItem
|
||||||
|
})
|
||||||
|
|
||||||
|
setOrderItems(newItems)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const incrementItemQty = (orderItem:orderItem) => setItemQty(orderItem, orderItem?.qty+1)
|
||||||
|
const decrementItemQty = (orderItem:orderItem) => setItemQty(orderItem, orderItem?.qty-1)
|
||||||
|
|
||||||
|
const deselectAllRows = () => {
|
||||||
|
OrderScreen.selected_item_ids = []
|
||||||
|
$('tr.selected').removeClass('selected')
|
||||||
|
}
|
||||||
|
|
||||||
|
const addOrderItemsToPulse = (id: number) => OrderScreen.order_item_ids_to_pulse = array_push(OrderScreen.order_item_ids_to_pulse, id)
|
||||||
|
const removeOrderItemsToPulse = (id: number) => OrderScreen.order_item_ids_to_pulse = array_remove(OrderScreen.order_item_ids_to_pulse, id)
|
||||||
|
|
||||||
|
const addItemToOrderBox = (newOrderItem:orderItem) => {
|
||||||
|
const existingItems = OrderScreen.order_items
|
||||||
|
.filter(existingOrderItem =>
|
||||||
|
existingOrderItem.item.id == newOrderItem.item.id
|
||||||
|
&& existingOrderItem.print_group.id == newOrderItem.print_group.id
|
||||||
|
&& existingOrderItem.cover == newOrderItem.cover
|
||||||
|
)
|
||||||
|
|
||||||
|
if(existingItems.length > 0 && isInMode('accumulate')) {
|
||||||
|
addOrderItemsToPulse(existingItems[0].id)
|
||||||
|
incrementItemQty(existingItems[0])
|
||||||
|
OrderScreen.last_added_item_ids = [existingItems[0].id]
|
||||||
|
} else {
|
||||||
|
addOrderItemsToPulse(newOrderItem.id)
|
||||||
|
if(!OrderScreen.selected_item_ids.length) {
|
||||||
|
const newItems = array_push(OrderScreen.order_items, newOrderItem)
|
||||||
|
setOrderItems(newItems)
|
||||||
|
} else {
|
||||||
|
const newItems =
|
||||||
|
OrderScreen.order_items
|
||||||
|
.collect(existingOrderItem => {
|
||||||
|
const firstSelectedItemId = getLastInstructionItem(OrderScreen.selected_item_ids.first()).id
|
||||||
|
return firstSelectedItemId == existingOrderItem.id
|
||||||
|
? [existingOrderItem, newOrderItem]
|
||||||
|
: [existingOrderItem]
|
||||||
|
})
|
||||||
|
setOrderItems(newItems)
|
||||||
|
}
|
||||||
|
OrderScreen.last_added_item_ids = [newOrderItem.id]
|
||||||
|
}
|
||||||
|
deselectAllRows()
|
||||||
|
}
|
||||||
|
|
||||||
|
const getParentItem = (orderItemId: number, itemList:orderItem[]) => {
|
||||||
|
const itemIndex = itemList.findIndex(orderItem => orderItem.id === orderItemId);
|
||||||
|
if(itemList[itemIndex].item.item_type == "item"){
|
||||||
|
return itemList[itemIndex]
|
||||||
|
}
|
||||||
|
return itemList
|
||||||
|
.filter((orderItem, index) => index < itemIndex && orderItem.item.item_type === 'item')
|
||||||
|
.last()
|
||||||
|
}
|
||||||
|
|
||||||
|
const getInstructionItems = (orderItemId: number) => {
|
||||||
|
const itemIndex = OrderScreen.order_items.findIndex(orderItem => orderItem.id === orderItemId);
|
||||||
|
if(!OrderScreen.order_items[itemIndex+1]
|
||||||
|
|| OrderScreen.order_items[itemIndex+1].item.item_type == "item"
|
||||||
|
|| OrderScreen.order_items[itemIndex].item.item_type == "instruction"
|
||||||
|
)
|
||||||
|
return [OrderScreen.order_items[itemIndex]]
|
||||||
|
|
||||||
|
|
||||||
|
const nextItem =
|
||||||
|
OrderScreen.order_items
|
||||||
|
.filter((orderItem, index) => index > itemIndex && orderItem.item.item_type === 'item')
|
||||||
|
?.first()
|
||||||
|
if(!nextItem) {
|
||||||
|
return OrderScreen.order_items.filter((orderItem, index) => index > itemIndex)
|
||||||
|
}
|
||||||
|
const nextItemIndex = OrderScreen.order_items.findIndex(orderItem => orderItem.id === nextItem.id);
|
||||||
|
return OrderScreen.order_items.slice(itemIndex, nextItemIndex)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
const getLastInstructionItem = (orderItemId: number) => getInstructionItems(orderItemId).last()
|
||||||
|
|
||||||
const addInstructionToOrderBox = (instruction: orderItem) => {
|
const addInstructionToOrderBox = (instruction: orderItem) => {
|
||||||
const orderBox = $('.orderBoxTable tbody')
|
|
||||||
let selectedRows = orderBox.find('tr.selected')
|
|
||||||
const newRow = createOrderRow(instruction)
|
|
||||||
|
|
||||||
//If no items are added, then you can't add an instruction row.
|
//If no items are added, then you can't add an instruction row.
|
||||||
if(!orderBox.find('tr.itemRow').length) return
|
if(!OrderScreen.order_items.length) return
|
||||||
|
|
||||||
if(selectedRows.length > 0){
|
const addAfter = OrderScreen.selected_item_ids.length
|
||||||
selectedRows.each( (_, row) => {
|
? OrderScreen.selected_item_ids
|
||||||
const selectedRow = $(row)
|
.filter(selectedItemId => {
|
||||||
const parentRow = getParentRow(selectedRow)
|
const orderItem = OrderScreen.order_items.find(orderItem => orderItem.id == selectedItemId)
|
||||||
if(parentRow.is(selectedRow) || !parentRow.hasClass('selected')) {
|
const parentItem = getParentItem(selectedItemId, OrderScreen.order_items)
|
||||||
const newRow = createOrderRow(instruction)
|
return !(orderItem.item.item_type == "instruction" && OrderScreen.selected_item_ids.includes(parentItem.id))
|
||||||
getLastInstructionRow(selectedRow).after(newRow)
|
})
|
||||||
newRow
|
.map(selectedItemId => getLastInstructionItem(selectedItemId).id)
|
||||||
.setColumnValue( lang('printgroup_header'), selectedRow.getColumnValue(lang('printgroup_header')) )
|
.unique()
|
||||||
|
: OrderScreen.last_added_item_ids.map(itemId => getLastInstructionItem(itemId).id)
|
||||||
|
|
||||||
|
const newItems = OrderScreen.order_items.collect(existingItem => {
|
||||||
|
const newInstruction = createNewOrderItem(instruction.item, instruction.qty, instruction.print_group)
|
||||||
|
addOrderItemsToPulse(newInstruction.id)
|
||||||
|
return addAfter.includes(existingItem.id)
|
||||||
|
? [existingItem, newInstruction]
|
||||||
|
: [existingItem]
|
||||||
|
})
|
||||||
|
setOrderItems(newItems)
|
||||||
|
}
|
||||||
|
|
||||||
if(parentRow.hasClass('selected')){
|
const createNewOrderItem = (item: item, qty: number, printGroup: print_group) : orderItem => {
|
||||||
selectRow(newRow)
|
return {
|
||||||
} else {
|
id: OrderScreen.order_item_id_generator.next().value,
|
||||||
newRow.pulse()
|
item: clone(item),
|
||||||
}
|
qty: qty,
|
||||||
|
print_group: printGroup,
|
||||||
scrollToElement(newRow)
|
cover: OrderScreen.selected_cover,
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const lastRow = orderBox.find('tr').last()
|
|
||||||
newRow
|
|
||||||
.setColumnValue(lang('printgroup_header'), lastRow.getColumnValue(lang('printgroup_header')))
|
|
||||||
.appendTo(orderBox)
|
|
||||||
.pulse()
|
|
||||||
scrollToElement(newRow)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const addNewItem = (item: item, qty = 1) => {
|
const addNewItem = (item: item, qty = 1) => {
|
||||||
const salesCategory = OrderScreen.sales_categories.where('id', item.sales_category_id)
|
const salesCategory = OrderScreen.sales_categories.where('id', item.sales_category_id)
|
||||||
const printGroup = OrderScreen.print_group_override ?? OrderScreen.print_groups.where('id', salesCategory.print_group_id)
|
const printGroup = OrderScreen.print_group_override ?? OrderScreen.print_groups.where('id', salesCategory.print_group_id)
|
||||||
const orderItem : orderItem = {
|
const orderItem = createNewOrderItem(item, qty, printGroup)
|
||||||
id: OrderScreen.order_item_id_generator.next().value,
|
|
||||||
item: item,
|
|
||||||
qty: qty,
|
|
||||||
print_group_id: printGroup,
|
|
||||||
cover: OrderScreen.selected_cover,
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(item.item_type){
|
switch(item.item_type){
|
||||||
case 'instruction':
|
case 'instruction':
|
||||||
@@ -205,52 +275,34 @@ const addNewItem = (item: item, qty = 1) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const getLastInstructionRow = (row: JQuery) => {
|
|
||||||
let stopCounting = false
|
|
||||||
let finalRow = row
|
|
||||||
row.nextAll().each(function (index, activeRow){
|
|
||||||
if(!stopCounting){
|
|
||||||
if($(activeRow).hasClass('instructionRow')){
|
|
||||||
finalRow = $(activeRow)
|
|
||||||
} else {
|
|
||||||
stopCounting = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
return $(finalRow)
|
|
||||||
}
|
|
||||||
|
|
||||||
const getParentRow = (row: JQuery) =>
|
|
||||||
row.hasClass('instructionRow')
|
|
||||||
? row.prevAll('.itemRow').first()
|
|
||||||
: row
|
|
||||||
|
|
||||||
|
|
||||||
const incrementRowQty = (row: JQuery, qty: number) => {
|
|
||||||
const existingQty = Number(row.getColumnValue(lang('qty_header')))
|
|
||||||
const newQty = qty + existingQty
|
|
||||||
row.setColumnValue(lang('qty_header'), newQty)
|
|
||||||
calculateRowTotal(row)
|
|
||||||
}
|
|
||||||
|
|
||||||
const renderOrderBox = () => {
|
const renderOrderBox = () => {
|
||||||
const orderBox = $('.orderBoxTable')
|
const orderBox = getOrderBox()
|
||||||
const tbody = orderBox.children('tbody')
|
|
||||||
const newTbody = $('<tbody />')
|
const newTbody = $('<tbody />')
|
||||||
OrderScreen.order_items.forEach(orderItem => {
|
OrderScreen.order_items.forEach(orderItem => {
|
||||||
const newRow = createOrderRow(orderItem)
|
const newRow = createOrderRow(orderItem)
|
||||||
newTbody.append(newRow)
|
newTbody.append(newRow)
|
||||||
newRow.pulse()
|
|
||||||
if(OrderScreen.selected_item_ids.includes(orderItem.id)){
|
if(OrderScreen.selected_item_ids.includes(orderItem.id)){
|
||||||
selectRow(newRow)
|
newRow.addClass('selected')
|
||||||
|
}
|
||||||
|
|
||||||
|
if(OrderScreen.order_item_ids_to_pulse.includes(orderItem.id)){
|
||||||
|
newRow.pulse()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
tbody.replaceWith(newTbody)
|
orderBox.replaceWith(newTbody)
|
||||||
const element = orderBox.find('tbody tr').last().get()[0]
|
const element = newTbody.find('tr').last().get()[0]
|
||||||
element.scrollIntoView()
|
if(element) {
|
||||||
OrderScreen.last_added_item = null
|
element.scrollIntoView()
|
||||||
|
}
|
||||||
|
updateOrderBoxTotals()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const setOrderItems = (orderItems: orderItem[]) => {
|
||||||
|
OrderScreen.order_items = orderItems
|
||||||
|
renderOrderBox()
|
||||||
}
|
}
|
||||||
|
|
||||||
const createOrderRow = (orderItem: orderItem) => {
|
const createOrderRow = (orderItem: orderItem) => {
|
||||||
@@ -263,10 +315,10 @@ const createOrderRow = (orderItem: orderItem) => {
|
|||||||
.setColumnValue(lang('price_header'), price)
|
.setColumnValue(lang('price_header'), price)
|
||||||
.setColumnValue(lang('id_header'), orderItem.item.id)
|
.setColumnValue(lang('id_header'), orderItem.item.id)
|
||||||
.setColumnValue(lang('total_price_header'), price.multiply(orderItem.qty))
|
.setColumnValue(lang('total_price_header'), price.multiply(orderItem.qty))
|
||||||
.setColumnValue(lang('printgroup_header'), orderItem.print_group_id?.name)
|
.setColumnValue(lang('printgroup_header'), orderItem.print_group?.name)
|
||||||
.data('order-item-id', orderItem.id)
|
.data('order-item-id', orderItem.id)
|
||||||
.data('order-item-id', orderItem.id)
|
.data('order-item', orderItem)
|
||||||
.data('print_group', orderItem.print_group_id)
|
.data('print_group', orderItem.print_group)
|
||||||
.data('cover', orderItem.cover)
|
.data('cover', orderItem.cover)
|
||||||
.data('item', orderItem.item)
|
.data('item', orderItem.item)
|
||||||
.find('td.itemCell')
|
.find('td.itemCell')
|
||||||
@@ -276,7 +328,7 @@ const createOrderRow = (orderItem: orderItem) => {
|
|||||||
|
|
||||||
if(orderItem.item.item_type == 'instruction' && price.value <= 0){
|
if(orderItem.item.item_type == 'instruction' && price.value <= 0){
|
||||||
row
|
row
|
||||||
.find('.totalPriceCell')
|
.find('.totalPriceCell,.unitPriceCell')
|
||||||
.css('font-size', 0)
|
.css('font-size', 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -309,14 +361,13 @@ const hideGrids = () => $('.gridContainer').hide()
|
|||||||
|
|
||||||
const gridHtmlGenerated = (gridData: {gridHtml:string, grid: grid}) => {
|
const gridHtmlGenerated = (gridData: {gridHtml:string, grid: grid}) => {
|
||||||
const gridContainer = $('.gridContainer')
|
const gridContainer = $('.gridContainer')
|
||||||
const gridCellWidth = getGridCellWidth()
|
const cellDimensions = getGridCellDimensions()
|
||||||
const gridCellHeight = getGridCellHeight()
|
|
||||||
const grid = gridData.grid
|
const grid = gridData.grid
|
||||||
const gridHtml = gridData.gridHtml
|
const gridHtml = gridData.gridHtml
|
||||||
|
|
||||||
gridContainer
|
gridContainer
|
||||||
.show()
|
.show()
|
||||||
.width(gridCellWidth * grid.cols)
|
.width(cellDimensions.width * grid.cols)
|
||||||
.children('.gridContainerHeader')
|
.children('.gridContainerHeader')
|
||||||
.children('span')
|
.children('span')
|
||||||
.text(grid.name)
|
.text(grid.name)
|
||||||
@@ -326,134 +377,97 @@ const gridHtmlGenerated = (gridData: {gridHtml:string, grid: grid}) => {
|
|||||||
.html(gridHtml)
|
.html(gridHtml)
|
||||||
.show()
|
.show()
|
||||||
.parent()
|
.parent()
|
||||||
.height(gridCellHeight * grid.rows)
|
.height(cellDimensions.height * grid.rows)
|
||||||
.closest('.gridContainer')
|
.closest('.gridContainer')
|
||||||
.find('.pageNavigation')
|
.find('.pageNavigation')
|
||||||
.toggle(gridContainer.find('.gridPage').length > 1)
|
.toggle(gridContainer.find('.gridPage').length > 1)
|
||||||
.height(gridCellHeight)
|
.height(cellDimensions.height)
|
||||||
}
|
}
|
||||||
|
|
||||||
const itemRowClicked = (e: JQuery.TriggeredEvent) => {
|
const itemRowClicked = (e: JQuery.TriggeredEvent) => {
|
||||||
const row = $(e.target).closest('tr')
|
const row = $(e.target).closest('tr')
|
||||||
|
const orderItem: orderItem = row.data('order-item')
|
||||||
|
|
||||||
if(isInMode('void')){
|
if(isInMode('void')){
|
||||||
voidRows(row)
|
voidOrderItems([orderItem.id])
|
||||||
turnOffMode('void')
|
turnOffMode('void')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!row.hasClass('selected')) selectRow(row)
|
if(!row.hasClass('selected')) {
|
||||||
else deselectRow(row)
|
OrderScreen.selected_item_ids = array_push(OrderScreen.selected_item_ids, orderItem.id)
|
||||||
|
getInstructionItems(orderItem.id).forEach(instruction => OrderScreen.selected_item_ids = array_push(OrderScreen.selected_item_ids, instruction.id))
|
||||||
}
|
OrderScreen.selected_item_ids = OrderScreen.selected_item_ids.unique()
|
||||||
|
|
||||||
const selectRow = (row: JQuery) => {
|
|
||||||
row.addClass('selected')
|
|
||||||
const instructionRows = row.nextUntil('.itemRow')
|
|
||||||
|
|
||||||
if(row.hasClass('itemRow') && instructionRows.length){
|
|
||||||
instructionRows.each((index, row) => {
|
|
||||||
selectRow($(row))
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
else {
|
||||||
|
OrderScreen.selected_item_ids = array_remove(OrderScreen.selected_item_ids, orderItem.id)
|
||||||
const deselectRow = (row: JQuery) => {
|
getInstructionItems(orderItem.id).forEach(instruction => OrderScreen.selected_item_ids = array_remove(OrderScreen.selected_item_ids, instruction.id))
|
||||||
row.removeClass('selected')
|
|
||||||
const instructionRows = row.nextUntil('.itemRow')
|
|
||||||
|
|
||||||
if(row.hasClass('itemRow') && instructionRows.length){
|
|
||||||
deselectRow(instructionRows)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderOrderBox()
|
||||||
}
|
}
|
||||||
|
|
||||||
const deleteRow = (row: JQuery) => row.find('*:not(.hidden)').slideUp('fast', () => row.remove())
|
const voidOrderItems = (orderItemIds: number[]) => {
|
||||||
|
const originalOrderItemList = clone(OrderScreen.order_items)
|
||||||
const voidInstructionRow = (row: JQuery) => {
|
const originalSelectedIds = clone(OrderScreen.selected_item_ids)
|
||||||
if(!row.prevAll('.itemRow').first().hasClass('selected'))
|
orderItemIds.forEach(orderItemId => {
|
||||||
deleteRow(row)
|
const orderItemToVoid = originalOrderItemList.find(item => item.id == orderItemId)
|
||||||
|
if(orderItemToVoid.item.item_type == "instruction") {
|
||||||
|
const parentItem = getParentItem(orderItemToVoid.id, originalOrderItemList)
|
||||||
|
if(originalSelectedIds.includes(parentItem.id) && parentItem.qty-1 < 1 || !originalSelectedIds.includes(parentItem.id)){
|
||||||
|
decrementItemQty(orderItemToVoid)
|
||||||
|
}
|
||||||
|
} else decrementItemQty(orderItemToVoid)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const voidItemRow = (row : JQuery) => decrementQty(row)
|
|
||||||
|
|
||||||
const voidRow = (row: JQuery) => {
|
|
||||||
if(row.hasClass('itemRow')) voidItemRow(row)
|
|
||||||
else voidInstructionRow(row)
|
|
||||||
}
|
|
||||||
|
|
||||||
const voidRows = (rows: JQuery) => rows.each((index, row) => voidRow($(row)))
|
|
||||||
|
|
||||||
const voidButtonClicked = () => {
|
const voidButtonClicked = () => {
|
||||||
const selectedRows = $('.orderBox tr.selected')
|
|
||||||
if(isInMode('void')){
|
if(isInMode('void')){
|
||||||
turnOffMode('void')
|
turnOffMode('void')
|
||||||
} else if(selectedRows.length){
|
} else if(OrderScreen.selected_item_ids.length){
|
||||||
voidRows(selectedRows)
|
voidOrderItems(OrderScreen.selected_item_ids)
|
||||||
} else {
|
} else {
|
||||||
turnOnMode('void')
|
turnOnMode('void')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const voidLastItem = () => {
|
const voidLastItem = () => {
|
||||||
const orderBox = $('.orderBoxTable tbody')
|
if (OrderScreen.order_items.length)
|
||||||
const allRows = orderBox.find('tr')
|
decrementItemQty(OrderScreen.order_items.last())
|
||||||
if(allRows.length < 1) return
|
|
||||||
voidRows(allRows.last())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const getSelectedTotals = () =>
|
||||||
|
OrderScreen.selected_item_ids
|
||||||
|
.map(selectedId => OrderScreen.order_items.find(orderItem => orderItem.id == selectedId))
|
||||||
|
.reduce((resultSoFar, currentOrderItem) => {
|
||||||
|
return resultSoFar.add(currentOrderItem.item.price1 * currentOrderItem.qty)
|
||||||
|
}, money(0))
|
||||||
|
|
||||||
|
const getTotals = () =>
|
||||||
|
OrderScreen.order_items
|
||||||
|
.reduce((resultSoFar, currentOrderItem) => {
|
||||||
|
return resultSoFar.add(currentOrderItem.item.price1 * currentOrderItem.qty)
|
||||||
|
}, money(0))
|
||||||
|
|
||||||
const updateOrderBoxTotals = () => {
|
const updateOrderBoxTotals = () => {
|
||||||
const allRows = $('.orderBoxTable tbody tr')
|
const completeTotal = lang('totalPrice', getTotals().format())
|
||||||
const selectedRows = $('.orderBoxTable tbody tr.selected')
|
const selectedTotal = lang('selectedPrice', getSelectedTotals().format())
|
||||||
const completeTotal = lang('totalPrice', getTotalOfRows(allRows))
|
|
||||||
const selectedTotal = lang('selectedPrice', getTotalOfRows(selectedRows))
|
|
||||||
|
|
||||||
$('.orderBoxTotal').text(completeTotal)
|
$('.orderBoxTotal').text(completeTotal)
|
||||||
$('.orderBoxSelectedTotal').text(selectedTotal)
|
$('.orderBoxSelectedTotal').text(selectedTotal)
|
||||||
}
|
}
|
||||||
|
|
||||||
const getTotalOfRows = (rows: JQuery) => {
|
|
||||||
return money(rows
|
|
||||||
.find('td.totalPriceCell')
|
|
||||||
.get()
|
|
||||||
.map(cell => Number(cell.innerText))
|
|
||||||
.filter(number => !isNaN(number))
|
|
||||||
.reduce( (total, number) => total + number , 0), false)
|
|
||||||
.format()
|
|
||||||
}
|
|
||||||
|
|
||||||
const getQty = (row: JQuery) => Number(row.getColumnValue(lang('qty_header')))
|
|
||||||
const getUnitPrice = (row: JQuery) => moneyFromString(row.getColumnValue(lang('price_header')))
|
|
||||||
|
|
||||||
const calculateRowTotal = (row: JQuery) => {
|
|
||||||
let price = getUnitPrice(row)
|
|
||||||
let qty = getQty(row)
|
|
||||||
row.setColumnValue(lang('total_price_header'), price.multiply(qty))
|
|
||||||
}
|
|
||||||
|
|
||||||
const decrementQty = (row: JQuery, qty=1) => {
|
|
||||||
const existingQty = getQty(row)
|
|
||||||
|
|
||||||
if(existingQty <= 1){
|
|
||||||
const childRows = row.nextUntil('.itemRow')
|
|
||||||
deleteRow(row)
|
|
||||||
deleteRow(childRows)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
row.setColumnValue(lang('qty_header'), existingQty - qty)
|
|
||||||
calculateRowTotal(row)
|
|
||||||
}
|
|
||||||
|
|
||||||
const scrollToElement = (JQueryElement: JQuery) => {
|
const scrollToElement = (JQueryElement: JQuery) => {
|
||||||
const element = JQueryElement.get()[0]
|
const element = JQueryElement.get()[0]
|
||||||
const container = JQueryElement.closest('.orderBox').get()[0]
|
const container = JQueryElement.closest('.orderBox').get()[0]
|
||||||
const containerTop = $(container).scrollTop()
|
const containerTop = $(container).scrollTop()
|
||||||
const containerBottom = containerTop + $(container).height();
|
const containerBottom = containerTop + $(container).height()
|
||||||
const elemTop = element.offsetTop
|
const elemTop = element.offsetTop
|
||||||
const elemBottom = elemTop + $(element).height();
|
const elemBottom = elemTop + $(element).height()
|
||||||
if (elemTop < containerTop) {
|
if (elemTop < containerTop) {
|
||||||
$(container).scrollTop(elemTop);
|
$(container).scrollTop(elemTop)
|
||||||
} else if (elemBottom > containerBottom) {
|
} else if (elemBottom > containerBottom) {
|
||||||
$(container).scrollTop(elemBottom - $(container).height());
|
$(container).scrollTop(elemBottom - $(container).height())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -496,7 +510,6 @@ const freetextSubmitted = (text: string) => {
|
|||||||
item.name = text
|
item.name = text
|
||||||
|
|
||||||
addNewItem(item)
|
addNewItem(item)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const customItem = () => showVirtualKeyboard(lang('enter_item_name'), 32,false, customItemTextSubmitted)
|
const customItem = () => showVirtualKeyboard(lang('enter_item_name'), 32,false, customItemTextSubmitted)
|
||||||
@@ -515,21 +528,28 @@ const customItemTextSubmitted = (text: string) => {
|
|||||||
showVirtualNumpad(lang('enter_item_price'), 4, false, true, true, submitFunction)
|
showVirtualNumpad(lang('enter_item_price'), 4, false, true, true, submitFunction)
|
||||||
}
|
}
|
||||||
|
|
||||||
const getGridCellHeight = () => $('#pageGroupContainer').height()/8
|
const getGridCellDimensions = () => {
|
||||||
const getGridCellWidth = () => $('#pageGroupContainer').width()/6
|
const container = $('#pageGroupContainer')
|
||||||
|
return {
|
||||||
|
height: container.height()/8,
|
||||||
|
width: container.width()/6
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const showCoverSelector = (event: JQuery.TriggeredEvent) => {
|
const showCoverSelector = (event: JQuery.TriggeredEvent) => {
|
||||||
const button = $(event.target)
|
const button = $(event.target)
|
||||||
const gridHeight = getGridCellHeight()
|
const gridHeight = getGridCellDimensions().height
|
||||||
|
|
||||||
const coverSelector = $('.coverSelector')
|
const coverSelector = $('.coverSelector')
|
||||||
|
|
||||||
|
const buttonPositionLeftPercent = getPercentageOfPageContainerWidth(button.offset().left)
|
||||||
|
const buttonWidthPercent = getPercentageOfPageContainerWidth(button.width())
|
||||||
|
|
||||||
coverSelector
|
coverSelector
|
||||||
.toggle(!coverSelector.is(':visible'))
|
.toggle(!coverSelector.is(':visible'))
|
||||||
.width(button.width())
|
|
||||||
.css({
|
.css({
|
||||||
left: button.offset().left + 'px',
|
width: buttonWidthPercent,
|
||||||
top: button.offset().top + button.height() + 'px',
|
left: buttonPositionLeftPercent,
|
||||||
|
top: (button.offset().top + button.height()) + 'px'
|
||||||
})
|
})
|
||||||
.find('.coverSelectorButton')
|
.find('.coverSelectorButton')
|
||||||
.height(gridHeight)
|
.height(gridHeight)
|
||||||
@@ -567,7 +587,7 @@ const changeCoverNumberPrompt = () =>
|
|||||||
const changeCoverNumberPromptSubmitted = (value: string) => updateCoverNumbers(Number(value))
|
const changeCoverNumberPromptSubmitted = (value: string) => updateCoverNumbers(Number(value))
|
||||||
|
|
||||||
const updateCoverNumbers = (covers: number) => {
|
const updateCoverNumbers = (covers: number) => {
|
||||||
let newTable = Object.assign({}, OrderScreen.table)
|
let newTable = clone(OrderScreen.table)
|
||||||
newTable.default_covers = covers
|
newTable.default_covers = covers
|
||||||
ajax('/order/updateCovers', newTable, 'post', coverNumbersUpdated, null, null)
|
ajax('/order/updateCovers', newTable, 'post', coverNumbersUpdated, null, null)
|
||||||
}
|
}
|
||||||
@@ -601,4 +621,4 @@ $(() => {
|
|||||||
$('.coverSelector, .gridContainer').hide()
|
$('.coverSelector, .gridContainer').hide()
|
||||||
if(OrderScreen.table)
|
if(OrderScreen.table)
|
||||||
ajax(`/order/getOrderScreenData/${OrderScreen.table.table_number}`, null, 'get', setupOrderScreen, null, null)
|
ajax(`/order/getOrderScreenData/${OrderScreen.table.table_number}`, null, 'get', setupOrderScreen, null, null)
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -25,9 +25,9 @@ let showVirtualNumpad = (heading: string, maxlength = 4, isPassword: boolean, al
|
|||||||
inputBox.text('');
|
inputBox.text('');
|
||||||
|
|
||||||
numpad.data('maxlength', maxlength)
|
numpad.data('maxlength', maxlength)
|
||||||
numpad.data('submitfunction', submitFunction)
|
numpad.data('submit-function', submitFunction)
|
||||||
numpad.data('password', isPassword);
|
numpad.data('password', isPassword);
|
||||||
numpad.data('allowdecimals', allowDecimals);
|
numpad.data('allow-decimals', allowDecimals);
|
||||||
|
|
||||||
$(document).off('keyup');
|
$(document).off('keyup');
|
||||||
$(document).on('keyup', e => {
|
$(document).on('keyup', e => {
|
||||||
@@ -64,9 +64,9 @@ let showVirtualNumpad = (heading: string, maxlength = 4, isPassword: boolean, al
|
|||||||
let virtualNumpadInput = (input: string) => {
|
let virtualNumpadInput = (input: string) => {
|
||||||
let inputBox = $('#virtualNumpadInput')
|
let inputBox = $('#virtualNumpadInput')
|
||||||
let numpad = $('#virtualNumpad')
|
let numpad = $('#virtualNumpad')
|
||||||
let maxlength = numpad.data('maxlength')
|
let maxlength : number = numpad.data('maxlength')
|
||||||
let allowDecimals = numpad.data('allowdecimals')
|
let allowDecimals: boolean = numpad.data('allow-decimals')
|
||||||
let submitFunction = numpad.data('submitfunction')
|
let submitFunction : Function = numpad.data('submit-function')
|
||||||
let allowedValues = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'submit', 'clear']
|
let allowedValues = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'submit', 'clear']
|
||||||
let currentValue = numpad.data('value').toString()
|
let currentValue = numpad.data('value').toString()
|
||||||
|
|
||||||
@@ -144,7 +144,7 @@ let showVirtualNumpad = (heading: string, maxlength = 4, isPassword: boolean, al
|
|||||||
inputBox.val('')
|
inputBox.val('')
|
||||||
keyboard.data('maxlength', maxlength)
|
keyboard.data('maxlength', maxlength)
|
||||||
keyboard.data('password', isPassword)
|
keyboard.data('password', isPassword)
|
||||||
keyboard.data('submitfunction', submitFunction)
|
keyboard.data('submit-function', submitFunction)
|
||||||
inputBox.attr('autofocus', 'autofocus');
|
inputBox.attr('autofocus', 'autofocus');
|
||||||
inputBox.trigger('focus')
|
inputBox.trigger('focus')
|
||||||
inputBox.trigger('click')
|
inputBox.trigger('click')
|
||||||
@@ -175,7 +175,7 @@ let showVirtualNumpad = (heading: string, maxlength = 4, isPassword: boolean, al
|
|||||||
break;
|
break;
|
||||||
case 'submit':
|
case 'submit':
|
||||||
hideVirtualKeyboard();
|
hideVirtualKeyboard();
|
||||||
let submitFunction = keyboard.data('submitfunction')
|
let submitFunction = keyboard.data('submit-function')
|
||||||
submitFunction(inputBox.val());
|
submitFunction(inputBox.val());
|
||||||
break;
|
break;
|
||||||
case 'shift':
|
case 'shift':
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ interface order {
|
|||||||
interface orderItem {
|
interface orderItem {
|
||||||
id: number
|
id: number
|
||||||
qty: number
|
qty: number
|
||||||
print_group_id: print_group
|
print_group: print_group
|
||||||
item: item
|
item: item
|
||||||
cover: number
|
cover: number
|
||||||
}
|
}
|
||||||
@@ -108,4 +108,8 @@ type sales_category = {
|
|||||||
|
|
||||||
interface Array<T> {
|
interface Array<T> {
|
||||||
where(property: string, value: any): T
|
where(property: string, value: any): T
|
||||||
|
first(): T
|
||||||
|
last(): T
|
||||||
|
unique(): this
|
||||||
|
collect<y>(func: (item: T) => y[]): y[]
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user