{"version":3,"file":"logotypes.js?v=9.1.8","mappings":"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","sources":["webpack://empori-base/./src/controls/logotypes/logotypeImg.tsx","webpack://empori-base/./src/controls/logotypes/logotypesGrid.tsx","webpack://empori-base/./src/controls/logotypes/logotypesSlideshow.tsx","webpack://empori-base/./src/controls/logotypes/logotypes.tsx","webpack://empori-base/./src/controls/logotypes/logotypesNavigation.tsx","webpack://empori-base/./src/empracoTypes.ts","webpack://empori-base/./src/util/util.ts"],"sourcesContent":["import { FilterColor, ImageWithInfo } from '../../empracoTypes';\r\nimport { FileExtensions } from '../../util/util';\r\nimport { CSSProperties } from 'react';\r\n\r\nfunction renderImg(url: string, alt: string, css: CSSProperties) {\r\n const width = 200;\r\n const height = css.maxHeight ? css.maxHeight : 75;\r\n\r\n return ;\r\n};\r\n\r\ninterface LogotypeImageProps extends ImageWithInfo {\r\n externalLink: boolean;\r\n maxHeight?: number;\r\n filterColor: FilterColor;\r\n parentStyling?: CSSProperties;\r\n}\r\n\r\nexport function Logotype(props: LogotypeImageProps) {\r\n if (!props.imgUrl) {\r\n return null;\r\n }\r\n\r\n const url = props.imgUrl.includes(FileExtensions.SVG) || props.imgUrl.includes(FileExtensions.GIF)\r\n ? props.imgUrl\r\n : `${props.imgUrl}?width=200&format=webp`;\r\n\r\n const setTarget = () => {\r\n if (props.externalLink && (props.pageLink.startsWith('http') || props.pageLink.startsWith('www'))) {\r\n return '_blank';\r\n }\r\n\r\n return '_self';\r\n };\r\n\r\n const setInlineStyling = () => {\r\n const css = {filter: 'none', maxHeight: 'unset'};\r\n\r\n if (props.maxHeight) {\r\n css.maxHeight = `${props.maxHeight}px`;\r\n }\r\n\r\n if (!url || !url.includes(FileExtensions.SVG)) {\r\n return css;\r\n }\r\n\r\n if (props.filterColor === FilterColor.black) {\r\n css.filter = 'brightness(0)';\r\n }\r\n\r\n if (props.filterColor === FilterColor.gray) {\r\n css.filter = 'grayscale(1)';\r\n }\r\n\r\n if (props.filterColor === FilterColor.white) {\r\n css.filter = 'brightness(0) invert(1)';\r\n }\r\n\r\n return css;\r\n };\r\n\r\n if (props.pageLink) {\r\n return(\r\n
\r\n \r\n {renderImg(url, props.imgAlt, setInlineStyling())}\r\n \r\n
\r\n );\r\n }\r\n\r\n return(\r\n
\r\n {renderImg(url, props.imgAlt, setInlineStyling())}\r\n
\r\n );\r\n}","import * as React from 'react';\r\nimport { LogotypesProps, slidesPerView } from './logotypes';\r\nimport { Logotype } from './logotypeImg';\r\nimport { LogotypesDisplay } from '../../empracoTypes';\r\nimport { FaIcon } from '../../generic/icon';\r\n\r\nexport function LogotypesGrid(props: LogotypesProps) {\r\n const {\r\n mediaObjects,\r\n display,\r\n filterColor,\r\n externalLink,\r\n logotypesPerView,\r\n maxHeight,\r\n spaceBetween,\r\n buttonLabel\r\n } = props.data;\r\n\r\n const [cap, setCap] = React.useState(null);\r\n\r\n const spv = slidesPerView(logotypesPerView);\r\n const gap = spaceBetween ?? 20;\r\n const flex = 100 / spv;\r\n\r\n React.useEffect(() => {\r\n if (display === LogotypesDisplay.partiallyHiddenGrid) {\r\n setCap(spv);\r\n return;\r\n }\r\n }, [spv]);\r\n\r\n // Applies a \"margin\" between the items on each row to make them fit the entire container.\r\n const offset = (gap * spv - gap) / spv;\r\n\r\n return(\r\n
\r\n {mediaObjects.slice(0, cap ? cap : mediaObjects.length).map((item, index) =>\r\n )}\r\n {display === LogotypesDisplay.partiallyHiddenGrid && !!cap &&\r\n setCap(null)}>\r\n \r\n {buttonLabel ?? 'See all'}\r\n \r\n \r\n
}\r\n \r\n );\r\n}","import { className } from '@empori/util';\r\nimport { Swiper, SwiperSlide } from 'swiper/react';\r\nimport { Direction } from '../../util/util';\r\nimport { Autoplay, SwiperOptions } from 'swiper';\r\nimport { LogotypesProps, slidesPerView } from './logotypes';\r\nimport { NavigationButton } from './logotypesNavigation';\r\nimport { Logotype } from './logotypeImg';\r\n\r\nexport function LogotypesSlideshow(props: LogotypesProps) {\r\n\r\n const {\r\n mediaObjects,\r\n autoplay,\r\n filterColor,\r\n externalLink,\r\n hideNavigation,\r\n logotypesPerView,\r\n maxHeight,\r\n spaceBetween\r\n } = props.data;\r\n\r\n const spv = slidesPerView(logotypesPerView);\r\n\r\n const settings: SwiperOptions = {\r\n modules: autoplay ? [ Autoplay ] : [],\r\n autoplay: autoplay ? { delay: 3000 } : false,\r\n loop: true,\r\n autoHeight: true,\r\n lazy: true,\r\n loopedSlidesLimit: false,\r\n breakpoints: {\r\n 800: { // 800px or more\r\n slidesPerView: spv,\r\n spaceBetween: spaceBetween\r\n },\r\n 600: {\r\n slidesPerView: spv > 4 ? 4 : spv,\r\n spaceBetween: 20\r\n },\r\n 440: {\r\n slidesPerView: spv > 3 ? 3 : spv,\r\n spaceBetween: 15\r\n },\r\n 300: {\r\n slidesPerView: spv > 2 ? 2 : spv,\r\n spaceBetween: 15\r\n },\r\n 0: {\r\n slidesPerView: 1\r\n }\r\n }\r\n };\r\n\r\n return(\r\n \r\n {mediaObjects.map((item, index) =>\r\n \r\n \r\n )}\r\n {!hideNavigation &&\r\n
\r\n \r\n \r\n
}\r\n
\r\n );\r\n}","import { LogotypesJson, LogotypesDisplay } from '../../empracoTypes';\r\nimport { LogotypesGrid } from './logotypesGrid';\r\nimport { LogotypesSlideshow } from './logotypesSlideshow';\r\n\r\nexport interface LogotypesProps {\r\n data: LogotypesJson;\r\n}\r\n\r\nexport function slidesPerView(setting: number | undefined) {\r\n if (!setting && setting === 0) {\r\n return 1;\r\n }\r\n\r\n if (!setting) {\r\n return 5;\r\n }\r\n\r\n if (setting > 12) {\r\n return 12;\r\n }\r\n\r\n if (setting < 1) {\r\n return 1;\r\n }\r\n\r\n return setting;\r\n};\r\n\r\nexport default function Logotypes(props: LogotypesProps) {\r\n const { mediaObjects, display } = props.data;\r\n\r\n if (!mediaObjects) {\r\n return null;\r\n }\r\n\r\n if (display === LogotypesDisplay.grid || display === LogotypesDisplay.partiallyHiddenGrid) {\r\n return ;\r\n }\r\n\r\n return ;\r\n}","import { useSwiper } from 'swiper/react';\r\nimport { Direction } from '../../util/util';\r\nimport { className } from '@empori/util';\r\nimport { FaIcon } from '../../generic/icon';\r\n\r\nexport interface NavigationButtonProps {\r\n direction: Direction;\r\n absolute?: boolean;\r\n}\r\n\r\nexport function NavigationButton({ direction, absolute }: NavigationButtonProps) {\r\n const swiper = useSwiper();\r\n const leftOrRight = direction === Direction.next ? 'right' : 'left';\r\n\r\n const handleChange = () => {\r\n if (direction === Direction.next) {\r\n swiper.slideNext();\r\n return;\r\n }\r\n\r\n swiper.slidePrev();\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n}","/*\r\n * Generated from Empori.Typings.TypescriptTyping\r\n */\r\n\r\n/**\r\n * Map properties suited for usage within JavaScript.\r\n */\r\nexport interface GoogleMapsJson {\r\n\r\n /**\r\n * The map height in pixels.\r\n */\r\n height: number;\r\n\r\n /**\r\n * The API key for Google Maps, specified in the Umbraco back-office.\r\n */\r\n apiKey: string;\r\n\r\n /**\r\n * Iframe HTML to replace the JavaScript integration.\r\n */\r\n iframeHtml: string;\r\n\r\n /**\r\n * Initial map zoom.\r\n */\r\n initialZoom: number;\r\n\r\n /**\r\n * Initial map latitude.\r\n */\r\n initialLat: number;\r\n\r\n /**\r\n * Initial map longitude.\r\n */\r\n initialLng: number;\r\n\r\n /**\r\n * A list of map markers.\r\n */\r\n markerCollection: GoogleMapsMarkers;\r\n}\r\n\r\n/**\r\n * Used for easier JSON conversion.\r\n */\r\nexport interface GoogleMapsMarkers {\r\n\r\n /**\r\n * A list of map markers.\r\n */\r\n markers: Marker[];\r\n}\r\n\r\n/**\r\n * A single map marker item.\r\n */\r\nexport interface Marker {\r\n\r\n /**\r\n * The marker's address.\r\n */\r\n address: string;\r\n\r\n /**\r\n * The marker's latitude on the map.\r\n */\r\n lat: number;\r\n\r\n /**\r\n * The marker's longitude on the map.\r\n */\r\n lng: number;\r\n\r\n /**\r\n * The marker's description. Shows upon hoovering on the marker.\r\n */\r\n description: string;\r\n}\r\n\r\n/**\r\n * Used for ECMS cookie window content.\r\n */\r\nexport interface CookiesViewModel {\r\n\r\n /**\r\n * The main header of the cookie window content.\r\n */\r\n headerText: string;\r\n\r\n /**\r\n * The information text.\r\n */\r\n text: string;\r\n\r\n /**\r\n * The displayed label of the accept button.\r\n */\r\n acceptButtonText: string;\r\n\r\n /**\r\n * The displayed label of the read more button.\r\n */\r\n readMoreButtonText: string;\r\n\r\n /**\r\n * The link for the read more button destination.\r\n */\r\n readMoreButtonLink: string;\r\n}\r\n\r\n/**\r\n * Hidden text properties suited for usage within JavaScript.\r\n */\r\nexport interface HiddenTextJson {\r\n\r\n /**\r\n * The cap height of the text in pixels.\r\n */\r\n height: number;\r\n\r\n /**\r\n * Button label when the text is capped.\r\n */\r\n showText: string;\r\n\r\n /**\r\n * Button label when the text is visible.\r\n */\r\n hideText: string;\r\n}\r\n\r\n/**\r\n * The model for the entire buttons object. Used now for easier JSON conversion.\r\n */\r\nexport interface ButtonsModel {\r\n\r\n /**\r\n * The actual buttons.\r\n */\r\n buttons: ButtonModel[];\r\n}\r\n\r\n/**\r\n * Standard button properties.\r\n */\r\nexport interface ButtonModel {\r\n\r\n /**\r\n * The button label.\r\n */\r\n text: string;\r\n\r\n /**\r\n * The link url / href value.\r\n */\r\n url: string;\r\n\r\n /**\r\n * Reference to the FontAwesome icon library.\r\n */\r\n iconHtml: string;\r\n\r\n /**\r\n * If the button's @see Empori.Razor.Controls.ButtonModel.Url should open in a new browser window.\r\n */\r\n newWindow: boolean;\r\n\r\n /**\r\n * Removes the CSS background colors and padding and makes the button look more like plain text.\r\n */\r\n displayAsText: boolean;\r\n\r\n /**\r\n * Uses the alternative color as background color. @see Empori.Core.Configuration.Options.DesignOptions.SecondaryColor\r\n */\r\n inverted: boolean;\r\n\r\n /**\r\n * Links that contains a hash (#) or query (?).\r\n */\r\n anchor: string;\r\n}\r\n\r\n/**\r\n * A single weekday item.\r\n */\r\nexport interface OpenHoursDayItem {\r\n\r\n /**\r\n * What label to show for the day. Usually its the actual day (e.g. Monday).\r\n */\r\n dayLabel: string;\r\n\r\n /**\r\n * When the facility opens this day. Can have any string value.\r\n * TODO: Try to convert this to a date and use JavaScript for some more useful stuff.\r\n */\r\n openHour: string;\r\n\r\n /**\r\n * When the facility closes this day. Can have any string value.\r\n * TODO: Try to convert this to a date and use JavaScript for some more useful stuff.\r\n */\r\n closeHour: string;\r\n}\r\n\r\n/**\r\n * The model for the list of links.\r\n */\r\nexport interface SocialLinksModel {\r\n\r\n /**\r\n * The list.\r\n */\r\n links: SocialLink[];\r\n}\r\n\r\n/**\r\n * The social link item.\r\n */\r\nexport interface SocialLink {\r\n\r\n /**\r\n * A pre-defined icon reference.\r\n */\r\n linkIcon: LinkIcon;\r\n\r\n /**\r\n * FontAwesome icon HTML.\r\n */\r\n icon: string;\r\n\r\n /**\r\n * The link label.\r\n */\r\n linkLabel: string;\r\n\r\n /**\r\n * The link source specified by the user.\r\n */\r\n linkUrl: string;\r\n\r\n /**\r\n * The external link to the social media page or platform, forced into https protocol.\r\n */\r\n url: string;\r\n}\r\n\r\n/**\r\n * A selection of common social media platforms.\r\n */\r\nexport enum LinkIcon {\r\n\r\n /**\r\n * Facebook.\r\n */\r\n facebook = 0,\r\n\r\n /**\r\n * Twitter.\r\n */\r\n twitter = 1,\r\n\r\n /**\r\n * Instagram.\r\n */\r\n instagram = 2,\r\n\r\n /**\r\n * LinkedIn.\r\n */\r\n linkedIn = 3,\r\n\r\n /**\r\n * YouTube.\r\n */\r\n youtube = 4,\r\n\r\n /**\r\n * Pinterest.\r\n */\r\n pinterest = 5,\r\n\r\n /**\r\n * Default.\r\n */\r\n default = 99\r\n}\r\n\r\n/**\r\n * The model for the entire FAQ-items object. Used now for easier JSON conversion.\r\n */\r\nexport interface FaqModel {\r\n\r\n /**\r\n * The FAQ items list.\r\n */\r\n faqItems: FaqItem[];\r\n}\r\n\r\n/**\r\n * A single FAQ item.\r\n */\r\nexport interface FaqItem {\r\n\r\n /**\r\n * The question that shows in the block header.\r\n */\r\n question: string;\r\n\r\n /**\r\n * The answer that can be toggled when the @see Empori.Razor.Controls.FaqItem.Question is clicked.\r\n */\r\n answer: string;\r\n\r\n /**\r\n * The icon to show next to the @see Empori.Razor.Controls.FaqItem.Question.\r\n */\r\n iconHtml: string;\r\n\r\n /**\r\n * If the icon should rotate when the answer is toggled.\r\n */\r\n enableIconRotate: boolean;\r\n}\r\n\r\n/**\r\n * A general input item primarily used for @see Empori.Core.Data.Entities.Form.\r\n */\r\nexport interface InputItem {\r\n\r\n /**\r\n * This identification is used for frontend drag and drop only.\r\n */\r\n id: number;\r\n\r\n /**\r\n * The unique name that is associated with the value.\r\n */\r\n uniqueName: string;\r\n\r\n /**\r\n * Name is used for frontend reference only.\r\n */\r\n name: string;\r\n\r\n /**\r\n * Single value pre-defined by admin or assigned by the end-user.\r\n */\r\n value: string;\r\n\r\n /**\r\n * Multiple values pre-defined by admin or assigned by the end-user.\r\n */\r\n values: string[];\r\n\r\n /**\r\n * A shorter descriptive text about the input.\r\n */\r\n label: string;\r\n\r\n /**\r\n * Type of HTML input.\r\n */\r\n type: EmporiInputType;\r\n\r\n /**\r\n * A descriptive text within the input.\r\n */\r\n placeholder: string;\r\n\r\n /**\r\n * A descriptive text associated to the input.\r\n */\r\n description: string;\r\n\r\n /**\r\n * If the input should be required for form submission.\r\n */\r\n required: boolean;\r\n\r\n /**\r\n * Validation member translates to \"pattern\" HTML attribute and only works with the following input types: text, date, search, url, tel, email, and password.\r\n */\r\n validation: string;\r\n\r\n /**\r\n * The global title attribute helps describe the pattern to the end user.\r\n */\r\n title: string;\r\n\r\n /**\r\n * Alternatives member is only relevant for select, radio and checkbox input types.\r\n */\r\n alternatives: InputAlternative[];\r\n\r\n /**\r\n * Only relevant for input-type file to specify what filetypes are allowed\r\n */\r\n allowedFiles: AllowedFileType[];\r\n\r\n /**\r\n * If this member is true, form recipient specified in global and individual settings are ignored.\r\n * The mailto recipient gets taken from the selected \"Alternatives\" > \"MailTo\" value.\r\n * Only one input in each form can have this member set as true.\r\n */\r\n controlsRecipients: boolean;\r\n\r\n /**\r\n * FontAwesome string reference to an icon in their library. Primarily used for back-office frontend.\r\n */\r\n icon: string;\r\n\r\n /**\r\n * How much space this input should take in the horizontal context of the parent element.\r\n */\r\n width: WidthLayout;\r\n\r\n /**\r\n * If this member is true, the associated @see Empori.Core.Controllers.Models.EmporiInputType.Email input will send a confirmation e-mail to the user.\r\n */\r\n sendConfirmationEmail: boolean;\r\n\r\n /**\r\n * If this is true the first option will set as default empty option\r\n */\r\n isDefaultEmptyOptionSelected: boolean;\r\n}\r\n\r\n/**\r\n * Various HTML input types.\r\n */\r\nexport enum EmporiInputType {\r\n\r\n /**\r\n * \r\n */\r\n text = 0,\r\n\r\n /**\r\n * \r\n */\r\n textArea = 1,\r\n\r\n /**\r\n * \r\n */\r\n email = 2,\r\n\r\n /**\r\n * \r\n */\r\n date = 3,\r\n\r\n /**\r\n * \r\n */\r\n select = 4,\r\n\r\n /**\r\n * \r\n */\r\n number = 5,\r\n\r\n /**\r\n * \r\n */\r\n checkbox = 6,\r\n\r\n /**\r\n * \r\n */\r\n radiobutton = 7,\r\n\r\n /**\r\n * \r\n */\r\n submit = 8,\r\n\r\n /**\r\n * \r\n */\r\n file = 9,\r\n\r\n /**\r\n * Custom HTML within the
element.\r\n */\r\n rte = 10,\r\n\r\n /**\r\n * \r\n */\r\n time = 11,\r\n\r\n /**\r\n * \r\n */\r\n color = 12\r\n}\r\n\r\n/**\r\n * Multiple input alternatives that holds a @see Empori.Core.Controllers.Models.InputAlternative.Name and a @see Empori.Core.Controllers.Models.InputAlternative.MailTo address if @see Empori.Core.Controllers.Models.InputItem.ControlsRecipients is active for this input.\r\n */\r\nexport interface InputAlternative {\r\n\r\n /**\r\n * The display name of the alternative that can be selected or viewed.\r\n */\r\n name: string;\r\n\r\n /**\r\n * If the input @see Empori.Core.Controllers.Models.InputItem.ControlsRecipients is used for an input, this value can hold an e-mail address associated to the alternative @see Empori.Core.Controllers.Models.InputAlternative.Name.\r\n */\r\n mailTo: string;\r\n}\r\n\r\nexport interface AllowedFileType {\r\n type: string;\r\n}\r\n\r\n/**\r\n * A design reference that can be used for width rules.\r\n */\r\nexport enum WidthLayout {\r\n\r\n /**\r\n * Most commonly used for setting a 50 percentage width to something.\r\n */\r\n half = 0,\r\n\r\n /**\r\n * Most commonly used for setting a 100 percentage width to something.\r\n */\r\n full = 1\r\n}\r\n\r\n/**\r\n * An image gallery model suited for usage within JavaScript.\r\n */\r\nexport interface ImageGalleryModel {\r\n\r\n /**\r\n * Properties used for the frontend editor.\r\n */\r\n imageGalleryEditorModel: ImageGalleryEditorModel;\r\n\r\n /**\r\n * The image gallery's delay before showing the next slide if @see Empori.Razor.Controls.ImageGalleryModel.Autoplay is active.\r\n */\r\n delay: number;\r\n\r\n /**\r\n * The slides height. If no value is chosen the height automatically fits the content.\r\n */\r\n staticHeight: number;\r\n\r\n /**\r\n * Whether to autoplay the gallery or not.\r\n */\r\n autoplay: boolean;\r\n\r\n /**\r\n * JavaScript id reference.\r\n */\r\n macroId: string;\r\n\r\n /**\r\n * The slides margin. If no value is chosen the margin is automatically set to 0.\r\n */\r\n spaceBetween?: number;\r\n\r\n /**\r\n * The amount of slides displayed. If no value is chosen only one slide is shown at a time.\r\n */\r\n slidesPerView?: number;\r\n\r\n /**\r\n * A setting for enabling fullscreen mode for the entire gallery.\r\n */\r\n fullscreenEnabled: boolean;\r\n}\r\n\r\n/**\r\n * The image gallery model for the frontend editor.\r\n */\r\nexport interface ImageGalleryEditorModel {\r\n\r\n /**\r\n * A list of slides.\r\n */\r\n slides: Slide[];\r\n\r\n /**\r\n * An extra (optional field) to show beneath the slides.\r\n */\r\n extraInfo: GalleryExtraInfoModel;\r\n}\r\n\r\n/**\r\n * A slide item.\r\n */\r\nexport interface Slide {\r\n\r\n /**\r\n * The image source path.\r\n */\r\n image: string;\r\n\r\n /**\r\n * A fallback image source path to empty videos.\r\n */\r\n poster: string;\r\n\r\n /**\r\n * The main title above the @see Empori.Razor.Controls.Slide.Image.\r\n */\r\n titleText: string;\r\n\r\n /**\r\n * The subtitle beneath the @see Empori.Razor.Controls.Slide.TitleText.\r\n */\r\n subtitleText: string;\r\n\r\n /**\r\n * If set to true, it adds an overlay element between the @see Empori.Razor.Controls.Slide.Image and the text elements (@see Empori.Razor.Controls.Slide.TitleText and @see Empori.Razor.Controls.Slide.SubtitleText).\r\n */\r\n isImageOverlay: boolean;\r\n\r\n /**\r\n * The individual slide's buttons.\r\n */\r\n buttonsModel: ButtonsModel;\r\n\r\n /**\r\n * The horizontal alignment of the content.\r\n */\r\n contentAlignment: ContentAlignment;\r\n\r\n /**\r\n * The vertical alignment of the content.\r\n */\r\n verticalAlignment: VerticalAlignment;\r\n}\r\n\r\n/**\r\n * Horizontal alignment alternatives.\r\n */\r\nexport enum ContentAlignment {\r\n\r\n /**\r\n * Align to the left.\r\n */\r\n left = 0,\r\n\r\n /**\r\n * Align to the horizontal center.\r\n */\r\n center = 1,\r\n\r\n /**\r\n * Align to the right.\r\n */\r\n right = 2\r\n}\r\n\r\n/**\r\n * Vertical alignment alternatives.\r\n */\r\nexport enum VerticalAlignment {\r\n\r\n /**\r\n * Align to the top.\r\n */\r\n top = 0,\r\n\r\n /**\r\n * Align to the center.\r\n */\r\n center = 1,\r\n\r\n /**\r\n * Align to the bottom.\r\n */\r\n bottom = 2\r\n}\r\n\r\n/**\r\n * The model for the slide's extra content suited for usage within JavaScript.\r\n */\r\nexport interface GalleryExtraInfoModel {\r\n\r\n /**\r\n * Whether to show or hide the extra info.\r\n */\r\n isHideExtraInfo: boolean;\r\n\r\n /**\r\n * The extra info window's columns.\r\n */\r\n columns: GalleryExtraInfoColumn[];\r\n}\r\n\r\n/**\r\n * A column item that is used within the @see Empori.Razor.Controls.GalleryExtraInfoModel.\r\n */\r\nexport interface GalleryExtraInfoColumn {\r\n\r\n /**\r\n * Image source path.\r\n */\r\n image: string;\r\n\r\n /**\r\n * HTML content.\r\n */\r\n content: string;\r\n\r\n /**\r\n * HTML title.\r\n */\r\n title: string;\r\n}\r\n\r\n/**\r\n * The counter model for JavaScript usage.\r\n */\r\nexport interface CounterJson {\r\n\r\n /**\r\n * DOM reference.\r\n */\r\n id: string;\r\n\r\n /**\r\n * Count from this value.\r\n */\r\n countFrom: number;\r\n\r\n /**\r\n * Count to this value.\r\n */\r\n countTo: number;\r\n\r\n /**\r\n * How long the counting should take in milliseconds.\r\n */\r\n time: number;\r\n\r\n /**\r\n * A frontend check whether the counting has started or not.\r\n */\r\n started: boolean;\r\n}\r\n\r\n/**\r\n * Properties to be used in JavaScript.\r\n */\r\nexport interface FormDetails {\r\n\r\n /**\r\n * The id of the form.\r\n */\r\n formId: string;\r\n\r\n /**\r\n * The form submit button id.\r\n */\r\n formSubmitButtonId: string;\r\n\r\n /**\r\n * The actual form with its child properties.\r\n */\r\n form: Form;\r\n\r\n /**\r\n * File size cap in MiB (MB).\r\n */\r\n globalMaxUploadFileSize?: number;\r\n\r\n /**\r\n * If the visitor should remain on the same page or not upon form submission.\r\n */\r\n stayOnPage: boolean;\r\n\r\n /**\r\n * DOM reference to the element containing the message HTML.\r\n */\r\n messageKey: string;\r\n\r\n /**\r\n * DOM reference to the element containing the post status messages for \"posting form\" and \"form posted\".\r\n */\r\n statusKey: string;\r\n\r\n /**\r\n * The URL to post data to.\r\n */\r\n fetchUrl: string;\r\n\r\n /**\r\n * The URL to fetch empori captcha\r\n */\r\n fetchUrlEmporiCaptcha: string;\r\n\r\n /**\r\n * The URL to post data to.\r\n */\r\n spamProtectionDetails: SpamProtectionDetails;\r\n\r\n /**\r\n * The tranlations for the form.\r\n */\r\n translations: { [key: string]: string };\r\n}\r\n\r\n/**\r\n * Turnstile response\r\n */\r\nexport interface SpamProtectionDetails {\r\n\r\n /**\r\n * Check whether tunstile spam protection is on from the settings\r\n */\r\n isTurnstileEnabled: boolean;\r\n\r\n /**\r\n * Check whether empori spam protection is enabled from the settings\r\n */\r\n isEmporiCaptchaEnabled: boolean;\r\n\r\n /**\r\n * Empori captcha generating url\r\n */\r\n fetchUrlEmporiCaptcha: string;\r\n\r\n /**\r\n * Empori captcha image guid id\r\n */\r\n captchaImgId: string;\r\n}\r\n\r\n/**\r\n * A standard image model additional information.\r\n */\r\nexport interface ImageWithInfo {\r\n\r\n /**\r\n * Image media path.\r\n */\r\n imgUrl: string;\r\n\r\n /**\r\n * A non-cropped or otherwise manipulated image url from Umbraco.\r\n */\r\n imgUrlOriginal: string;\r\n\r\n /**\r\n * Image alt HTML attribute.\r\n */\r\n imgAlt: string;\r\n\r\n /**\r\n * A title to render alongside the image. Not the same as @see Empori.Razor.Models.ImageWithInfo.ImgAlt.\r\n */\r\n title: string;\r\n\r\n /**\r\n * URL to the content node/page.\r\n */\r\n pageLink: string;\r\n}\r\n\r\nexport interface SearchAliasItemModel {\r\n searchAliasItems: SearchAliasItem[];\r\n}\r\n\r\nexport interface SearchAliasItem {\r\n alias: string;\r\n fieldDescription: string;\r\n isRemovedFromSearch: boolean;\r\n boostValue: string;\r\n culture: string;\r\n}\r\n\r\nexport interface UmbracoSearchModel {\r\n culture: string;\r\n selectedNodesIdList: number[];\r\n displayTitleAlias: string;\r\n displayDescriptionAlias: string;\r\n pageSize?: number;\r\n searchAliasItems: SearchAliasItem[];\r\n placeHolderText: string;\r\n noResultFoundText: string;\r\n}\r\n\r\n/**\r\n * Used for populating extra data to interest form.\r\n */\r\nexport interface BrandModelData {\r\n\r\n /**\r\n * The model's title\r\n */\r\n title: string;\r\n\r\n /**\r\n * The model's year.\r\n */\r\n year: string;\r\n\r\n /**\r\n * The model's url/link to its page.\r\n */\r\n link: string;\r\n\r\n /**\r\n * The current language of the page.\r\n */\r\n lang: string;\r\n}\r\n\r\nexport interface BrandModelItem {\r\n name: string;\r\n year: string;\r\n description: string;\r\n pricePrefix: string;\r\n priceFrom?: number;\r\n mainImage: string;\r\n created: string;\r\n link: string;\r\n brand: string;\r\n family: string;\r\n category: string;\r\n imageCrop: string;\r\n}\r\n\r\nexport interface BrandPagesConfig {\r\n lang: string;\r\n translations: BrandPagesTranslations;\r\n}\r\n\r\nexport interface BrandPagesTranslations {\r\n viewingModelsCount: string;\r\n filter: string;\r\n sort: string;\r\n showingAllBrands: string;\r\n showingAllFamilies: string;\r\n showingAllCategories: string;\r\n closeAndShowModels: string;\r\n alphabetAsc: string;\r\n alphabetDesc: string;\r\n priceAsc: string;\r\n priceDesc: string;\r\n createdAsc: string;\r\n createdDesc: string;\r\n noModelsFound: string;\r\n}\r\n\r\n/**\r\n * Animation styles for rows upon reaching the viewport.\r\n */\r\nexport enum RowAnimationStyle {\r\n\r\n /**\r\n * No animation.\r\n */\r\n none = 0,\r\n\r\n /**\r\n * The row slides and fades in from the bottom to the top.\r\n */\r\n fadeUp = 1\r\n}\r\n\r\nexport interface LogotypesJson {\r\n mediaObjects: ImageWithInfo[];\r\n logotypesPerView?: number;\r\n spaceBetween?: number;\r\n display: LogotypesDisplay;\r\n hideNavigation: boolean;\r\n autoplay: boolean;\r\n externalLink?: boolean;\r\n maxHeight?: number;\r\n filterColor: FilterColor;\r\n buttonLabel: string;\r\n}\r\n\r\n/**\r\n * Display alternatives for a logotypes listing control.\r\n */\r\nexport enum LogotypesDisplay {\r\n\r\n /**\r\n * Display as a slideshow.\r\n */\r\n slideshow = 0,\r\n\r\n /**\r\n * Display as a grid.\r\n */\r\n grid = 1,\r\n\r\n /**\r\n * Display some logotypes, and require user action to display more.\r\n */\r\n partiallyHiddenGrid = 2\r\n}\r\n\r\n/**\r\n * Filter color styles suited for logotypes.\r\n */\r\nexport enum FilterColor {\r\n\r\n /**\r\n * No filter.\r\n */\r\n none = 0,\r\n\r\n /**\r\n * #000.\r\n */\r\n black = 1,\r\n\r\n /**\r\n * Gray.\r\n */\r\n gray = 2,\r\n\r\n /**\r\n * #fff.\r\n */\r\n white = 3\r\n}\r\n\r\n/**\r\n * Object representing interactive image properties.\r\n */\r\nexport interface InteractiveImageObj {\r\n\r\n /**\r\n * Gets or sets the image source.\r\n */\r\n image: string;\r\n\r\n /**\r\n * Gets or sets the list of clickable buttons on the interactive image.\r\n */\r\n buttons: ButtonObj[];\r\n}\r\n\r\n/**\r\n * Object representing properties of a clickable button on the interactive image.\r\n */\r\nexport interface ButtonObj {\r\n\r\n /**\r\n * Unique identifier for the button.\r\n */\r\n id: string;\r\n\r\n /**\r\n * The index of the button.\r\n */\r\n index: number;\r\n\r\n /**\r\n * The horizontal position of the button on the image.\r\n */\r\n positionX: number;\r\n\r\n /**\r\n * The vertical position of the button on the image.\r\n */\r\n positionY: number;\r\n\r\n /**\r\n * Input features for the button.\r\n */\r\n featureInput: FeatureInput;\r\n}\r\n\r\n/**\r\n * Object representing input features for a clickable button.\r\n */\r\nexport interface FeatureInput {\r\n\r\n /**\r\n * Feature title. Used only in the backoffice to visually facilitate sorting.\r\n */\r\n sortingTitle: string;\r\n\r\n /**\r\n * Input text for the feature.\r\n */\r\n inputText: string;\r\n\r\n /**\r\n * Indicating whether the feature is active.\r\n */\r\n active: boolean;\r\n}\r\n\r\n/**\r\n * Used for ECMS popup window content.\r\n */\r\nexport interface PopupViewModel {\r\n\r\n /**\r\n * Wether the popup is activated.\r\n */\r\n active?: boolean;\r\n\r\n /**\r\n * Timeframe (in days) for when the popup appears to the user next time.\r\n */\r\n showInterval: number;\r\n\r\n /**\r\n * Expiration date for when the popup becomes inactive.\r\n */\r\n expirationDate?: string;\r\n\r\n /**\r\n * Scroll distance (in pixels) until the popup appears.\r\n */\r\n appearOnScroll?: number;\r\n\r\n /**\r\n * Popup name.\r\n */\r\n name: string;\r\n}\r\n\r\n/**\r\n * The image gallery model for the frontend editor.\r\n */\r\nexport interface BannerBlockEditorModel {\r\n\r\n /**\r\n * A list of slides.\r\n */\r\n banners: Banner[];\r\n}\r\n\r\n/**\r\n * A slide item.\r\n */\r\nexport interface Banner {\r\n\r\n /**\r\n * The image source path.\r\n */\r\n image: string;\r\n\r\n /**\r\n * A fallback image source path to empty videos.\r\n */\r\n poster: string;\r\n\r\n /**\r\n * Background color of the banner @see Empori.Razor.Controls.Banner.Image.\r\n */\r\n backgroundColor: string;\r\n\r\n /**\r\n * The main title above the @see Empori.Razor.Controls.Banner.Image.\r\n */\r\n titleText: string;\r\n\r\n /**\r\n * The subtitle beneath the @see Empori.Razor.Controls.Banner.TitleText.\r\n */\r\n subtitleText: string;\r\n\r\n /**\r\n * If set to true, it adds an blur effect to the banner image\r\n */\r\n isImageBlur: boolean;\r\n\r\n /**\r\n * is the blur option applying vertically or horizontally.\r\n */\r\n blurType: BlurType;\r\n\r\n /**\r\n * is the blur option applying vertically or horizontally.\r\n */\r\n blurHorizontalSide: BlurHorizontalSide;\r\n\r\n /**\r\n * is the blur option applying vertically or horizontally.\r\n */\r\n blurVerticalSide: BlurVerticalSide;\r\n\r\n /**\r\n * Blur half(50%) or two third(66.67%) of the banner.\r\n */\r\n blurOption: BlurOption;\r\n\r\n /**\r\n * The individual banner's buttons.\r\n */\r\n buttonsModel: ButtonsModel;\r\n\r\n /**\r\n * The horizontal alignment of the content.\r\n */\r\n contentAlignment: ContentAlignment;\r\n\r\n /**\r\n * The vertical alignment of the content.\r\n */\r\n verticalAlignment: VerticalAlignment;\r\n}\r\n\r\n/**\r\n * Horizontal/verticle blur height\r\n */\r\nexport enum BlurType {\r\n\r\n /**\r\n * Overlay blur vertically\r\n */\r\n vertical = 0,\r\n\r\n /**\r\n * Overlay blur horizontally\r\n */\r\n horizontal = 1\r\n}\r\n\r\n/**\r\n * Blur content side vertical\r\n */\r\nexport enum BlurHorizontalSide {\r\n\r\n /**\r\n * left side content\r\n */\r\n left = 0,\r\n\r\n /**\r\n * right side content\r\n */\r\n right = 1\r\n}\r\n\r\n/**\r\n * Blur content side horizontal\r\n */\r\nexport enum BlurVerticalSide {\r\n\r\n /**\r\n * content on top\r\n */\r\n top = 0,\r\n\r\n /**\r\n * content on bottom\r\n */\r\n bottom = 1\r\n}\r\n\r\n/**\r\n * Horizontal/verticle blur height\r\n */\r\nexport enum BlurOption {\r\n\r\n /**\r\n * Half of the banner will be blured out.\r\n */\r\n half = 0,\r\n\r\n /**\r\n * 2/3 of the banner will be blured out.\r\n */\r\n twoThird = 1\r\n}\r\n\r\nexport interface FormPostResponse {\r\n posts: FormPost[];\r\n}\r\n\r\nexport interface FormExportQueryString {\r\n formId: number;\r\n culture: string;\r\n format?: SpreadsheetFormat;\r\n}\r\n\r\n/**\r\n * Supported spreadsheet formats.\r\n */\r\nexport enum SpreadsheetFormat {\r\n\r\n /**\r\n * Default XML-based file format for Excel 2010 and Excel 2007.\r\n */\r\n xlsx = 0,\r\n\r\n /**\r\n * Excel 97 - Excel 2003 Binary file format (BIFF8).\r\n */\r\n xls = 1,\r\n\r\n /**\r\n * Comma separated values.\r\n */\r\n csv = 2,\r\n\r\n /**\r\n * JavaScript object notation.\r\n */\r\n json = 3\r\n}\r\n\r\nexport interface ResendFormPostsMailResponse {\r\n failedResentMails: FailedResentMail[];\r\n succededResentMails: number[];\r\n}\r\n\r\nexport interface FailedResentMail {\r\n id: number;\r\n errorMessage: string;\r\n}\r\n\r\nexport interface OptionsResponse {\r\n key: string;\r\n title: string;\r\n definitions: ObjectDefinition[];\r\n properties: OptionsProperty[];\r\n model: { [key: string]: any };\r\n}\r\n\r\nexport interface ObjectDefinition {\r\n type: string;\r\n propertyEditor: string;\r\n formatString: string;\r\n properties: OptionsProperty[];\r\n}\r\n\r\nexport interface OptionsProperty {\r\n title: string;\r\n description: string;\r\n key: string;\r\n type: string;\r\n propertyType: OptionsPropertyType;\r\n tab: string;\r\n group: string;\r\n relation: OptionsRelation;\r\n isAdminOnly?: boolean;\r\n isReadOnly?: boolean;\r\n isVaryByCulture?: boolean;\r\n evaluateOnChange?: boolean;\r\n mappingTitle: string;\r\n}\r\n\r\n/**\r\n * Options property type of an object definition.\r\n */\r\nexport enum OptionsPropertyType {\r\n\r\n /**\r\n * Primitive value such as a number or a string.\r\n */\r\n primitive = 0,\r\n\r\n /**\r\n * Nested object structure.\r\n */\r\n object = 1,\r\n\r\n /**\r\n * Array of nested object structures.\r\n */\r\n array = 2\r\n}\r\n\r\nexport interface OptionsRelation {\r\n multiSelect?: boolean;\r\n optional?: boolean;\r\n style: number;\r\n values: IOptionsValue[];\r\n}\r\n\r\n/**\r\n * Selectable options relation value.\r\n */\r\nexport interface IOptionsValue {\r\n\r\n /**\r\n * Title of value.\r\n */\r\n title: string;\r\n\r\n /**\r\n * Options value\r\n */\r\n value: string;\r\n\r\n /**\r\n * Description to show to the editor.\r\n */\r\n description: string;\r\n\r\n /**\r\n * Description to show to the editor.\r\n */\r\n isVaryByCulture?: boolean;\r\n\r\n /**\r\n * Indicate that this value is selected.\r\n */\r\n selected?: boolean;\r\n context?: any | null;\r\n}\r\n\r\n/**\r\n * Type of list style to use for relation values.\r\n */\r\nexport enum RelationListStyle {\r\n\r\n /**\r\n * A single or a multi select dropdown list.\r\n */\r\n dropdown = 0,\r\n\r\n /**\r\n * A list of radio buttons or a list of checkboxes for multi select.\r\n */\r\n buttons = 1\r\n}\r\n\r\nexport interface MenuOptionsItem {\r\n title: string;\r\n key: string;\r\n icon: string;\r\n view: string;\r\n viewData: { [key: string]: any };\r\n subMenu: MenuOptionsItem[];\r\n}\r\n\r\nexport interface TableWindowQuery {\r\n tableKey: string;\r\n searchText: string;\r\n skip?: number;\r\n take?: number;\r\n sorting: TableSort;\r\n filters: TableFilter[];\r\n}\r\n\r\nexport interface TableSort {\r\n column: string;\r\n descending: boolean;\r\n}\r\n\r\nexport interface TableFilter {\r\n column: string;\r\n value: string;\r\n operator: TableFilterOperator;\r\n}\r\n\r\nexport enum TableFilterOperator {\r\n equals = 0,\r\n notEquals = 1,\r\n greaterThan = 2,\r\n greaterThanOrEquals = 3,\r\n lessThan = 4,\r\n lessThanOrEquals = 5,\r\n contains = 6,\r\n startsWith = 7,\r\n endsWith = 8\r\n}\r\n\r\nexport interface TableActionQuery {\r\n tableKey: string;\r\n actionName: string;\r\n selectedIds: any[];\r\n deselectedIds: any[];\r\n selectedAll: boolean;\r\n model: any;\r\n searchText: string;\r\n filters: TableFilter[];\r\n}\r\n\r\nexport interface TableResponse {\r\n key: string;\r\n title: string;\r\n icon: string;\r\n idColumn: string;\r\n editable: boolean;\r\n selectable: boolean;\r\n defaultSorting: TableSort;\r\n columns: TableColumn[];\r\n actions: TableAction[];\r\n definitions: ObjectDefinition[];\r\n properties: OptionsProperty[];\r\n}\r\n\r\nexport interface TableColumn {\r\n key: string;\r\n title: string;\r\n type: TableColumnType;\r\n hide: boolean;\r\n options: { [key: string]: any };\r\n sortable: boolean;\r\n sortBy: string;\r\n filterable: boolean;\r\n}\r\n\r\nexport enum TableColumnType {\r\n text = 0,\r\n integer = 1,\r\n decimal = 2,\r\n dateTime = 3,\r\n boolean = 4,\r\n enum = 5\r\n}\r\n\r\nexport interface TableAction {\r\n key: string;\r\n name: string;\r\n icon: string;\r\n actionType: TableActionType;\r\n comfirmMessage: string;\r\n style: string;\r\n visible: boolean;\r\n sortOrder: number;\r\n}\r\n\r\nexport enum TableActionType {\r\n\r\n /**\r\n * A standalone action that does not require a row to be selected.\r\n */\r\n standalone = 0,\r\n\r\n /**\r\n * An action that requires at least one row to be selected.\r\n */\r\n oneOrMore = 1\r\n}\r\n\r\nexport interface TableActionRunResult {\r\n success: boolean;\r\n value: any;\r\n}\r\n\r\nexport interface TableActionResult {\r\n message: string;\r\n status: TableActionStatus;\r\n schema: OptionsSchema;\r\n}\r\n\r\nexport enum TableActionStatus {\r\n info = 0,\r\n success = 1,\r\n error = 2,\r\n options = 10,\r\n actionResult = 11\r\n}\r\n\r\nexport interface OptionsSchema {\r\n model: any;\r\n definitions: ObjectDefinition[];\r\n properties: OptionsProperty[];\r\n}\r\n\r\nexport interface JobDescriptionResponse {\r\n jobDescriptions: JobDescription[];\r\n latestRuns: ScheduledJobRun[];\r\n}\r\n\r\n/**\r\n * General model for all types of job descriptions.\r\n */\r\nexport interface JobDescription {\r\n active: boolean;\r\n lastRun?: string;\r\n nextOccurrence?: string;\r\n name: string;\r\n entity: ScheduledJob;\r\n currentRunEntity: ScheduledJobRun;\r\n status: JobReportStatus;\r\n}\r\n\r\n/**\r\n * Job reporter status for a job task during its execution.\r\n */\r\nexport enum JobReportStatus {\r\n\r\n /**\r\n * The job task is idling and waiting to be ran.\r\n */\r\n idle = 0,\r\n\r\n /**\r\n * The job task is currently running.\r\n */\r\n running = 1\r\n}\r\n\r\nexport interface JobTypesResponse {\r\n types: JobTypeModel[];\r\n}\r\n\r\nexport interface JobTypeModel {\r\n typeName: string;\r\n name: string;\r\n}\r\n\r\n/**\r\n * Job reporter event data from the reporter channel.\r\n */\r\nexport interface JobReporterEvent {\r\n\r\n /**\r\n * Gets or sets scheduled job entity id.\r\n */\r\n entityId: number;\r\n\r\n /**\r\n * Gets or sets progress value.\r\n */\r\n progress: number;\r\n\r\n /**\r\n * Gets or sets status text.\r\n */\r\n text: string;\r\n\r\n /**\r\n * Gets or sets job reporter status.\r\n */\r\n status: JobReportStatus;\r\n\r\n /**\r\n * Gets or sets internal job status that may be used to report metadata status to listeners.\r\n */\r\n metadataJobStatus?: MetadataJobStatus;\r\n}\r\n\r\n/**\r\n * Metadata job status.\r\n */\r\nexport enum MetadataJobStatus {\r\n\r\n /**\r\n * Job task is removed and should be propagated to listeners.\r\n */\r\n remove = 0,\r\n\r\n /**\r\n * Job task is updated and should be propagated to listeners.\r\n */\r\n update = 1,\r\n\r\n /**\r\n * Job task is created and should be propagated to listeners.\r\n */\r\n create = 2\r\n}\r\n\r\n/**\r\n * Job reporter status summary of individual job tasks.\r\n */\r\nexport interface JobReporterStatusSummary {\r\n\r\n /**\r\n * Job task events by entity id.\r\n */\r\n jobEvents: { [key: number]: JobReporterEvent };\r\n}\r\n\r\nexport interface JobDescriptionUpdateRequest {\r\n model: JobTaskModel;\r\n}\r\n\r\nexport interface JobTaskModel {\r\n\r\n /**\r\n * Scheduled job entity id.\r\n */\r\n entityId: number;\r\n\r\n /**\r\n * Given name of this job task.\r\n */\r\n name: string;\r\n\r\n /**\r\n * Cron timing expression.\r\n */\r\n cron: string;\r\n\r\n /**\r\n * Cron time zone in IANA id. UTC if `null`.\r\n */\r\n cronTimeZoneIana: string;\r\n\r\n /**\r\n * Decide whether this job task is active or not.\r\n */\r\n active: boolean;\r\n\r\n /**\r\n * Type name of this job task.\r\n */\r\n type: string;\r\n}\r\n\r\nexport interface JobRunLogsResponse {\r\n run: ScheduledJobRun;\r\n logs: ScheduledJobRunLog[];\r\n}\r\n\r\nexport interface JobRunsResponse {\r\n runs: ScheduledJobRun[];\r\n}\r\n\r\nexport interface EventLog {\r\n message: string;\r\n exceptionMessage: string;\r\n exceptionStackTrace: string;\r\n exceptionSource: string;\r\n}\r\n\r\nexport interface RichTextConfiguration {\r\n editor: any;\r\n overlaySize: string;\r\n hideLabel: boolean;\r\n mediaParentId: string;\r\n ignoreUserStartNodes: boolean;\r\n}\r\n\r\n/**\r\n * Umbraco search result response\r\n */\r\nexport interface SearchResultResponse {\r\n\r\n /**\r\n * Total count of the records received\r\n */\r\n totalCount: number;\r\n\r\n /**\r\n * Search term which was performed search on\r\n */\r\n searchTerm: string;\r\n\r\n /**\r\n * Search response item list\r\n */\r\n results: SearchResultItem[];\r\n}\r\n\r\nexport interface SearchResultItem {\r\n title: string;\r\n description: string;\r\n\r\n /**\r\n * Url of the published content or url to media\r\n */\r\n url: string;\r\n id: string;\r\n\r\n /**\r\n * Content type whether a page or media\r\n */\r\n contentType: string;\r\n}\r\n\r\nexport interface ImportPreviewResult {\r\n rows: HeaderRow[];\r\n sheetNames: string[];\r\n}\r\n\r\n/**\r\n * Header row of a spreadsheet.\r\n */\r\nexport interface HeaderRow {\r\n\r\n /**\r\n * Columns (cells) of the header row.\r\n */\r\n columns: HeaderCellValue[];\r\n}\r\n\r\n/**\r\n * A cell value in the header row.\r\n */\r\nexport interface HeaderCellValue {\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n index: number;\r\n\r\n /**\r\n * String value of the cell.\r\n */\r\n value: string;\r\n\r\n /**\r\n * Type of the cell.\r\n */\r\n cellType: SpreadsheetCellType;\r\n}\r\n\r\nexport enum SpreadsheetCellType {\r\n unknown = -1,\r\n numeric = 0,\r\n string = 1,\r\n formula = 2,\r\n blank = 3,\r\n boolean = 4,\r\n error = 5\r\n}\r\n\r\nexport interface ImportRunRequest {\r\n keys: string[];\r\n targetType: string;\r\n sheetIndex?: number;\r\n skipRows?: number;\r\n mappedFields: string[];\r\n mapperOptions: MapperOptions;\r\n}\r\n\r\nexport enum MapperOptions {\r\n auto = 0,\r\n manual = 1\r\n}\r\n\r\nexport interface ImportUploadResult {\r\n files: ImportFile[];\r\n}\r\n\r\n/**\r\n * A temporarily stored file to import.\r\n */\r\nexport interface ImportFile {\r\n\r\n /**\r\n * Gets or sets the cache key of the file.\r\n */\r\n key: string;\r\n\r\n /**\r\n * Gets or sets the temporary name of the file.\r\n */\r\n tempName: string;\r\n\r\n /**\r\n * Gets or sets the original file name.\r\n */\r\n fileName: string;\r\n\r\n /**\r\n * Gets or sets the content type of the file.\r\n */\r\n contentType: string;\r\n\r\n /**\r\n * Gets or sets the length of the file.\r\n */\r\n length: number;\r\n}\r\n\r\nexport interface ImportTargetsResponse {\r\n targetTypes: ImportTargetType[];\r\n}\r\n\r\nexport interface ImportTargetType {\r\n type: string;\r\n name: string;\r\n description: string;\r\n fields: ImportTargetField[];\r\n}\r\n\r\nexport interface ImportTargetField {\r\n key: string;\r\n name: string;\r\n required: boolean;\r\n}\r\n\r\nexport interface ImportRunResponse {\r\n started: boolean;\r\n message: string;\r\n}\r\n\r\nexport interface ImportHistoryResponse {\r\n jobs: ScheduledJob[];\r\n jobRuns: ScheduledJobRun[];\r\n}\r\n\r\n/**\r\n * @inheritdoc Empori.Core.Data.Entities.IForm\r\n */\r\nexport interface Form extends EntityBase {\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n name: string;\r\n inputs: InputItem[];\r\n settings: FormSettings;\r\n}\r\n\r\nexport interface FormSettings extends BaseOptions {\r\n submitLabel: string;\r\n\r\n /**\r\n * Page node to redirect to after form has been posted. See also @see Empori.Core.Middlewares.FormPostMiddleware.\r\n */\r\n redirectPageNode: BaseNodePickerOption;\r\n\r\n /**\r\n * File size in megabytes (MiB).\r\n */\r\n maxUploadFileSize?: number;\r\n adminMailOptions: AdminEmailOptions;\r\n spamProtectionOptions: FormSpamProtectionOptions;\r\n}\r\n\r\n/**\r\n * Class contains the bare-minumum fields required for NodePicker property-editor to work.\r\n * Can be extended with all the fields listed in @see Empori.Core.Configuration.PropertyEditors.BaseNodePickerOption\r\n */\r\nexport interface BaseNodePickerOption {\r\n nodeId: number;\r\n name: string;\r\n icon: string;\r\n}\r\n\r\nexport interface AdminEmailOptions extends MailToOptions {\r\n sendAdminEmail: GlobalNoYes;\r\n attachUploadedFiles: GlobalNoYes;\r\n}\r\n\r\n/**\r\n * No/yes override for a global @see System.Boolean option.\r\n */\r\nexport enum GlobalNoYes {\r\n\r\n /**\r\n * Use global option.\r\n */\r\n global = 0,\r\n\r\n /**\r\n * No.\r\n */\r\n no = 1,\r\n\r\n /**\r\n * Yes.\r\n */\r\n yes = 2\r\n}\r\n\r\n/**\r\n * Options for an email message with receiver address, sender address, template and subject.\r\n */\r\nexport interface MailToOptions extends MailOptions {\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n toEmail: string;\r\n}\r\n\r\n/**\r\n * Options for an email message with sender address, template and subject.\r\n */\r\nexport interface MailOptions {\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n fromEmail: string;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n template: string;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n title: string;\r\n}\r\n\r\n/**\r\n * emporicaptcha/turnstile override for a global @see System.Boolean option.\r\n */\r\nexport enum FormSpamProtectionOptions {\r\n\r\n /**\r\n * Use global option.\r\n */\r\n global = 0,\r\n\r\n /**\r\n * No.\r\n */\r\n none = 1,\r\n\r\n /**\r\n * Empori Captcha.\r\n */\r\n emporiCaptcha = 2,\r\n\r\n /**\r\n * 3rd Party Turnstile.\r\n */\r\n turnstile = 3\r\n}\r\n\r\n/**\r\n * Base abstract class of a configurable @see Microsoft.Extensions.Options.IOptions`1 in the backoffice.\r\n */\r\nexport interface BaseOptions {\r\n}\r\n\r\nexport interface EntityBase extends BeingDirtyBase {\r\n id: number;\r\n key: string;\r\n createDate: string;\r\n updateDate: string;\r\n deleteDate?: string;\r\n hasIdentity: boolean;\r\n}\r\n\r\nexport interface BeingDirtyBase {\r\n}\r\n\r\n/**\r\n * @inheritdoc Empori.Core.Data.Entities.IFormPost\r\n */\r\nexport interface FormPost extends EntityBase {\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n formId: number;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n pageId?: number;\r\n pageCulture: string;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n ip: string;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n created: string;\r\n status: number;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n postData: FormPostData[];\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n postFiles: FormPostFile[];\r\n}\r\n\r\n/**\r\n * @inheritdoc Empori.Core.Data.Entities.IFormPostData\r\n */\r\nexport interface FormPostData extends EntityBase {\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n formPostId: number;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n name: string;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n value: string;\r\n}\r\n\r\n/**\r\n * @inheritdoc Empori.Core.Data.Entities.IFormPostFile\r\n */\r\nexport interface FormPostFile extends EntityBase {\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n formPostId: number;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n fieldName: string;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n fileName: string;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n length: number;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n contentType: string;\r\n\r\n /**\r\n * @inheritdoc \r\n */\r\n storageName: string;\r\n}\r\n\r\nexport interface ScheduledJob extends EntityBase {\r\n active: boolean;\r\n lastRun: string;\r\n name: string;\r\n type: string;\r\n cron: string;\r\n cronTimeZoneIana: string;\r\n category: JobCategory;\r\n}\r\n\r\n/**\r\n * Job type category.\r\n */\r\nexport enum JobCategory {\r\n\r\n /**\r\n * Default recurring job.\r\n */\r\n recurring = 0,\r\n\r\n /**\r\n * Import job.\r\n */\r\n import = 10\r\n}\r\n\r\nexport interface ScheduledJobRun extends EntityBase {\r\n jobId: number;\r\n result: JobRunResult;\r\n startDate: string;\r\n endDate?: string;\r\n}\r\n\r\n/**\r\n * Job run result.\r\n */\r\nexport enum JobRunResult {\r\n\r\n /**\r\n * Default idle result.\r\n */\r\n idle = 0,\r\n\r\n /**\r\n * Run is currently running.\r\n */\r\n running = 1,\r\n\r\n /**\r\n * Run is completed.\r\n */\r\n complete = 2,\r\n\r\n /**\r\n * Run is stopped.\r\n */\r\n stopped = 3,\r\n\r\n /**\r\n * Run has an error.\r\n */\r\n error = 4\r\n}\r\n\r\nexport interface ScheduledJobRunLog extends EntityBase {\r\n runId: number;\r\n level: LogLevel;\r\n message: string;\r\n}\r\n\r\nexport enum LogLevel {\r\n trace = 0,\r\n debug = 1,\r\n information = 2,\r\n warning = 3,\r\n error = 4,\r\n critical = 5,\r\n none = 6\r\n}\r\n\r\nexport interface TableWindow {\r\n rows: any[];\r\n totalCount?: number;\r\n}\r\n\r\n","import * as React from 'react';\r\n\r\nexport type MappedArrayObject = {\r\n [key: string]: T;\r\n};\r\n\r\nexport type GroupedArrayObject = {\r\n [key: string]: T[];\r\n};\r\n\r\nexport function arrayToObject(array: T[], key: (item: T) => string): MappedArrayObject {\r\n const obj: MappedArrayObject = {};\r\n\r\n for (let item of array) {\r\n obj[key(item)] = item;\r\n }\r\n\r\n return obj;\r\n}\r\n\r\nexport function groupArray(array: T[], key: (item: T) => string): GroupedArrayObject {\r\n const obj: GroupedArrayObject = {};\r\n\r\n for (let item of array) {\r\n const itemKey = key(item);\r\n (obj[itemKey] || (obj[itemKey] = [])).push(item);\r\n }\r\n\r\n return obj;\r\n}\r\n\r\nexport function camelCase(value?: string) {\r\n if (!value || value.length <= 1) {\r\n return value ?? '';\r\n }\r\n\r\n return value.charAt(0).toLocaleLowerCase() + value.substring(1);\r\n}\r\n\r\nconst formatMustasch = /{([^{}]*)}/g;\r\n\r\n/**\r\n * Format a string template in a provided mustasch format using an object as a lookup source.\r\n *\r\n * @example\r\n * formatObject('test {key1} format', { key1: 'string' }) // \"test string format\"\r\n *\r\n * @param format Format string template.\r\n * @param object Object to use as lookup.\r\n * @param replacementFunc Optional callback function for each parsed tag.\r\n * Returned `string` will be used instead of given mapped item.\r\n * @returns Formatted string template.\r\n */\r\nexport function formatObject(format: string, object?: any, replacementFunc?: (key: string, item: any) => string) {\r\n if (object == null) {\r\n return '';\r\n }\r\n\r\n return format.replace(formatMustasch, (a: string, b: string) => {\r\n let val = object[b] ?? object[camelCase(b)];\r\n let formatVal = replacementFunc?.(b, val);\r\n return formatVal ?? val;\r\n });\r\n}\r\n\r\nconst byte = 1024;\r\nexport const FileSizeUnits = {\r\n KiB: byte,\r\n MiB: byte * byte,\r\n GiB: byte * byte * byte,\r\n TiB: byte * byte * byte * byte,\r\n PiB: byte * byte * byte * byte * byte,\r\n EiB: byte * byte * byte * byte * byte * byte\r\n};\r\n\r\n/**\r\n * Returns a new array with one item replaced at given index.\r\n * Does not mutate the original array.\r\n * @param items The original array\r\n * @param index What item to replace\r\n * @param newItem The new replacementitem\r\n */\r\nexport function replaceItem(items: T[], index: number, newItem: T) {\r\n return items.map((item, idx) => idx === index ? newItem : item);\r\n}\r\n\r\nexport const FileExtensions = {\r\n PDF: '.pdf',\r\n MP4: '.mp4',\r\n OGG: '.ogg',\r\n SVG: '.svg',\r\n GIF: '.gif'\r\n};\r\n\r\nexport function thousandSeparator(num: number) {\r\n return num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\r\n};\r\n\r\n// eslint-disable-next-line no-shadow\r\nexport enum Direction {\r\n prev,\r\n next\r\n}\r\n\r\n// eslint-disable-next-line no-shadow\r\nexport enum ThemeIds {\r\n raw = 'Raw',\r\n exclusive = 'Exclusive'\r\n}\r\n\r\nexport function parseStyleString(styleString: string) {\r\n const styleObj: React.CSSProperties = {};\r\n\r\n if (!styleString) {\r\n return styleObj;\r\n }\r\n\r\n styleString.split(';').forEach(style => {\r\n const [property, value] = style.split(':').map(str => str.trim());\r\n\r\n if (property && value) {\r\n (styleObj as any)[property] = value;\r\n }\r\n });\r\n\r\n return styleObj;\r\n}\r\n\r\nexport function useDebounce(value: T, delay = 500) {\r\n const [debouncedValue, setDebouncedValue] = React.useState();\r\n const timerRef = React.useRef(0);\r\n\r\n React.useEffect(() => {\r\n timerRef.current = setTimeout(() => setDebouncedValue(value), delay) as unknown as number;\r\n\r\n return () => {\r\n clearTimeout(timerRef.current);\r\n };\r\n }, [value, delay]);\r\n\r\n return debouncedValue;\r\n}\r\n"],"names":["renderImg","url","alt","css","height","maxHeight","width","src","loading","style","Logotype","props","imgUrl","includes","SVG","GIF","setInlineStyling","filter","filterColor","black","gray","white","pageLink","className","parentStyling","href","title","imgAlt","target","externalLink","startsWith","LogotypesGrid","mediaObjects","display","logotypesPerView","spaceBetween","buttonLabel","data","cap","setCap","spv","slidesPerView","gap","flex","partiallyHiddenGrid","offset","slice","length","map","item","index","onClick","LogotypesSlideshow","autoplay","hideNavigation","settings","modules","delay","loop","autoHeight","lazy","loopedSlidesLimit","breakpoints","direction","prev","next","setting","Logotypes","grid","NavigationButton","absolute","swiper","leftOrRight","slidePrev","slideNext","clsName","LinkIcon","EmporiInputType","WidthLayout","ContentAlignment","VerticalAlignment","RowAnimationStyle","LogotypesDisplay","FilterColor","BlurType","BlurHorizontalSide","BlurVerticalSide","BlurOption","SpreadsheetFormat","OptionsPropertyType","RelationListStyle","TableFilterOperator","TableColumnType","TableActionType","TableActionStatus","JobReportStatus","MetadataJobStatus","SpreadsheetCellType","MapperOptions","GlobalNoYes","FormSpamProtectionOptions","JobCategory","JobRunResult","LogLevel","FileSizeUnits","KiB","MiB","byte","GiB","TiB","PiB","EiB","FileExtensions","PDF","MP4","OGG","thousandSeparator","num","toString","replace","Direction","ThemeIds"],"sourceRoot":""}