@dcrackel/hematournamentui 1.0.706 → 1.0.707

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (330) hide show
  1. package/.prettierignore +7 -1
  2. package/.storybook/main.js +5 -12
  3. package/.storybook/preview-head.html +10 -3
  4. package/.storybook/preview.js +5 -13
  5. package/AGENTS.md +31 -1
  6. package/README.md +29 -22
  7. package/dist/HemaTournamentUI-lib.es.js +7189 -7467
  8. package/dist/HemaTournamentUI-lib.umd.js +27 -27
  9. package/dist/hematournamentui-tailwind.css +0 -24
  10. package/dist/hematournamentui.css +1 -1
  11. package/eslint.config.js +49 -23
  12. package/package.json +6 -2
  13. package/postcss.config.js +3 -3
  14. package/prettier.config.js +16 -10
  15. package/src/config/boutScreenConfigurations.js +52 -50
  16. package/src/main.js +1 -1
  17. package/src/mocks/EventQuestionsMock.js +43 -55
  18. package/src/mocks/assignments.js +180 -181
  19. package/src/mocks/clubGetAllMock.js +8143 -8143
  20. package/src/mocks/eventMock.js +205 -205
  21. package/src/mocks/eventPersonGetInitalPoolAssignmentsLivePools.js +541 -542
  22. package/src/mocks/eventPersonGetInitalPoolAssignmentsPreparing.js +522 -523
  23. package/src/mocks/eventPersonGetInitialPoolAssignments.js +386 -387
  24. package/src/mocks/eventPersonGetInitialPoolAssignments2.js +2267 -2268
  25. package/src/mocks/eventPersonGetInitialStaff.js +94 -95
  26. package/src/mocks/eventPersonGetPoolAssignmentEvent.js +161 -162
  27. package/src/mocks/eventRules.js +87 -86
  28. package/src/mocks/eventpersonGetEventById.js +1737 -1737
  29. package/src/mocks/getAllClubs.js +8143 -8143
  30. package/src/mocks/getAllStaffByTournamentId.js +74 -75
  31. package/src/mocks/getAllWeapons.js +81 -82
  32. package/src/mocks/getAttendance.js +43 -44
  33. package/src/mocks/getClub.js +43 -44
  34. package/src/mocks/getClubDisplayByClubId.js +104 -105
  35. package/src/mocks/getDEBouts-128Fencers.js +3247 -3248
  36. package/src/mocks/getDEBouts-42Fencers.js +3736 -3737
  37. package/src/mocks/getDEBouts-67Fencers.js +6684 -6690
  38. package/src/mocks/getDEBouts-DoubleElim.js +4198 -4199
  39. package/src/mocks/getDEWithBouts.js +628 -629
  40. package/src/mocks/getDeBouts-12fencers.js +1255 -1256
  41. package/src/mocks/getDeBouts-15fencers.js +925 -927
  42. package/src/mocks/getDeBouts-22fencers.js +1683 -1685
  43. package/src/mocks/getDeBouts-6fencers.js +818 -818
  44. package/src/mocks/getEventByTournamentId.js +47 -48
  45. package/src/mocks/getFinalEventResult.js +304 -305
  46. package/src/mocks/getPenaltiesByEvent.js +655 -656
  47. package/src/mocks/getPoolResults.js +1533 -1534
  48. package/src/mocks/getPoolsWithBouts.js +662 -663
  49. package/src/mocks/getPoolsWithBouts6PoolId139.js +885 -886
  50. package/src/mocks/getPoolsWithBoutsByPoolId.js +841 -841
  51. package/src/mocks/getPoolsWithBoutsClubColors.js +4 -4
  52. package/src/mocks/getPoolsWithBoutsComplete.js +919 -921
  53. package/src/mocks/locationMock.js +3213 -3214
  54. package/src/mocks/mockRoutes.js +3 -3
  55. package/src/mocks/personGetAllMock.js +2536 -2537
  56. package/src/mocks/personsMock.js +17569 -17570
  57. package/src/mocks/singleEventMock.js +249 -250
  58. package/src/mocks/tournamentMock.js +1988 -1927
  59. package/src/stories/Atoms/CheckBox/BaseCheckbox.stories.js +25 -23
  60. package/src/stories/Atoms/CheckBox/BaseCheckbox.vue +30 -24
  61. package/src/stories/Atoms/Icon/BaseIcon.stories.js +63 -64
  62. package/src/stories/Atoms/Icon/BaseIcon.test.js +67 -69
  63. package/src/stories/Atoms/Icon/BaseIcon.vue +2 -3
  64. package/src/stories/Atoms/Input/BaseInput.stories.js +18 -18
  65. package/src/stories/Atoms/Input/BaseInput.test.js +65 -67
  66. package/src/stories/Atoms/Input/BaseInput.vue +36 -31
  67. package/src/stories/Atoms/RadioGroup/BaseRadioGroup.stories.js +21 -21
  68. package/src/stories/Atoms/RadioGroup/BaseRadioGroup.test.js +31 -31
  69. package/src/stories/Atoms/RadioGroup/BaseRadioGroup.vue +23 -18
  70. package/src/stories/Atoms/Tag/BaseTag.stories.js +21 -21
  71. package/src/stories/Atoms/Tag/BaseTag.test.js +26 -30
  72. package/src/stories/Atoms/Tag/BaseTag.vue +18 -19
  73. package/src/stories/Atoms/Text/BaseText.stories.js +54 -62
  74. package/src/stories/Atoms/Text/BaseText.test.js +152 -154
  75. package/src/stories/Atoms/Text/BaseText.vue +103 -81
  76. package/src/stories/Configure.mdx +5 -3
  77. package/src/stories/Molecules/Boxes/BoutBoxes/HandshotCounterBox/HandshotCounterBox.stories.js +24 -24
  78. package/src/stories/Molecules/Boxes/BoutBoxes/HandshotCounterBox/HandshotCounterBox.vue +33 -15
  79. package/src/stories/Molecules/Boxes/BoutBoxes/PassesBox/PassesBox.stories.js +46 -48
  80. package/src/stories/Molecules/Boxes/BoutBoxes/PassesBox/PassesBox.vue +38 -25
  81. package/src/stories/Molecules/Boxes/BoutBoxes/PenaltyConfirmationBox/PenaltyConfirmationBox.stories.js +4 -4
  82. package/src/stories/Molecules/Boxes/BoutBoxes/PenaltyConfirmationBox/PenaltyConfirmationBox.vue +9 -4
  83. package/src/stories/Molecules/Boxes/BoutBoxes/ScoreBox/ScoreBox.stories.js +90 -90
  84. package/src/stories/Molecules/Boxes/BoutBoxes/ScoreBox/ScoreBox.vue +51 -32
  85. package/src/stories/Molecules/Boxes/BoutBoxes/TimerBox/TimerBox.stories.js +25 -25
  86. package/src/stories/Molecules/Boxes/BoutBoxes/TimerBox/TimerBox.vue +47 -12
  87. package/src/stories/Molecules/Boxes/CounterBox/CounterBox.stories.js +19 -19
  88. package/src/stories/Molecules/Boxes/CounterBox/CounterBox.vue +25 -19
  89. package/src/stories/Molecules/Boxes/EventStatusBox/EventStatusBox.stories.js +25 -28
  90. package/src/stories/Molecules/Boxes/EventStatusBox/EventStatusBox.vue +7 -7
  91. package/src/stories/Molecules/Breadcrumb/Admin/Breadcrumb.stories.js +28 -29
  92. package/src/stories/Molecules/Breadcrumb/Admin/Breadcrumb.test.js +58 -58
  93. package/src/stories/Molecules/Breadcrumb/Admin/Breadcrumb.vue +15 -15
  94. package/src/stories/Molecules/Buttons/BaseButton/BaseButton.stories.js +86 -86
  95. package/src/stories/Molecules/Buttons/BaseButton/BaseButton.test.js +101 -103
  96. package/src/stories/Molecules/Buttons/BaseButton/BaseButton.vue +87 -24
  97. package/src/stories/Molecules/Buttons/ButtonBar/ButtonBar.stories.js +31 -31
  98. package/src/stories/Molecules/Buttons/ButtonBar/ButtonBar.vue +19 -21
  99. package/src/stories/Molecules/CombinationInputs/TitledInput/TitledInput.stories.js +57 -57
  100. package/src/stories/Molecules/CombinationInputs/TitledInput/TitledInput.test.js +64 -64
  101. package/src/stories/Molecules/CombinationInputs/TitledInput/TitledInput.vue +17 -16
  102. package/src/stories/Molecules/Filters/FilterAndSortBar/FilterAndSortBar.stories.js +19 -19
  103. package/src/stories/Molecules/Filters/FilterAndSortBar/FilterAndSortBar.vue +18 -7
  104. package/src/stories/Molecules/Filters/FilterUpcomingPast/FilterUpcomingPast.stories.js +16 -18
  105. package/src/stories/Molecules/Filters/FilterUpcomingPast/FilterUpcomingPast.vue +31 -13
  106. package/src/stories/Molecules/Indicators/ServerConnected/ServerConnected.stories.js +27 -27
  107. package/src/stories/Molecules/Indicators/ServerConnected/ServerConnected.vue +6 -5
  108. package/src/stories/Molecules/Inputs/MultiSelect/MultiSelect.stories.js +35 -35
  109. package/src/stories/Molecules/Inputs/MultiSelect/MultiSelect.vue +13 -8
  110. package/src/stories/Molecules/Inputs/Toggle/Toggle.stories.js +27 -27
  111. package/src/stories/Molecules/Inputs/Toggle/Toggle.vue +8 -5
  112. package/src/stories/Molecules/Menus/TabBar/TabBar.stories.js +18 -18
  113. package/src/stories/Molecules/Menus/TabBar/TabBar.vue +1 -2
  114. package/src/stories/Molecules/Modals/AddDisplayModal/AddDisplay.stories.js +36 -27
  115. package/src/stories/Molecules/Modals/AddDisplayModal/AddDisplayModal.vue +25 -15
  116. package/src/stories/Molecules/Modals/BaseModal/BaseModal.stories.js +66 -65
  117. package/src/stories/Molecules/Modals/BaseModal/BaseModal.vue +47 -9
  118. package/src/stories/Molecules/Modals/ConfirmModal/ConfirmModal.stories.js +23 -23
  119. package/src/stories/Molecules/Modals/ConfirmModal/ConfirmModal.vue +59 -11
  120. package/src/stories/Molecules/Modals/DirectorModal/DirectorModal.stories.js +37 -37
  121. package/src/stories/Molecules/Modals/DirectorModal/DirectorModal.vue +27 -22
  122. package/src/stories/Molecules/Modals/EditBoutModal/EditBoutModal.stories.js +41 -41
  123. package/src/stories/Molecules/Modals/EditBoutModal/EditBoutModal.vue +27 -15
  124. package/src/stories/Molecules/Modals/EventWizardModal/EventWizardModal.stories.js +29 -30
  125. package/src/stories/Molecules/Modals/EventWizardModal/EventWizardModal.vue +18 -16
  126. package/src/stories/Molecules/Modals/LoadingModal/LoadingModal.stories.js +21 -21
  127. package/src/stories/Molecules/Modals/LoadingModal/LoadingModal.vue +7 -7
  128. package/src/stories/Molecules/Modals/PenaltyModal/PenaltyModal.stories.js +24 -24
  129. package/src/stories/Molecules/Modals/PenaltyModal/PenaltyModal.vue +30 -25
  130. package/src/stories/Molecules/Reorder/ReorderableShell.stories.js +81 -77
  131. package/src/stories/Molecules/Reorder/ReorderableShell.vue +46 -43
  132. package/src/stories/Molecules/StepIndicator/BaseStepIndicator/StepIndicator.stories.js +40 -40
  133. package/src/stories/Molecules/StepIndicator/BaseStepIndicator/StepIndicator.vue +23 -25
  134. package/src/stories/Organisms/Cards/BoutCard/BoutCard.stories.js +34 -29
  135. package/src/stories/Organisms/Cards/BoutCard/BoutCard.vue +69 -66
  136. package/src/stories/Organisms/Cards/BoutCard/Variants/BoutCardActive/BoutCardActive.stories.js +24 -22
  137. package/src/stories/Organisms/Cards/BoutCard/Variants/BoutCardActive/BoutCardActive.vue +53 -41
  138. package/src/stories/Organisms/Cards/BoutCard/Variants/BoutCardInactive/BoutCardInactive.stories.js +24 -37
  139. package/src/stories/Organisms/Cards/BoutCard/Variants/BoutCardInactive/BoutCardInactive.vue +88 -103
  140. package/src/stories/Organisms/Cards/BoutCard/Variants/BoutCardReorder/BoutCardReorder.vue +13 -14
  141. package/src/stories/Organisms/Cards/BoutCard/Variants/BoutCardWaiting/BoutCardWaiting.stories.js +5 -5
  142. package/src/stories/Organisms/Cards/BoutCard/Variants/BoutCardWaiting/BoutCardWaiting.vue +22 -21
  143. package/src/stories/Organisms/Cards/ClubCard/ClubCard.stories.js +14 -17
  144. package/src/stories/Organisms/Cards/ClubCard/ClubCard.vue +25 -18
  145. package/src/stories/Organisms/Cards/Director/DirectorCard.stories.js +23 -23
  146. package/src/stories/Organisms/Cards/Director/DirectorCard.vue +159 -103
  147. package/src/stories/Organisms/Cards/EditBout/EditBout.stories.js +47 -47
  148. package/src/stories/Organisms/Cards/EditBout/EditBout.test.js +51 -0
  149. package/src/stories/Organisms/Cards/EditBout/EditBout.vue +82 -54
  150. package/src/stories/Organisms/Cards/EventCard/EventCard.stories.js +9 -10
  151. package/src/stories/Organisms/Cards/EventCard/EventCard.vue +83 -63
  152. package/src/stories/Organisms/Cards/FencerCard/FencerCard.stories.js +105 -105
  153. package/src/stories/Organisms/Cards/FencerCard/FencerCard.vue +142 -58
  154. package/src/stories/Organisms/Cards/FencerFinalResultCard/FencerFinalResultCard.stories.js +14 -14
  155. package/src/stories/Organisms/Cards/FencerFinalResultCard/FencerFinalResultCard.vue +37 -26
  156. package/src/stories/Organisms/Cards/FencerPoolResultsCard/FencerPoolResults.stories.js +24 -24
  157. package/src/stories/Organisms/Cards/FencerPoolResultsCard/FencerPoolResultsCard.vue +95 -28
  158. package/src/stories/Organisms/Cards/ImportFencerCard/ImportFencerCard.stories.js +59 -60
  159. package/src/stories/Organisms/Cards/ImportFencerCard/ImportFencerCard.vue +13 -7
  160. package/src/stories/Organisms/Cards/KioskCard/KioskCard.stories.js +34 -34
  161. package/src/stories/Organisms/Cards/KioskCard/KioskCard.vue +149 -104
  162. package/src/stories/Organisms/Cards/PenaltyCard/PenaltyCard.stories.js +19 -20
  163. package/src/stories/Organisms/Cards/PenaltyCard/PenaltyCard.vue +207 -163
  164. package/src/stories/Organisms/Cards/PenaltyFencerCard/PenaltyFencerCard.stories.js +17 -17
  165. package/src/stories/Organisms/Cards/PenaltyFencerCard/PenaltyFencerCard.vue +88 -46
  166. package/src/stories/Organisms/Cards/PoolBoutMatchCard/PoolBoutMatchCard.stories.js +182 -182
  167. package/src/stories/Organisms/Cards/PoolBoutMatchCard/PoolBoutMatchCard.vue +21 -12
  168. package/src/stories/Organisms/Cards/PoolFencerCard/PoolFencerCard.stories.js +25 -28
  169. package/src/stories/Organisms/Cards/PoolFencerCard/PoolFencerCard.vue +28 -22
  170. package/src/stories/Organisms/Cards/StaffCard/StaffCard.stories.js +62 -62
  171. package/src/stories/Organisms/Cards/StaffCard/StaffCard.vue +27 -22
  172. package/src/stories/Organisms/Cards/TableauBoutCard/SpacingConfig.js +103 -103
  173. package/src/stories/Organisms/Cards/TableauBoutCard/TableauBoutCard.stories.js +73 -73
  174. package/src/stories/Organisms/Cards/TableauBoutCard/TableauBoutCard.test.js +44 -0
  175. package/src/stories/Organisms/Cards/TableauBoutCard/TableauBoutCard.vue +69 -56
  176. package/src/stories/Organisms/Cards/TableauFencerCard/TableauFencerCard.stories.js +80 -81
  177. package/src/stories/Organisms/Cards/TableauFencerCard/TableauFencerCard.vue +39 -22
  178. package/src/stories/Organisms/Cards/TournamentAdminCard/TournamentAdmin.stories.js +20 -20
  179. package/src/stories/Organisms/Cards/TournamentAdminCard/TournamentAdminCard.vue +62 -33
  180. package/src/stories/Organisms/Cards/WaitlistFencerCard/WaitlistFencerCard.vue +44 -30
  181. package/src/stories/Organisms/ComplexInputs/AddressAutocomplete/AddressAutocomplete.stories.js +6 -7
  182. package/src/stories/Organisms/ComplexInputs/AddressAutocomplete/AddressAutocomplete.vue +7 -8
  183. package/src/stories/Organisms/ComplexInputs/ClubColorPicker/ClubColorPicker.stories.js +31 -31
  184. package/src/stories/Organisms/ComplexInputs/ClubColorPicker/ClubColorPicker.vue +30 -35
  185. package/src/stories/Organisms/ComplexInputs/DatePicker/DatePicker.stories.js +13 -16
  186. package/src/stories/Organisms/ComplexInputs/DatePicker/DatePicker.vue +68 -70
  187. package/src/stories/Organisms/ComplexInputs/DropDown/DropDownMenu.stories.js +32 -34
  188. package/src/stories/Organisms/ComplexInputs/DropDown/DropDownMenu.vue +48 -25
  189. package/src/stories/Organisms/ComplexInputs/FindLocation/FindLocation.stories.js +21 -21
  190. package/src/stories/Organisms/ComplexInputs/FindLocation/FindLocation.vue +65 -38
  191. package/src/stories/Organisms/ComplexInputs/FindOrAddPerson/FindOrAddPerson.stories.js +19 -20
  192. package/src/stories/Organisms/ComplexInputs/FindOrAddPerson/FindOrAddPerson.vue +46 -21
  193. package/src/stories/Organisms/ComplexInputs/FindPerson/FindPerson.stories.js +22 -22
  194. package/src/stories/Organisms/ComplexInputs/FindPerson/FindPerson.vue +68 -23
  195. package/src/stories/Organisms/ComplexInputs/ImageCropper/ImageCropper.stories.js +13 -13
  196. package/src/stories/Organisms/ComplexInputs/ImageCropper/ImageCropper.vue +25 -24
  197. package/src/stories/Organisms/ComplexInputs/TextBoxEditor/TextBoxEditor.stories.js +6 -10
  198. package/src/stories/Organisms/ComplexInputs/TextBoxEditor/TextBoxEditor.vue +112 -48
  199. package/src/stories/Organisms/Containers/BoutsSection/BoutsSection.stories.js +43 -44
  200. package/src/stories/Organisms/Containers/BoutsSection/BoutsSection.vue +30 -23
  201. package/src/stories/Organisms/Containers/FinalResults/FinalResultsTable.stories.js +20 -20
  202. package/src/stories/Organisms/Containers/FinalResults/FinalResultsTable.vue +12 -12
  203. package/src/stories/Organisms/Containers/KioskContainer/KioskContainer.stories.js +24 -25
  204. package/src/stories/Organisms/Containers/KioskContainer/KioskContainer.vue +112 -87
  205. package/src/stories/Organisms/Containers/Pool/Pool.stories.js +54 -54
  206. package/src/stories/Organisms/Containers/Pool/Pool.vue +64 -41
  207. package/src/stories/Organisms/Containers/PoolGrid/PoolGrid.stories.js +17 -19
  208. package/src/stories/Organisms/Containers/PoolGrid/PoolGrid.vue +189 -135
  209. package/src/stories/Organisms/Containers/PoolResults/PoolResultsTable.stories.js +53 -54
  210. package/src/stories/Organisms/Containers/PoolResults/PoolResultsTable.vue +107 -73
  211. package/src/stories/Organisms/Containers/Tableau/Tableau.stories.js +23 -24
  212. package/src/stories/Organisms/Containers/Tableau/Tableau.test.js +49 -10
  213. package/src/stories/Organisms/Containers/Tableau/Tableau.vue +96 -173
  214. package/src/stories/Organisms/Containers/TableauColumn/TabeauColumn.stories.js +26 -27
  215. package/src/stories/Organisms/Containers/TableauColumn/TableauColumn.vue +20 -17
  216. package/src/stories/Organisms/Containers/TableauLines/SpacingConfig.js +153 -103
  217. package/src/stories/Organisms/Containers/TableauLines/TableauLines.stories.js +13 -15
  218. package/src/stories/Organisms/Containers/TableauLines/TableauLines.vue +7 -8
  219. package/src/stories/Organisms/Form/AddDisplay/AddDisplay.stories.js +26 -26
  220. package/src/stories/Organisms/Form/AddDisplay/AddDisplay.vue +130 -118
  221. package/src/stories/Organisms/Form/AddNewPerson/AddNewPerson.stories.js +14 -15
  222. package/src/stories/Organisms/Form/AddNewPerson/AddNewPerson.vue +94 -88
  223. package/src/stories/Organisms/Grids/GridContainer.stories.js +101 -101
  224. package/src/stories/Organisms/Grids/GridContainer.vue +160 -136
  225. package/src/stories/Organisms/Headers/AttendanceSummary/AttendanceSummary.stories.js +47 -47
  226. package/src/stories/Organisms/Headers/AttendanceSummary/AttendanceSummary.vue +65 -54
  227. package/src/stories/Organisms/Headers/EventFinalResultsHeader/EventFinalResultsHeader.stories.js +27 -27
  228. package/src/stories/Organisms/Headers/EventFinalResultsHeader/EventFinalResultsHeader.vue +38 -22
  229. package/src/stories/Organisms/Headers/PenaltySummary/PenaltySummary.stories.js +80 -80
  230. package/src/stories/Organisms/Headers/PenaltySummary/PenaltySummary.vue +14 -6
  231. package/src/stories/Organisms/Headers/PoolResultsHeader/PoolResultsHeader.stories.js +34 -34
  232. package/src/stories/Organisms/Headers/PoolResultsHeader/PoolResultsHeader.vue +36 -36
  233. package/src/stories/Organisms/Headers/PoolSummary/PoolSummary.stories.js +21 -21
  234. package/src/stories/Organisms/Headers/PoolSummary/PoolSummary.vue +56 -29
  235. package/src/stories/Organisms/Headers/ToggleHeader/ToggleHeader.stories.js +38 -38
  236. package/src/stories/Organisms/Headers/ToggleHeader/ToggleHeader.vue +19 -20
  237. package/src/stories/Organisms/RankCalculator/ByLetter/RankCalculator.stories.js +12 -13
  238. package/src/stories/Organisms/RankCalculator/ByLetter/RankCalculator.vue +47 -41
  239. package/src/stories/Organisms/RankCalculator/ByPoints/RankCalculatorByPoints.stories.js +12 -13
  240. package/src/stories/Organisms/RankCalculator/ByPoints/RankCalculatorByPoints.vue +66 -37
  241. package/src/stories/Organisms/Skeletons/ClubManagement/ClubManagement.stories.js +6 -10
  242. package/src/stories/Organisms/Skeletons/ClubManagement/ClubMangementSkeleton.vue +2 -2
  243. package/src/stories/Organisms/Skeletons/EventCard/EventCardSkeleton.stories.js +6 -10
  244. package/src/stories/Organisms/Skeletons/EventCard/EventCardSkeleton.vue +2 -3
  245. package/src/stories/Organisms/Skeletons/FencerCard/FencerCardSkeleton.stories.js +6 -10
  246. package/src/stories/Organisms/Skeletons/FencerCard/FencerCardSkeleton.vue +1 -1
  247. package/src/stories/Organisms/Skeletons/PersonManagement/PersonManagementSkeleton.stories.js +6 -9
  248. package/src/stories/Organisms/Skeletons/PersonManagement/PersonManagementSkeleton.vue +2 -2
  249. package/src/stories/Organisms/Skeletons/PoolSkeleton/PoolSkeleton.stories.js +6 -10
  250. package/src/stories/Organisms/Skeletons/PoolSkeleton/PoolSkeleton.vue +10 -4
  251. package/src/stories/Organisms/Skeletons/TournamentCard/TournamentCardSkeleton.stories.js +6 -10
  252. package/src/stories/Organisms/Skeletons/TournamentCard/TournamentCardSkeleton.vue +2 -2
  253. package/src/stories/Organisms/Wizards/EditEventWizard/BasicEventInfo/BasicEventInfo.stories.js +34 -34
  254. package/src/stories/Organisms/Wizards/EditEventWizard/BasicEventInfo/BasicEventInfo.vue +106 -56
  255. package/src/stories/Organisms/Wizards/EditEventWizard/DirectElimination/DirectElimination.stories.js +95 -95
  256. package/src/stories/Organisms/Wizards/EditEventWizard/DirectElimination/DirectElimination.vue +129 -69
  257. package/src/stories/Organisms/Wizards/EditEventWizard/DirectEliminationPromotion/DirectEliminationPromotion.stories.js +87 -88
  258. package/src/stories/Organisms/Wizards/EditEventWizard/DirectEliminationPromotion/DirectEliminationPromotion.vue +105 -60
  259. package/src/stories/Organisms/Wizards/EditEventWizard/EditEventWizard.stories.js +82 -82
  260. package/src/stories/Organisms/Wizards/EditEventWizard/EditEventWizard.vue +150 -177
  261. package/src/stories/Organisms/Wizards/EditEventWizard/EventCustomization/EventCustomization.stories.js +28 -28
  262. package/src/stories/Organisms/Wizards/EditEventWizard/EventCustomization/EventCustomization.vue +96 -36
  263. package/src/stories/Organisms/Wizards/EditEventWizard/PoolConfiguration/PoolConfiguration.stories.js +99 -99
  264. package/src/stories/Organisms/Wizards/EditEventWizard/PoolConfiguration/PoolConfiguration.vue +115 -67
  265. package/src/stories/Templates/Assignment/Assignment.stories.js +22 -23
  266. package/src/stories/Templates/Assignment/Assignment.vue +210 -161
  267. package/src/stories/Templates/ClubManagement/ClubBasic/ClubBasic.stories.js +90 -90
  268. package/src/stories/Templates/ClubManagement/ClubBasic/ClubBasic.vue +68 -55
  269. package/src/stories/Templates/ClubManagement/ClubManagement.stories.js +87 -87
  270. package/src/stories/Templates/ClubManagement/ClubManagement.vue +167 -147
  271. package/src/stories/Templates/EventManagement/Bracket/Bracket.stories.js +82 -103
  272. package/src/stories/Templates/EventManagement/Bracket/Bracket.test.js +88 -43
  273. package/src/stories/Templates/EventManagement/Bracket/Bracket.vue +167 -200
  274. package/src/stories/Templates/EventManagement/EditEventInfo/EditEventInfo.stories.js +49 -50
  275. package/src/stories/Templates/EventManagement/EditEventInfo/EditEventInfo.vue +21 -21
  276. package/src/stories/Templates/EventManagement/EventAttendance/EventAttendance.stories.js +105 -103
  277. package/src/stories/Templates/EventManagement/EventAttendance/EventAttendance.vue +289 -226
  278. package/src/stories/Templates/EventManagement/EventFinalResults/EventFinalResults.stories.js +30 -30
  279. package/src/stories/Templates/EventManagement/EventFinalResults/EventFinalResults.vue +27 -22
  280. package/src/stories/Templates/EventManagement/KioskDisplay/KioskDisplay.stories.js +44 -45
  281. package/src/stories/Templates/EventManagement/KioskDisplay/KioskDisplay.vue +52 -43
  282. package/src/stories/Templates/EventManagement/Penalties/PenaltyReport.stories.js +28 -29
  283. package/src/stories/Templates/EventManagement/Penalties/PenaltyReport.vue +54 -39
  284. package/src/stories/Templates/EventManagement/PoolLive/PoolLive.stories.js +80 -111
  285. package/src/stories/Templates/EventManagement/PoolLive/PoolLive.test.js +121 -0
  286. package/src/stories/Templates/EventManagement/PoolLive/PoolLive.vue +290 -255
  287. package/src/stories/Templates/EventManagement/PoolManagement/PoolManagement.stories.js +109 -107
  288. package/src/stories/Templates/EventManagement/PoolManagement/PoolManagement.vue +144 -87
  289. package/src/stories/Templates/EventManagement/PoolResults/PoolResults.stories.js +56 -57
  290. package/src/stories/Templates/EventManagement/PoolResults/PoolResults.vue +132 -123
  291. package/src/stories/Templates/EventManagement/StaffList/StaffList.stories.js +56 -57
  292. package/src/stories/Templates/EventManagement/StaffList/StaffList.vue +84 -47
  293. package/src/stories/Templates/Menus/Admin/AdminLeftMenu.stories.js +29 -29
  294. package/src/stories/Templates/Menus/Admin/AdminLeftMenu.vue +71 -67
  295. package/src/stories/Templates/Menus/EditEventsTopMenu/EditEventsTopMenu.stories.js +39 -40
  296. package/src/stories/Templates/Menus/EditEventsTopMenu/EditEventsTopMenu.vue +79 -71
  297. package/src/stories/Templates/PersonManagement/Admin/Administration/Administration.stories.js +47 -47
  298. package/src/stories/Templates/PersonManagement/Admin/Administration/Administration.vue +39 -42
  299. package/src/stories/Templates/PersonManagement/Admin/FencerAdmin/FencerAdmin.stories.js +54 -54
  300. package/src/stories/Templates/PersonManagement/Admin/FencerAdmin/FencerAdmin.vue +27 -31
  301. package/src/stories/Templates/PersonManagement/Admin/MergeAccounts/MergeAccounts.stories.js +69 -69
  302. package/src/stories/Templates/PersonManagement/Admin/MergeAccounts/MergeAccounts.vue +78 -89
  303. package/src/stories/Templates/PersonManagement/Attendance/Attendance.stories.js +22 -22
  304. package/src/stories/Templates/PersonManagement/Attendance/Attendance.vue +61 -33
  305. package/src/stories/Templates/PersonManagement/Basic/BasicEdit.stories.js +29 -29
  306. package/src/stories/Templates/PersonManagement/Basic/BasicEdit.vue +80 -53
  307. package/src/stories/Templates/PersonManagement/PersonManagement.stories.js +84 -86
  308. package/src/stories/Templates/PersonManagement/PersonManagement.vue +107 -82
  309. package/src/stories/Templates/TournamentManagement/ListEvents/ListEvents.stories.js +31 -31
  310. package/src/stories/Templates/TournamentManagement/ListEvents/ListEvents.vue +70 -51
  311. package/src/stories/Templates/TournamentManagement/TournamentManagement.stories.js +79 -79
  312. package/src/stories/Templates/TournamentManagement/TournamentManagement.vue +275 -230
  313. package/src/stories/Templates/TournamentManagement/TournamentPageOne/TournamentPageOne.stories.js +113 -113
  314. package/src/stories/Templates/TournamentManagement/TournamentPageOne/TournamentPageOne.vue +175 -146
  315. package/src/stories/Templates/TournamentManagement/TournamentPageTwo/TournamentPageTwo.stories.js +77 -77
  316. package/src/stories/Templates/TournamentManagement/TournamentPageTwo/TournamentPageTwo.vue +208 -185
  317. package/src/stories/Util/Validations/AddNewPersonModalValidation.js +23 -19
  318. package/src/stories/Util/Validations/ClubManagementValidations.js +17 -21
  319. package/src/stories/Util/Validations/PersonManagementValidations.js +26 -22
  320. package/src/stories/Util/Validations/TournamentFieldsValidations.js +20 -18
  321. package/src/stories/Util/seeding.js +131 -131
  322. package/src/stories/Util/tabs.js +75 -75
  323. package/tailwind/tailwind.css +5 -7
  324. package/tailwind.config.js +12 -15
  325. package/vite.config.js +3 -3
  326. package/src/mocks/getDirectors.js +0 -18
  327. package/src/stories/Molecules/Modals/AssignDirectorModal/AssignDirectorModal.stories.js +0 -45
  328. package/src/stories/Molecules/Modals/AssignDirectorModal/AssignDirectorModal.vue +0 -111
  329. package/src/stories/Organisms/Cards/DirectorAssignmentCard/DirectorAssignmentCard.stories.js +0 -45
  330. package/src/stories/Organisms/Cards/DirectorAssignmentCard/DirectorAssignmentCard.vue +0 -83
@@ -1,34 +1,40 @@
1
1
  <template>
2
2
  <section>
3
- <EditEventsTopMenu :currentTab="'Pools'" :tabs="tabs(role, isMobile)" @tabMenuClick="handleTabMenuClick"/>
4
- <ToggleHeader :currentSelection="viewName" firstButtonLabel="List View" secondButtonLabel="Pool Grid"
5
- :showConnected="true"
6
- @update:selection="handleViewChange" :connectedToServer="connectedToServer" class="hidden md:block"/>
3
+ <EditEventsTopMenu :currentTab="'Pools'" :tabs="tabs(role, isMobile)" @tabMenuClick="handleTabMenuClick" />
4
+ <ToggleHeader
5
+ :currentSelection="viewName"
6
+ firstButtonLabel="List View"
7
+ secondButtonLabel="Pool Grid"
8
+ :showConnected="true"
9
+ @update:selection="handleViewChange"
10
+ :connectedToServer="connectedToServer"
11
+ class="hidden md:block"
12
+ />
7
13
 
8
14
  <section v-if="viewName === 'Pool Grid'" class="hidden md:block">
9
- <PoolGrid :bouts="localBouts" :isCountingBackwardsMaxScore="isCountingBackwardsMaxScore"/>
15
+ <PoolGrid :bouts="localBouts" :isCountingBackwardsMaxScore="isCountingBackwardsMaxScore" />
10
16
  </section>
11
17
 
12
18
  <!-- Buttons visible until the first bout starts -->
13
19
  <div v-if="remainingBoutsCount > 0 && remainingBoutsCount === localBouts.length" class="w-full my-4">
14
20
  <div class="flex justify-center gap-3">
15
21
  <BaseButton
16
- v-if="!reorderMode"
17
- :label="reorderMode ? 'Return to Bout View' : 'Fencer List'"
18
- type="primary"
19
- :size="isMobile ? 'xs' : 'sm'"
20
- class="h-10 inline-flex shrink-0 px-5 h-10"
21
- :class="fencerList ? 'w-full md:w-3/4' : 'w-44 md:w-96'"
22
- @buttonClick="showFencerList"
22
+ v-if="!reorderMode"
23
+ :label="reorderMode ? 'Return to Bout View' : 'Fencer List'"
24
+ type="primary"
25
+ :size="isMobile ? 'xs' : 'sm'"
26
+ class="h-10 inline-flex shrink-0 px-5 h-10"
27
+ :class="fencerList ? 'w-full md:w-3/4' : 'w-44 md:w-96'"
28
+ @buttonClick="showFencerList"
23
29
  />
24
30
  <BaseButton
25
- v-if="!fencerList"
26
- :label="reorderMode ? 'Return to Bout View' : 'Re-order Bouts'"
27
- type="primary"
28
- :size="isMobile ? 'xs' : 'sm'"
29
- class="h-10 inline-flex shrink-0 px-5"
30
- :class="reorderMode ? 'w-full md:w-3/4' : 'w-44 md:w-96'"
31
- @buttonClick="reorderBouts"
31
+ v-if="!fencerList"
32
+ :label="reorderMode ? 'Return to Bout View' : 'Re-order Bouts'"
33
+ type="primary"
34
+ :size="isMobile ? 'xs' : 'sm'"
35
+ class="h-10 inline-flex shrink-0 px-5"
36
+ :class="reorderMode ? 'w-full md:w-3/4' : 'w-44 md:w-96'"
37
+ @buttonClick="reorderBouts"
32
38
  />
33
39
  </div>
34
40
  <div class="md:border-b border-dropdownSelect mt-3"></div>
@@ -38,53 +44,58 @@
38
44
  <section v-if="remainingBoutsCount > 0 && !reorderMode">
39
45
  <div class="w-full flex flex-col items-center">
40
46
  <div v-if="fencerList" v-for="fencer in simpleFencerList" class="w-full md:w-3/4 my-1">
41
- <FencerFinalResultCard :result="fencer"/>
47
+ <FencerFinalResultCard :result="fencer" />
42
48
  </div>
43
49
  <div v-if="!hasActiveBout && !fencerList" class="w-full md:w-3/4 my-4">
44
- <BoutCard :bout="{}"
45
- :hostingClubColors="hostingClubColors"
46
- :editMode="editMode"
47
- :isCountingBackwardsMaxScore="isCountingBackwardsMaxScore"
48
- :isWaiting="true"
49
- :reorderMode="false"
50
- @action:startBout="directBout"
51
- @action:resumeBout="directBout"
50
+ <BoutCard
51
+ :bout="{}"
52
+ :hostingClubColors="hostingClubColors"
53
+ :editMode="editMode"
54
+ :isCountingBackwardsMaxScore="isCountingBackwardsMaxScore"
55
+ :isWaiting="true"
56
+ :reorderMode="false"
57
+ @action:startBout="directBout"
58
+ @action:resumeBout="directBout"
59
+ />
60
+ </div>
61
+ <div v-for="bout in activeBouts" :key="bout.BoutId" class="w-full md:w-3/4 my-4">
62
+ <BoutCard
63
+ :bout="bout"
64
+ :hostingClubColors="hostingClubColors"
65
+ :editMode="editMode"
66
+ :isCountingBackwardsMaxScore="isCountingBackwardsMaxScore"
67
+ :reorderMode="false"
68
+ :timerStatus="bout.TimerStatus || 'stopped'"
69
+ @action:startBout="directBout"
70
+ @action:resumeBout="directBout"
52
71
  />
53
72
  </div>
54
- <div v-for="bout in activeBouts" :key="bout.BoutId" class="w-full md:w-3/4 my-4">
55
- <BoutCard :bout="bout" :hostingClubColors="hostingClubColors" :editMode="editMode"
56
- :isCountingBackwardsMaxScore="isCountingBackwardsMaxScore" :reorderMode="false"
57
- :timerStatus="bout.TimerStatus || 'stopped'"
58
- @action:startBout="directBout" @action:resumeBout="directBout"/>
59
- </div>
60
-
61
73
  </div>
62
74
  </section>
63
75
 
64
76
  <!-- Upcoming -->
65
77
  <section v-if="remainingBoutsCount > 0 && !fencerList && !reorderMode">
66
78
  <div class="flex flex-row justify-between">
67
- <BaseText class="mt-5" color="primaryHighlight" size="md" text="Upcoming" weight="bold"/>
79
+ <BaseText class="mt-5" color="primaryHighlight" size="md" text="Upcoming" weight="bold" />
68
80
  <div class="flex mr-1">
69
- <BaseText class="mt-5 ml-5" color="primaryHighlight" size="md" text="Remaining bouts:"/>
70
- <BaseText :text="remainingBoutsCount" class="mt-5 ml-2" color="primaryHighlight" size="md" weight="bold"/>
81
+ <BaseText class="mt-5 ml-5" color="primaryHighlight" size="md" text="Remaining bouts:" />
82
+ <BaseText :text="remainingBoutsCount" class="mt-5 ml-2" color="primaryHighlight" size="md" weight="bold" />
71
83
  </div>
72
84
  </div>
73
85
  <div class="border-b border-dropdownSelect mb-5"></div>
74
86
  <div class="w-full flex flex-col items-center">
75
87
  <div v-for="bout in markedUpcomingBouts" :key="bout.BoutId" class="w-full md:w-3/4 my-4 flex items-stretch">
76
88
  <div class="flex-1">
77
- <BoutCard
78
- :bout="bout"
79
- :hostingClubColors="hostingClubColors"
80
- :editMode="editMode"
81
- :isCountingBackwardsMaxScore="isCountingBackwardsMaxScore"
82
- :reorderMode="false"
83
- :timerStatus="bout.TimerStatus || 'stopped'"
84
- @action:startBout="directBout"
85
- />
89
+ <BoutCard
90
+ :bout="bout"
91
+ :hostingClubColors="hostingClubColors"
92
+ :editMode="editMode"
93
+ :isCountingBackwardsMaxScore="isCountingBackwardsMaxScore"
94
+ :reorderMode="false"
95
+ :timerStatus="bout.TimerStatus || 'stopped'"
96
+ @action:startBout="directBout"
97
+ />
86
98
  </div>
87
-
88
99
  </div>
89
100
  </div>
90
101
  </section>
@@ -92,148 +103,189 @@
92
103
  <!-- Completed -->
93
104
  <section v-if="hasCompletedBout > 0 && !fencerList">
94
105
  <div class="w-full flex flex-col items-center">
95
- <BaseButton v-if="remainingBoutsCount === 0" label="Show Pool Results on Scoreboard" type="bright"
96
- class="w-full md:w-1/3 my-1 h-10" @buttonClick="showResultsGrid"/>
106
+ <BaseButton
107
+ v-if="remainingBoutsCount === 0"
108
+ label="Show Pool Results on Scoreboard"
109
+ type="bright"
110
+ class="w-full md:w-1/3 my-1 h-10"
111
+ @buttonClick="showResultsGrid"
112
+ />
97
113
  </div>
98
114
  <div class="flex flex-row">
99
- <BaseText v-if="remainingBoutsCount === 0" class="mt-8" color="primaryHighlight" size="md"
100
- text="All Bouts Are Complete" weight="bold"/>
101
- <BaseText v-if="remainingBoutsCount > 0" class="mt-5" color="primaryHighlight" size="md" text="Completed"
102
- weight="bold"/>
115
+ <BaseText
116
+ v-if="remainingBoutsCount === 0"
117
+ class="mt-8"
118
+ color="primaryHighlight"
119
+ size="md"
120
+ text="All Bouts Are Complete"
121
+ weight="bold"
122
+ />
123
+ <BaseText
124
+ v-if="remainingBoutsCount > 0"
125
+ class="mt-5"
126
+ color="primaryHighlight"
127
+ size="md"
128
+ text="Completed"
129
+ weight="bold"
130
+ />
103
131
  </div>
104
132
  <div class="border-b border-dropdownSelect mb-5"></div>
105
133
  <div class="w-full flex flex-col items-center">
106
134
  <div v-for="bout in completedBouts" :key="bout.BoutId" class="w-full md:w-3/4 my-4">
107
- <BoutCard :bout="bout"
108
- :hostingClubColors="hostingClubColors"
109
- :editMode="editMode"
110
- :isCountingBackwardsMaxScore="isCountingBackwardsMaxScore"
111
- @action:editBout="editBout"
112
- @action:startBout="directBout"
113
- :reorderMode="false"/>
135
+ <BoutCard
136
+ :bout="bout"
137
+ :hostingClubColors="hostingClubColors"
138
+ :editMode="editMode"
139
+ :isCountingBackwardsMaxScore="isCountingBackwardsMaxScore"
140
+ @action:editBout="editBout"
141
+ @action:startBout="directBout"
142
+ :reorderMode="false"
143
+ />
114
144
  </div>
115
145
  </div>
116
146
  </section>
117
147
 
118
-
119
148
  <!-- Reorder mode -->
120
149
  <section v-if="reorderMode">
121
150
  <div class="w-full flex flex-col items-center">
122
-
123
151
  <div class="w-full md:w-3/4 my-2">
124
152
  <div class="text-xs text-slate-500 mb-2">
125
- <BaseText text="Expected order (by seeds)" size="xs" color="primary" weight="" class=""/>
153
+ <BaseText text="Expected order (by seeds)" size="xs" color="primary" weight="" class="" />
126
154
  </div>
127
155
  <ol class="grid grid-cols-2 md:grid-cols-4 gap-2 text-xs">
128
156
  <li
129
- v-for="row in expectedOrderLegend"
130
- :key="row.index"
131
- class="px-2 py-1 rounded border flex"
132
- title="Expected: {{ row.pair[0] }} vs {{ row.pair[1] }}"
157
+ v-for="row in expectedOrderLegend"
158
+ :key="row.index"
159
+ class="px-2 py-1 rounded border flex"
160
+ title="Expected: {{ row.pair[0] }} vs {{ row.pair[1] }}"
133
161
  >
134
- <BaseText :text="`#${row.index+1}`" size="xs" color="quaternary" weight="" class="mr-4 w-4"/>
135
- <BaseText :text="`${row.pair[0]} vs ${row.pair[1]}`" size="xs" color="quaternary" class="w-9"/>
136
- <BaseIcon v-if="row.bout && row.index === row.boutIndex" icon-name="fa-square-check" size="xs"
137
- color="green" hover="green" class="ml-2"/>
138
- <BaseIcon v-else-if="row.bout" icon-name="fa-square-xmark" size="xs" color="orange" hover="orange"
139
- class="ml-2"/>
140
- <BaseIcon v-else icon-name="fa-square-minus" size="xs" color="red" hover="red" class="ml-2"/>
162
+ <BaseText :text="`#${row.index + 1}`" size="xs" color="quaternary" weight="" class="mr-4 w-4" />
163
+ <BaseText :text="`${row.pair[0]} vs ${row.pair[1]}`" size="xs" color="quaternary" class="w-9" />
164
+ <BaseIcon
165
+ v-if="row.bout && row.index === row.boutIndex"
166
+ icon-name="fa-square-check"
167
+ size="xs"
168
+ color="green"
169
+ hover="green"
170
+ class="ml-2"
171
+ />
172
+ <BaseIcon
173
+ v-else-if="row.bout"
174
+ icon-name="fa-square-xmark"
175
+ size="xs"
176
+ color="orange"
177
+ hover="orange"
178
+ class="ml-2"
179
+ />
180
+ <BaseIcon v-else icon-name="fa-square-minus" size="xs" color="red" hover="red" class="ml-2" />
141
181
  </li>
142
182
  </ol>
143
183
  </div>
144
184
 
145
185
  <div class="w-full md:w-3/4 my-2 flex gap-2">
146
- <BaseButton
147
- label="Auto-sort (by seeds)"
148
- type="primary"
149
- class="h-10 w-full"
150
- @buttonClick="autoSortBouts"
151
- />
152
-
186
+ <BaseButton label="Auto-sort (by seeds)" type="primary" class="h-10 w-full" @buttonClick="autoSortBouts" />
153
187
  </div>
154
188
 
155
189
  <div class="w-full md:w-3/4 my-4">
156
- <BaseText text="Re-order Bouts" size="md" color="primaryHighlight" weight="bold"/>
157
- <BaseText text="Select a card, then on a second to swap them." size="xs" color="quinary"/>
190
+ <BaseText text="Re-order Bouts" size="md" color="primaryHighlight" weight="bold" />
191
+ <BaseText text="Select a card, then on a second to swap them." size="xs" color="quinary" />
158
192
  </div>
159
193
 
160
194
  <!-- The draggable list -->
161
195
  <div role="list" class="w-full md:w-3/4 space-y-3">
162
196
  <ReorderableShell
163
- v-for="bout in markedUpcomingBouts"
164
- :key="bout.BoutId || bout.boutId"
165
- :enabled="true"
166
- :dragId="bout.BoutId || bout.boutId"
167
- :payload="bout"
168
- aria-label="Reorder bout"
169
- @reorder:drop="onReorderDrop"
170
- @reorder:tap="onReorderTap"
197
+ v-for="bout in markedUpcomingBouts"
198
+ :key="bout.BoutId || bout.boutId"
199
+ :enabled="true"
200
+ :dragId="bout.BoutId || bout.boutId"
201
+ :payload="bout"
202
+ aria-label="Reorder bout"
203
+ @reorder:drop="onReorderDrop"
204
+ @reorder:tap="onReorderTap"
171
205
  >
172
206
  <BoutCard
173
- :bout="bout"
174
- :hostingClubColors="hostingClubColors"
175
- :editMode="false"
176
- :isCountingBackwardsMaxScore="isCountingBackwardsMaxScore"
177
- :reorderMode="true"
178
- :selected="selectedReorderId === (bout.BoutId || bout.boutId)"
207
+ :bout="bout"
208
+ :hostingClubColors="hostingClubColors"
209
+ :editMode="false"
210
+ :isCountingBackwardsMaxScore="isCountingBackwardsMaxScore"
211
+ :reorderMode="true"
212
+ :selected="selectedReorderId === (bout.BoutId || bout.boutId)"
179
213
  />
180
214
  </ReorderableShell>
181
-
182
215
  </div>
183
216
  </div>
184
217
  </section>
185
218
 
186
- <DirectorModal :bout="currentSelectedBout"
187
- :eventRules="eventRules"
188
- :hostingClubColors="hostingClubColors"
189
- :show="showDirectorModal"
190
- @penalty:add="handleAddPenalty"
191
- @penalty:update="handleUpdatePenalty"
192
- @penalty:remove="handleRemovePenalty"
193
- @update:closeModal="handleCloseModal"
194
- @update:bout="handleUpdateBout"
195
- @submit:bout="handleSubmitBout"/>
196
-
197
- <EditBoutModal :bout="currentSelectedBout" :eventRules="eventRules" :hostingClubColors="hostingClubColors"
198
- :show="showEditBoutModal"
199
- @update:closeModal="handleCloseModal"
200
- @submit:bout="handleEditBout"
201
- :isCountingBackwardsMaxScore="isCountingBackwardsMaxScore"/>
202
-
219
+ <DirectorModal
220
+ :bout="currentSelectedBout"
221
+ :eventRules="eventRules"
222
+ :hostingClubColors="hostingClubColors"
223
+ :show="showDirectorModal"
224
+ @penalty:add="handleAddPenalty"
225
+ @penalty:update="handleUpdatePenalty"
226
+ @penalty:remove="handleRemovePenalty"
227
+ @update:closeModal="handleCloseModal"
228
+ @update:bout="handleUpdateBout"
229
+ @submit:bout="handleSubmitBout"
230
+ />
231
+
232
+ <EditBoutModal
233
+ :bout="currentSelectedBout"
234
+ :eventRules="eventRules"
235
+ :hostingClubColors="hostingClubColors"
236
+ :show="showEditBoutModal"
237
+ @update:closeModal="handleCloseModal"
238
+ @submit:bout="handleSubmitBout"
239
+ @request:bout-active="handleBoutActiveRequest"
240
+ :isCountingBackwardsMaxScore="isCountingBackwardsMaxScore"
241
+ />
203
242
  </section>
204
243
  </template>
205
244
 
206
245
  <script>
207
- import EditEventsTopMenu from "../../Menus/EditEventsTopMenu/EditEventsTopMenu.vue";
208
- import ToggleHeader from "../../../Organisms/Headers/ToggleHeader/ToggleHeader.vue";
209
- import BaseText from "../../../Atoms/Text/BaseText.vue";
210
- import BaseIcon from "../../../Atoms/Icon/BaseIcon.vue";
211
- import BoutCard from "../../../Organisms/Cards/BoutCard/BoutCard.vue";
212
- import DirectorModal from "../../../Molecules/Modals/DirectorModal/DirectorModal.vue";
213
- import EditBoutModal from "../../../Molecules/Modals/EditBoutModal/EditBoutModal.vue";
214
- import PoolGrid from "../../../Organisms/Containers/PoolGrid/PoolGrid.vue";
215
- import {tabs} from '../../../Util/tabs.js';
216
- import BaseButton from "../../../Molecules/Buttons/BaseButton/BaseButton.vue";
217
- import FencerFinalResultCard from "../../../Organisms/Cards/FencerFinalResultCard/FencerFinalResultCard.vue";
218
- import ReorderableShell from "../../../Molecules/Reorder/ReorderableShell.vue";
219
- import {getPoolOrder} from '../../../Util/seeding.js';
246
+ import EditEventsTopMenu from '../../Menus/EditEventsTopMenu/EditEventsTopMenu.vue';
247
+ import ToggleHeader from '../../../Organisms/Headers/ToggleHeader/ToggleHeader.vue';
248
+ import BaseText from '../../../Atoms/Text/BaseText.vue';
249
+ import BaseIcon from '../../../Atoms/Icon/BaseIcon.vue';
250
+ import BoutCard from '../../../Organisms/Cards/BoutCard/BoutCard.vue';
251
+ import DirectorModal from '../../../Molecules/Modals/DirectorModal/DirectorModal.vue';
252
+ import EditBoutModal from '../../../Molecules/Modals/EditBoutModal/EditBoutModal.vue';
253
+ import PoolGrid from '../../../Organisms/Containers/PoolGrid/PoolGrid.vue';
254
+ import { tabs } from '../../../Util/tabs.js';
255
+ import BaseButton from '../../../Molecules/Buttons/BaseButton/BaseButton.vue';
256
+ import FencerFinalResultCard from '../../../Organisms/Cards/FencerFinalResultCard/FencerFinalResultCard.vue';
257
+ import ReorderableShell from '../../../Molecules/Reorder/ReorderableShell.vue';
258
+ import { getPoolOrder } from '../../../Util/seeding.js';
259
+
260
+ const normalizeBoutStatus = bout => String(bout?.Status || '').toLowerCase();
220
261
 
221
262
  export default {
222
- name: "PoolLive",
263
+ name: 'PoolLive',
223
264
  components: {
224
265
  ReorderableShell,
225
266
  FencerFinalResultCard,
226
267
  BaseButton,
227
268
  BaseIcon,
228
- PoolGrid,
229
- EditBoutModal,
269
+ PoolGrid,
270
+ EditBoutModal,
230
271
  DirectorModal,
231
272
  BoutCard,
232
273
  BaseText,
233
274
  ToggleHeader,
234
275
  EditEventsTopMenu
235
276
  },
236
- emits: ["update:bout", "tab:menu-click", "submit:bout", "update:directing-bout", "penalty:update", "penalty:add", "penalty:remove", "scoreboard:showFencerList", "scoreboard:showPoolGrid"],
277
+ emits: [
278
+ 'penalty:add',
279
+ 'penalty:remove',
280
+ 'penalty:update',
281
+ 'request:bout-active',
282
+ 'scoreboard:showFencerList',
283
+ 'scoreboard:showPoolGrid',
284
+ 'submit:bout',
285
+ 'tab:menu-click',
286
+ 'update:bout',
287
+ 'update:directing-bout'
288
+ ],
237
289
  props: {
238
290
  bouts: {
239
291
  type: Array,
@@ -262,11 +314,11 @@ export default {
262
314
  },
263
315
  data() {
264
316
  return {
265
- localBouts: this.cloneBouts(this.bouts),
317
+ localBouts: this.cloneBouts(this.bouts),
266
318
  showDirectorModal: false,
267
319
  showEditBoutModal: false,
268
320
  selectedBout: {},
269
- viewName: "Pool Grid",
321
+ viewName: 'Pool Grid',
270
322
  fencerList: false,
271
323
  reorderMode: false,
272
324
  tabs,
@@ -275,17 +327,18 @@ export default {
275
327
  };
276
328
  },
277
329
  watch: {
278
- bouts: {
279
- handler(newBouts) {
280
- this.localBouts = this.cloneBouts(newBouts);
281
- },
330
+ bouts: {
331
+ handler(newBouts) {
332
+ this.localBouts = this.cloneBouts(newBouts);
333
+ this.reconcileSelectedBout();
334
+ },
282
335
  immediate: true,
283
336
  deep: true
284
337
  }
285
338
  },
286
339
  mounted() {
287
340
  window.addEventListener('resize', this.handleResize);
288
- this.localBouts = this.sortBoutsByOrder(this.localBouts);
341
+ this.localBouts = this.sortBoutsByOrder(this.localBouts);
289
342
  },
290
343
  beforeUnmount() {
291
344
  window.removeEventListener('resize', this.handleResize);
@@ -302,9 +355,9 @@ export default {
302
355
  },
303
356
  upcomingBouts() {
304
357
  return this.localBouts
305
- .filter(b => (b.Status || '').toLowerCase() === 'scheduled')
306
- .slice()
307
- .sort((a, b) => Number(a.OrderIndex ?? 0) - Number(b.OrderIndex ?? 0));
358
+ .filter(b => (b.Status || '').toLowerCase() === 'scheduled')
359
+ .slice()
360
+ .sort((a, b) => Number(a.OrderIndex ?? 0) - Number(b.OrderIndex ?? 0));
308
361
  },
309
362
  completedBouts() {
310
363
  return this.localBouts.filter(bout => bout.Status === 'Completed');
@@ -314,9 +367,9 @@ export default {
314
367
  },
315
368
  activeBouts() {
316
369
  return this.localBouts
317
- .filter(b => String(b?.Status || '').toLowerCase() === 'active')
318
- .slice()
319
- .sort((a, b) => Number(a?.OrderIndex ?? 0) - Number(b?.OrderIndex ?? 0));
370
+ .filter(b => String(b?.Status || '').toLowerCase() === 'active')
371
+ .slice()
372
+ .sort((a, b) => Number(a?.OrderIndex ?? 0) - Number(b?.OrderIndex ?? 0));
320
373
  },
321
374
 
322
375
  hasActiveBout() {
@@ -367,17 +420,12 @@ export default {
367
420
  });
368
421
  },
369
422
  upcomingBoutsSorted() {
370
- return this.upcomingBouts
371
- .slice()
372
- .sort((a, b) => Number(a.OrderIndex ?? 0) - Number(b.OrderIndex ?? 0));
423
+ return this.upcomingBouts.slice().sort((a, b) => Number(a.OrderIndex ?? 0) - Number(b.OrderIndex ?? 0));
373
424
  },
374
425
  seedingSize() {
375
426
  const maxPos = Math.max(
376
- 0,
377
- ...this.localBouts.flatMap((bout) => [
378
- Number(bout.Person1Pos || 0),
379
- Number(bout.Person2Pos || 0),
380
- ])
427
+ 0,
428
+ ...this.localBouts.flatMap(bout => [Number(bout.Person1Pos || 0), Number(bout.Person2Pos || 0)])
381
429
  );
382
430
  return maxPos || this.simpleFencerList.length || 0;
383
431
  },
@@ -386,7 +434,7 @@ export default {
386
434
  if (!expected.length) return [];
387
435
 
388
436
  // Build a normalized list of the “actual” upcoming pairs, in display order
389
- const actualPairs = this.upcomingBoutsSorted.map((bout) => {
437
+ const actualPairs = this.upcomingBoutsSorted.map(bout => {
390
438
  const a = Number(bout.Person1Pos);
391
439
  const b = Number(bout.Person2Pos);
392
440
  return [Math.min(a, b), Math.max(a, b)];
@@ -395,34 +443,24 @@ export default {
395
443
  return expected.map((pair, index) => {
396
444
  const [x, y] = pair;
397
445
  const normalized = [Math.min(x, y), Math.max(x, y)];
398
- const boutIndex = actualPairs.findIndex(
399
- (p) => p[0] === normalized[0] && p[1] === normalized[1]
400
- );
446
+ const boutIndex = actualPairs.findIndex(p => p[0] === normalized[0] && p[1] === normalized[1]);
401
447
  const bout = boutIndex >= 0 ? this.upcomingBoutsSorted[boutIndex] : null;
402
448
 
403
449
  return {
404
- index, // 0-based index in expected order
405
- pair, // [seedA, seedB]
406
- boutIndex, // where it exists in the current list (or -1)
407
- bout, // the actual bout object (or null)
450
+ index, // 0-based index in expected order
451
+ pair, // [seedA, seedB]
452
+ boutIndex, // where it exists in the current list (or -1)
453
+ bout // the actual bout object (or null)
408
454
  };
409
455
  });
410
- },
456
+ }
411
457
  },
412
458
  methods: {
413
- handleCloseModal(bout) {
414
- this.showDirectorModal = false;
415
- this.showEditBoutModal = false;
416
-
417
- if (!bout?.BoutId) return;
418
- if (bout.Status !== 'Completed') {
419
- const updatedBout = this.localBouts.find(b => b.BoutId === bout.BoutId);
420
- if (!updatedBout) return;
421
-
422
- updatedBout.Status = 'Scheduled';
423
- this.$emit('update:bout', updatedBout);
424
- }
425
- },
459
+ handleCloseModal() {
460
+ this.showDirectorModal = false;
461
+ this.showEditBoutModal = false;
462
+ this.selectedBout = {};
463
+ },
426
464
  handleTabMenuClick(value) {
427
465
  this.$emit('tab:menu-click', value);
428
466
  },
@@ -431,50 +469,36 @@ export default {
431
469
  },
432
470
  handleUpdateBout(bout) {
433
471
  if (!bout?.BoutId) return;
434
-
435
- const updatedBout = this.localBouts.find(b => b.BoutId === bout.BoutId);
436
- if (!updatedBout) return;
437
-
438
- Object.assign(updatedBout, bout);
439
- updatedBout.Status = 'Active'; // keep it active while directing
440
-
441
- this.$emit('update:bout', updatedBout);
472
+ this.$emit('update:bout', { ...bout });
442
473
  },
443
- handleEditBout(bout) {
444
- const resetToActive = bout.Status === 'Active'
445
- this.handleSubmitBout(bout, resetToActive)
474
+ handleSubmitBout(bout) {
475
+ this.showEditBoutModal = false;
476
+ this.showDirectorModal = false;
477
+ if (!bout?.BoutId) return;
478
+ this.$emit('submit:bout', { ...bout });
479
+ this.selectedBout = {};
446
480
  },
447
- handleSubmitBout(bout, resetToActive = false) {
448
- this.showEditBoutModal = false;
449
- this.showDirectorModal = false;
450
- const updatedBout = this.localBouts.find(b => b.BoutId === bout.BoutId);
451
- if (!updatedBout) return;
452
-
453
- Object.assign(updatedBout, bout);
454
- if (!resetToActive) updatedBout.Status = 'Completed';
455
- updatedBout.Ended = new Date().toISOString();
456
-
457
- this.$emit('submit:bout', updatedBout);
481
+ handleBoutActiveRequest(bout) {
482
+ this.showEditBoutModal = false;
483
+ if (!bout?.BoutId) return;
484
+ this.$emit('request:bout-active', { ...bout });
485
+ this.selectedBout = {};
458
486
  },
459
487
  directBout(bout) {
460
- const activeBouts = this.localBouts.filter(b => String(b?.Status || '').toLowerCase() === 'active');
461
- activeBouts.forEach(b => b.Status = 'scheduled');
462
-
488
+ if (!bout?.BoutId) return;
463
489
  const updatedBout = this.localBouts.find(b => b.BoutId === bout.BoutId);
490
+ if (!updatedBout) return;
464
491
 
465
- if (updatedBout) {
466
- updatedBout.Status = 'Active';
467
- this.showDirectorModal = true;
468
- this.selectedBout = updatedBout;
469
- }
470
- this.$emit('update:directing-bout', updatedBout)
492
+ this.selectedBout = { ...updatedBout };
493
+ this.showDirectorModal = normalizeBoutStatus(updatedBout) === 'active';
494
+ this.$emit('update:directing-bout', { ...updatedBout });
471
495
  },
472
496
  editBout(bout) {
473
497
  const updatedBout = this.localBouts.find(b => b.BoutId === bout.BoutId);
474
- if (updatedBout) {
475
- this.showEditBoutModal = true;
476
- this.selectedBout = updatedBout;
477
- }
498
+ if (!updatedBout) return;
499
+
500
+ this.showEditBoutModal = true;
501
+ this.selectedBout = { ...updatedBout };
478
502
  },
479
503
  handleResize() {
480
504
  this.windowWidth = window.innerWidth;
@@ -497,10 +521,10 @@ export default {
497
521
  },
498
522
  reorderBouts() {
499
523
  this.reorderMode = !this.reorderMode;
500
- },
501
- autoSortBouts() {
502
- const normalizeStatus = s => String(s || '').toLowerCase();
503
- const idOf = bout => bout.BoutId ?? bout.boutId;
524
+ },
525
+ autoSortBouts() {
526
+ const normalizeStatus = s => String(s || '').toLowerCase();
527
+ const idOf = bout => bout.BoutId ?? bout.boutId;
504
528
  const matchPair = (bout, [a, b]) => {
505
529
  const p1 = Number(bout.Person1Pos);
506
530
  const p2 = Number(bout.Person2Pos);
@@ -510,17 +534,13 @@ export default {
510
534
  const poolSize = this.seedingSize;
511
535
  const expectedOrder = getPoolOrder(poolSize) || [];
512
536
 
513
- const scheduled = this.localBouts
514
- .filter(b => normalizeStatus(b.Status) === 'scheduled')
515
- .slice();
537
+ const scheduled = this.localBouts.filter(b => normalizeStatus(b.Status) === 'scheduled').slice();
516
538
 
517
539
  const usedIds = new Set();
518
540
  const inExpectedOrder = [];
519
541
 
520
542
  for (const pair of expectedOrder) {
521
- const match = scheduled.find(
522
- bout => !usedIds.has(idOf(bout)) && matchPair(bout, pair)
523
- );
543
+ const match = scheduled.find(bout => !usedIds.has(idOf(bout)) && matchPair(bout, pair));
524
544
  if (match) {
525
545
  inExpectedOrder.push(match);
526
546
  usedIds.add(idOf(match));
@@ -543,44 +563,49 @@ export default {
543
563
  _normalizeStatus(s) {
544
564
  return String(s || '').toLowerCase();
545
565
  },
546
- _getBoutById(id) {
547
- return this.localBouts.find(b => String(this._idOf(b)) === String(id));
566
+ _getBoutById(id, bouts = this.localBouts) {
567
+ return bouts.find(bout => String(this._idOf(bout)) === String(id));
548
568
  },
549
- _ensureSequentialOrderIndexForScheduled() {
550
- const scheduled = this.localBouts
569
+ _withSequentialScheduledOrder(bouts) {
570
+ const scheduledOrderById = new Map(
571
+ bouts
551
572
  .filter(b => this._normalizeStatus(b.Status) === 'scheduled')
552
573
  .slice()
553
- .sort((a, b) => Number(a.OrderIndex ?? Infinity) - Number(b.OrderIndex ?? Infinity));
554
- scheduled.forEach((b, i) => {
555
- b.OrderIndex = i;
574
+ .sort((a, b) => Number(a.OrderIndex ?? Infinity) - Number(b.OrderIndex ?? Infinity))
575
+ .map((bout, index) => [String(this._idOf(bout)), index])
576
+ );
577
+
578
+ return bouts.map(bout => {
579
+ const orderIndex = scheduledOrderById.get(String(this._idOf(bout)));
580
+ return orderIndex === undefined ? bout : { ...bout, OrderIndex: orderIndex };
556
581
  });
557
582
  },
558
583
  _swapOrderBetweenIds(idA, idB) {
559
584
  if (!idA || !idB || String(idA) === String(idB)) return;
560
- const a = this._getBoutById(idA);
561
- const b = this._getBoutById(idB);
585
+ const normalizedBouts = this._withSequentialScheduledOrder(this.localBouts);
586
+ const a = this._getBoutById(idA, normalizedBouts);
587
+ const b = this._getBoutById(idB, normalizedBouts);
562
588
  if (!a || !b) return;
563
- if (this._normalizeStatus(a.Status) !== 'scheduled' ||
564
- this._normalizeStatus(b.Status) !== 'scheduled') return;
565
-
566
- // make sure indices are sane before swapping
567
- this._ensureSequentialOrderIndexForScheduled();
589
+ if (this._normalizeStatus(a.Status) !== 'scheduled' || this._normalizeStatus(b.Status) !== 'scheduled') return;
568
590
 
569
- const tmp = Number(a.OrderIndex ?? 0);
570
- a.OrderIndex = Number(b.OrderIndex ?? 0);
571
- b.OrderIndex = tmp;
591
+ const swappedOrderById = new Map([
592
+ [String(idA), Number(b.OrderIndex ?? 0)],
593
+ [String(idB), Number(a.OrderIndex ?? 0)]
594
+ ]);
572
595
 
573
- // nudge reactivity
574
- this.localBouts = [...this.localBouts];
596
+ this.localBouts = normalizedBouts.map(bout => {
597
+ const orderIndex = swappedOrderById.get(String(this._idOf(bout)));
598
+ return orderIndex === undefined ? bout : { ...bout, OrderIndex: orderIndex };
599
+ });
575
600
  },
576
601
 
577
602
  // --- DnD drop from <ReorderableShell> ---
578
- onReorderDrop({fromDragId, toDragId}) {
603
+ onReorderDrop({ fromDragId, toDragId }) {
579
604
  this._swapOrderBetweenIds(fromDragId, toDragId);
580
605
  },
581
606
 
582
607
  // --- Tap-to-swap (mobile) from <ReorderableShell> ---
583
- onReorderTap(payload) {
608
+ onReorderTap(payload) {
584
609
  const tappedId = this._idOf(payload);
585
610
  if (!tappedId) return;
586
611
 
@@ -593,16 +618,26 @@ export default {
593
618
  this.selectedReorderId = null;
594
619
  return;
595
620
  }
596
- this._swapOrderBetweenIds(this.selectedReorderId, tappedId);
597
- this.selectedReorderId = null;
598
- },
599
- cloneBouts(bouts) {
600
- return Array.isArray(bouts) ? bouts.map(bout => ({ ...bout })) : [];
601
- },
602
- sortBoutsByOrder(bouts) {
603
- return this.cloneBouts(bouts)
604
- .sort((a, b) => Number(a.OrderIndex ?? 0) - Number(b.OrderIndex ?? 0));
605
- },
606
- }
607
- }
608
- </script>
621
+ this._swapOrderBetweenIds(this.selectedReorderId, tappedId);
622
+ this.selectedReorderId = null;
623
+ },
624
+ reconcileSelectedBout() {
625
+ const selectedBoutId = this.selectedBout?.BoutId;
626
+ if (!selectedBoutId) return;
627
+
628
+ const updatedBout = this.localBouts.find(bout => bout.BoutId === selectedBoutId);
629
+ if (!updatedBout) return;
630
+
631
+ this.selectedBout = { ...updatedBout };
632
+ if (normalizeBoutStatus(updatedBout) !== 'active') return;
633
+ this.showDirectorModal = true;
634
+ },
635
+ cloneBouts(bouts) {
636
+ return Array.isArray(bouts) ? bouts.map(bout => ({ ...bout })) : [];
637
+ },
638
+ sortBoutsByOrder(bouts) {
639
+ return this.cloneBouts(bouts).sort((a, b) => Number(a.OrderIndex ?? 0) - Number(b.OrderIndex ?? 0));
640
+ }
641
+ }
642
+ };
643
+ </script>