Bracket Game Management
Welcome to Fans United Custom Bracket Game Management Widget. The widget allows staff members with sufficient permissions to create new games. You can use this widget as it is and embed it in your platform, or you can use the Management Panel to create games. Bracket Game is a game where users must predict the winner of fixtures between two participants. With successful installation, you can create and edit a Bracket Game.
Installation and usage
The easiest way to use fansunited-widget-bracket-management is to install it from npm as follows:
npm install fansunited-widget-bracketor:
yarn add fansunited-widget-bracketHere is an example how you can integrate Fans United Bracket Game Management Widget:
import 'fansunited-widget-bracket/style.css';
import { BracketManager } from 'fansunited-widget-bracket';
const App = () => {
return (
<BracketManager
fansUnitedApiKey={'your-api-key'}
fansUnitedClientId={'your-client-id'} />
);
}Notes
-
The widget is bundled as a React component and its usage is as simple as the above example
-
Don't worry about your project's CSS. The widget's styling is done with Joy UI which is based on headless unstyle react components. This means that the widget's CSS will NOT affect yours. One important thing is that you need to import
style.cssfile from package folder:
import 'fansunited-widget-bracket/style.css';
N.B: If you are using an entry point for importing all your stylings, you need to import fansunited-widget-bracket/style.css there as well
- Easy translation in every language. For more information check our Translation heading.
Props
type BracketManagerProps = {
fansUnitedApiKey: string;
fansUnitedClientId: string;
fansUnitedLanguage?: string;
fansUnitedEnvironment?: string;
sportal365Project?: string;
sportal365Infrastructure?: 'shared' | 'betway';
labels?: LabelsModel;
hideSignOutButton?: boolean;
};Fans United Bracket Game Management Widget depends on Fans United JS SDK and Fans United Client API. Thats why fansUnitedApiKey and fansUnitedClientId are required. They will be provided to you from Fans United team. For other optional props here is some information:
-
fansUnitedLanguage- for our sports APIs FansUnited platform supports different languages. For now they are Bulgarian (bg), English (en), Romanian (ro), Greek (el), Slovak (sk), Serbian (sr) and Hungarian (hu). If no value given it will be set to English (en). -
fansUnitedEnvironment- You can run the widget in the following environments: staging, production and watg. If no value given it will be set to production (prod). -
labels- you can easily translate all labels, UI messages, descriptions, placeholders and etc. with this prop. By default, Fans United Bracket Game Management Widget is available in English so if no value is given, the widget will be translated in English. -
sportal365Project- The Sportal365 project. Used as a request header when communicating with Sportal365 APIs. -
sportal365Infrastructure- The Sportal365 infrastructure. Used to determine what authorization should be used when communicating with Sportal365 APIs. If no value given (when sportal365Project props is provided) it will be set to shared . -
hideSignOutButton- The prop is used to hide the sign out button which is positioned on the top right corner on the main screen of the widget.
Translation
You can easily translate Fans United Bracket Game Management Widget in your language! You just need to pass an object to labels prop with concrete keys and values and that's it! Here's an example how you can do it:
import 'fansunited-widget-bracket/style.css';
import { BracketManager } from 'fansunited-widget-bracket';
const labels = {
userNotFound: 'User not found. Please try again.',
noGamesFound: "No games were found. You can create a game by clicking the button 'Create'",
create: 'Create',
signOut: 'Sign out',
name: 'Name',
status: 'Status',
statusDescription: 'Select the status of the game.',
participants: 'Participants',
creationDate: 'Created at',
acceptUntil: 'Accept Until',
actions: 'Actions',
pending: 'Pending',
settled: 'Settled',
live: 'Live',
open: 'Open',
canceled: 'Canceled',
closed: 'Closed',
enableTiebreaker: 'Enable tiebreaker',
enableTiebreakerDescription: `When enabled the game's leaderboard will have a classic user ranking (1,2,3). In case of same points, the user who placed their predictions with tiebreaker closest to the game stat total will be placed further. When disabled and 2 or more people have the same points, the ranking will be 1,1,3,4,5,5,7,8.`,
totalStats: 'Total stats',
totalStatsDescription: 'What is the total stats of the game',
sortOrder: 'Sort order',
ascending: 'Ascending',
descending: 'Descending',
itemsPerPage: 'Items per page',
back: 'Back',
manageGameTitle: 'Manage Bracket Game',
manageGameDescription: 'Using this form, you can manage Bracket games.',
title: 'Title',
description: 'Description',
cutoffTime: 'Cutoff time',
configuration: 'Configuration',
id: 'ID',
points: 'Points',
pointsDescription: 'Set the number of points awarded for each correct prediction. Points will be added to users rankings.'
customFields: 'Custom fields',
type: 'Type',
relationship: 'Relationship',
entity: 'Entity',
images: 'Images'
mainImage: 'Main',
coverImage: 'Cover',
mobileImage: 'Mobile',
uploadImage: 'Upload Image',
sportal365Images: 'Sportal365 Images',
search: 'Search',
searchImage: 'Search image',
hideFilters: 'Hide filters',
showFilters: 'Show filters',
urlCopiedToClipboardMessage: 'URL copied to clipboard',
imageDeletedMessage: 'Image deleted',
imageResetMessage: 'The initial size of the image has been restored',
uploadingImageMessage: 'You have successfully uploaded image',
generateSignedInUrlErrorMessage: 'There was a problem generating signed in URL to store the image in bucket. Please try again',
uploadingImageErrorMessage: 'There was a problem with uploading image to bucket. Please try again',
encryptingImageErrorMessage: 'There was a problem with encrypting image before uploading it to bucket. Please try again',
searchSportal365ImagesErrorMessage: 'There was a problem with searching images from Sportal 365 API. Please try again',
clearImage: 'Clear image',
copyUrl: 'Copy URL',
viewImage: 'View image',
cropImage: 'Crop image',
aspectRatio: 'Aspect ratio',
crop: 'Crop',
reset: 'Reset',
hideMoreImages: 'Hide more images',
showMoreImages: 'Show more images',
addImages: 'Add images',
participantsDescription: 'Add participants to the game.',
additionalFields: 'Additional fields',
addParticipant: 'Add participant',
participantNumber: 'Participant number',
group: 'Group',
undecided: 'Undecided',
removeParticipant: 'Remove participant'
related: 'Related',
rules: 'Rules',
timeFormat: 'DD.MM.YYYY, HH:mm',
edit: 'Edit',
clone: 'Clone',
close: 'Close',
pageNo: 'Page No',
save: 'Save',
keyDynamicFields: 'Key',
valueDynamicFields: 'Value',
add: 'Add',
delete: 'Delete',
cloneGameTitle: 'Clone Bracket Game',
fixtures: 'Fixtures',
fixturesDescription: 'Manage matches between participants.',
addMatch: 'Add Match',
tbd: 'TBD',
vs: 'vs',
selectParticipant: 'Select participant',
removeFixture: 'Remove fixture',
participantOne: 'Participant one',
scoreParticipantOne: 'Score participant one',
participantTwo: 'Participant two',
scoreParticipantTwo: 'Score participant two',
home: 'Home',
startDate: 'Start date',
winner: 'Winner',
draw: 'Draw',
showResult: 'Show result',
hideResult: 'Hide result',
resolvePredictions: 'Resolve predictions',
provideIdGameErrorMessage: 'You need to provide an ID to your game!',
provideTitleGameErrorMessage: 'You need to provide a title to your game!',
gamesErrorMessage: 'There was a problem retrieving information about the games.',
createGameMessage: 'You have successfully created a game.',
editGameMessage: 'You have successfully edited a game.',
createGameErrorMessage: 'There was a problem with creating the game. Please try again.',
editGameErrorMessage: 'There was a problem with editing the game. Please try again.',
requiredFieldValidationMessage: 'The following field is required: ',
cutoffValidationMessage: 'Cutoff time should be maximum 15 minutes before earliest fixture start date!',
fixturesValidationMessage: 'Fixture __fixtureNumber__: __propertyLabel__ is required!',
participantsValidationMessage: 'Participant __participantNumber__: __propertyLabel__ is required!',
relatedEntitiesErrorMessage: 'There was a problem with fetching entities for related. Please try again.',
predictionsStartingToResolveInfoMessage: 'Predictions for game __gameTitle__ are starting to resolve. Keep in mind that this operation can take a while if there are thousands of predictions.',
resolvingPredictionsInProgressInfoMessage: 'Resolving game predictions is already in progress...',
resolvingPredictionsMessage: 'Predictions for game __gameTitle__ are successfully resolved! Total resolved predictions: __predictionsLength__',
};
const App = () => {
return (
<BracketManager
fansUnitedApiKey={'your-api-key'}
fansUnitedClientId={'your-client-id'}
labels={labels}/>
);
}Here is all information about LabelsModel:
| Key | Description | Default Value |
|---|---|---|
userNotFound | On login screen when client gives invalid information about email or password. | User not found. Please try again. |
noGamesFound | When there are no created games for specific client, this message will appear on screen. | No games were found. You can create a game by clicking the button 'Create'. |
create | Used as label on create button. | Create |
signOut | Used as label on sign out button. | Sign out |
name | Label for name. | Name |
status | Label for status. | Status |
statusDescription | Status select description. | Select the status of the game. |
participants | Label text for participants tab | Participants |
creationDate | Displayed in header of list of games. Date of created game in same format as given for timeFormat prop | Created at |
acceptUntil | Displayed in header of list of games. Date of predictions cutoff in same format as given for timeFormat prop | Accept until |
actions | Displayed in header of list of games. | Actions |
pending | Status for specific game. | Pending |
settled | Status for specific game. | Settled |
live | Status for specific game. | Live |
open | Status for specific game. | Open |
canceled | Status for specific game. | Canceled |
closed | Status for specific game. | Closed |
enableTiebreaker | Label for tiebreaker toggle switch. | Enable tiebreaker |
enableTiebreakerDescription | Description for tiebreaker toggle switch. | When enabled the game's leaderboard will have a classic user ranking (1,2,3). In case of same points, the user who placed their predictions with tiebreaker closest to the game stat total will be placed further. When disabled and 2 or more people have the same points, the ranking will be 1,1,3,4,5,5,7,8. |
totalStats | Label for total stats in tiebreaker configuration number input. | Total stats |
totalStatsDescription | Description for total stats in tiebreaker configuration number input. | What is the total stats of the game |
sortOrder | Label for sort order select input | Sort order |
ascending | Label for ascending option | Ascending |
descending | Label for descending option | Descending |
itemsPerPage | Label for items per page filter | Items per page |
back | label for back button (left arrow positioned on top-right corner). | Back |
manageGameTitle | Title on managing screen | Manage Bracket Game |
manageGameDescription | Description on managing screen | Using this form, you can manage Bracket games. |
title | Label for title input | Title |
description | Label for description input field when creating/editing a game. | Description |
cutoffTime | Title for choosing a cutoff time for game. | Cutoff time |
configuration | Label for configuration accordion | Configuration |
id | Label for ID input field. | ID |
points | Label for points configuration number input | Points |
pointsDescription | Description for points configuration number input | Set the number of points awarded for each correct prediction. Points will be added to users rankings. |
customFields | Label for custom fields accordion. | Custom fields |
type | Label for type input in related relationship. | Type |
relationship | Label for relationship input in related relationship. | Relationship |
entity | Label for entity input in related relationship. | Entity |
keyDynamicFields | Label for key input. | Key |
valueDynamicFields | Label for value input. | Value |
images | Title for images container. | Images |
mainImage | Title for main image. | Main |
coverImage | Title for cover image. | Cover |
mobileImage | Title for mobile image. | Mobile |
uploadImage | Label for upload button in images accordion | Upload Image |
sportal365Images | Label for sportal365 images button | Sportal365 Images |
search | Label for search button | Search |
searchImage | Placeholder for input search in sportal365 | Search image |
hideFilters | Label for hide filters for sportal365 images hyperlink | Hide filters |
showFilters | Label for show filters for sportal365 images hyperlink | Show filters |
urlCopiedToClipboardMessage | Toast info message when image URL is copied | URL copied to clipboard |
imageDeletedMessage | Toast info message when image is deleted | Image deleted |
imageResetMessage | Toast info message when image size is restored | The initial size of the image has been restored |
uploadingImageMessage | Toast success message when uploading image to bucket | You have successfully uploaded image |
generateSignedInUrlErrorMessage | Toast error message when trying to receive a signed in URL. | There was a problem generating signed in URL to store the image in bucket. Please try again |
uploadingImageErrorMessage | Toast error message when uploading image to bucket | There was a problem with uploading image to bucket. Please try again |
encryptingImageErrorMessage | Toast error message when encrypting image before uploading it to bucket | There was a problem with encrypting image before uploading it to bucket. Please try again |
searchSportal365ImagesErrorMessage | Toast error message when searching images from Sportal 365 API | There was a problem with searching images from Sportal 365 API. Please try again |
clearImage | Tooltip for clear image button | Clear image |
copyUrl | Tooltip for copy url image button | Copy URL |
viewImage | Tooltip for view image button | View image |
cropImage | Tooltip for crop image button | Crop image |
aspectRatio | Label for aspect ratio select | Aspect ratio |
crop | Label for crop button | Crop |
reset | Label for reset button | Reset |
hideMoreImages | Label for hide more images hyperlink | Hide more images |
showMoreImages | Label for show more images hyperlink | Show more images |
addImages | Label for toggle button to show images | Add images |
participantsDescription | Description for participants tab | Add participants to the game. |
additionalFields | Heading text for toggle actions on participants | Additional fields |
addParticipant | Label for add participant button | Add participant |
participantNumber | Placeholder text when no participant is fulfilled | Participant number |
group | Label for group input | Group |
undecided | Label for undecided toggle switch | Undecided |
removeParticipant | Label for remove participant button | Remove participant |
related | Label for related accordion | Related |
rules | Label for rules accordion | Rules |
timeFormat | Time format for displaying dates. Widgets uses dayjs as a date dependency. | DD.MM.YYYY, HH:mm |
edit | Used as a tooltip on edit button. | Edit |
clone | Used as label on clone button. | Clone |
close | Label for close button | Close |
pageNo | Label for pagination | Page No |
save | Label for save button | Save |
resolvePredictions | Tooltip for resolve predictions button | Resolve predictions |
add | Label for tooltip add button. | Add |
delete | Label for delete button | Delete |
cloneGameTitle | Title on cloning modal | Clone Bracket Game |
fixtures | Label for fixtures tab | Fixtures |
fixturesDescription | Description in fixtures tab | Manage matches between participants. |
addMatch | Label for add match button | Add Match |
tbd | Label for add match button | TBD |
vs | Label for versus | vs |
selectParticipant | Label for option in select participant select when no name is available for participant | Select participant |
removeFixture | Label for remove fixture button in fixtures | Remove fixture |
participantOne | Label for participant one select in fixtures | Participant one |
scoreParticipantOne | Label for participant one score in fixtures | Score participant one |
participantTwo | Label for participant two select in fixtures | Participant two |
scoreParticipantTwo | Label for participant two score in fixtures | Score participant two |
home | Label for checkbox next to participants in fixtures | Home |
startDate | Label for start date calender input in fixtures | Start date |
winner | Label for winner select in fixtures | Winner |
draw | Label for option in winner select in fixtures | Draw |
showResult | Label for toggle button in fixtures | Show result |
hideResult | Label for toggle button in fixtures | Hide result |
provideIdGameErrorMessage | Toast error message when no ID is provided when cloning a game | You need to provide an ID to your game! |
provideTitleGameErrorMessage | Toast error message when no title is provided when cloning a game | You need to provide a title to your game! |
gamesErrorMessage | Toast error message when request for fetching games fails | There was a problem retrieving information about the games. |
createGameMessage | When creating a game displaying a toast successful message for created game. | You have successfully created a game. |
editGameMessage | When editing a game displaying a toast successful message for edited game. | You have successfully edited a game. |
createGameErrorMessage | When creating a game displaying a toast error message. | There was a problem with creating the game. Please try again. |
editGameErrorMessage | When editing a game displaying a toast error message. | There was a problem with editing the game. Please try again. |
requiredFieldValidationMessage | Common error toast validation message when main required field is missing. | The following field is required: |
cutoffValidationMessage | Error toast validation message for cutoff time. | Cutoff time should be maximum 15 minutes before earliest fixture start date! |
fixturesValidationMessage | Error toast validation message for fixtures. fixtureNumber and propertyLabel are variables provided from the widget. The propertyLabel can be labels set for id, participantOne, participantTwo and startDate. | Fixture fixtureNumber: propertyLabel is required! |
participantsValidationMessage | Error toast validation message for participants. participantNumber and propertyLabel are variables provided from the widget. The propertyLabel can be labels set for id and name. | Participant participantNumber: propertyLabel is required! |
relatedEntitiesErrorMessage | Error toast message when request to fetch entities for related fails | There was a problem with fetching entities for related. Please try again. |
predictionsStartingToResolveInfoMessage | Info toast message for resolving predictions per game. gameTitle is a variable provided from the widget. | Predictions for game gameTitle are starting to resolve. Keep in mind that this operation can take a while if there are thousands of predictions. |
resolvingPredictionsInProgressInfoMessage | Info toast message for resolving predictions in progress per game | Resolving game predictions is already in progress... |
resolvingPredictionsMessage | Success toast message for resolving predictions per game. gameTitle is a variable provided from the widget. predictionsLength is a number that comes from API response. | Predictions for game gameTitle are successfully resolved! Total resolved predictions: predictionsLength |
Changelog
1.2.1 - 2025-11-07
- Changed:
- Updated related entities to support only classic quiz and bonusPointsGame relationships (previous version supported all entities and relationships, but backend did not support it)
- Upgraded internal consuming management components library version and updated component props
- Fixed:
- Fixed condition for list games visualization and no games found message
- Cloned games are now created with PENDING status
1.2.2 - 2025-11-07
- Changed:
- Color of OPEN status chip is changed from neutral to primary
Updated 10 days ago
