-- ------------------------------------------------------------------------------ -- -- TradeSkillMaster -- -- https://tradeskillmaster.com -- -- All Rights Reserved - Detailed license information included with addon. -- -- ------------------------------------------------------------------------------ -- local _, TSM = ... local Inventory = TSM.MainUI.Ledger:NewPackage("Inventory") local L = TSM.Include("Locale").GetTable() local TempTable = TSM.Include("Util.TempTable") local Money = TSM.Include("Util.Money") local String = TSM.Include("Util.String") local Math = TSM.Include("Util.Math") local Database = TSM.Include("Util.Database") local ItemInfo = TSM.Include("Service.ItemInfo") local CustomPrice = TSM.Include("Service.CustomPrice") local BagTracking = TSM.Include("Service.BagTracking") local GuildTracking = TSM.Include("Service.GuildTracking") local AuctionTracking = TSM.Include("Service.AuctionTracking") local MailTracking = TSM.Include("Service.MailTracking") local AltTracking = TSM.Include("Service.AltTracking") local InventoryService = TSM.Include("Service.Inventory") local Settings = TSM.Include("Service.Settings") local UIElements = TSM.Include("UI.UIElements") local private = { settings = nil, db = nil, query = nil, searchFilter = "", groupFilter = {}, valuePriceSource = "dbmarket", -- luacheck: ignore 1005 - hidden modify via SetSettingInfo() } -- ============================================================================ -- Module Functions -- ============================================================================ function Inventory.OnInitialize() private.settings = Settings.NewView() :AddKey("global", "mainUIContext", "ledgerInventoryScrollingTable") TSM.MainUI.Ledger.RegisterPage(L["Inventory"], private.DrawInventoryPage) end function Inventory.OnEnable() private.db = Database.NewSchema("LEDGER_INVENTORY") :AddUniqueStringField("itemString") :Commit() private.query = private.db:NewQuery() :VirtualField("bagQuantity", "number", BagTracking.GetBagsQuantityByBaseItemString, "itemString") :VirtualField("guildQuantity", "number", private.GuildQuantityVirtualField, "itemString") :VirtualField("auctionQuantity", "number", AuctionTracking.GetQuantityByBaseItemString, "itemString") :VirtualField("mailQuantity", "number", MailTracking.GetQuantityByBaseItemString, "itemString") :VirtualField("altQuantity", "number", AltTracking.GetQuantityByBaseItemString, "itemString") :VirtualField("totalQuantity", "number", private.TotalQuantityVirtualField) :VirtualField("totalValue", "number", private.TotalValueVirtualField) :VirtualField("totalBankQuantity", "number", private.GetTotalBankQuantity) :InnerJoin(ItemInfo.GetDBForJoin(), "itemString") :LeftJoin(TSM.Groups.GetItemDBForJoin(), "itemString") :OrderBy("name", true) end -- ============================================================================ -- Inventory UI -- ============================================================================ function private.DrawInventoryPage() TSM.UI.AnalyticsRecordPathChange("main", "ledger", "inventory") local items = TempTable.Acquire() for _, itemString in BagTracking.BaseItemIterator() do items[itemString] = true end for _, itemString in GuildTracking.BaseItemIterator() do items[itemString] = true end for _, itemString in AuctionTracking.BaseItemIterator() do items[itemString] = true end for _, itemString in MailTracking.BaseItemIterator() do items[itemString] = true end for _, itemString in AltTracking.BaseItemIterator() do items[itemString] = true end private.db:TruncateAndBulkInsertStart() for itemString in pairs(items) do private.db:BulkInsertNewRow(itemString) end private.db:BulkInsertEnd() TempTable.Release(items) private.UpdateQuery() return UIElements.New("Frame", "content") :SetLayout("VERTICAL") :AddChild(UIElements.New("Frame", "row1") :SetLayout("HORIZONTAL") :SetHeight(24) :SetMargin(8) :AddChild(UIElements.New("Input", "filter") :SetMargin(0, 8, 0, 0) :SetIconTexture("iconPack.18x18/Search") :SetClearButtonEnabled(true) :AllowItemInsert() :SetHintText(L["Filter by keyword"]) :SetValue(private.searchFilter) :SetScript("OnValueChanged", private.SearchFilterChanged) ) :AddChild(UIElements.New("GroupSelector", "group") :SetWidth(240) :SetHintText(L["Filter by groups"]) :SetScript("OnSelectionChanged", private.GroupFilterChanged) ) ) :AddChild(UIElements.New("Frame", "row2") :SetLayout("HORIZONTAL") :SetHeight(24) :SetMargin(8, 8, 0, 8) :AddChild(UIElements.New("Text", "label") :SetWidth("AUTO") :SetFont("BODY_BODY3") :SetText(L["Value Price Source"]) ) :AddChild(UIElements.New("Input", "input") :SetMargin(4, 8, 0, 0) :SetBackgroundColor("PRIMARY_BG_ALT") :SetBorderColor("ACTIVE_BG") :SetFont("TABLE_TABLE1") :SetValidateFunc("CUSTOM_PRICE") :SetSettingInfo(private, "valuePriceSource") :SetScript("OnValueChanged", private.FilterChangedCommon) ) :AddChild(UIElements.New("Frame", "value") :SetLayout("HORIZONTAL") :SetWidth(240) :AddChild(UIElements.New("Spacer", "spacer")) :AddChild(UIElements.New("Text", "label") :SetWidth("AUTO") :SetFont("BODY_BODY3") :SetMargin(0, 4, 0, 0) :SetText(L["Total Value"]..":") ) :AddChild(UIElements.New("Text", "value") :SetWidth("AUTO") :SetFont("TABLE_TABLE1") :SetText(Money.ToString(private.GetTotalValue())) ) ) ) :AddChild(UIElements.New("Frame", "accountingScrollingTableFrame") :SetLayout("VERTICAL") :AddChild(UIElements.New("QueryScrollingTable", "scrollingTable") :SetSettingsContext(private.settings, "ledgerInventoryScrollingTable") :GetScrollingTableInfo() :NewColumn("item") :SetTitle(L["Item"]) :SetFont("ITEM_BODY3") :SetJustifyH("LEFT") :SetTextInfo("itemString", TSM.UI.GetColoredItemName) :SetTooltipInfo("itemString") :SetSortInfo("name") :DisableHiding() :Commit() :NewColumn("totalItems") :SetTitle(L["Total"]) :SetFont("ITEM_BODY3") :SetJustifyH("RIGHT") :SetTextInfo("totalQuantity") :SetSortInfo("totalQuantity") :Commit() :NewColumn("bags") :SetTitle(L["Bags"]) :SetFont("ITEM_BODY3") :SetJustifyH("RIGHT") :SetTextInfo("bagQuantity") :SetSortInfo("bagQuantity") :Commit() :NewColumn("banks") :SetTitle(L["Banks"]) :SetFont("ITEM_BODY3") :SetJustifyH("RIGHT") :SetTextInfo("totalBankQuantity") :SetSortInfo("totalBankQuantity") :Commit() :NewColumn("mail") :SetTitle(L["Mail"]) :SetFont("ITEM_BODY3") :SetJustifyH("RIGHT") :SetTextInfo("mailQuantity") :SetSortInfo("mailQuantity") :Commit() :NewColumn("alts") :SetTitle(L["Alts"]) :SetFont("ITEM_BODY3") :SetJustifyH("RIGHT") :SetTextInfo("altQuantity") :SetSortInfo("altQuantity") :Commit() :NewColumn("guildVault") :SetTitle(L["GVault"]) :SetFont("ITEM_BODY3") :SetJustifyH("RIGHT") :SetTextInfo("guildQuantity") :SetSortInfo("guildQuantity") :Commit() :NewColumn("auctionHouse") :SetTitle(L["AH"]) :SetFont("ITEM_BODY3") :SetJustifyH("RIGHT") :SetTextInfo("auctionQuantity") :SetSortInfo("auctionQuantity") :Commit() :NewColumn("totalValue") :SetTitle(L["Value"]) :SetFont("ITEM_BODY3") :SetJustifyH("RIGHT") :SetTextInfo("totalValue", private.TableGetTotalValueText) :SetSortInfo("totalValue") :Commit() :Commit() :SetSelectionDisabled(true) :SetQuery(private.query) ) ) end -- ============================================================================ -- Local Script Handlers -- ============================================================================ function private.FilterChangedCommon(element) private.UpdateQuery() element:GetElement("__parent.__parent.accountingScrollingTableFrame.scrollingTable") :SetQuery(private.query, true) element:GetElement("__parent.__parent.row2.value.value") :SetText(Money.ToString(private.GetTotalValue())) :Draw() end function private.SearchFilterChanged(input) private.searchFilter = input:GetValue() private.FilterChangedCommon(input) end function private.GroupFilterChanged(groupSelector) wipe(private.groupFilter) for groupPath in groupSelector:SelectedGroupIterator() do private.groupFilter[groupPath] = true end private.FilterChangedCommon(groupSelector) end -- ============================================================================ -- Scrolling Table Helper Functions -- ============================================================================ function private.TableGetTotalValueText(totalValue) return Math.IsNan(totalValue) and "" or Money.ToString(totalValue) end -- ============================================================================ -- Private Helper Functions -- ============================================================================ function private.GuildQuantityVirtualField(itemString) local totalNum = 0 for guildName in pairs(TSM.db.factionrealm.internalData.guildVaults) do local guildQuantity = InventoryService.GetGuildQuantity(itemString, guildName) totalNum = totalNum + guildQuantity end return totalNum end function private.TotalQuantityVirtualField(row) local bagQuantity, totalBankQuantity, guildQuantity, auctionQuantity, mailQuantity, altQuantity = row:GetFields("bagQuantity", "totalBankQuantity", "guildQuantity", "auctionQuantity", "mailQuantity", "altQuantity") return bagQuantity + totalBankQuantity + guildQuantity + auctionQuantity + mailQuantity + altQuantity end function private.TotalValueVirtualField(row) local itemString, totalQuantity = row:GetFields("itemString", "totalQuantity") local price = CustomPrice.GetValue(private.valuePriceSource, itemString) if not price then return Math.GetNan() end return price * totalQuantity end function private.GetTotalBankQuantity(row) local itemString = row:GetField("itemString") local bankQuantity = BagTracking.GetBankQuantityByBaseItemString(itemString) local reagentBankQuantity = BagTracking.GetReagentBankQuantityByBaseItemString(itemString) return bankQuantity + reagentBankQuantity end function private.GetTotalValue() -- can't lookup the value of items while the query is iteratoring, so grab the list of items first local itemQuantities = TempTable.Acquire() for _, row in private.query:Iterator() do local itemString, total = row:GetFields("itemString", "totalQuantity") itemQuantities[itemString] = total end local totalValue = 0 for itemString, total in pairs(itemQuantities) do local price = CustomPrice.GetValue(private.valuePriceSource, itemString) if price then totalValue = totalValue + price * total end end TempTable.Release(itemQuantities) return totalValue end function private.UpdateQuery() private.query:ResetFilters() if private.searchFilter ~= "" then private.query:Matches("name", String.Escape(private.searchFilter)) end if next(private.groupFilter) then private.query:InTable("groupPath", private.groupFilter) end end