From 88c0c67ef32b31042f83d2d9fa566db6e0b4f3d2 Mon Sep 17 00:00:00 2001 From: Doug Martin Date: Fri, 18 Oct 2024 11:19:48 -0400 Subject: [PATCH] feat: Add hide question number custom override [PT-187807322] This adds a custom override to hide question number authoring. --- app/assets/javascripts/lara-typescript.js | 54 +++++++++++++++++- app/models/managed_interactive.rb | 17 +++--- ...134619_add_inherit_hide_question_number.rb | 6 ++ db/schema.rb | 4 +- .../common/hooks/use-library-interactives.tsx | 1 + .../managed-interactives/customize.tsx | 57 ++++++++++++++++++- .../managed-interactives/index.tsx | 2 + .../components/item-edit-dialog.tsx | 1 + spec/models/managed_interactive_spec.rb | 20 ++++++- 9 files changed, 149 insertions(+), 13 deletions(-) create mode 100644 db/migrate/20241018134619_add_inherit_hide_question_number.rb diff --git a/app/assets/javascripts/lara-typescript.js b/app/assets/javascripts/lara-typescript.js index 68903582a..e15922fee 100644 --- a/app/assets/javascripts/lara-typescript.js +++ b/app/assets/javascripts/lara-typescript.js @@ -135602,7 +135602,9 @@ var CustomizeManagedInteractive = function (props) { inherit_image_url = managedInteractive.inherit_image_url, custom_image_url = managedInteractive.custom_image_url, show_in_featured_question_report = managedInteractive.show_in_featured_question_report, - linked_interactive_item_id = managedInteractive.linked_interactive_item_id; + linked_interactive_item_id = managedInteractive.linked_interactive_item_id, + inherit_hide_question_number = managedInteractive.inherit_hide_question_number, + custom_hide_question_number = managedInteractive.custom_hide_question_number; var _a = (0, react_1.useState)(inherit_aspect_ratio_method), inheritAspectRatio = _a[0], @@ -135640,6 +135642,14 @@ var CustomizeManagedInteractive = function (props) { customImageUrl = _h[0], setCustomImageUrl = _h[1]; + var _j = (0, react_1.useState)(inherit_hide_question_number), + inheritHideQuestionNumber = _j[0], + setInheritHideQuestionNumber = _j[1]; + + var _k = (0, react_1.useState)(custom_hide_question_number), + customHideQuestionNumber = _k[0], + setCustomHideQuestionNumber = _k[1]; + var handleBooleanOption = function (setter) { return function (e) { var value = !!(e.target.checked && e.target.value === "true"); @@ -135662,6 +135672,8 @@ var CustomizeManagedInteractive = function (props) { var handleChangeCustomClickToPlay = handleBooleanOption(setCustomClickToPlay); var handleChangeCustomClickToPlayPrompt = handleStringOption(setCustomClickToPlayPrompt); var handleChangeCustomImageUrl = handleStringOption(setCustomImageUrl); + var handleChangeHideQuestionNumber = handleBooleanOption(setInheritHideQuestionNumber); + var handleChangeCustomHideQuestionNumber = handleBooleanOption(setCustomHideQuestionNumber); var clickToPlayEnabled = inheritClickToPlay && libraryInteractive.click_to_play || !inheritClickToPlay && customClickToPlay; var renderCommonFields = function () { @@ -135839,7 +135851,44 @@ var CustomizeManagedInteractive = function (props) { onChange: handleChangeCustomClickToPlay }), React.createElement("label", { htmlFor: "custom-click-to-play" - }, "Enabled")), clickToPlayEnabled && renderClickToPlayOptions())))); + }, "Enabled")), clickToPlayEnabled && renderClickToPlayOptions()))), libraryInteractive.enable_learner_state && React.createElement("fieldset", null, React.createElement("legend", null, "Hide Question Number"), React.createElement("div", { + className: "option_group" + }, React.createElement("div", { + className: "customizable-option" + }, React.createElement("input", { + type: "radio", + id: "inherit-hide-question-number", + name: "inherit_hide_question_number", + value: "true", + defaultChecked: inheritHideQuestionNumber, + onChange: handleChangeHideQuestionNumber + }), React.createElement("label", { + htmlFor: "inherit-hide-question-number", + className: "radioLabel" + }, "Use default: ", React.createElement("strong", null, libraryInteractive.hide_question_number ? "Enabled" : "Disabled"))), React.createElement("div", { + className: "customizable-option" + }, React.createElement("input", { + type: "radio", + id: "inherit-hide-question-number", + name: "inherit_hide_question_number", + value: "false", + defaultChecked: !inheritHideQuestionNumber, + onChange: handleChangeHideQuestionNumber + }), React.createElement("label", { + htmlFor: "inherit-hide-question-number", + className: "radioLabel" + }, "Customize"), !inheritHideQuestionNumber && React.createElement("div", { + className: "customizable-option-setting" + }, React.createElement("input", { + id: "custom-hide-question-number", + type: "checkbox", + name: "custom_hide_question_number", + value: "true", + defaultChecked: customHideQuestionNumber, + onChange: handleChangeCustomHideQuestionNumber + }), React.createElement("label", { + htmlFor: "custom-hide-question-number" + }, "Enabled")))))); }; exports.CustomizeManagedInteractive = CustomizeManagedInteractive; @@ -143444,6 +143493,7 @@ var ItemEditDialog = function (_a) { case "inherit_image_url": case "inherit_native_height": case "inherit_native_width": + case "inherit_hide_question_number": elementValue = handleBooleanElement(element); break; diff --git a/app/models/managed_interactive.rb b/app/models/managed_interactive.rb index b80e16358..b976198a4 100644 --- a/app/models/managed_interactive.rb +++ b/app/models/managed_interactive.rb @@ -23,7 +23,8 @@ class ManagedInteractive < ActiveRecord::Base :inherit_image_url, :custom_image_url, :linked_interactive_item_id, :legacy_ref_id, - :legacy_ref_type + :legacy_ref_type, + :inherit_hide_question_number, :custom_hide_question_number default_value_for :custom_native_width, ASPECT_RATIO_DEFAULT_WIDTH default_value_for :custom_native_height, ASPECT_RATIO_DEFAULT_HEIGHT @@ -91,15 +92,15 @@ def image_url inherit_image_url && library_interactive ? library_interactive.image_url : custom_image_url end + def hide_question_number + inherit_hide_question_number && library_interactive ? library_interactive.hide_question_number : custom_hide_question_number + end + # getters for proxied attributes def enable_learner_state library_interactive ? library_interactive.enable_learner_state : false end - def hide_question_number - library_interactive ? library_interactive.hide_question_number : false - end - def show_delete_data_button library_interactive ? library_interactive.show_delete_data_button : true end @@ -151,7 +152,9 @@ def to_hash inherit_image_url: inherit_image_url, custom_image_url: custom_image_url, linked_interactives: linked_interactives_list, - linked_interactive_item_id: linked_interactive_item_id + linked_interactive_item_id: linked_interactive_item_id, + inherit_hide_question_number: inherit_hide_question_number, + custom_hide_question_number: custom_hide_question_number } end @@ -175,7 +178,7 @@ def to_authoring_preview_hash # inherit_native_width, custom_native_width, inherit_native_height, custom_native_height, # inherit_click_to_play, custom_click_to_play, inherit_full_window, custom_full_window, # inherit_click_to_play_prompt, custom_click_to_play_prompt, inherit_image_url, custom_image_url, - # linked_interactives + # linked_interactives, inherit_hide_question_number, custom_question_number def to_interactive # NOTE: model_library_url is missing as there is no analog diff --git a/db/migrate/20241018134619_add_inherit_hide_question_number.rb b/db/migrate/20241018134619_add_inherit_hide_question_number.rb new file mode 100644 index 000000000..2ed67fa4f --- /dev/null +++ b/db/migrate/20241018134619_add_inherit_hide_question_number.rb @@ -0,0 +1,6 @@ +class AddInheritHideQuestionNumber < ActiveRecord::Migration + def change + add_column :managed_interactives, :inherit_hide_question_number, :boolean, default: true + add_column :managed_interactives, :custom_hide_question_number, :boolean, default: false + end +end diff --git a/db/schema.rb b/db/schema.rb index b3c8d8231..6ce782db2 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20241011123743) do +ActiveRecord::Schema.define(:version => 20241018134619) do create_table "admin_events", :force => true do |t| t.string "kind" @@ -528,6 +528,8 @@ t.string "linked_interactive_type" t.integer "legacy_ref_id" t.string "legacy_ref_type" + t.boolean "inherit_hide_question_number", :default => true + t.boolean "custom_hide_question_number", :default => false end add_index "managed_interactives", ["legacy_ref_id", "legacy_ref_type"], :name => "managed_interactive_legacy_idx" diff --git a/lara-typescript/src/page-item-authoring/common/hooks/use-library-interactives.tsx b/lara-typescript/src/page-item-authoring/common/hooks/use-library-interactives.tsx index 479375718..87c2d338c 100644 --- a/lara-typescript/src/page-item-authoring/common/hooks/use-library-interactives.tsx +++ b/lara-typescript/src/page-item-authoring/common/hooks/use-library-interactives.tsx @@ -10,6 +10,7 @@ export interface ILibraryInteractive { click_to_play_prompt: string; description: string; enable_learner_state: boolean; + hide_question_number: boolean; export_hash: string; full_window: boolean; has_report_url: boolean; diff --git a/lara-typescript/src/page-item-authoring/managed-interactives/customize.tsx b/lara-typescript/src/page-item-authoring/managed-interactives/customize.tsx index cdb96f3cb..137df0ec1 100644 --- a/lara-typescript/src/page-item-authoring/managed-interactives/customize.tsx +++ b/lara-typescript/src/page-item-authoring/managed-interactives/customize.tsx @@ -32,7 +32,9 @@ export const CustomizeManagedInteractive: React.FC = (props) => { inherit_image_url, custom_image_url, show_in_featured_question_report, - linked_interactive_item_id + linked_interactive_item_id, + inherit_hide_question_number, + custom_hide_question_number } = managedInteractive; const [inheritAspectRatio, setInheritAspectRatio] = useState(inherit_aspect_ratio_method); @@ -47,6 +49,8 @@ export const CustomizeManagedInteractive: React.FC = (props) => { const [inheritFullWindow, setInheritFullWindow] = useState(inherit_full_window); const [inheritImageUrl, setInheritImageUrl] = useState(inherit_image_url); const [customImageUrl, setCustomImageUrl] = useState(custom_image_url); + const [inheritHideQuestionNumber, setInheritHideQuestionNumber] = useState(inherit_hide_question_number); + const [customHideQuestionNumber, setCustomHideQuestionNumber] = useState(custom_hide_question_number); const handleBooleanOption = (setter: (value: boolean) => void) => { return (e: React.ChangeEvent) => { @@ -67,6 +71,8 @@ export const CustomizeManagedInteractive: React.FC = (props) => { const handleChangeCustomClickToPlay = handleBooleanOption(setCustomClickToPlay); const handleChangeCustomClickToPlayPrompt = handleStringOption(setCustomClickToPlayPrompt); const handleChangeCustomImageUrl = handleStringOption(setCustomImageUrl); + const handleChangeHideQuestionNumber = handleBooleanOption(setInheritHideQuestionNumber); + const handleChangeCustomHideQuestionNumber = handleBooleanOption(setCustomHideQuestionNumber); const clickToPlayEnabled = (inheritClickToPlay && libraryInteractive.click_to_play) || (!inheritClickToPlay && customClickToPlay); @@ -317,5 +323,54 @@ export const CustomizeManagedInteractive: React.FC = (props) => { + + {libraryInteractive.enable_learner_state && +
+ Hide Question Number +
+
+ + +
+
+ + + {!inheritHideQuestionNumber && +
+ + +
+ } +
+
+
+ } ; }; diff --git a/lara-typescript/src/page-item-authoring/managed-interactives/index.tsx b/lara-typescript/src/page-item-authoring/managed-interactives/index.tsx index 118ef9c41..f8c03c780 100644 --- a/lara-typescript/src/page-item-authoring/managed-interactives/index.tsx +++ b/lara-typescript/src/page-item-authoring/managed-interactives/index.tsx @@ -52,6 +52,8 @@ export interface IManagedInteractive { interactive_item_id: string; linked_interactive_item_id: string; linked_interactives: ILinkedInteractive[]; + inherit_hide_question_number: boolean; + custom_hide_question_number: boolean; } export const ManagedInteractiveAuthoring: React.FC = (props) => { diff --git a/lara-typescript/src/section-authoring/components/item-edit-dialog.tsx b/lara-typescript/src/section-authoring/components/item-edit-dialog.tsx index 4ee2e0bb0..3226085ab 100644 --- a/lara-typescript/src/section-authoring/components/item-edit-dialog.tsx +++ b/lara-typescript/src/section-authoring/components/item-edit-dialog.tsx @@ -119,6 +119,7 @@ export const ItemEditDialog: React.FC = ({ case "inherit_image_url": case "inherit_native_height": case "inherit_native_width": + case "inherit_hide_question_number": elementValue = handleBooleanElement((element as HTMLInputElement)); break; case "library_interactive_id": diff --git a/spec/models/managed_interactive_spec.rb b/spec/models/managed_interactive_spec.rb index 88ca9623c..312797461 100644 --- a/spec/models/managed_interactive_spec.rb +++ b/spec/models/managed_interactive_spec.rb @@ -70,7 +70,9 @@ inherit_image_url: managed_interactive.inherit_image_url, custom_image_url: managed_interactive.custom_image_url, linked_interactives: [], - linked_interactive_item_id: nil + linked_interactive_item_id: nil, + inherit_hide_question_number: managed_interactive.inherit_hide_question_number, + custom_hide_question_number: managed_interactive.custom_hide_question_number, } expect(managed_interactive.to_hash).to eq(expected) end @@ -127,7 +129,9 @@ inherit_click_to_play_prompt: managed_interactive.inherit_click_to_play_prompt, custom_click_to_play_prompt: managed_interactive.custom_click_to_play_prompt, inherit_image_url: managed_interactive.inherit_image_url, - custom_image_url: managed_interactive.custom_image_url + custom_image_url: managed_interactive.custom_image_url, + inherit_hide_question_number: managed_interactive.inherit_hide_question_number, + custom_hide_question_number: managed_interactive.custom_hide_question_number, }) end end @@ -297,6 +301,18 @@ expect(managed_interactive.click_to_play).to eq !library_interactive.click_to_play end + it "returns hide_question_number" do + expect(managed_interactive.hide_question_number).to eq library_interactive.hide_question_number + managed_interactive.custom_hide_question_number = !library_interactive.hide_question_number + expect(managed_interactive.hide_question_number).to eq library_interactive.hide_question_number + managed_interactive.inherit_hide_question_number = false + expect(managed_interactive.hide_question_number).to eq !library_interactive.hide_question_number + managed_interactive.inherit_hide_question_number = true + expect(managed_interactive.hide_question_number).to eq library_interactive.hide_question_number + managed_interactive.library_interactive = nil + expect(managed_interactive.hide_question_number).to eq !library_interactive.hide_question_number + end + it "returns full_window" do expect(managed_interactive.full_window).to eq library_interactive.full_window managed_interactive.custom_full_window = !library_interactive.full_window