Sports Data Management

Welcome to Fans United Sport Data Management Widget. The widget lets staff members with sufficient permissions browse the shared sport catalogue — competitions, teams, athletes, coaches, staff, venues and countries — and tailor it for a single client. You can use this widget as it is and embed it in your platform, or you can use the Management Panel to manage sport data. Entities can be renamed and translated, given logos, brand colors, socials, related entities, season history and provider references, and any entity can be overridden for one client without disturbing the version every other client reads. With successful installation, you can search, create, edit and override sport entities, and see exactly how each one will be found by the Search API.

Installation and usage

The easiest way to use fansunited-widget-sports-data is to install it from npm as follows:

npm install fansunited-widget-sports-data

or:

yarn add fansunited-widget-sports-data

Here is an example how you can integrate Fans United Sport Data Management Widget:

import 'fansunited-widget-sports-data/style.css';
import { SportsDataManager } from 'fansunited-widget-sports-data';

const App = () => {
  return (
    <SportsDataManager
      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.css file from package folder:

import 'fansunited-widget-sports-data/style.css';

N.B: If you are using an entry point for importing all your stylings, you need to import fansunited-widget-sports-data/style.css there as well

Props

type SportsDataManagerProps = {
  fansUnitedApiKey: string;
  fansUnitedClientId: string;
  fansUnitedClientName?: string;
  fansUnitedEnvironment?: string;
  labels?: LabelsModel;
  hideSignOutButton?: boolean;
};

Fans United Sport Data 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:

  • fansUnitedClientName - the name used whenever the widget refers to the client in copy, for example "Sport data for Ludogorets only". Display only, and never used to address an index — if no value is given the client ID is shown instead.

  • fansUnitedEnvironment - You can run the widget in the following environments: staging and production. 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 Sport Data Management Widget is available in English so if no value is given, the widget will be translated in English.

  • 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.

Unlike the other management widgets, there is no fansUnitedLanguage prop. This widget reads and writes sport entities through the Ikebana proxy and calls no localized sports API, so there is no response language to choose. The widget's own wording is set with labels, and per-language entity names are data you edit in the Translations section — neither depends on such a prop.

The catalogue and overrides

This is the one concept worth reading before using the widget, because it decides who sees your changes.

Sport data lives in two places:

ScopeWhat it isWho it affects
CatalogueThe global, shared catalogue.Every client on the platform.
OverridesOne client's own overlay on top of it.That client only.

An entity read by a client is the global entity, unless that client has an override for it — in which case the override replaces it entirely.

An override is a client-owned copy of a global entity. It keeps the same ID as the global entity, which is what lets it shadow it. It starts from the global values at the moment you create it, and from then on it is independent: later changes to the global entity no longer reach that client. Removing the override deletes only the copy and the client falls back to the global entity again — the global entity is never touched by any of this.

You can also create an entity directly in the Overrides scope. That is not an override of anything: it is a client-only entity with a newly generated ID, it never enters the global catalogue, and no other client can see it.

Entities can be overridden one at a time from a row, or in bulk by ticking several rows. Rows already overridden are badged and cannot be selected, since a second override would only overwrite the first.

Overrides are removed the same way — from a row, or by ticking several in the Overrides scope and removing them together. Removing one deletes only the client's copy; the entity itself is untouched and that client goes back to reading the global version.

Permissions

The widget reads a roles custom claim from the signed-in account's token.

RoleCatalogueOverrides
Platform OperatorRead and writeRead and write, for every client
Client AdminRead-onlyRead and write, for their own client

What you can manage

Seven entity types: competitions, teams, athletes, coaches, staff, venues and countries. Every type except countries is scoped to a sport — Football, Basketball, Tennis, Hockey, American Football or Formula 1 — which is encoded in its ID and cannot be changed after it is created.

Depending on the type, an entity carries some of: General (naming), Translations, Assets, Branding, Socials, Related, Season History, Additional Information and Provider References. Only the sections that apply to a type are offered.

Each entity also has a How people find this entity panel, which shows in plain language how the Search API will match it: the name, the other terms it answers to, the links apps can filter by, and the popularity score that breaks ties. It updates as you edit.

Translation

You can easily translate Fans United Sport Data 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-sports-data/style.css';
import { SportsDataManager } from 'fansunited-widget-sports-data';

const labels = {
  sportDataTitle: 'Sport Data',
  createLabel: 'Create',
  saveLabel: 'Save',
  editAction: 'Edit',
  overrideAction: 'Override',
};

const App = () => {
  return (
    <SportsDataManager
      fansUnitedApiKey={'your-api-key'}
      fansUnitedClientId={'your-client-id'}
      labels={labels} />
  );
}

Every key is optional — anything you leave out keeps its English default.

Some labels contain placeholders in braces, such as {name}, {client}, {count} or {entities}. These are filled in at runtime, so keep them in your translation. A placeholder you drop simply will not be shown; one you misspell is printed as written.

The full list follows, grouped by where it appears.

Access and session

Shown before the catalogue is reachable, or in the header.

KeyDescriptionDefault value
clientConfigErrorMessageShown when the client configuration cannot be fetched, usually a wrong API key or client ID.There was a problem fetching client's configuration. Please check again your API key and client ID. For more information contact Fans United staff.
featureDisabledShown when Sport Data is not enabled for the client.Feature disabled!
noPermissionMessageShown when the signed-in account carries no role granting access.You have no permission for this feature!
tryAgainButtonRetries the failed request.Try again
userNotFoundShown when the signed-in account cannot be resolved.User not found. Please try again.
signOutThe sign-out button, top right. Hidden by hideSignOutButton.Sign out

Page header

Title and standfirst above the tabs.

KeyDescriptionDefault value
sportDataTitlePage title.Sport Data
sportDataDescriptionStandfirst under the title.Browse the shared sport catalogue and manage your own entries — rename entities, add logos and metadata for your audience, or create records that only exist for your account.

Scope tabs

The two scopes the catalogue is browsed in.

KeyDescriptionDefault value
globalCatalogueTabThe shared catalogue every client reads.Catalogue
clientOverridesTabThe client's own overlay, shown to platform operators.Overrides
mySportDataTabThe same overlay, shown to client admins.Overrides

Scope notes

The banner under the tabs. Which one shows depends on the scope and on the role.

KeyDescriptionDefault value
globalScopeOperatorNoteCatalogue note for an operator, who can write here. Takes {client}.Changes here are visible to ALL clients. To change one for {client} only, use Override on its row, or tick several rows and create overrides together.
globalScopeAdminNoteCatalogue note for a client admin, who cannot. Takes {client}.Read-only. To customize an entity for {client}, use Override on its row, or tick several rows and create overrides together. The global entity stays unchanged.
overridesScopeOperatorNoteOverrides note for an operator. Takes {client}.Sport data for {client} only. Overrides keep the global ID and shadow it for this client; client-only entities you create here get a newly generated ID.
overridesScopeAdminNoteOverrides note for a client admin.Entities you have customised, plus entities you created yourself. Open one and use Remove override to go back to the global version.

Toolbar

Search, sport filter and Create.

KeyDescriptionDefault value
searchPlaceholderPlaceholder in the search field.Search by name, title, or ID...
allSportsThe unfiltered option in the sport filter.All sports
createLabelStarts a new entity in the current scope.Create

Entity list

Column headings, row actions and list-level messages.

KeyDescriptionDefault value
nameColumnName column heading.Name
countryColumnCountry column heading.Country
actionsColumnActions column heading.Actions
notAvailableStands in for a value the entity does not carry.N/A
copyIdTooltip on the copy-ID button beside each row.Copy ID
copiedIdReplaces it briefly once the ID is copied.Copied
editActionRow action opening the editor. Shown as a pencil, with this as its tooltip.Edit
viewActionRow action for read-only access. Shown as an eye.View
emptyStateMessageShown when the scope holds no entities of this type. Takes {entities}.No {entities} yet. Create the first one from the button above.
loadEntitiesErrorMessageShown when the list request fails.Could not load the catalogue.
entityNotFoundShown when an entity is opened that no longer exists in this scope.This entity no longer exists here.

Editor and saving

The editor shell: save bar, toasts and the banner naming what is being edited.

KeyDescriptionDefault value
generalSectionGeneral section heading.General
generalSectionHintHint under that heading.Identity and naming. The ID and sport are fixed once the entity exists.
saveLabelSave button in the save bar.Save
entityUpdatedGlobalMessageToast after saving a global entity. Takes {name}.{name} updated in the catalogue — live for every client.
entityUpdatedClientMessageToast after saving an override. Takes {name} and {client}.{name} updated for {client}. The global entity is unchanged.
entityUpdateErrorMessagePrefix on a failed save, followed by the reason. Takes {name}.Could not update {name}:
unsavedGlobalNoteSave-bar status while a global entity has unsaved changes.Unsaved changes — publishing updates all clients
unsavedClientNoteThe same for an override. Takes {client}.Unsaved changes — affects only {client}
noChangesNoteSave-bar status while nothing has changed.No unsaved changes
readOnlyNoteSave-bar status when the account cannot write here. Takes {client}.Read-only — create an override to change these values for {client}
fieldErrorsNoteSave-bar status with several invalid fields. Takes {count}.{count} fields need attention before saving
fieldErrorNoteThe same for exactly one.1 field needs attention before saving
backLabelReturns to the list, keeping your place in it.Back
bannerCreatingGlobalTitleBanner title while creating a global entity.Creating a new GLOBAL entity
bannerCreatingGlobalTextIts body.once saved it enters the global catalogue and every client can read it.
bannerCreatingClientTitleBanner title while creating a client-only entity.Creating a client-only entity
bannerCreatingClientTextIts body. Takes {client}.it lives only in {client}’s data and never appears in the global catalogue.
bannerViewingGlobalTitleBanner title while viewing a global entity read-only.Viewing the GLOBAL entity
bannerViewingGlobalTextIts body. Takes {client}.{client} has no override for this entity, so it is served exactly as published.
bannerEditingGlobalTitleBanner title while editing a global entity.Editing the GLOBAL entity
bannerEditingGlobalTextIts body.changes are published to every client that does not have its own override of this entity.
bannerEditingOverrideTitleBanner title while editing an override. Takes {client}.Editing {client}’s override
bannerEditingOverrideTextIts body.the global entity is left unchanged and keeps the same ID.

How people find this entity

The panel explaining how the Search API will match this entity.

KeyDescriptionDefault value
searchPanelTitleHeading of the panel.How people find this entity
searchPanelHintHint under it.Updates as you edit. Saved automatically.
searchNameStepStep 1 heading: the name itself.Searching for this name finds it
searchNameStepHintIts hint.Typing the first few letters is enough. Change it in General.
searchVariationsStepStep 2 heading: the other terms that match.It is also found by
searchVariationsStepHintIts hint.Collected from the short name, three letter code, nickname and every translation you add.
noVariationsNoteShown when the entity has no variations beyond its name.Only the name above. Add a short name, nickname or translation to widen this.
searchFiltersStepStep 3 heading: the links apps filter by.It is returned when apps filter by
searchFiltersStepHintIts hint.These are the things this entity is linked to. An app asking for every team in a competition, or every competition in a country, gets this entity back because of a link listed here. Add or remove them in Related.
noLinksNoteShown when the entity is linked to nothing.Not linked to anything, so it can only be found by name. Add links in Related.
moreFiltersExpands a truncated list of filter values. Takes {count}.+{count} more
fewerFiltersCollapses it again.Show less
copyFilterTooltip on a filter's copy button.Copy filter
copiedFilterReplaces it briefly once copied.Copied
showParamsReveals the query parameters for the Search API call.Show API parameters
hideParamsHides them again.Hide API parameters
paramsHintExplains what those parameters are.Query parameters for Search API GET /entities/search. One example per link type - relationship and value are always sent together.
paramsMoreNotes how many further values share the shape shown. Takes {count}.and {count} more of these
searchRankingStepStep 4 heading: popularity as a tie-breaker.If several entities match
searchRankingStepHintIts hint.The higher this score, the earlier it appears in the results.
searchUnfilterableWarningWarns that links are stored in a field the Search API does not filter on. Takes {count}.This entity has {count} link(s) saved in a field the Search API does not filter on, so apps cannot narrow results by them. Re-saving this entity fixes it.

Creating an entity

The create form and its outcomes.

KeyDescriptionDefault value
createEntityTitleTitle of the create form. Takes {entity}.New {entity}
createEntityHintHint under it.The ID and sport are set once, here — they cannot be changed afterwards.
entityCreatedGlobalMessageToast after creating a global entity. Takes {name}.{name} added to the catalogue — available to every client.
entityCreatedClientMessageToast after creating a client-only entity. Takes {name} and {client}.{name} created for {client}. It exists only in their data.
entityCreateErrorMessagePrefix on a failed create, followed by the reason. Takes {name}.Could not create {name}:
idAlreadyExistsShown when the generated or entered ID is already taken in this scope.An entity with this ID already exists here. Pick a different ID.

Translations section

Localized names, one row per language.

KeyDescriptionDefault value
languageColumnLanguage column heading.Language
filterLanguagesPlaceholderPlaceholder in the language search field.Filter languages...
addLanguageOpens the language picker.
  • Add language
removeTranslationTooltip on a translation row's remove button.Remove translation
noTranslationsShown when no language has been added.No translations yet — add a language to start.
noLanguageMatchesShown when the filter matches no language.No language matches that filter.
showAllLanguagesExpands the truncated language list. Takes {count}.Show all {count} languages
showFewerLanguagesCollapses it again.Show less
translationsSummarySection summary. Takes {count} and {total}.{count} of {total} supported languages translated.

Assets section

One image per asset key, uploaded or pointed at an external URL.

KeyDescriptionDefault value
assetUploadedChipMarks an asset stored in Cloud Storage.Uploaded
assetExternalChipMarks an asset pointing at an external URL.External
assetReplaceReplaces the current image.Replace
assetRemoveClears the asset.Remove
assetChooseFileOpens the file picker.Choose file
assetDropHereShown in an empty asset slot.Not set.
assetUseExternalUrlIntroduces the external-URL field.Or use an external URL
assetExternalUrlPlaceholderPlaceholder in that field.https://cdn.example.com/logo.png
assetSaveUrlAccepts the entered URL.Save
assetKeepCurrentAbandons the entered URL and keeps what is set.Keep current
assetStoredPathNoteExplains how an uploaded asset is stored and served.Stored in Cloud Storage. The CDN host is applied when served.
assetExternalUrlNoteExplains that an external asset is served by its own host.Served from its original host, which we do not control.
assetUploadingShown while an upload is in flight.Uploading…
assetsSummarySection summary. Takes {count}, {total} and {folder}.{count} of {total} assets set. Uploads are stored in Cloud Storage under /{folder}/ as a relative path; external URLs are saved verbatim.

Branding section

Brand and shirt colors.

KeyDescriptionDefault value
brandNotSetShown in place of an unset color.Not set
brandClearClears a color back to unset.Clear
shirtColorsHeadingHeading above the shirt colors.Shirt colors
addShirtAdds a shirt.Add shirt
removeShirtTooltip on a shirt's remove button.Remove shirt
shirtPrimaryPrimary shirt color field.Primary
shirtSecondarySecondary shirt color field.Secondary
brandingSummarySection summary. Takes {count} and {total}.{count} of {total} colors set. Unset colors fall back to platform defaults.

Socials section

Links to official channels.

KeyDescriptionDefault value
socialInvalidUrlValidation message on a malformed social URL.Enter a full URL starting with https://
socialOpenLinkTooltip on the button opening a channel.Open in a new tab
socialsSummarySection summary. Takes {count} and {total}.{count} of {total} channels set.

Related section

Links to other entities, which become the filters apps search by.

KeyDescriptionDefault value
relatedAddHeadingHeading above the relationship picker.Add a relationship
relatedSearchPlaceholderPlaceholder in the entity search. Takes {type}.Search {type} by name or ID...
relatedNoResultsShown when the search matches nothing.No match in the catalogue.
relatedSearchingShown while the search is in flight.Searching…
relatedRemoveTooltip on a link's remove button.Remove link
relatedUnknownEntityStands in for a linked entity that cannot be resolved.Unknown entity
relatedUnknownRelationshipMarks a stored relationship not offered for this entity type.Not offered for this type
relatedShowMoreExpands a truncated list of links. Takes {count}.+{count} more
relatedShowLessCollapses it again.Show less
relatedEmptyShown when the entity has no links.No links yet. Apps can only find this entity by name.
relatedSummarySection summary. Takes {count}.{count} links. These become the filters apps search by.

Season history section

Per-season links, assets and attributes.

KeyDescriptionDefault value
seasonAddSeasonAdds a season.Add season
seasonRemoveSeasonTooltip on a season's remove button.Remove season
seasonIdLabelSeason ID field.Season ID
seasonIdPlaceholderIts placeholder, showing the expected shape.fb:c:1:2024/2025
seasonIdInvalidValidation message on a malformed season ID.Expected a competition id with the season, like fb:c:1:2024/2025
seasonUntitledStands in for a season with no ID yet.New season
seasonLinksHeadingHeading above the season's links.Related
seasonRelationshipColumnRelationship column heading.Relationship
seasonEntityIdColumnEntity ID column heading.Entity ID
seasonAddLinkAdds a link to the season.Add related entity
seasonRemoveLinkTooltip on a link's remove button.Remove related entity
seasonNoLinksShown when the season has no links.No related entities for this season.
seasonAssetsHeadingHeading above the season's assets.Assets
seasonAttributesHeadingHeading above the season's attributes.Attributes
seasonAddAttributeAdds an attribute to the season.Add attribute
seasonRemoveAttributeTooltip on an attribute's remove button.Remove attribute
seasonNoAttributesShown when the season has no attributes.No attributes for this season.
seasonEmptyShown when the entity has no seasons.No seasons yet.
seasonSummarySection summary. Takes {count}.{count} seasons recorded.

Attributes and provider references

Key/value attributes, and the external IDs per data provider.

KeyDescriptionDefault value
attributeColumnAttribute column heading.Attribute
valueColumnValue column heading.Value
providerColumnProvider column heading.Provider
providerIdColumnProvider ID column heading.Provider ID
addAttributeAdds an attribute row.Add attribute
addProviderReferenceAdds a provider reference row.Add provider reference
noAttributesShown when the entity has no attributes.No attributes yet.
noProviderReferencesShown when the entity has no provider references.No provider references yet.
removeAttributeTooltip on an attribute's remove button.Remove attribute
removeProviderReferenceTooltip on a provider reference's remove button.Remove provider reference
attributesSummarySection summary. Takes {count}.{count} attributes set. Each key should appear once.
attributeSummarySingularThe same for exactly one.1 attribute set. Each key should appear once.
providersSummarySection summary. Takes {count}.{count} provider references. Each provider should appear once.
providerSummarySingularThe same for exactly one.1 provider reference. Each provider should appear once.
customAttributeOptionThe option that turns the attribute key into a free-text field. Additional Information only.Custom
customAttributeOptionHintHint under that option in the list.Type your own attribute key
customAttributePlaceholderPlaceholder in the custom key field.Shirt Sponsor
customAttributeNoteNote under it, explaining how a custom key is stored.Write it however reads best — "Shirt Sponsor" is saved as SHIRT_SPONSOR.
duplicateAttributeNoteTooltip on the warning icon when a key repeats. Both rows are still saved.Another attribute uses this key. Both are saved — whatever reads them decides which it takes.

Pagination

Below the list.

KeyDescriptionDefault value
rowsPerPageLabel on the page-size select.Rows per page
paginationSummaryRange summary. Takes {from}, {to}, {total} and {entities}.Showing {from}–{to} of {total} {entities}
searchResultsSummaryReplaces it while searching. Takes {total} and {entities}.Found {total} {entities}

Overrides, JSON preview and bulk actions

Creating and removing client overrides, and the read-only JSON drawer.

KeyDescriptionDefault value
removeOverrideActionRemoves the override, in the editor header and as a row action.Remove
removeOverrideTitleTitle of the confirmation modal.Remove this override?
removeOverrideBodyIts body. Takes {name} and {client}.{name} will no longer be customised for {client}. They go back to the global version that everyone else sees.
removeOverrideFallsBackNoteExplains that the global entity is untouched. Takes {client}.The entity is not deleted — only the customised copy. Updates to the global version reach {client} again.
removeOverridePermanentNoteWarns that the customised values cannot be recovered.The changes made here — names, translations, images, colours and links — cannot be recovered. You can customise again, starting from the global version.
removeOverrideConfirmConfirms removal.Remove
overrideRemovedMessageToast after removal. Takes {name} and {client}.{name} is no longer customised for {client}.
removeOverrideErrorMessagePrefix on a failed removal, followed by the reason.Could not remove the override:
jsonActionOpens the read-only JSON drawer.JSON
jsonGlobalSubtitleDrawer subtitle for a global entity.Global entity
jsonOverrideSubtitleDrawer subtitle for an override.Client override
jsonCopyCopies the JSON.Copy
jsonCopiedReplaces it briefly once copied.Copied
jsonCloseCloses the drawer.Close
jsonFooterNoteFooter note in the drawer.Read-only preview of the entity data this editor will save.
deviationTitleTooltip heading on the badge counting fields that differ from the global entity. Takes {count}.{count} values differ from the global entity
deviationMoreTruncates that tooltip's list. Takes {count}.+{count} more
overrideActionCreates an override from a catalogue row.Override
overriddenBadgeBadge on a catalogue row the client already overrides.Overridden
overriddenBadgeTitleIts tooltip. Takes {client}.{client} has its own copy of this entity — global changes no longer reach it.
selectedSuffixCount of rows ticked for bulk override. Takes {count} and {entities}.{count} {entities} selected
createOverridesForIntroduces the client in the selection strip.Create overrides for
clearSelectionClears the selection.Clear
createOverridesButtonStarts the bulk override. Takes {count}.Create {count} overrides
confirmOverrideTitleTitle of the single-override modal.Create this override?
confirmOverrideBodyIts body. Takes {client}.A client copy of this global entity will be created for {client}. From then on your copy replaces the global entity everywhere {client} reads search data.
confirmOverrideStartsFromExplains what the copy starts from.The copy starts from the current global values. Fields you change are highlighted; global updates no longer reach this entity.
confirmOverrideReversibleExplains that removing it later restores the global entity.Removing the override later restores the global entity for you.
confirmBulkTitleTitle of the bulk modal. Takes {count} and {client}.Create {count} overrides for {client}?
confirmBulkSubtitleIts subtitle.Each entity gets its own client copy, starting from the current global values.
confirmBulkMoreExpands the list of selected entities. Takes {count}.
  • {count} more
confirmBulkLessCollapses it again.Show fewer
cancelDismisses a modal without acting.Cancel
createOverrideConfirmConfirms creation.Create override
overrideCreatedMessageToast after one override. Takes {name} and {client}.Override created for {name} — {client} now has its own copy.
overridesCreatedMessageToast after a bulk override. Takes {count} and {client}.{count} overrides created for {client}.
overridesSkippedMessageNotes entities already overridden and left alone. Takes {count}.{count} were already overridden and were left as they are.
viewOverridesJumps to the Overrides scope from the toast.View overrides
createOverrideErrorMessageShown when creating an override fails.Could not create the override.
creatingOverridesProgressProgress while a bulk override runs. Takes {done} and {total}.Creating {done} of {total}…
partialOverrideErrorMessageShown when a bulk override fails part way. Takes {done} and {total}.Created {done} of {total} overrides, then failed:
removeOverridesForIntroduces the client in the selection strip, in the Overrides scope.Remove overrides for
removeOverridesButtonStarts the bulk removal. Takes {count}.Remove {count} overrides
confirmBulkRemoveTitleTitle of the bulk removal modal. Takes {count} and {client}.Remove {count} overrides for {client}?
confirmBulkRemoveSubtitleIts subtitle.Each one goes back to the global version that everyone else sees.
overridesRemovedMessageToast after a bulk removal. Takes {count} and {client}.{count} overrides removed for {client}.
removingOverridesProgressProgress while a bulk removal runs. Takes {done} and {total}.Removing {done} of {total}…
partialRemoveErrorMessageShown when a bulk removal fails part way. Takes {done} and {total}.Removed {done} of {total} overrides, then failed:

Changelog

1.0.0 - 2026-09-17

  • Initial Release:
    • Browse the global sport catalogue across seven entity types, with search, sport filter and pagination
    • Create and edit entities, with per-type sections for translations, assets, branding, socials, related entities, season history, additional information and provider references
    • Client overrides: create one from a row or several at once, see which fields differ from the global entity, and remove an override to fall back
    • "How people find this entity" panel explaining name matching, variations, filterable links and popularity ranking
    • Read-only JSON preview of the entity data being saved
    • Role-aware UI for platform_operator and client_admin

Did this page help you?