diff --git a/esoui/ingame/help/keyboard/helpsubmitfeedback_keyboard.lua b/esoui/ingame/help/keyboard/helpsubmitfeedback_keyboard.lua
new file mode 100644
index 0000000..877e200
--- /dev/null
+++ b/esoui/ingame/help/keyboard/helpsubmitfeedback_keyboard.lua
@@ -0,0 +1,317 @@
+local HELP_CUSTOMER_SERVICE_INCOMPLETED_FIELDS_DIALOG = "HELP_CUSTOMER_SERVICE_INCOMPLETED_FIELDS_DIALOG"
+
+local HELP_SUBMIT_FEEDBACK_SUBCATEGORY =
+{
+ --Will Replace Subcategories With Enums--
+ [CUSTOMER_SERVICE_SUBMIT_FEEDBACK_CATEGORY_ALLIANCE_WAR] =
+ {
+ minValue = CUSTOMER_SERVICE_SUBMIT_FEEDBACK_SUBCATEGORY_ALLIANCE_WAR_GRAVEYARD,
+ maxValue = CUSTOMER_SERVICE_SUBMIT_FEEDBACK_SUBCATEGORY_ALLIANCE_WAR_SIEGE,
+ },
+ [CUSTOMER_SERVICE_SUBMIT_FEEDBACK_CATEGORY_AUDIO] =
+ {
+ minValue = CUSTOMER_SERVICE_SUBMIT_FEEDBACK_SUBCATEGORY_AUDIO_MUSIC,
+ maxValue = CUSTOMER_SERVICE_SUBMIT_FEEDBACK_SUBCATEGORY_AUDIO_OTHER,
+ },
+ [CUSTOMER_SERVICE_SUBMIT_FEEDBACK_CATEGORY_CHARACTERS] =
+ {
+ minValue = CUSTOMER_SERVICE_SUBMIT_FEEDBACK_SUBCATEGORY_CHARACTERS_ABILITIES,
+ maxValue = CUSTOMER_SERVICE_SUBMIT_FEEDBACK_SUBCATEGORY_CHARACTERS_TARGETING,
+ },
+ [CUSTOMER_SERVICE_SUBMIT_FEEDBACK_CATEGORY_COMBAT] =
+ {
+ minValue = CUSTOMER_SERVICE_SUBMIT_FEEDBACK_SUBCATEGORY_COMBAT_ABILITY,
+ maxValue = CUSTOMER_SERVICE_SUBMIT_FEEDBACK_SUBCATEGORY_COMBAT_NPC,
+ },
+ [CUSTOMER_SERVICE_SUBMIT_FEEDBACK_CATEGORY_ITEMS] =
+ {
+ minValue = CUSTOMER_SERVICE_SUBMIT_FEEDBACK_SUBCATEGORY_ITEMS_ARMOR,
+ maxValue = CUSTOMER_SERVICE_SUBMIT_FEEDBACK_SUBCATEGORY_ITEMS_WEAPONS,
+ detailsTitle = GetString(SI_CUSTOMER_SERVICE_ITEM_NAME),
+ },
+ [CUSTOMER_SERVICE_SUBMIT_FEEDBACK_CATEGORY_GAME_SYSTEM] =
+ {
+ minValue = CUSTOMER_SERVICE_SUBMIT_FEEDBACK_SUBCATEGORY_GAME_SYSTEM_CHAT,
+ maxValue = CUSTOMER_SERVICE_SUBMIT_FEEDBACK_SUBCATEGORY_GAME_SYSTEM_VENDOR,
+ },
+ [CUSTOMER_SERVICE_SUBMIT_FEEDBACK_CATEGORY_GRAPHICS] =
+ {
+ minValue = CUSTOMER_SERVICE_SUBMIT_FEEDBACK_SUBCATEGORY_GRAPHICS_ART_ANIMATION,
+ maxValue = CUSTOMER_SERVICE_SUBMIT_FEEDBACK_SUBCATEGORY_GRAPHICS_WEATHER,
+ },
+ [CUSTOMER_SERVICE_SUBMIT_FEEDBACK_CATEGORY_QUESTS] =
+ {
+ minValue = CUSTOMER_SERVICE_SUBMIT_FEEDBACK_SUBCATEGORY_QUESTS_DIALOG_VOICEOVER,
+ maxValue = CUSTOMER_SERVICE_SUBMIT_FEEDBACK_SUBCATEGORY_QUESTS_REWARDS,
+ detailsTitle = GetString(SI_CUSTOMER_SERVICE_QUEST_NAME),
+ },
+ [CUSTOMER_SERVICE_SUBMIT_FEEDBACK_CATEGORY_TEXT] =
+ {
+ minValue = CUSTOMER_SERVICE_SUBMIT_FEEDBACK_SUBCATEGORY_TEXT_DIALOG_VOICEOVER,
+ maxValue = CUSTOMER_SERVICE_SUBMIT_FEEDBACK_SUBCATEGORY_TEXT_BOOKS,
+ },
+}
+
+local HelpSubmitFeedback_Keyboard = ZO_HelpScreenTemplate_Keyboard:Subclass()
+
+function HelpSubmitFeedback_Keyboard:New(...)
+ return ZO_HelpScreenTemplate_Keyboard.New(self, ...)
+end
+
+function HelpSubmitFeedback_Keyboard:Initialize(control)
+ HELP_CUSTOMER_SERVICE_SUBMIT_FEEDBACK_KEYBOARD_FRAGMENT = ZO_FadeSceneFragment:New(control)
+
+ local iconData =
+ {
+ name = GetString(SI_CUSTOMER_SERVICE_SUBMIT_FEEDBACK),
+ categoryFragment = HELP_CUSTOMER_SERVICE_SUBMIT_FEEDBACK_KEYBOARD_FRAGMENT,
+ up = "EsoUI/Art/Help/help_tabIcon_feedback_up.dds",
+ down = "EsoUI/Art/Help/help_tabIcon_feedback_down.dds",
+ over = "EsoUI/Art/Help/help_tabIcon_feedback_over.dds",
+ }
+ ZO_HelpScreenTemplate_Keyboard.Initialize(self, control, iconData)
+
+ self.helpScrollChild = control:GetNamedChild("ScrollContainerScrollChild")
+ self.helpImpactTitle = self.helpScrollChild:GetNamedChild("ImpactTitle")
+ self.helpCategoryTitle = self.helpScrollChild:GetNamedChild("CategoryTitle")
+ self.helpSubcategoryTitle = self.helpScrollChild:GetNamedChild("SubcategoryTitle")
+ self.helpDetailsTitle = self.helpScrollChild:GetNamedChild("DetailsTitle")
+ self.helpDescriptionTitle = self.helpScrollChild:GetNamedChild("DescriptionTitle")
+ self.helpSubmitButton = self.helpScrollChild:GetNamedChild("SubmitButton")
+ self.helpDetailsTextControl = self.helpScrollChild:GetNamedChild("DetailsTextLine")
+
+ self.helpSubcategoryContainer = self.helpScrollChild:GetNamedChild("SubcategoryContainer")
+ self.helpDetailsContainer = self.helpScrollChild:GetNamedChild("DetailsContainer")
+
+ self.helpCategoryComboBoxControl = self.helpScrollChild:GetNamedChild("CategoryComboBox")
+ self.helpSubcategoryComboBoxControl = self.helpScrollChild:GetNamedChild("SubcategoryComboBox")
+
+ control:RegisterForEvent(EVENT_CUSTOMER_SERVICE_FEEDBACK_SUBMITTED, function (...) self:OnCustomerServiceFeedbackSubmitted(...) end)
+
+ self:InitializeTextBox()
+ self:InitializeComboBoxes()
+ self:InitializeCheckButton()
+ self:InitializeDialogs()
+end
+
+function HelpSubmitFeedback_Keyboard:InitializeComboBoxes()
+
+ local function CreateComboBox(childName)
+ local combo = ZO_ComboBox_ObjectFromContainer(self.helpScrollChild:GetNamedChild(childName))
+ combo:SetSortsItems(false)
+ combo:SetFont("ZoFontWinT1")
+ combo:SetSpacing(4)
+ return combo
+ end
+
+ self.helpImpactComboBox = CreateComboBox("ImpactComboBox")
+ self.helpCategoryComboBox = CreateComboBox("CategoryComboBox")
+ self.helpSubcategoryComboBox = CreateComboBox("SubcategoryComboBox")
+
+ local function OnCategoryChanged()
+ self:UpdateSubcategories()
+ self:UpdateDetailsComponents()
+ self:UpdateSubmitButton()
+ end
+
+ for i = CUSTOMER_SERVICE_SUBMIT_FEEDBACK_IMPACT_MIN_VALUE, CUSTOMER_SERVICE_SUBMIT_FEEDBACK_IMPACT_MAX_VALUE do
+ local name = GetString("SI_CUSTOMERSERVICESUBMITFEEDBACKIMPACTS", i)
+ if name ~= nil then
+ local entry = ZO_ComboBox:CreateItemEntry(name, function() self:UpdateSubmitButton() end)
+ entry.index = i
+ self.helpImpactComboBox:AddItem(entry, ZO_COMBOBOX_SUPRESS_UPDATE)
+ end
+ end
+
+ self.helpImpactComboBox:SelectItemByIndex(1)
+
+ for i = CUSTOMER_SERVICE_SUBMIT_FEEDBACK_CATEGORY_MIN_VALUE, CUSTOMER_SERVICE_SUBMIT_FEEDBACK_CATEGORY_MAX_VALUE do
+ local name = GetString("SI_CUSTOMERSERVICESUBMITFEEDBACKCATEGORIES", i)
+ if name ~= nil then
+ local entry = ZO_ComboBox:CreateItemEntry(name, OnCategoryChanged)
+ entry.index = i
+ self.helpCategoryComboBox:AddItem(entry, ZO_COMBOBOX_SUPRESS_UPDATE)
+ end
+ end
+
+ self.helpCategoryComboBox:SelectItemByIndex(1)
+end
+
+function HelpSubmitFeedback_Keyboard:InitializeTextBox()
+ self.details = self.helpScrollChild:GetNamedChild("DetailsTextLineField")
+ self.details:SetMaxInputChars(MAX_HELP_DETAILS_TEXT)
+ ZO_EditDefaultText_Initialize(self.details, GetString(SI_CUSTOMER_SERVICE_ENTER_NAME))
+
+ --Storing the text field and adding handlers to the visibility events so the Submit Button can be enabled/disabled when the player has typed something in
+ --The Submit Button is disabled when the details text is empty (and the details text is visible)
+ self.detailsDefaultTextField = self.details:GetNamedChild("Text")
+ self.detailsDefaultTextField:SetHandler("OnEffectivelyShown",function() self:UpdateSubmitButton() end)
+ self.detailsDefaultTextField:SetHandler("OnEffectivelyHidden",function() self:UpdateSubmitButton() end)
+
+ self.description = self.helpScrollChild:GetNamedChild("DescriptionBodyField")
+ self.description:SetMaxInputChars(MAX_HELP_DESCRIPTION_BODY)
+ ZO_EditDefaultText_Initialize(self.description, GetString(SI_CUSTOMER_SERVICE_DEFAULT_DESCRIPTION_TEXT_FEEDBACK))
+
+ --The Submit Button is disabled when the description text is empty
+ self.descriptionDefaultTextField = self.description:GetNamedChild("Text")
+ self.descriptionDefaultTextField:SetHandler("OnEffectivelyShown",function() self:UpdateSubmitButton() end)
+ self.descriptionDefaultTextField:SetHandler("OnEffectivelyHidden",function() self:UpdateSubmitButton() end)
+
+ self.description:SetText("")
+end
+
+function HelpSubmitFeedback_Keyboard:InitializeCheckButton()
+ self.helpAttachScreenshotCheckButton = self.helpScrollChild:GetNamedChild("AttachScreenshotCheckButton")
+ ZO_CheckButton_SetUnchecked(self.helpAttachScreenshotCheckButton)
+end
+
+function HelpSubmitFeedback_Keyboard:InitializeDialogs()
+ ZO_Dialogs_RegisterCustomDialog("HELP_SUBMIT_FEEDBACK_SUBMIT_TICKET_SUCCESSFUL_DIALOG",
+ {
+ canQueue = true,
+ mustChoose = true,
+ title =
+ {
+ text = GetString(SI_CUSTOMER_SERVICE_SUBMIT_CONFIRMATION),
+ },
+ mainText =
+ {
+ text = GetString(SI_CUSTOMER_SERVICE_SUBMIT_FEEDBACK_SUBMIT_CONFIRMATION),
+ },
+
+ buttons =
+ {
+ {
+ keybind = "DIALOG_NEGATIVE",
+ text = SI_DIALOG_EXIT,
+ },
+ },
+ })
+end
+
+function HelpSubmitFeedback_Keyboard:UpdateSubcategories()
+ local categoryIndex = self.helpCategoryComboBox:GetSelectedItemData().index
+
+ self.helpSubcategoryComboBox:ClearItems()
+
+ self.subcategoryIndex = HELP_SUBMIT_FEEDBACK_SUBCATEGORY[categoryIndex]
+
+ if self.subcategoryIndex == nil then
+ self:SetSubcategoryContentHidden(true)
+ else
+ self:SetSubcategoryContentHidden(false)
+
+ --Add Select Subcategory Entry in the Subcategory Combo Box
+ local defaultEntry = ZO_ComboBox:CreateItemEntry(GetString("SI_CUSTOMERSERVICESUBMITFEEDBACKSUBCATEGORIES",CUSTOMER_SERVICE_SUBMIT_FEEDBACK_SUBCATEGORY_NONE), OnImpactChanged)
+ defaultEntry.index = CUSTOMER_SERVICE_SUBMIT_FEEDBACK_SUBCATEGORY_NONE
+ self.helpSubcategoryComboBox:AddItem(defaultEntry, ZO_COMBOBOX_UPDATE_NOW)
+
+ for i = self.subcategoryIndex.minValue, self.subcategoryIndex.maxValue do
+ local entry = ZO_ComboBox:CreateItemEntry(GetString("SI_CUSTOMERSERVICESUBMITFEEDBACKSUBCATEGORIES",i), function() self:UpdateSubmitButton() end)
+ entry.index = i
+ self.helpSubcategoryComboBox:AddItem(entry, ZO_COMBOBOX_UPDATE_NOW)
+ end
+
+ local PERFORM_CALLBACK = false
+ self.helpSubcategoryComboBox:SelectItemByIndex(1,PERFORM_CALLBACK)
+ end
+end
+
+function HelpSubmitFeedback_Keyboard:UpdateDetailsComponents()
+ self.details:SetText("")
+
+ if self.subcategoryIndex then
+ if self.subcategoryIndex.detailsTitle then
+ self:SetDetailsContentHidden(false)
+ self.helpDetailsTitle:SetText(self.subcategoryIndex.detailsTitle)
+ else
+ self:SetDetailsContentHidden(true)
+ end
+ else
+ self:SetDetailsContentHidden(true)
+ end
+end
+
+function HelpSubmitFeedback_Keyboard:SetSubcategoryContentHidden(shouldHide)
+ self.helpSubcategoryComboBoxControl:SetHidden(shouldHide)
+ self.helpSubcategoryTitle:SetHidden(shouldHide)
+
+ local offsetY = 0
+ if not shouldHide then
+ offsetY = 20
+ end
+ self.helpSubcategoryContainer:SetAnchor(TOPLEFT, self.helpCategoryComboBoxControl, BOTTOMLEFT, 0, offsetY)
+end
+
+function HelpSubmitFeedback_Keyboard:SetDetailsContentHidden(shouldHide)
+ self.helpDetailsTextControl:SetHidden(shouldHide)
+ self.helpDetailsTitle:SetHidden(shouldHide)
+
+ local offsetY = 0
+ if not shouldHide then
+ offsetY = 20
+ end
+ self.helpDetailsContainer:SetAnchor(TOPLEFT, self.helpSubcategoryContainer, BOTTOMLEFT, 0, offsetY)
+end
+
+function HelpSubmitFeedback_Keyboard:UpdateSubmitButton()
+ local enableSubmitButton = true
+
+ if self.helpCategoryComboBox == nil or self.helpImpactComboBox == nil or self.helpSubcategoryComboBox == nil or self.descriptionDefaultTextField == nil then
+ enableSubmitButton = false
+ elseif self.helpImpactComboBox:GetSelectedItemData().index <= CUSTOMER_SERVICE_SUBMIT_FEEDBACK_IMPACT_MIN_VALUE then
+ enableSubmitButton = false
+ elseif self.helpCategoryComboBox:GetSelectedItemData().index <= CUSTOMER_SERVICE_SUBMIT_FEEDBACK_CATEGORY_MIN_VALUE then
+ enableSubmitButton = false
+ elseif not self.helpSubcategoryComboBoxControl:IsHidden() and self.helpSubcategoryComboBox:GetSelectedItemData().index <= 0 then
+ enableSubmitButton = false
+ elseif not self.helpDetailsTextControl:IsHidden() and self.details:GetText() == "" then
+ enableSubmitButton = false
+ elseif not self.descriptionDefaultTextField:IsHidden() then
+ enableSubmitButton = false
+ end
+
+ self.helpSubmitButton:SetEnabled(enableSubmitButton)
+end
+
+function HelpSubmitFeedback_Keyboard:ClearFields()
+ self.helpImpactComboBox:SelectItemByIndex(1)
+ self.helpCategoryComboBox:SelectItemByIndex(1)
+ self.description:SetText("")
+ ZO_CheckButton_SetUnchecked(self.helpAttachScreenshotCheckButton)
+end
+
+function HelpSubmitFeedback_Keyboard:AttemptToSendFeedback()
+ --Create the Request
+ local impactId = self.helpImpactComboBox:GetSelectedItemData().index
+ local categoryId = self.helpCategoryComboBox:GetSelectedItemData().index
+ local detailsText = self.details:GetText()
+ local descriptionText = self.description:GetText()
+ local attachScreenshot = ZO_CheckButton_IsChecked(self.helpAttachScreenshotCheckButton)
+
+ local subcategoryId
+ if not self.helpSubcategoryComboBoxControl:IsHidden() then
+ subcategoryId = self.helpSubcategoryComboBox:GetSelectedItemData().index
+ end
+
+ ZO_Dialogs_ShowDialog("HELP_CUSTOMER_SERVICE_SUBMITTING_TICKET_DIALOG")
+ ReportFeedback(impactId, categoryId, subcategoryId, detailsText, descriptionText, attachScreenshot)
+end
+
+function HelpSubmitFeedback_Keyboard:OnCustomerServiceFeedbackSubmitted(...)
+ ZO_Dialogs_ReleaseDialog("HELP_CUSTOMER_SERVICE_SUBMITTING_TICKET_DIALOG")
+
+ ZO_Dialogs_ShowDialog("HELP_SUBMIT_FEEDBACK_SUBMIT_TICKET_SUCCESSFUL_DIALOG")
+
+ self:ClearFields()
+end
+
+--Global XML
+
+function ZO_HelpSubmitFeedback_Keyboard_OnInitialized(self)
+ HELP_CUSTOMER_SERVICE_SUBMIT_FEEDBACK_KEYBOARD = HelpSubmitFeedback_Keyboard:New(self)
+end
+
+function ZO_HelpSubmitFeedback_Keyboard_AttemptToSendFeedback()
+ HELP_CUSTOMER_SERVICE_SUBMIT_FEEDBACK_KEYBOARD:AttemptToSendFeedback()
+end
\ No newline at end of file