@datawheel/bespoke 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-cf73f4fa.js","sources":["../components/commons/Dialog.tsx","../frontend/components/explore/ExploreFilters.tsx","../frontend/components/explore/ExploreTile.tsx","../frontend/components/explore/ExploreResults.tsx","../models/report.ts","../models/section.ts","../libs/configs/getLocales.ts","../models/block.ts","../libs/stats.js","../libs/libs.ts","../libs/variables/mortarEval.ts","../types/cms.ts","../libs/js/list.ts","../libs/variables/varSwap.ts","../libs/variables/varSwapRecursive.ts","../libs/selectors/scaffoldDynamic.js","../libs/selectors/valueInOptions.ts","../libs/selectors/runSelector.js","../libs/selectors/selectorQueryToVariable.js","../libs/blocks/getBlockContent.ts","../libs/blocks/getRootBlocksForSection.ts","../libs/configs/getLogging.ts","../api/http/lib.ts","../api/http/image/imageSave.ts","../api/http/image/imageSearch.ts","../api/http/index.ts","../libs/blocks/runConsumers.ts","../libs/variables/previewsToAttributes.ts","../libs/ordering.ts","../libs/FUNC.js","../store/lib.ts","../api/lib.ts","../store/recordsSlice.ts","../store/recordsActions.ts","../store/envvars.ts","../store/statusSlice.ts","../store/variablesSlice.ts","../store/actions.ts","../context/ResourceProvider.tsx","../store/hooks.ts","../store/store.ts","../store/withFetcher.tsx","../frontend/components/explore/Explore.tsx","../frontend/components/explore/ExploreModal.tsx","../frontend/components/search/SearchItem.tsx","../frontend/components/search/Search.tsx","../frontend/components/Report.tsx","../libs/js/paramString.ts","../components/builder/DimensionAutocomplete.tsx","../models/dimension.ts","../models/formatter.ts","../models/variant.ts","../models/index.ts","../components/builder/EntityDeleteButton.tsx","../components/builder/DimensionCard.tsx","../libs/js/stripHTML.ts","../libs/js/stripEntities.ts","../libs/js/slugify.ts","../components/builder/EntityCreateButton.tsx","../components/commons/Typography.tsx","../components/builder/VariantCard.tsx","../libs/js/arrayUtils.ts","../libs/web/slugifyInput.ts","../cms/components/components/ConsoleVariable.tsx","../cms/components/components/InputMenuItem.tsx","../components/DrawerContentWithScroll.tsx","../components/builder/VariantEditor.tsx","../components/builder/DimensionEditor.tsx","../components/builder/ReportEditor.tsx","../components/builder/CMSHeader.tsx","../cms/components/components/DeleteButton.tsx","../libs/settings/block.tsx","../cms/components/components/DesignMenu.tsx","../cms/components/components/ApiInput.tsx","../cms/editors/MonacoWrapper.tsx","../libs/blocks/sanitizeBlockContent.ts","../components/blocks/types/renderers/Paragraph.tsx","../components/blocks/types/renderers/Stat.tsx","../components/blocks/types/renderers/Subtitle.tsx","../components/blocks/types/renderers/Title.tsx","../components/blocks/types/renderers/Selector.tsx","../components/blocks/types/renderers/Generator.tsx","../components/blocks/types/renderers/Image.tsx","../components/blocks/types/renderers/index.tsx","../components/blocks/types/adapters/Selector.ts","../components/blocks/types/adapters/index.js","../libs/js/stringifyObject.ts","../components/blocks/types/simpleEditors/SelectorUI.tsx","../components/blocks/types/simpleEditors/index.js","../components/blocks/types/index.js","../components/blocks/BlockPreview.tsx","../components/blocks/VizSettings.tsx","../components/blocks/BlockSettings.tsx","../cms/components/components/InputMenu.tsx","../cms/editors/MCEWrapper.tsx","../libs/js/deepClone.ts","../libs/blocks/stringifyWithTemplate.ts","../cms/editors/RichTextEditor.tsx","../cms/editors/SimpleUI.tsx","../components/blocks/VariableList.tsx","../components/blocks/BlockEditor.tsx","../cms/components/components/ConsumerMenu.tsx","../libs/blocks/scaffoldEmptyBlock.ts","../components/blocks/Block.tsx","../libs/settings/site.ts","../components/blocks/BlockElement.tsx","../components/sections/DesignSectionMenu.tsx","../components/sections/SectionMenu.tsx","../components/options/CopyInput.tsx","../components/SortableTable.tsx","../components/options/tabs/DataTab.tsx","../components/options/tabs/ImageTab.tsx","../components/options/tabs/ShareTab.tsx","../components/options/OptionsModal.tsx","../components/options/Options.tsx","../components/sections/SectionHeader.tsx","../components/sections/SectionBackground.tsx","../components/sections/Section.tsx","../views/EditReport.tsx","../components/metadata/FilterSidebar.tsx","../components/metadata/ImageSelector.tsx","../views/ImagePreview.tsx","../components/metadata/MemberForm.tsx","../components/metadata/MembersTable.tsx","../views/MetadataEditor.tsx","../components/formatters/FilterSidebar.tsx","../components/formatters/FormatterForm.tsx","../components/formatters/FormattersTable.tsx","../views/FormatterEditor.tsx","../components/builder/ReportCard.tsx","../views/PickReport.tsx","../views/BespokeCMS.tsx","../views/BespokeRenderer.tsx"],"sourcesContent":["import {\n Button, Group, Modal, useMantineTheme,\n} from \"@mantine/core\";\nimport React, {useCallback, useContext, useState} from \"react\";\n\ninterface ConfirmPrompt {\n title?: string;\n message: string;\n cancelText?: string;\n confirmText?: string;\n}\ntype Prompt = ConfirmPrompt; // We can add more types of dialogs\n\ntype DialogRequest<T> = {\n request: T;\n onResolve: (value: any) => void;\n onReject: (reason: any) => void;\n}\n\ninterface RequestFactory<T extends Prompt> {\n (request: T, delayed?: false): Promise<void>;\n (request: T, delayed: true): {show(): Promise<void>};\n}\n\ntype DialogContextProps = {\n newConfirmation: RequestFactory<ConfirmPrompt>;\n}\n\nconst DialogContext = React.createContext<DialogContextProps | undefined>(undefined);\n\ntype DialogProviderProps = React.PropsWithChildren<{}>;\n\nexport function DialogProvider(props: DialogProviderProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [current, setCurrent] = useState<DialogRequest<Prompt> | null>(null);\n\n const value = React.useMemo((): DialogContextProps => {\n function newRequest<T extends Prompt>(request: T, delayed?: false): Promise<void>;\n function newRequest<T extends Prompt>(request: T, delayed: true): {show(): Promise<void>};\n function newRequest<T extends Prompt>(request: T, delayed?: boolean) {\n if (delayed) {\n return {show: () => newRequest(request)};\n }\n return new Promise<void>((resolve, reject) => {\n setCurrent({request, onResolve: resolve, onReject: reject});\n setIsOpen(true);\n });\n }\n\n return {\n newConfirmation: newRequest,\n };\n }, []);\n\n const resetDialog = () => {\n setIsOpen(false);\n // The disappearing text is visually jarring - clear it out just a bit later\n setTimeout(() => setCurrent(null), 200);\n };\n\n const confirmHandler = useCallback((value: any) => {\n if (!isOpen || !current) return;\n current.onResolve(value);\n resetDialog();\n }, [isOpen, current]);\n\n const cancelHandler = useCallback((reason: any) => {\n if (!isOpen || !current) return;\n current.onReject(reason);\n resetDialog();\n }, [isOpen, current]);\n\n return (\n <DialogContext.Provider value={value}>\n {current && (\n <ConfirmationDialog\n opened={isOpen}\n request={current.request}\n onConfirm={confirmHandler}\n onCancel={cancelHandler}\n />\n )}\n {props.children}\n </DialogContext.Provider>\n );\n}\n\ntype ConfirmationDialogProps = {\n opened: boolean;\n request: ConfirmPrompt;\n onConfirm: (value?: any) => void;\n onCancel: (reason?: any) => void;\n}\n\nfunction ConfirmationDialog(props: ConfirmationDialogProps) {\n const {\n request, opened, onCancel, onConfirm,\n } = props;\n const theme = useMantineTheme();\n\n return (\n <Modal\n centered\n zIndex={1002}\n opened={opened}\n title={request.title}\n onClose={onCancel}\n >\n {request.message}\n <Group position=\"right\" style={{marginTop: theme.spacing.sm}}>\n <Button onClick={onCancel}>\n {request.cancelText || \"Cancel\"}\n </Button>\n <Button color=\"red\" onClick={onConfirm}>\n {request.confirmText || \"Confirm\"}\n </Button>\n </Group>\n </Modal>\n );\n}\n\nexport function useDialog() {\n const value = useContext(DialogContext);\n if (value === undefined) {\n throw new Error(\"useConfirmationDialog must be used within ConfirmationDialogProvider.\");\n }\n return value;\n}\n","import {Button, Group, Space} from \"@mantine/core\";\nimport {useEffect, useState} from \"react\";\n\n/**\n * Renderer for a single member\n */\nfunction ExploreFilters({metadata, onFilter, initialReportId, initialVariantId}) {\n const [selectors, setSelectors] = useState<any>([]);\n const [filters, setFilters] = useState({profile: undefined, variant: undefined});\n // todo pala check these types\n const [selectedProfile, setSelectedProfile] = useState<any>();\n const [selectedVariant, setSelectedVariant] = useState<any>();\n\n const allMember:any = {id: undefined, name: \"All\"};\n\n /**\n * From a list of arrays, returns the combinatory\n */\n const getVariantsCombinatory = (variantsArrays) => {\n const combinatory = variantsArrays\n .reduce((a, b) => a\n .reduce((r, v) => r\n .concat(b.map(w => [].concat(v, w))), []))\n .map(combination => {\n if (!Array.isArray(combination)) return combination;\n console.log(combination);\n return {\n id: combination.map(c => c.id).join(\",\"),\n name: combination.map(c => c.name).join(\" / \"),\n };\n });\n return [allMember, ...combinatory];\n };\n\n const onClickProfile = (profile) => {\n if (profile !== selectedProfile) {\n setSelectedProfile(profile);\n setSelectedVariant(allMember);\n }\n };\n\n const onClickVariant = (variant) => {\n if (variant !== selectedVariant) {\n setSelectedVariant(variant);\n }\n };\n\n useEffect(() => {\n let newFilters:any = {};\n if (selectedProfile) {\n newFilters.profile = selectedProfile.id;\n }\n if (selectedVariant) {\n newFilters.variant = selectedVariant.id;\n }\n setFilters({...filters, ...newFilters});\n }, [selectedProfile, selectedVariant]);\n\n useEffect(() => {\n // Send item to parents\n onFilter(filters);\n }, [filters]);\n\n useEffect(() => {\n if (metadata) {\n // This structure basically ignore the dimension and combine variants as profiles\n const selectorStructure = metadata\n .filter((profile) => profile.dimensions.length > 0)\n .map((profile) => ({\n id: profile.id,\n name: profile.dimensions.map(d=> d.name).join(\" / \"),\n variants: getVariantsCombinatory(profile.dimensions.map(d => d.variants)),\n }));\n setSelectors([allMember, ...selectorStructure]);\n\n // Initial state\n if (initialReportId || initialVariantId) {\n if (initialReportId) {\n const initialReport = selectorStructure.find((ss) => ss.id === initialReportId);\n setSelectedProfile(initialReport);\n if (initialVariantId && initialReport) {\n setSelectedVariant(initialReport.variants.find((v) => v.id === initialVariantId));\n }\n }\n }\n }\n }, [metadata, initialReportId, initialVariantId]);\n\n return (\n <>\n <Space h=\"md\" />\n {selectors.length > 0 && (\n <Group position=\"center\">\n {selectors.map(s => (\n <Button\n key={`p-${s.id}`}\n variant={s.id === selectedProfile?.id?\"outline\":\"subtle\"}\n onClick={() => onClickProfile(s)}\n >\n {s.name}\n </Button>\n ))}\n </Group>\n )}\n <Space h=\"md\" />\n <Group position=\"center\" style={{minHeight: \"36px\"}}>\n {selectedProfile && selectedProfile.variants && selectedProfile.variants.length > 2 && selectedProfile.variants.map(v => (\n <Button\n key={`v-${v.id}`}\n variant={v.id === selectedVariant?.id ? \"outline\" : \"subtle\"}\n onClick={() => onClickVariant(v)}\n >\n {v.name}\n </Button>\n ))}\n </Group>\n <Space h=\"md\" />\n </>\n );\n}\n\nexport default ExploreFilters;\n","import {\n Badge, Button, Card, Group, Text, Image, Grid, Stack,\n} from \"@mantine/core\";\nimport Link from \"next/link\";\n\n/**\n * Renderer for a single member\n */\nfunction ExploreTile({profile, profilePrefix}) {\n const url = `${profilePrefix}${profile.path}`;\n\n const images = profile.members.map((m) => (\n <Image\n key={m.id}\n src={`/api/cms/member/image.png?member=${m.id}&size=thumb`}\n height={160}\n alt=\"Norway\"\n />\n ));\n\n const names = profile.members.map((m) => (\n <Stack key={m.id}>\n <Text weight={500}>{m.name}</Text>\n <Badge color=\"green\" variant=\"light\">\n {m.metadata.variant.name}\n </Badge>\n </Stack>\n ));\n\n return (\n <Grid.Col key={profile.id} xs={12} sm={6} md={4} lg={4} xl={3}>\n <Card shadow=\"sm\" p=\"lg\" radius=\"md\" withBorder>\n <Card.Section>\n <Group grow spacing={0}>\n {images}\n </Group>\n </Card.Section>\n\n <Group position=\"apart\" mt=\"md\" mb=\"xs\">\n {names}\n </Group>\n\n <Link href={url}>\n <Button variant=\"light\" color=\"blue\" fullWidth mt=\"md\" radius=\"md\">\n {`See ${profile.report.name} Report`}\n </Button>\n </Link>\n </Card>\n </Grid.Col>\n );\n}\n\nexport default ExploreTile;\n","import {Grid, ScrollArea} from \"@mantine/core\";\nimport {useState, useEffect} from \"react\";\nimport ExploreTile from \"./ExploreTile\";\nimport {SearchReportItem} from \"../../types\";\n\ntype ExploreResultsProps = {\n results: SearchReportItem[];\n profilePrefix: string;\n}\n\n/**\n * Render explore results items\n */\nfunction ExploreResults({results = [], profilePrefix}:ExploreResultsProps) {\n const [scrollSize, setScrollSize] = useState(500);\n\n useEffect(() => {\n // Updated scroller area size, replace with a proper css layout\n const {innerHeight} = window;\n setScrollSize(innerHeight - 200);\n }, []);\n\n return (\n <ScrollArea offsetScrollbars type=\"always\" style={{height: scrollSize}}>\n <Grid align=\"stretch\">\n {results.map(\n (item:SearchReportItem) => <ExploreTile key={item.id} profile={item} profilePrefix={profilePrefix} />,\n )}\n </Grid>\n </ScrollArea>\n );\n}\n\nexport default ExploreResults;\n","import * as DimensionModel from \"./dimension\";\nimport * as SectionModel from \"./section\";\n\nexport const ID = \"report\";\n\nexport const MODEL_NAME = \"Report\";\n\nexport const PARENT_MODEL = null;\n\nexport enum ENTITY_TYPE {\n REPORT = \"report\",\n STORY = \"story\",\n}\n\nexport enum ENTITY_FIELD {\n TITLE = \"title\",\n SUBTITLE = \"subtitle\",\n LABEL = \"label\",\n}\n\ntype ReportType = \"report\" | \"story\";\n\ntype TypeReportSettings = {\n label: string;\n title?: string;\n subtitle?: string;\n}\ntype TypeStorySettings = {\n label: string;\n title?: string;\n subtitle?: string;\n}\ntype EntitySettings = {\n report: TypeReportSettings;\n story: TypeStorySettings;\n}\n\nexport interface Report<T extends ReportType> {\n /** Entity ID */\n id: number;\n\n name: string;\n visible: boolean;\n date: string;\n type: T;\n settings: EntitySettings[T];\n}\n\nexport interface NestedReport<T extends ReportType> extends Report<T> {\n dimensions: DimensionModel.NestedDimension[];\n sections: SectionModel.NestedSection[];\n}\nexport interface NormalizedReport<T extends ReportType> extends Report<T> {\n dimensions: number[];\n sections: number[];\n}\n\nexport type AnyReport = Report<\"report\"> | Report<\"story\">;\nexport type AnyNestedReport = NestedReport<\"report\"> | NestedReport<\"story\">;\nexport type AnyNormalizedReport = NormalizedReport<\"report\"> | NormalizedReport<\"story\">;\n","import * as ReportModel from \"./report\";\nimport * as BlockModel from \"./block\";\n\nexport const ID = \"section\";\n\nexport const MODEL_NAME = \"Section\";\n\nexport const PARENT_MODEL = ReportModel.ID;\n\ntype EntitySettings = {\n allowed: string;\n allowedLogic: string;\n icon: string;\n position: string;\n memberImageBg: boolean;\n}\n\nexport interface Section {\n /** Entity ID */\n id: number;\n /** Parent Report ID */\n report_id: number;\n\n heading: number;\n ordering: string;\n settings: EntitySettings;\n}\n\nexport interface NestedSection extends Section {\n blocks: BlockModel.AnyNestedBlock[];\n}\nexport interface NormalizedSection extends Section {\n blocks: number[];\n}\n","export default (): {localeDefault: string, locales: string[]} => {\n const localeDefault = process.env.NEXT_PUBLIC_REPORTS_LOCALE_DEFAULT || \"en\";\n const locales = process.env.NEXT_PUBLIC_REPORTS_LOCALES?.split(\",\") || [localeDefault];\n if (!locales.includes(localeDefault)) locales.push(localeDefault);\n return {localeDefault, locales};\n};\n","import * as SectionModel from \"./section\";\n\nimport getLocales from \"../libs/configs/getLocales\";\n\nconst {localeDefault} = getLocales();\n\nexport const ID = \"block\";\n\nexport const MODEL_NAME = \"Block\";\n\nexport const PARENT_MODEL = SectionModel.ID;\n\nexport type BlockType =\n | \"generator\"\n | \"image\"\n | \"paragraph\"\n | \"selector\"\n | \"stat\"\n | \"subtitle\"\n | \"title\"\n | \"visualization\";\n\ntype BlockSettings = {\n width?: string;\n display?: string;\n align?: string;\n}\n\ntype TypeGeneratorSettings = {};\ntype TypeImageSettings = {}\ntype TypeParagraphSettings = {}\ntype TypeSelectorSettings = {}\ntype TypeStatSettings = {\n allowed: string;\n allowedLogic: string;\n name: string;\n description?: string;\n}\ntype TypeSubtitleSettings = {}\ntype TypeTitleSettings = {}\ntype TypeVizSettings = {}\n\ntype EntitySettings = {\n generator: TypeGeneratorSettings;\n image: TypeImageSettings;\n paragraph: TypeParagraphSettings;\n selector: TypeSelectorSettings;\n stat: TypeStatSettings;\n subtitle: TypeSubtitleSettings;\n title: TypeTitleSettings;\n visualization: TypeVizSettings;\n}\n\nexport interface LocaleContent {\n id: number;\n locale: string;\n content: Record<string, unknown>;\n}\n\nexport interface Block<T extends BlockType> {\n /** Entity ID */\n id: number;\n /** Parent Report ID */\n section_id: number;\n\n blockcol: string;\n blockrow: string;\n contentByLocale: Record<string, LocaleContent>;\n settings: EntitySettings[T] & BlockSettings;\n shared: boolean;\n type: T;\n}\n\nexport interface NestedBlock<T extends BlockType> extends Block<T> {\n inputs: AnyBlock[];\n consumers: AnyBlock[];\n}\nexport interface NormalizedBlock<T extends BlockType> extends Block<T> {\n inputs: number[];\n consumers: number[];\n}\n\nexport type AnyBlock =\n | Block<\"image\">\n | Block<\"paragraph\">\n | Block<\"selector\">\n | Block<\"stat\">\n | Block<\"subtitle\">\n | Block<\"title\">\n | Block<\"generator\">\n | Block<\"visualization\">;\n\nexport type AnyNestedBlock =\n | NestedBlock<\"image\">\n | NestedBlock<\"paragraph\">\n | NestedBlock<\"selector\">\n | NestedBlock<\"stat\">\n | NestedBlock<\"subtitle\">\n | NestedBlock<\"title\">\n | NestedBlock<\"generator\">\n | NestedBlock<\"visualization\">;\n\nexport type AnyNormalizedBlock =\n | NormalizedBlock<\"image\">\n | NormalizedBlock<\"paragraph\">\n | NormalizedBlock<\"selector\">\n | NormalizedBlock<\"stat\">\n | NormalizedBlock<\"subtitle\">\n | NormalizedBlock<\"title\">\n | NormalizedBlock<\"generator\">\n | NormalizedBlock<\"visualization\">;\n\n/**\n * In order to execute its logic, a block needs a \"BlockContext\", which includes:\n * - The variables in scope\n * - Any query arguments from selector states\n * - The current locale\n */\nexport type BlockContext = {\n variables: Record<string, any>,\n query: Record<string, any>,\n locale: string,\n}\n\nexport type BlockContextPartial = Partial<BlockContext>\n\nexport function parseBlockContext(context: BlockContextPartial): BlockContext {\n return {\n variables: context.variables || {},\n query: context.query || {},\n locale: context.locale || localeDefault,\n };\n}\n","// adapted from http://www.math.ucla.edu/~tom/distributions/binomial.html\n/** */\nfunction logGamma(Z) {\n const S = 1 + 76.18009173 / Z - 86.50532033 / (Z + 1) + 24.01409822 / (Z + 2) - 1.231739516 / (Z + 3) + 0.00120858003 / (Z + 4) - 0.00000536382 / (Z + 5);\n return (Z - 0.5) * Math.log(Z + 4.5) - (Z + 4.5) + Math.log(S * 2.50662827465);\n}\n\n/** */\nfunction betinc(X, A, B) {\n let A0 = 0;\n let B0 = 1;\n let A1 = 1;\n let B1 = 1;\n let M9 = 0;\n let A2 = 0;\n let C9;\n while (Math.abs((A1 - A2) / A1) > 0.00001) {\n A2 = A1;\n C9 = -(A + M9) * (A + B + M9) * X / (A + 2 * M9) / (A + 2 * M9 + 1);\n A0 = A1 + C9 * A0;\n B0 = B1 + C9 * B0;\n M9 += 1;\n C9 = M9 * (B - M9) * X / (A + 2 * M9 - 1) / (A + 2 * M9);\n A1 = A0 + C9 * A1;\n B1 = B0 + C9 * B1;\n A0 /= B1;\n B0 /= B1;\n A1 /= B1;\n B1 = 1;\n }\n return A1 / A;\n}\n\n/** */\nfunction binomialCdf(X, N, P) {\n let betacdf; let\n bincdf;\n if (X < 0) bincdf = 0;\n else if (X >= N) bincdf = 1;\n else {\n X = Math.floor(X);\n const Z = P;\n const A = X + 1;\n const B = N - X;\n const S = A + B;\n const BT = Math.exp(logGamma(S) - logGamma(B) - logGamma(A) + A * Math.log(Z) + B * Math.log(1 - Z));\n if (Z < (A + 1) / (S + 2)) {\n betacdf = BT * betinc(Z, A, B);\n } else {\n betacdf = 1 - BT * betinc(1 - Z, B, A);\n }\n bincdf = 1 - betacdf;\n }\n return Math.round(bincdf * 100000) / 100000;\n}\n\n/**\nCompute mid-p confidence interval around single ratio\nCredit to @JogoShugh\nSourced from: https://github.com/JogoShugh/OpenEpi.com/blob/8c90dc075c6a9b8e2a8de8ff26d7cd0b1987762a/OpenEpi/Proportion/Proportion.js\n*/\n\n/**\n *\n */\nfunction criticalValue(confLevel) {\n // Returns z value for various levels of confidence and 1 degree\n // of freedom. OEConfLevel must be expressed as\n // a string with two digits, then two optional digits, without a % sign.\n const critMap = {\n 0.99999: 15.137,\n 0.99: 6.635,\n 0.95: 3.841,\n 0.9: 2.706,\n };\n // TODO: check if confLevel in critMap\n return critMap[confLevel];\n}\n\n/**\n *\n */\nfunction binP(N, p, x1, x2) {\n const q = p / (1 - p);\n let k = 0;\n let v = 1;\n let s = 0;\n let tot = 0;\n while (k <= N) {\n tot += v;\n if (k >= x1 & k <= x2) {\n s += v;\n }\n if (tot > 1e30) {\n s /= 1e30;\n tot /= 1e30;\n v /= 1e30;\n }\n k += 1;\n v = v * q * (N + 1 - k) / k;\n }\n return s / tot;\n}\n\n/**\n *\n */\nfunction computeMidP(vx, vN, confLevel) {\n // TODO check vx and vN are >= 0\n // TODO check vx not larger than n\n const vP = vx / vN;\n // const npq = vN * vP * (1 - vP);\n // const crit = criticalValue(confLevel);\n // const zL = Math.sqrt(crit);\n // const zSquare = Math.pow(zL, 2);\n const prob = confLevel * 100;\n const vTL = (100 - prob) / 2;\n\n let T1; let\n T2;\n if (vx === 0) {\n T1 = 0;\n } else {\n let v = vP / 2;\n let vsL = 0;\n let vsH = vP;\n const p = vTL / 100;\n while (vsH - vsL > 1e-5) {\n if (binP(vN, v, vx, vx) * 0.5 + binP(vN, v, vx + 1, vN) > p) {\n vsH = v;\n v = (vsL + v) / 2;\n } else {\n vsL = v;\n v = (vsH + v) / 2;\n }\n }\n T1 = v;\n }\n if (vx === vN) {\n T2 = 0;\n } else {\n let v = (1 + vP) / 2;\n let vsL = vP;\n let vsH = 1;\n const p = vTL / 100;\n while (vsH - vsL > 1e-5) {\n if (binP(vN, v, vx, vx) * 0.5 + binP(vN, v, 0, vx - 1) < p) {\n vsH = v;\n v = (vsL + v) / 2;\n } else {\n vsL = v;\n v = (vsH + v) / 2;\n }\n }\n T2 = v;\n }\n\n return {lci: T1, uci: T2};\n}\n\n/**\n * Adapted from JogoShugh's SMR https://github.com/JogoShugh/OpenEpi.com/blob/master/OpenEpi/SMR/SMR.js\n * @param {*} observedVal\n * @param {*} expectedVal\n */\nfunction smr(observedVal, expectedVal) {\n /* Calculates standard morbidity ratio given observed and expected values */\n const vx = observedVal;\n const vN = expectedVal;\n\n // Fisher's exact test for poisson distribution ;\n const Obs = vx;\n const Exp = vN;\n\n const ci = 95; // currently hard-wired to 95% CI\n\n // Mid-P exact test;\n // Lower tail;\n let v = 0.5;\n let dv = 0.5;\n const vTL = (100 - ci) / 2;\n let p = vTL / 100;\n\n const vZ = Obs;\n while (dv > 1e-5) {\n dv /= 2; if (poisP((1 + vZ) * v / (1 - v), vZ + 1, 1e10) + 0.5 * poisP((1 + vZ) * v / (1 - v), vZ, vZ) > p) {\n v -= dv;\n } else {\n v += dv;\n }\n }\n\n const QL = (1 + vZ) * v / (1 - v) / Exp;\n\n // Upper tail;\n v = 0.5;\n dv = 0.5;\n const vTU = (100 - ci) / 2;\n p = vTU / 100;\n\n while (dv > 1e-5) {\n dv /= 2; if (poisP((1 + vZ) * v / (1 - v), 0, vZ - 1) + 0.5 * poisP((1 + vZ) * v / (1 - v), vZ, vZ) < p) {\n v -= dv;\n } else {\n v += dv;\n }\n }\n const QU = (1 + vZ) * v / (1 - v) / Exp;\n return {lci: QL, uci: QU};\n}\n\n/**\n * Poisson iteration;\n * @param {*} Z\n * @param {*} x1\n * @param {*} x2\n */\nfunction poisP(Z, x1, x2) {\n let q = 1; let tot = 0; let s = 0; let k = 0;\n while (k < Z || q > tot * 1e-10) {\n tot += q;\n if (k >= x1 & k <= x2) {\n s += q;\n }\n if (tot > 1e30) {\n s /= 1e30; tot /= 1e30; q /= 1e30;\n }\n k += 1; q = q * Z / k;\n }\n return s / tot;\n}\n\nexport default {\n binomialCdf,\n binP,\n computeMidP,\n criticalValue,\n smr,\n};\n","import * as d3Array from \"d3-array\";\nimport * as d3Collection from \"d3-collection\";\nimport * as d3Format from \"d3-format\";\nimport * as d3TimeFormat from \"d3-time-format\";\nimport {formatAbbreviate} from \"d3plus-format\";\nimport {date} from \"d3plus-axis\";\nimport {assign, closest, merge} from \"d3plus-common\";\nimport {strip, titleCase} from \"d3plus-text\";\nimport stats from \"./stats\";\n\nexport const libs = {\n d3: {\n ...d3Array, ...d3Collection, ...d3Format, ...d3TimeFormat,\n },\n d3plus: {\n assign, closest, date, formatAbbreviate, merge, strip, titleCase,\n },\n stats,\n} as const;\n\nexport type EnvLibs = typeof libs;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype FormatterFn = (...args: any[]) => any;\n\ninterface FormatterManifest {\n name: string;\n description: string;\n logicFactory: (libs: EnvLibs) => FormatterFn;\n inputType: \"string\" | \"number\" | \"object\" | \"date\";\n testValue: string;\n type: \"formatter\" | \"function\";\n}\n\ninterface FormatterContent {\n description: string;\n inputType: string;\n logic: string;\n testValue: string;\n type: string;\n [key: string]: string;\n}\n\nexport const declaredFormatters: Record<string, FormatterContent> = {};\n\nexport function declareFormatter(manifest: FormatterManifest) {\n const func = manifest.logicFactory(libs);\n declaredFormatters[manifest.name] = {\n description: manifest.description,\n inputType: manifest.inputType,\n logic: stringifyFn(func),\n testValue: manifest.testValue,\n type: manifest.type || \"formatter\",\n };\n return func;\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction stringifyFn(func: Function): string {\n const strFunc = func.toString().trim();\n if (strFunc.startsWith(\"function\")) {\n return strFunc\n .replace(/^function(?:\\s\\w+)?\\([^\\)]\\)/, \"\")\n .trim()\n .replace(/^{([\\s\\S]+)\\}$/, \"$1\");\n }\n const noArgs = strFunc.replace(/^.+?=>/, \"\").trim();\n return noArgs.startsWith(\"{\")\n ? noArgs.replace(/^{([\\s\\S]+)\\}$/, \"$1\")\n : `return ${noArgs}`;\n}\n\nexport default libs;\n","import yn from \"yn\";\nimport {BlockContext, parseBlockContext} from \"../../models/block\";\nimport libs from \"../libs\";\n\nconst verbose = yn(process.env.REPORTS_LOGGING);\n\n// todo1.0 this will have be rewritten, including its comments, to match 1.0 logic\n\nexport default mortarEval;\n\nfunction mortarEval(\n varInnerName: string,\n varOuterValue: any,\n logic: string,\n formatterFunctions: Record<string, any>,\n attributes: undefined | object = undefined,\n blockContext: Partial<BlockContext>,\n) {\n const vars = {};\n /**\n * Do not delete these next few lines! The eval code below requires these variables\n * to be in scope, but because they are technically \"unused\" in the primary code of\n * this function, typescript complains.\n */\n const {locale} = parseBlockContext(blockContext);\n\n // Because logic is arbitrary javascript, it may be malformed. We need to wrap the\n // entire execution in a try/catch.\n try {\n if (varOuterValue) {\n const log: string[] = [];\n const pConsole = new Proxy(console, {\n get(target, prop: string) {\n if (isInSet(prop, \"log\", \"debug\", \"info\", \"warn\", \"error\")) {\n return (...args: unknown[]) => {\n log.push(`${prop} ${Date.now()} - ${args.join(\" \")}`);\n if (verbose) target[prop](...args);\n }\n }\n return target[prop];\n },\n });\n\n let output;\n if (attributes) {\n // If attributes has been set, this is being run by a generator who is providing search attributes.\n // We want those attributes to be available as variables, so pass that in as an argument\n // eslint-disable-next-line\n const fn = new Function(varInnerName, \"console\", \"libs\", \"formatters\", \"locale\", \"variables\", logic);\n output = fn(varOuterValue, pConsole, libs, formatterFunctions, locale, attributes);\n } else {\n // If attributes hasn't been set, this is being run by a materializer. Because a materializer can't ever\n // be run without generators being run first (and injecting attributes above), we don't need anything special\n // and can just pass in the variables as normal (via varInnerName)\n // eslint-disable-next-line\n const fn = new Function(varInnerName, \"console\", \"libs\", \"formatters\", \"locale\", logic);\n output = fn(varOuterValue, pConsole, libs, formatterFunctions, locale);\n }\n // If evaluation result is valid object, inject content into vars\n if (typeof output === \"object\" && Object.keys(output).length > 0) {\n Object.assign(vars, output);\n }\n // A successfully run eval will return the vars generated\n return {vars, error: null, log};\n }\n\n // If varOuterValue was null, then the API that gave it to us was incorrect\n return {vars, error: \"Invalid API Link\"};\n } catch (err: any) {\n // An unsuccessfully run eval returns the error\n return {vars, error: err.message};\n }\n}\n\nfunction isInSet<T extends string>(value: string, ...args: T[]): value is T {\n return args.includes(value as T);\n}\n","/**\n * Top-level entity types - every \"entity\" in the CMS is one of these,\n * and has CRUD operations accordingly.\n */\nexport const ENTITY_TYPES = {\n REPORT: \"report\",\n SECTION: \"section\",\n BLOCK: \"block\",\n INPUT: \"block_input\",\n FORMATTER: \"formatter\",\n DIMENSION: \"report_dimension\",\n VARIANT: \"report_dimension_variant\",\n SEARCH: \"search\",\n};\n\nexport const CONTENT_TYPES = [ENTITY_TYPES.BLOCK, ENTITY_TYPES.SEARCH];\n\n/**\n * For each ENTITY_TYPE, store a pretty name for window titles, etc.\n */\nexport const ENTITY_PRETTY_NAMES = {\n report: \"Report\",\n section: \"Section\",\n block: \"Block\",\n block_input: \"Input\",\n formatter: \"Formatter\",\n dimension: \"Dimension\",\n variant: \"Variant\",\n search: \"Search\",\n};\n\nexport const ENTITY_PARENT_REFS = {\n [ENTITY_TYPES.SECTION]: \"report_id\",\n [ENTITY_TYPES.DIMENSION]: \"report_id\",\n [ENTITY_TYPES.VARIANT]: \"dimension_id\",\n [ENTITY_TYPES.BLOCK]: \"section_id\",\n [ENTITY_TYPES.INPUT]: \"block_id\",\n};\n\n/**\n * Reports and stories are nearly identical, but stories have a\n * publish date, and support for footnotes / authors\n */\nexport const REPORT_TYPES = {\n REPORT: \"report\",\n STORY: \"story\",\n};\n\n/**\n * Report mode is a simplification of dimension.length === 1 ? 'uni':'multi'\n */\nexport const REPORT_MODES = {\n UNILATERAL: \"uni\",\n MULTILATERAL: \"multi\",\n};\n\n/**\n * Selectors have two types, single and multi\n */\nexport const SELECTOR_TYPES = {\n SINGLE: \"single\",\n MULTI: \"multi\",\n};\n\n/**\n * NOTE ON FIELDS, MAPS, AND SETTINGS\n * Many elements of the CMS are stored as JSON blobs in the database, to allow\n * easy addition of new or custom keys without a database migration. However, the\n * standard keys for any given entity or settings element are contained here.\n * FIELDS - all available fields for a given entity, regardless of type\n * MAP - what subset of those fields belong to which type of that entity\n * SETTINGS - a list of settings keys expected in the settings object\n */\n\nexport const REPORT_FIELDS = {\n TITLE: \"title\",\n SUBTITLE: \"subtitle\",\n LABEL: \"label\",\n};\n\nexport const REPORT_MAP = {\n [REPORT_TYPES.REPORT]: Object.values(REPORT_FIELDS),\n [REPORT_TYPES.STORY]: Object.values(REPORT_FIELDS),\n};\n\nexport const ALLOWED = {\n ALLOWED: \"allowed\",\n ALLOWED_LOGIC: \"allowedLogic\",\n};\n\nexport const VIZ_SETTINGS = {\n VIZ_SETTINGS_LOGIC: \"vizSettingsLogic\",\n};\n\nexport const REPORT_SETTINGS = {\n ...ALLOWED,\n};\n\nexport const SECTION_FIELDS = {\n TITLE: \"title\",\n SHORT: \"short\",\n};\n\nexport const SECTION_SETTINGS = {\n POSITION: \"position\",\n ICON: \"icon\",\n ...ALLOWED,\n};\n\nexport const BLOCK_CONTENT_TYPES = {\n // AUTHOR: \"author\",\n // FOOTNOTE: \"footnote\",\n IMAGE: \"image\",\n PARAGRAPH: \"paragraph\",\n SELECTOR: \"selector\", // todo1.0 - move to logic types\n STAT: \"stat\",\n SUBTITLE: \"subtitle\",\n TITLE: \"title\",\n // todo1.0, how to put custom blocks in here?\n};\n\nexport const BLOCK_LOGIC_TYPES = {\n GENERATOR: \"generator\",\n VIZ: \"visualization\",\n};\n\nexport const BLOCK_LOGIC_LOCALE = \"logic\";\n\nexport const BLOCK_TYPES = {...BLOCK_CONTENT_TYPES, ...BLOCK_LOGIC_TYPES};\n\n// Types that shouldn't update on keystroke -- only after the user presses execute.\nexport const BLOCK_EXECUTE_TYPES = [\n BLOCK_TYPES.GENERATOR,\n BLOCK_TYPES.SELECTOR,\n BLOCK_TYPES.VIZ,\n BLOCK_TYPES.IMAGE,\n];\n\nexport const BLOCK_FIELDS = {\n ALT: \"alt\",\n AUTHOR: \"author\",\n FOOTNOTE: \"footnote\",\n BIO: \"bio\",\n IMAGE: \"image\",\n LOGIC: \"logic\",\n SIMPLE: \"simple\",\n SIMPLE_ENABLED: \"simpleEnabled\",\n PARAGRAPH: \"paragraph\",\n SELECTOR_DEFAULT: \"selectorDefault\",\n SELECTOR_DYNAMIC: \"selectorDynamic\",\n SELECTOR_NAME: \"selectorName\",\n SELECTOR_TYPE: \"selectorType\",\n SRC: \"src\",\n SLUG: \"slug\",\n SUBTITLE: \"subtitle\",\n TITLE: \"title\",\n TOOLTIP: \"tooltip\",\n TWITTER: \"twitter\",\n VALUE: \"value\",\n};\n\n/**\n * When exporting content variables for use by other blocks, skip over the following fields\n */\nexport const BLOCK_FIELDS_EXCLUDE = [\n BLOCK_FIELDS.LOGIC,\n BLOCK_FIELDS.SIMPLE,\n BLOCK_FIELDS.SIMPLE_ENABLED,\n];\n\nexport const BLOCK_MAP = {\n /*\n [BLOCK_TYPES.AUTHOR]: [\n BLOCK_FIELDS.AUTHOR,\n BLOCK_FIELDS.BIO,\n BLOCK_FIELDS.IMAGE,\n BLOCK_FIELDS.TITLE,\n ],\n [BLOCK_TYPES.FOOTNOTE]: [\n BLOCK_FIELDS.FOOTNOTE,\n ],\n */\n [BLOCK_TYPES.IMAGE]: [\n BLOCK_FIELDS.SRC,\n BLOCK_FIELDS.ALT,\n ],\n [BLOCK_TYPES.PARAGRAPH]: [\n BLOCK_TYPES.PARAGRAPH,\n BLOCK_FIELDS.TOOLTIP,\n ],\n [BLOCK_TYPES.SELECTOR]: [\n BLOCK_FIELDS.SELECTOR_DEFAULT,\n BLOCK_FIELDS.SELECTOR_DYNAMIC,\n BLOCK_FIELDS.SELECTOR_NAME,\n BLOCK_FIELDS.SELECTOR_TYPE,\n ],\n [BLOCK_TYPES.STAT]: [\n BLOCK_FIELDS.TITLE,\n BLOCK_FIELDS.SUBTITLE,\n BLOCK_FIELDS.VALUE,\n BLOCK_FIELDS.TOOLTIP,\n ],\n [BLOCK_TYPES.SUBTITLE]: [\n BLOCK_FIELDS.SUBTITLE,\n BLOCK_FIELDS.TOOLTIP,\n ],\n [BLOCK_TYPES.TITLE]: [\n BLOCK_FIELDS.TITLE,\n BLOCK_FIELDS.SLUG,\n BLOCK_FIELDS.TOOLTIP,\n ],\n [BLOCK_TYPES.GENERATOR]: [],\n [BLOCK_TYPES.VIZ]: [],\n};\n\n/*\nObject.keys(BLOCK_MAP).forEach(k => {\n BLOCK_MAP[k] = BLOCK_MAP[k].concat([\n BLOCK_FIELDS.LOGIC,\n BLOCK_FIELDS.LOGIC_ENABLED,\n BLOCK_FIELDS.LOGIC_SIMPLE,\n BLOCK_FIELDS.LOGIC_SIMPLE_ENABLED\n ]);\n});\n*/\n\nexport const BLOCK_SETTINGS = {\n NAME: \"name\",\n DESCRIPTION: \"description\",\n ...ALLOWED,\n};\n\n/**\n * Reports could have several dimensions:\n * - One dimension only is the default and is called UNILATERAL.\n * - More than one dimension is called MULTILATERAL.\n */\nexport const REPORT_MEMBER_TYPES = {\n UNILATERAL: \"uni\",\n MULTILATERAL: \"multi\",\n};\n\n/**\n * Formatter types\n * - \"formatter\" for a regular small thing to calculate or decorate some results\n * - \"function\" for bigger and global functions we want to use\n */\nexport const FORMATTER_TYPES = {\n FORMATTER: \"formatter\",\n FUNCTION: \"function\"\n};\nexport const FORMATTER_TYPES_NAMES = {\n [FORMATTER_TYPES.FORMATTER]: \"Formatter\",\n [FORMATTER_TYPES.FUNCTION]: \"Function\",\n};\n\n/**\n * Input type for formatter functions help us parse, call and test\n */\nexport const FORMATTER_INPUT_TYPES = {\n STRING: \"string\",\n NUMBER: \"number\",\n OBJECT: \"object\",\n DATE: \"date\",\n};\nexport const FORMATTER_INPUT_TYPES_NAMES = {\n [FORMATTER_INPUT_TYPES.STRING]: \"String\",\n [FORMATTER_INPUT_TYPES.NUMBER]: \"Number\",\n [FORMATTER_INPUT_TYPES.OBJECT]: \"Object/Array\",\n [FORMATTER_INPUT_TYPES.DATE]: \"Date\",\n};","/* eslint-disable no-param-reassign */\n/**\n * Joins an array of strings together, adding commas and \"and\" when necessary.\n * @param {object} n [\"foo\",\"bar\",\"bee\"]\n */\nexport default function list(n:[]) {\n return n.reduce((str, item, i) => {\n if (!i) str += item;\n else if (i === n.length - 1 && i === 1) str += ` and ${item}`;\n else if (i === n.length - 1) str += `, and ${item}`;\n else str += `, ${item}`;\n return str;\n }, \"\");\n}\n","import {BlockContextPartial, parseBlockContext} from \"../../models/block\";\nimport list from \"../js/list\";\nimport {EnvLibs, libs} from \"../libs\";\n\ntype Formatter = (d: string, libs: EnvLibs, funcs: FormatterMap) => string;\ntype FormatterMap = Record<string, Formatter>;\n\nexport default varSwap;\n\n/* Given an object, a hashtable of formatting functions, and a lookup object full of variables\n * Replace every instance of {{var}} with its true value from the lookup object, and\n * apply the appropriate formatter\n */\nfunction varSwap(\n sourceString: string,\n formatterFunctions: FormatterMap,\n blockContext: BlockContextPartial,\n passive = false,\n) {\n const {variables} = parseBlockContext(blockContext);\n\n // Find all instances of the following type: FormatterName{{VarToReplace}}\n if (!sourceString) return sourceString;\n\n // eslint-disable-next-line no-useless-escape\n const match = /([A-z0-9]*)\\{\\{([^\\}]+)\\}\\}/g;\n const resultString = sourceString.replace(match, (match, g1: string, keyMatch: string) => {\n // Get the function from the hash table using the lookup key FormatterName (or no-op if not found)\n let formatter: Formatter = (d) => d; //eslint-disable-line\n if (g1) {\n const formatTitle = g1.replace(/^\\w/g, (chr) => chr.toLowerCase());\n if (formatTitle in formatterFunctions) {\n formatter = formatterFunctions[formatTitle];\n }\n }\n\n const value = Array.isArray(variables[keyMatch])\n ? list(variables[keyMatch])\n : variables[keyMatch] as string;\n // passive mode is used by dynamic selectors as a \"first pass\" to apply dynamic selector labels\n // in that case, make fails a no-op, as the \"real\" varSwap is coming later.\n if (value === undefined) {\n return passive ? match : \"N/A\";\n }\n // The user-created formatter may be malformed. Wrap in a try/catch so bad js in a\n // formatter doesn't cause the CMS to crash.\n\n try {\n return formatter(value, libs, formatterFunctions);\n } catch (err: any) {\n console.error(\n `Error using formatter ${formatter.name}\\n`,\n `Error message: ${err.message}`,\n );\n return \"N/A\";\n }\n });\n return resultString;\n}\n","import varSwap from \"./varSwap\";\n\n/* Given an object, a hashtable of formatting functions, and a lookup object full of variables\n * Replace every instance of {{var}} with its true value from the lookup object, and\n * apply the appropriate formatter\n*/\n\nconst varSwapRecursive = (sourceObj, formatterFunctions, blockContext) => {\n const {variables} = blockContext;\n // todo1.0 this needs to use programmatic allowed\n const allowed = (obj) => (obj.allowed === \"never\"\n ? false\n : !obj.allowed || obj.allowed === \"always\" || variables[obj.allowed]\n );\n const obj = {...sourceObj};\n Object.keys(obj).forEach((skey) => {\n // If this property is a string, replace all the vars\n if (typeof obj[skey] === \"string\") {\n obj[skey] = varSwap(obj[skey], formatterFunctions, blockContext);\n } else if (Array.isArray(obj[skey])) {\n // If this property is an array, recursively swap all elements\n obj[skey] = obj[skey].filter(allowed).map((o) => {\n if (typeof o === \"object\") {\n return varSwapRecursive(o, formatterFunctions, blockContext);\n }\n // If this is a string, we've \"hit bottom\" and can swap it out with strSwap\n if (typeof o === \"string\") {\n return varSwap(o, formatterFunctions, blockContext);\n }\n return o;\n });\n } else if (typeof obj[skey] === \"object\" && obj[skey] !== null && !(obj[skey] instanceof Date)) {\n // If this property is an object, recursively do another swap\n // For some reason, postgres \"DATE\" props come through as objects. Exclude them from this object swap.\n obj[skey] = varSwapRecursive(obj[skey], formatterFunctions, blockContext);\n }\n });\n return obj;\n};\n\nexport default varSwapRecursive;\n","// Scaffold user-defined selector array into full-fledged Selector\n// todo1.0 - delete once runSelector changes!\nexport default (optionsArray) => {\n if (!Array.isArray(optionsArray)) return [];\n return optionsArray.map((d) => (\n typeof d === \"string\"\n ? {allowed: \"always\", label: d, id: d}\n : {allowed: \"always\", label: d.id, ...d}\n ));\n};\n","import {SELECTOR_TYPES} from \"../../types/cms\";\n\n/**\n * Determines if the provided value(s) are all valid options\n */\nexport default (type, value, options) => {\n if (!options) return false;\n if (type === SELECTOR_TYPES.SINGLE) {\n return options.find((obj) => obj.id === value);\n }\n // multi\n return Array.isArray(value) && value.every((d) => options.map((o) => o.id).includes(d));\n};\n","import {parseBlockContext} from \"../../models/block\";\nimport {SELECTOR_TYPES} from \"../../types/cms\";\nimport mortarEval from \"../variables/mortarEval\";\nimport varSwapRecursive from \"../variables/varSwapRecursive\";\nimport scaffoldDynamic from \"./scaffoldDynamic\";\nimport valueInOptions from \"./valueInOptions\";\n\n// todo1.0 - delete once runSelector changes!\nexport default (logic, formatterFunctions, blockContext) => {\n const {variables} = parseBlockContext(blockContext);\n const transpiledLogic = varSwapRecursive({logic}, formatterFunctions, blockContext).logic;\n const evalResult = mortarEval(\"variables\", variables, transpiledLogic, formatterFunctions, undefined, blockContext);\n const {vars, log, error} = evalResult;\n const type = vars.type || SELECTOR_TYPES.SINGLE;\n const name = vars.name || \"Unlabeled Selector\";\n const options = scaffoldDynamic(vars.options || []);\n\n const maybeFixForMulti = (defaultValue) => (type === SELECTOR_TYPES.MULTI && !Array.isArray(defaultValue)\n ? [defaultValue]\n : defaultValue);\n\n let potentialDefaultValue = vars.defaultValue;\n let defaultValue;\n\n if (potentialDefaultValue) {\n potentialDefaultValue = maybeFixForMulti(potentialDefaultValue);\n if (valueInOptions(type, potentialDefaultValue, options)) defaultValue = potentialDefaultValue;\n }\n\n if (!defaultValue) {\n const fallbackValue = options && options[0] && options[0].id\n || options[0]\n || \"\";\n defaultValue = maybeFixForMulti(fallbackValue);\n }\n const config = {\n name, type, options, defaultValue,\n };\n return {config, log, error};\n};\n","import {SELECTOR_TYPES} from \"../../types/cms\";\n\n/**\n * Given a selector id, a query like selector29id=year2017,year2019, and a selector config,\n * extract the ids from the query and create a variable set for use downstream from the selector.\n * If it is a single selector, selector29id and selector29label will be strings.\n * If it is a multi selector, selector29id and selector29label will be arrays of strings.\n */\nconst selectorQueryToVariable = (id, query, config) => {\n const accessor = `selector${id}id`;\n const queryObject = new URLSearchParams(query);\n if (config.type === SELECTOR_TYPES.MULTI) {\n // query values are \"string,lists\" but the default is a real array.\n const queryIds = queryObject.get(accessor) ? queryObject.get(accessor).split(\",\") : config.defaultValue;\n const options = config.options.filter((d) => queryIds.includes(d.id));\n return {\n [`selector${id}id`]: queryIds,\n [`selector${id}label`]: (options || []).map((d) => d.label),\n };\n }\n // single\n const queryId = queryObject.get(accessor) ? queryObject.get(accessor) : config.defaultValue;\n const option = config.options.find((d) => d.id === queryId);\n return {\n [`selector${id}id`]: queryId,\n [`selector${id}label`]: (option && option.label) || undefined,\n };\n};\n\nexport default selectorQueryToVariable;\n","import {BLOCK_LOGIC_TYPES, BLOCK_EXECUTE_TYPES, BLOCK_LOGIC_LOCALE} from \"../../types/cms\";\nimport getLocales from \"../configs/getLocales\";\n\nconst {localeDefault} = getLocales();\nconst logicTypes = Object.values(BLOCK_LOGIC_TYPES);\n\n/**\n *\n * @param block\n * @param locale\n * @returns returns \"logic\" for logic blocks, or the provided locale if appropriate, default locale otherwise\n */\nexport const getLocaleDerived = (block, locale = localeDefault) => (block && logicTypes.includes(block.type)\n ? BLOCK_LOGIC_LOCALE\n : locale);\n\n/**\n *\n * @param block\n * @param _locale\n * @returns reference to content (logic, provided locale, or default)\n */\nexport const getBlockContent = (block, _locale = localeDefault) => {\n if (!block) return {};\n const locale = getLocaleDerived(block, _locale);\n return block.contentByLocale?.[locale]?.content;\n};\n\nexport const onlyRenderOnExecute = (blockType) => BLOCK_EXECUTE_TYPES.includes(blockType);\n","import {AnyNormalizedBlock} from \"../../models/block\";\n\n/**\n * Given a section, find all its root blocks, i.e., ones with no inputs, to use as a starting point for running a section\n * 1. blocks in this section that have no inputs\n * 2. blocks in this section that have inputs entirely consisting of shared / global blocks.\n */\nfunction getRootBlocksForSection(sid: number, blocks: Record<string, AnyNormalizedBlock>) {\n const blockList = Object.values(blocks);\n const nonNativeBlocks = blockList\n .filter((block) => block.shared && block.section_id !== sid)\n .map((block) => block.id);\n\n return Object.fromEntries(\n blockList\n .filter((block) => block.section_id === sid && (\n block.inputs.length === 0 || \n block.inputs.every((id) => nonNativeBlocks.includes(id))\n ))\n .map((block) => [block.id, block])\n );\n}\n\nexport default getRootBlocksForSection;\n","import yn from \"yn\";\n\nexport default (env = process.env) => yn(env.REPORTS_LOGGING);\n","import {AxiosError, AxiosInstance, AxiosRequestConfig} from \"axios\";\nimport {FailureResult, Result} from \"../types\";\n\n/**\n * This a wrapper function around an axios instance, intended for requests that\n * return a `Result<unknown>` object, like the API endpoints.\n */\nexport function http<Response>(\n axios: AxiosInstance,\n config: AxiosRequestConfig,\n): Promise<Result<Response>> {\n return axios.request<Result<Response>>(config)\n .then((response): Result<Response, string> => {\n const {status, data} = response;\n return \"error\" in data\n ? {ok: false, status, error: data.error}\n : {ok: true, status, data: data.data};\n }, (err: Error | AxiosError<FailureResult>): FailureResult => {\n if (\"isAxiosError\" in err) {\n const {status, data} = err.response || {status: 500};\n return {ok: false, status, error: data?.error ?? err.message};\n }\n return {ok: false, status: 500, error: err.message};\n });\n}\n\nexport function httpGET<Params, Response>(\n axios: AxiosInstance,\n request: string | ({url: string} & AxiosRequestConfig),\n transformParams?: (params: Params) => unknown,\n) {\n const config = typeof request === \"string\" ? {url: request} : request;\n return (params: Params) => http<Response>(axios, {\n ...config,\n method: \"GET\",\n params: transformParams ? transformParams(params) : params,\n });\n}\n\nexport function httpPOST<Payload, Response>(\n axios: AxiosInstance,\n request: string | ({url: string} & AxiosRequestConfig),\n transformPayload?: (payload: Payload) => unknown,\n) {\n const config = typeof request === \"string\" ? {url: request} : request;\n return (payload: Payload) => http<Response>(axios, {\n ...config,\n method: \"POST\",\n data: transformPayload ? transformPayload(payload) : payload,\n });\n}\n\nexport function httpDELETE<Payload, Response>(\n axios: AxiosInstance,\n request: string | ({url: string} & AxiosRequestConfig),\n transformPayload?: (payload: Payload) => unknown,\n) {\n const config = typeof request === \"string\" ? {url: request} : request;\n return (payload: Payload) => http<Response>(axios, {\n ...config,\n method: \"DELETE\",\n data: transformPayload ? transformPayload(payload) : payload,\n });\n}\n","import {AxiosInstance} from \"axios\";\nimport type {ImageSaveParams, ImageSaveResponse} from \"../../db/image/imageSave\";\nimport {http} from \"../lib\";\n\nexport function httpImageSaveFactory(axios: AxiosInstance, provider: string) {\n return (params: ImageSaveParams) => http<ImageSaveResponse>(axios, {\n method: \"GET\",\n url: `search/images/${provider}`,\n params: {prompt: params.prompt, provider},\n });\n}\n","import {AxiosInstance} from \"axios\";\nimport type {ImageSearchParams, ImageSearchResponse} from \"../../db/image/imageSearch\";\nimport {http} from \"../lib\";\n\nexport function httpImageSearchFactory(axios: AxiosInstance, provider: string) {\n return (params: ImageSearchParams) => http<ImageSearchResponse>(axios, {\n method: \"GET\",\n url: `search/images/${provider}`,\n params: {prompt: params.prompt, provider},\n });\n}\n","import Axios from \"axios\";\nimport type {PublicAPI} from \"../db\";\nimport {ReadMethod} from \"../types\";\n\nimport {httpImageSaveFactory} from \"./image/imageSave\";\nimport {httpImageSearchFactory} from \"./image/imageSearch\";\nimport {httpDELETE, httpGET, httpPOST} from \"./lib\";\n\nexport function apiFactory(baseURL: string): PublicAPI {\n const axios = Axios.create({baseURL});\n\n return {\n createBlock: httpPOST(axios, \"create/block\"),\n createDimension: httpPOST(axios, \"create/dimension\"),\n createFormatter: httpPOST(axios, \"create/formatter\"),\n createReport: httpPOST(axios, \"create/report\"),\n createSection: httpPOST(axios, \"create/section\"),\n createVariant: httpPOST(axios, \"create/variant\"),\n\n deleteBlock: httpDELETE(axios, \"delete/block\", transformDeletePayload),\n deleteDimension: httpDELETE(axios, \"delete/dimension\", transformDeletePayload),\n deleteFormatter: httpDELETE(axios, \"delete/formatter\", transformDeletePayload),\n deleteReport: httpDELETE(axios, \"delete/report\", transformDeletePayload),\n deleteSection: httpDELETE(axios, \"delete/section\", transformDeletePayload),\n deleteVariant: httpDELETE(axios, \"delete/variant\", transformDeletePayload),\n\n readBlock: httpGET(axios, \"read/block\") as ReadMethod<\"block\">,\n readDimension: httpGET(axios, \"read/dimension\") as ReadMethod<\"dimension\">,\n readFormatter: httpGET(axios, \"read/formatter\") as ReadMethod<\"formatter\">,\n readReport: httpGET(axios, \"read/report\") as ReadMethod<\"report\">,\n readSection: httpGET(axios, \"read/section\") as ReadMethod<\"section\">,\n readVariant: httpGET(axios, \"read/variant\") as ReadMethod<\"variant\">,\n\n updateBlock: httpPOST(axios, \"update/block\"),\n updateDimension: httpPOST(axios, \"update/dimension\"),\n updateFormatter: httpPOST(axios, \"update/formatter\"),\n updateReport: httpPOST(axios, \"update/report\"),\n updateSection: httpPOST(axios, \"update/section\"),\n updateVariant: httpPOST(axios, \"update/variant\"),\n\n searchReport: httpGET(axios, \"search/reports\"),\n\n validateVariantSlug: httpGET(axios, \"validate/variant\"),\n\n readMember: httpGET(axios, \"read/member\"),\n readMemberImage: httpGET(axios, {\n url: \"member/image.png\",\n responseType: \"blob\",\n }),\n searchMember: httpGET(axios, \"memberSearch\"),\n updateMember: httpGET(axios, \"update/member\"),\n\n imageLocalSearch: httpImageSearchFactory(axios, \"local\"),\n imageLocalSave: httpImageSaveFactory(axios, \"local\"),\n imageFlickrSearch: httpImageSearchFactory(axios, \"flickr\"),\n imageFlickrSave: httpImageSaveFactory(axios, \"flickr\"),\n imageUnsplashSearch: httpImageSearchFactory(axios, \"unsplash\"),\n imageUnsplashSave: httpImageSaveFactory(axios, \"unsplash\"),\n imageUploadSave: httpImageSaveFactory(axios, \"upload\"),\n\n readMetadata: httpGET(axios, \"read/metadata\"),\n\n regenerateSearch: httpPOST(axios, \"search/regenerate\"),\n\n urlProxy: httpGET(axios, \"url/proxy\"),\n };\n}\n\nconst transformDeletePayload = (id: number) => ({id});\n","import axios, {AxiosRequestConfig, AxiosResponse} from \"axios\";\nimport mortarEval from \"../variables/mortarEval\";\nimport {BLOCK_TYPES} from \"../../types/cms\";\nimport varSwap from \"../variables/varSwap\";\nimport runSelector from \"../selectors/runSelector\";\nimport selectorQueryToVariable from \"../selectors/selectorQueryToVariable\";\nimport {getBlockContent} from \"./getBlockContent\";\nimport getRootBlocksForSection from \"./getRootBlocksForSection\";\n// import getLocales from \"../configs/getLocales\";\nimport getLogging from \"../configs/getLogging\";\n// import getAxiosConfig from \"../configs/getAxiosConfig\";\nimport {AnyNestedBlock, AnyNormalizedBlock, parseBlockContext} from \"../../models/block\";\nimport {httpApiFactory} from \"../../api\";\n\n/* const {\n localeDefault: LOCALE_DEFAULT,\n locales: LOCALES,\n} = getLocales();\n*/\nconst verbose = getLogging();\n/* const GENERATOR_TIMEOUT = process.env.REPORTS_GENERATOR_TIMEOUT && !Number.isNaN(process.env.REPORTS_GENERATOR_TIMEOUT)\n ? parseInt(process.env.REPORTS_GENERATOR_TIMEOUT, 10)\n : 5000;\n */\nconst ORIGIN = process.env.REPORTS_ORIGIN || \"\";\n\nconst bespokeVars = {};\n\nexport interface AxiosRequestConfigWithDuration extends AxiosRequestConfig {\n requestStart: number;\n}\n\nexport interface AxiosResponseWithDuration extends AxiosResponse {\n requestDuration: number;\n}\n\n// Use axios interceptors to time requests for CMS front-end warnings\naxios.interceptors.request.use((config): AxiosRequestConfigWithDuration => ({\n ...config,\n requestStart: Date.now(),\n}));\n\naxios.interceptors.response.use((d: AxiosResponse): AxiosResponseWithDuration => ({\n ...d,\n requestDuration: new Date().getTime() - (d.config as AxiosRequestConfigWithDuration).requestStart,\n}), (e) => Promise.reject(e));\n\nconst swapAPI = (api, formatterFunctions, blockContext) => {\n let url = varSwap(api, formatterFunctions, blockContext);\n if (!url.startsWith(\"http\")) url = `${ORIGIN}${url.startsWith(\"/\") ? \"\" : \"/\"}${url}`;\n return url;\n};\n\nconst {urlProxy} = httpApiFactory(\"/api/cms\");\n\n/**\n * Make a request to the given api endpoint, swapping in all vars\n */\nconst apiFetch = async (\n api: string,\n) => {\n const stub = {data: {}, requestDuration: 0};\n // TO-DO config should be pass to urlProxy\n // const config = getAxiosConfig({timeout: GENERATOR_TIMEOUT});\n const resp = await urlProxy({url: api}).catch((e) => {\n // todo1.0 - bubble up an error here like in translate\n if (verbose) console.log(`API Error for ${api}: ${e.message}`);\n return stub;\n });\n if (resp) {\n if (verbose) console.log(`Variable loaded: ${api}`);\n return resp;\n }\n\n return stub; // todo1.0 error here\n};\n\nexport type BlockResultStatus = {\n api?: string,\n resp?: any,\n log?: string[],\n error?: string,\n duration?: number,\n hiddenByCascade?: number,\n}\n\nexport type BlockResult = {\n outputVariables: object,\n renderVariables: object,\n status: BlockResultStatus,\n};\n\n// Calculate the vars/status for this block, given the variables from its inputs. Each var will be prepended with the\n// block type and id, which will create variables like \"stat14value\" for downstream blocks.\nexport const runSingleBlock = async (\n block,\n formatterFunctions,\n blockContext,\n):Promise<BlockResult> => {\n const {locale, variables, query} = parseBlockContext(blockContext);\n let resp;\n const unswappedAPI = block.contentByLocale?.logic?.content?.api;\n let apiResponse:any;\n let duration;\n let api;\n if (unswappedAPI) {\n // todo1.0, pass the correct vars here, including bespokeVars, etc\n api = swapAPI(unswappedAPI, formatterFunctions, blockContext);\n apiResponse = await apiFetch(api)\n .catch((e) => {\n if (verbose) console.error(`Error fetching ${api}: ${e.message}`);\n return {data: {}, requestDuration: 0};\n });\n resp = apiResponse.data;\n duration = apiResponse.requestDuration;\n }\n // If this block is a selector, then it should export *its currently selected option*\n if (block.type === BLOCK_TYPES.SELECTOR) {\n const {config, log, error} = runSelector(\n block.contentByLocale[locale].content.logic,\n formatterFunctions,\n blockContext,\n );\n return {\n outputVariables: selectorQueryToVariable(block.id, query, config),\n renderVariables: config,\n status: {\n log,\n error,\n },\n };\n }\n\n if (block.type === BLOCK_TYPES.VIZ) {\n return {\n outputVariables: {}, // todo1.0 this will have to be materialized click-variables\n renderVariables: block.contentByLocale.logic.content,\n status: {},\n };\n }\n\n const {logic} = getBlockContent(block, locale);\n const swappedLogic = varSwap(logic, formatterFunctions, blockContext);\n const evalResults = mortarEval(\"resp\", resp || {}, swappedLogic, formatterFunctions, variables, blockContext);\n const {vars, error, log} = evalResults;\n if (typeof vars !== \"object\") {\n return {\n outputVariables: {},\n renderVariables: {},\n status: {\n error: \"Configuration did not return an object\",\n log,\n duration,\n resp,\n api,\n },\n };\n }\n\n const nsVars = Object.keys(vars)\n .reduce((acc, d) => ({...acc, [`${block.type}${block.id}${d}`]: vars[d]}), {});\n\n return {\n renderVariables: vars,\n outputVariables: block.type === BLOCK_TYPES.GENERATOR ? vars : nsVars,\n status: {\n log,\n error,\n duration,\n resp,\n api,\n },\n };\n};\n\n/**\n * Given a list of all possible blocks, create a hash object, keyed by id,\n * where each entry contains the variables which that block exports.\n */\nexport const runConsumers = async (\n blocks: Record<string, AnyNormalizedBlock>,\n sid: number,\n bid: number | undefined,\n formatterFunctions,\n blockContext,\n) => {\n const rootBlocks = bid ? {[bid]: blocks[bid]} : getRootBlocksForSection(sid, blocks);\n const parsedBlockContext = parseBlockContext(blockContext);\n const attributes = parsedBlockContext.variables;\n /**\n * Starting with rootBlocks, crawl down the list of consumers, storing the keyed results in downstreamResult.\n *\n * However, while working DOWN the tree, we may encounter a block whose inputs have not been calculated.\n * Consider A->B->C in conjunction with D->E->C. We start at A, work down to B, but then encounter C.\n * The values for D/E have not been calculated during this run and are unavailable. In that case, we must\n * crawl back up backwards, from C to E to D, until we hit another root with no inputs (D). While on our way\n * up or down, cache results so we can use that cache instead of re-running.\n */\n const variablesById = {};\n const statusById = {};\n\n // Given the id of a block with inputs, fill the cache with objects keyed by the input ids, whose values\n // represent the variables those inputs provide. (Use cache as much as possible, recurse if necessary)\n const crawlUp = async (bid: number | string) => {\n const block = blocks[bid];\n if (block.inputs.length === 0 && !variablesById[bid]) {\n const {outputVariables, status} = await runSingleBlock(block, formatterFunctions, parsedBlockContext);\n variablesById[bid] = outputVariables;\n statusById[bid] = status;\n return;\n }\n for (let i = 0; i < block.inputs.length; i += 1) {\n const input = block.inputs[i];\n if (!variablesById[input]) await crawlUp(input);\n }\n const variables = block.inputs.reduce((acc, d) => ({...acc, ...variablesById[d]}), attributes);\n if (!variablesById[bid]) {\n const {outputVariables, status} = await runSingleBlock(\n block,\n formatterFunctions,\n {...parsedBlockContext, variables},\n );\n variablesById[bid] = outputVariables;\n statusById[bid] = status;\n }\n };\n\n // Given an id, set cache[id] to the variables which that id exports.\n const crawlDown = async (bid: number | string, cascader: number | string | false = false) => {\n if (cascader === false) {\n variablesById[bid] = {};\n statusById[bid] = {hiddenByCascade: cascader};\n for (let i = 0; i < blocks[bid].consumers.length; i += 1) {\n const cid = blocks[bid].consumers[i];\n await crawlDown(cid, cascader);\n }\n return;\n }\n let block;\n let variables = {};\n // If this block has inputs, gather their results into an object and use it to help generate THIS block's variables.\n if (rootBlocks[bid]) {\n block = rootBlocks[bid];\n // A rootBlock may be a \"true\" root, one with no inputs, or a block somewhere in the chain that updated (and may have inputs)\n // If it has inputs, crawl upwards to calculate the necessary variables, caching the results as we go.\n if (blocks[bid].inputs.length > 0) {\n await crawlUp(bid);\n variables = block.inputs.reduce((acc, d) => ({...acc, ...variablesById[d]}), {});\n }\n } else {\n block = blocks[bid];\n // If this block is not a root, then it should get its inputs from one two places:\n // 1. The cache, from a previous up/down run\n // 2. If some aren't cached, go back and run them\n // todo1.0 deal with removals / undefined? like in original cms\n if (block.inputs.some((d) => !variablesById[d])) await crawlUp(bid);\n variables = block.inputs.reduce((acc, d) => ({...acc, ...variablesById[d]}), {});\n }\n // rootBlock or otherwise, the variables that feed THIS BLOCK have now been calculated. Generate this block's output\n // using those variables, and store the result in the cache. First, however, using those vars, determine if this block\n // is allowed. If it isn't, cascade that hiding all the way down through its consumers.\n let allowed = true;\n if (\"allowed\" in block.settings && block.settings.allowed !== \"always\") {\n if (block.settings.allowed === \"never\") allowed = false;\n else {\n const {vars, error} = mortarEval(\n \"variables\",\n {...variables, ...attributes},\n block.settings.allowedLogic,\n formatterFunctions,\n undefined,\n parsedBlockContext,\n );\n if (!error) allowed = Boolean(vars);\n }\n }\n if (allowed) {\n if (!variablesById[bid]) {\n const {outputVariables, status} = await\n runSingleBlock(block, formatterFunctions, {...parsedBlockContext, variables: {...variables, ...attributes}});\n variablesById[bid] = outputVariables;\n statusById[bid] = status;\n }\n for (const cid of blocks[bid].consumers) {\n await crawlDown(cid);\n }\n } else {\n variablesById[bid] = {};\n statusById[bid] = {hiddenByCascade: bid};\n for (const cid of blocks[bid].consumers) {\n await crawlDown(cid, bid);\n }\n }\n };\n for (const id of Object.keys(rootBlocks)) {\n await crawlDown(id);\n }\n return {\n variables: variablesById,\n status: statusById,\n };\n};\n","const previewsToAttributes = (previews = []) => {\n const attributes = {};\n previews.forEach((preview:Record<string, any>, index) => {\n if (!preview) return;\n const i = index + 1;\n attributes[`id${i}`] = preview.id;\n attributes[`name${i}`] = preview.name;\n\n // Add attributes to preview\n Object.keys(preview.attributes).forEach((key) => {\n attributes[`attr_${key}${i}`] = preview.attributes[key];\n });\n\n // attributes[`keywords${i}`] = preview.id;\n // attributes[`attr${i}`] = preview.id;\n });\n return attributes;\n};\n\nexport default previewsToAttributes;\n","/**\n * Taken from https://steve.dignam.xyz/2020/03/31/practical-ordering/\n */\n\nconst START_CHAR_CODE = 32;\nconst END_CHAR_CODE = 126;\nexport const FIRST_POSITION = String.fromCharCode(START_CHAR_CODE + 1);\n\nfunction assertDev(expr: boolean) {\n if (!expr) {\n throw Error(\"Assertion Error\");\n }\n}\n\nexport function comparePositions(firstPos: string, secondPos: string) {\n return +(firstPos < secondPos) - +(firstPos > secondPos);\n}\n\nexport function orderSort(a, b, accessor = \"ordering\") {\n return comparePositions(b[accessor], a[accessor]);\n}\n\nexport function isValidPosition(pos: string) {\n if (pos === \"\" || pos.charCodeAt(pos.length - 1) == START_CHAR_CODE) {\n return false;\n }\n for (let i = 0; i < pos.length; i++) {\n const t = pos.charCodeAt(i);\n if (t < START_CHAR_CODE || t > END_CHAR_CODE) {\n return false;\n }\n }\n return true;\n}\n\nexport function positionBefore(pos: string) {\n assertDev(pos.length !== 0);\n\n for (let i = pos.length - 1; i >= 0; i--) {\n const curCharCode = pos.charCodeAt(i);\n if (curCharCode > START_CHAR_CODE + 1) {\n const position = pos.substr(0, i) + String.fromCharCode(curCharCode - 1);\n assertDev(isValidPosition(position));\n return position;\n }\n }\n const position = pos.substr(0, pos.length - 1)\n + String.fromCharCode(START_CHAR_CODE)\n + String.fromCharCode(END_CHAR_CODE);\n assertDev(isValidPosition(position));\n return position;\n}\nexport function positionAfter(pos: string) {\n assertDev(pos.length !== 0);\n\n for (let i = pos.length - 1; i >= 0; i--) {\n const curCharCode = pos.charCodeAt(i);\n if (curCharCode < END_CHAR_CODE) {\n const position = pos.substr(0, i) + String.fromCharCode(curCharCode + 1);\n assertDev(isValidPosition(position));\n return position;\n }\n }\n const position = pos + String.fromCharCode(START_CHAR_CODE + 1);\n assertDev(isValidPosition(position));\n return position;\n}\n\nfunction avg(a: number, b: number) {\n return Math.trunc((a + b) / 2);\n}\n\nexport function positionBetween(firstPos: string, secondPos: string) {\n assertDev(firstPos < secondPos);\n let flag = false;\n let position = \"\";\n const maxLength = Math.max(firstPos.length, secondPos.length);\n for (let i = 0; i < maxLength; i++) {\n const lower = i < firstPos.length ? firstPos.charCodeAt(i) : START_CHAR_CODE;\n const upper = i < secondPos.length && !flag ? secondPos.charCodeAt(i) : END_CHAR_CODE;\n if (lower === upper) {\n position += String.fromCharCode(lower);\n } else if (upper - lower > 1) {\n position += String.fromCharCode(avg(lower, upper));\n flag = false;\n break;\n } else {\n position += String.fromCharCode(lower);\n flag = true;\n }\n }\n\n if (flag) {\n position += String.fromCharCode(avg(START_CHAR_CODE, END_CHAR_CODE));\n }\n assertDev(firstPos < position);\n assertDev(position < secondPos);\n assertDev(isValidPosition(position));\n return position;\n}\n\nexport function determineOrdering<T extends Record<string, any>>(\n entities: Record<number, T>,\n entityIds: number[],\n destination: number,\n isNew = false,\n descending = true,\n accessor: keyof T = \"ordering\",\n) {\n if (isNew) {\n if (destination === 0) {\n return entities[entityIds[0]]\n ? positionBefore(entities[entityIds[0]][accessor])\n : FIRST_POSITION;\n } if (destination === entityIds.length) {\n return positionAfter(entities[entityIds[destination - 1]][accessor]);\n }\n return positionBetween(\n entities[entityIds[destination - 1]][accessor],\n entities[entityIds[destination]][accessor],\n );\n } if (destination === 0) {\n return positionBefore(entities[entityIds[destination]][accessor]);\n } if (destination === entityIds.length - 1) {\n return positionAfter(entities[entityIds[destination]][accessor]);\n }\n const beforeIndex = descending ? destination : destination - 1;\n const afterIndex = descending ? destination + 1 : destination;\n return positionBetween(\n entities[entityIds[beforeIndex]][accessor],\n entities[entityIds[afterIndex]][accessor],\n );\n}\n\nexport function findMaxOrdering(positions, next = false) {\n const max = positions.reduce((acc:string, d:string) => (comparePositions(d, acc) < 0 ? d : acc), FIRST_POSITION);\n return next ? positionAfter(max) : max;\n}\n","/**\n\n @name FUNC\n @desc Similar to the JSON.parse and JSON.stringify methods, these functions\n convert functions to and from object representations of themselves:\n @example object representation: {vars: [\"d\", \"i\"], logic: \"return d.x * i;\"}\n\n*/\n\nimport {isObject} from \"d3plus-common\";\n// import {trim} from \"d3plus-text\";\n// import buble from \"buble\";\nimport libs from \"./libs\";\n\n/** */\n\n// export const objectify = (obj) => {\n// if (obj.vars && obj.logic) return obj;\n// for (const key in obj) {\n// if (typeof obj[key] === \"function\") {\n// obj[key] = func2obj(obj[key]);\n// } else if (Array.isArray(obj[key])) {\n// obj[key] = obj[key].map((d) => {\n// if (typeof d === \"function\") return func2obj(d);\n// if (isObject(d) && !obj.vars && !obj.logic) return objectify(d);\n// return d;\n// });\n// } else if (isObject(obj[key])) objectify(obj[key]);\n// }\n// return obj;\n// };\n\n/** */\n// function func2obj(func) {\n// let s = buble.transform(`${func}`).code;\n// //console.log(func);\n// //console.log(s);\n// //console.log(\"\\n\");\n// if (s.startsWith(\"!\")) s = s.slice(1);\n\n// const vars = s\n// .replace(/function[\\sA-z]*\\(([A-z0-9\\s\\,]*)\\)[\\s\\S]*/g, \"$1\")\n// .split(\",\")\n// .map(trim);\n// const logic = s\n// .replace(/function[\\sA-z]*\\([A-z0-9\\s\\,]*\\)[\\s]*\\{([\\s\\S]*)\\}$/g, \"$1\");\n\n// return {vars, logic};\n// }\n\n/** */\nexport const parse = (config, formatters = {}, locale = \"en\", actions = {}) => {\n const globals = {\n setVariables: actions.onSetVariables ? actions.onSetVariables : (d) => d,\n openModal: actions.onOpenModal ? actions.onOpenModal : (d) => d,\n formatters,\n libs,\n locale,\n };\n\n /** */\n function parseFunction(obj) {\n return Function(\"globals\", ...obj.vars, `with (globals) { ${obj.logic} }`)\n .bind(globals, globals);\n }\n\n /** */\n function makeFunctions(obj) {\n if (obj.vars && obj.logic) {\n return parseFunction(obj);\n }\n\n for (const key in obj) {\n if (Array.isArray(obj[key])) {\n obj[key] = obj[key].map((d) => {\n if (isObject(d)) return makeFunctions(d);\n return d;\n });\n } else if (isObject(obj[key])) obj[key] = makeFunctions(obj[key]);\n }\n return obj;\n }\n\n return makeFunctions(config);\n};\n","import {normalize, schema} from \"normalizr\";\nimport {orderSort} from \"../libs/ordering\";\nimport {DimensionModel, NestedEntityMap, ReportModel} from \"../models\";\nimport {RecordsKey, RecordsState} from \"./recordsSlice\";\nimport {parse} from \"../libs/FUNC\";\nimport getLocales from \"../libs/configs/getLocales\";\n\nconst {localeDefault} = getLocales();\n\nenum SCHEMA_ENTITIES {\n REPORTS = \"report\",\n DIMENSIONS = \"dimension\",\n VARIANTS = \"variant\",\n SECTIONS = \"section\",\n BLOCKS = \"block\",\n FORMATTER = \"formatter\",\n}\n\nconst blockSchema = new schema.Entity(SCHEMA_ENTITIES.BLOCKS);\nblockSchema.define({\n consumers: [blockSchema],\n inputs: [blockSchema],\n});\n\nconst variantSchema = new schema.Entity(SCHEMA_ENTITIES.VARIANTS);\nconst dimensionSchema = new schema.Entity(SCHEMA_ENTITIES.DIMENSIONS, {\n variants: [variantSchema],\n}, {\n processStrategy(value: DimensionModel.NestedDimension | DimensionModel.Dimension) {\n return {\n ...value,\n variants: \"variants\" in value ? value.variants : [],\n };\n },\n});\nconst sectionSchema = new schema.Entity(SCHEMA_ENTITIES.SECTIONS, {\n blocks: [blockSchema],\n});\nconst reportSchema = new schema.Entity(SCHEMA_ENTITIES.REPORTS, {\n dimensions: [dimensionSchema],\n sections: [sectionSchema],\n}, {\n processStrategy(value: ReportModel.AnyNestedReport | ReportModel.AnyReport) {\n return {\n ...value,\n sections: \"sections\" in value ? value.sections.sort(orderSort) : [],\n };\n },\n});\n\nconst formatterSchema = new schema.Entity(SCHEMA_ENTITIES.FORMATTER);\n\nconst entitySchema = {\n report: reportSchema,\n section: sectionSchema,\n block: blockSchema,\n dimension: dimensionSchema,\n variant: variantSchema,\n formatter: formatterSchema,\n};\n\ntype NestedTypes = {\n block: NestedEntityMap[\"block\"];\n dimension: NestedEntityMap[\"dimension\"];\n report: NestedEntityMap[\"report\"];\n section: NestedEntityMap[\"section\"];\n variant: NestedEntityMap[\"variant\"];\n formatter: NestedEntityMap[\"formatter\"];\n}\n\nexport function normalizeEntity<T extends keyof NestedTypes>(\n type: T,\n entities: NestedTypes[T][],\n): RecordsState[\"entities\"] {\n const schema = entitySchema[type];\n if (!schema) {\n throw new Error(`Invalid entity type: ${type}`);\n }\n const {entities: nentities} = normalize(entities, [schema]);\n return {\n report: getTypedRecord(nentities, SCHEMA_ENTITIES.REPORTS),\n dimension: getTypedRecord(nentities, SCHEMA_ENTITIES.DIMENSIONS),\n section: getTypedRecord(nentities, SCHEMA_ENTITIES.SECTIONS),\n block: getTypedRecord(nentities, SCHEMA_ENTITIES.BLOCKS),\n variant: getTypedRecord(nentities, SCHEMA_ENTITIES.VARIANTS),\n formatter: getTypedRecord(nentities, SCHEMA_ENTITIES.FORMATTER),\n };\n}\n\nfunction getTypedRecord<K extends RecordsKey>(\n record: any,\n key: K,\n): RecordsState[\"entities\"][K] {\n return record.hasOwnProperty(key) ? record[key] : {};\n}\n\nexport type VariableUpdateParams = {\n sid: number\n bid: number\n previews: Record<string, any>[],\n query: Record<string, any>,\n}\n\nexport const parseVariableUpdateParams = (status, params: Partial<VariableUpdateParams> | undefined = undefined) => {\n const {\n sid, bid, previews = [], query = {},\n } = params || {};\n\n let activeSection;\n let activePreviews;\n const statusPayload:Record<string, any> = {};\n if (sid) {\n activeSection = sid;\n statusPayload.activeSection = activeSection;\n } else {\n activeSection = status.activeSection;\n }\n if (previews.length > 0) {\n activePreviews = previews;\n statusPayload.previews = activePreviews;\n } else {\n activePreviews = status.previews;\n }\n return {\n parsedParams: {\n sid: activeSection,\n bid,\n previews: activePreviews,\n query,\n },\n statusPayload,\n };\n};\n\nexport const funcifyFormattersByLocale = (\n formatters:Record<string, any>[] = [],\n locale = localeDefault,\n):Record<string, (n: any) => any> => formatters.reduce((acc:any, f:any) => {\n const formatterFn = parse({vars: [\"n\"], logic: f.content.logic}, {}, locale, {});\n acc[f.name] = formatterFn;\n return acc;\n}, {});\n","import {PublicAPI} from \"./db\";\nimport {\n CreateMethod, DeleteMethod, EntityType, FailureResult, ReadMethod, Result, SuccessResult, UpdateMethod,\n} from \"./types\";\n\nexport class BackendError extends Error {\n code: number;\n\n constructor(code: number, message: string) {\n super(message);\n this.code = code;\n }\n\n toJSON() {\n return failureResult(this);\n }\n\n static is(obj: any): obj is BackendError {\n return Object.prototype.hasOwnProperty.call(obj, \"code\") && typeof obj.code === \"number\";\n }\n}\n\nfunction successResult<T>(result: T): SuccessResult<T> {\n return {ok: true, status: 200, data: result};\n}\n\nfunction failureResult(err: Error): FailureResult<string> {\n return {ok: false, status: BackendError.is(err) ? err.code : 500, error: err.message};\n}\n\n/**\n * Takes a function which returns a `Promise`, which might\n * resolve to a `Value` or reject with `BackendError`,\n * and wraps it to always resolve to `Result<Value, string>`\n */\nexport function resultWrapper<Param, Return>(\n method: (param: Param) => Promise<Return>,\n): (param: Param) => Promise<Result<Return>> {\n return (param) => method(param).then(successResult, failureResult);\n}\n\nexport function pickMethod<T extends EntityType>(api: PublicAPI, operation: \"create\", entity: T): CreateMethod<T>;\nexport function pickMethod<T extends EntityType>(api: PublicAPI, operation: \"read\", entity: T): ReadMethod<T>;\nexport function pickMethod<T extends EntityType>(api: PublicAPI, operation: \"update\", entity: T): UpdateMethod<T>;\nexport function pickMethod<T extends EntityType>(api: PublicAPI, operation: \"delete\", entity: T): DeleteMethod;\nexport function pickMethod<T extends EntityType>(\n api: PublicAPI,\n operation: \"create\" | \"read\" | \"update\" | \"delete\",\n entity: T,\n): CreateMethod<T> | ReadMethod<T> | UpdateMethod<T> | DeleteMethod {\n const name = `${operation}${capitalize(entity)}` as const;\n return api[name] as DeleteMethod;\n}\n\nexport function capitalize<T extends string>(str: T) {\n return str[0].toUpperCase() + str.slice(1) as Capitalize<T>;\n}\n","/* eslint-disable no-param-reassign */\n\nimport {createSlice, PayloadAction as Action} from \"@reduxjs/toolkit\";\nimport {HYDRATE} from \"next-redux-wrapper\";\nimport {\n CreateResponse, DeleteResponse, ReadResponse, UpdateResponse,\n} from \"../api/types\";\nimport {orderSort} from \"../libs/ordering\";\nimport {\n AnyEntity, NestedEntityMap, NormalizedEntityMap, ReportModel,\n} from \"../models\";\nimport {normalizeEntity} from \"./lib\";\n\nexport type RecordsKey =\n | \"block\"\n | \"dimension\"\n | \"report\"\n | \"section\"\n | \"variant\"\n | \"formatter\";\n\nexport type RecordsState = {\n tree: ReportModel.AnyNestedReport[];\n reports: number[] | null;\n entities: {\n [K in RecordsKey]: Record<number, NormalizedEntityMap[K]>;\n };\n requests: {\n [K in RecordsKey]: Record<string, EntityRequest<K, unknown>>;\n }\n};\n\nconst initialState: RecordsState = {\n tree: [],\n reports: null,\n entities: {\n block: {},\n dimension: {},\n report: {},\n section: {},\n variant: {},\n formatter: {},\n },\n requests: {\n block: {},\n dimension: {},\n report: {},\n section: {},\n variant: {},\n formatter: {},\n },\n};\n\ntype PartialRecordsState = {\n entities?: Partial<RecordsState[\"entities\"]>;\n reports?: RecordsState[\"reports\"];\n requests?: Partial<RecordsState[\"requests\"]>;\n tree?: RecordsState[\"tree\"];\n}\n\nexport const recordsSlice = createSlice({\n name: \"records\",\n initialState,\n reducers: {\n set: (state, action: Action<PartialRecordsState>) => {\n const nextState = action.payload;\n return {\n entities: combineRecords(state.entities, nextState.entities || {}),\n requests: combineRecords(state.requests, nextState.requests || {}),\n reports: nextState.reports || state.reports,\n tree: nextState.tree || state.tree,\n };\n },\n\n /**\n * Reducer to save intermediate request updates.\n * Will only save the request status to inform all subscribed components.\n */\n setRequest: (state, action: Action<EntityRequest<RecordsKey, unknown>>) => {\n const req = action.payload;\n state.requests[req.type][req.key] = req;\n },\n\n /**\n * Reducer to save the results of a CREATE operation.\n * Besides saving the new elements:\n * - If entity is a report, saves the reference ID in the state.reports list\n * - Else, adds the reference ID of the new entity to its parent's array\n */\n setCreateRequest(state, action: Action<AnyCreateEntityRequest>) {\n const req = action.payload;\n state.requests[req.type][req.key] = req;\n\n if (req.status === FetchStatus.SUCCESS) {\n const newEntities = normalizeEntity(req.type, [req.data]);\n const nextEntities = combineRecords(state.entities, newEntities);\n state.entities = nextEntities;\n\n if (req.type === \"report\") {\n const item = req.data;\n if (!state.reports) {\n state.reports = [item.id];\n } else if (state.reports.indexOf(item.id) === -1) {\n state.reports = [...state.reports, item.id];\n }\n } else if (req.type === \"dimension\") {\n const item = req.data;\n state.entities.report[item.report_id].dimensions.push(item.id);\n } else if (req.type === \"variant\") {\n const item = req.data;\n state.entities.dimension[item.dimension_id].variants.push(item.id);\n } else if (req.type === \"section\") {\n const item = req.data;\n state.entities.report[item.report_id].sections.push(item.id);\n } else if (req.type === \"block\") {\n const item = req.data;\n state.entities.section[item.section_id].blocks.push(item.id);\n }\n }\n },\n\n /**\n * Reducer to save the results of a READ operation.\n * Besides saving the new elements:\n * - If entity is a report, saves the nested report in the tree,\n * and updates the normalized reference list.\n */\n setReadRequest(state, action: Action<AnyReadEntityRequest>) {\n const req = action.payload;\n state.requests[req.type][req.key] = req;\n\n if (req.status === FetchStatus.SUCCESS) {\n const newEntities = normalizeEntity(req.type, req.data);\n const nextEntities = combineRecords(state.entities, newEntities);\n state.entities = nextEntities;\n\n if (req.type === \"report\") {\n state.reports = Object.values(nextEntities.report).map((item) => item.id);\n state.tree = req.data;\n }\n }\n },\n\n /**\n * Reducer to save the results of a UPDATE operation.\n * Besides saving the new elements:\n * - Updates the order of the reference IDs in the parent's array\n */\n setUpdateRequest(state, action: Action<AnyUpdateEntityRequest>) {\n const req = action.payload;\n state.requests[req.type][req.key] = req;\n\n if (req.status === FetchStatus.SUCCESS) {\n const currEntities = normalizeEntity(req.type, [req.data]);\n\n // todo jimmy/francisco, this hack is horrible and we should talk about it\n // =======================================================================\n let isInputUpdate; let targetId; let\n isDeletion;\n if (req.type === \"block\") {\n const oldInputs = state.entities.block[req.data.id].inputs;\n const newInputs = currEntities.block[req.data.id].inputs;\n isInputUpdate = oldInputs.length !== newInputs.length;\n if (isInputUpdate) {\n isDeletion = oldInputs.length > newInputs.length;\n targetId = isDeletion\n ? oldInputs.filter((d) => !newInputs.includes(d))[0]\n : newInputs.filter((d) => !oldInputs.includes(d))[0];\n }\n Object.values(currEntities.block).forEach((block:any) => {\n if (block.block_input) {\n delete currEntities.block[block.id];\n }\n });\n }\n // =======================================================================\n\n const nextEntities = combineRecords(state.entities, currEntities);\n state.entities = nextEntities;\n\n if (req.type === \"dimension\") {\n const item = req.data;\n state.entities.report[item.report_id].dimensions = recalculateOrder(\n nextEntities.report[item.report_id].dimensions,\n nextEntities.dimension,\n );\n } else if (req.type === \"section\") {\n const item = req.data;\n state.entities.report[item.report_id].sections = recalculateOrder(\n nextEntities.report[item.report_id].sections,\n nextEntities.section,\n );\n } else if (req.type === \"block\") {\n const item = req.data;\n if (isInputUpdate) {\n if (isDeletion) {\n state.entities.block[targetId].consumers = state.entities.block[targetId].consumers\n .filter((d) => d !== (item.id));\n } else {\n state.entities.block[targetId].consumers.push(item.id);\n }\n }\n // TODO: Update ordering on item's parent\n }\n }\n },\n\n /**\n * Reducer to save the results of a DELETE operation.\n * Removes the incumbent item from the records, and if said item had a\n * parent, remove the reference ID from its children.\n */\n setDeleteRequest(state, action: Action<AnyDeleteEntityRequest>) {\n const req = action.payload;\n state.requests[req.type][req.key] = req;\n\n if (req.status === FetchStatus.SUCCESS) {\n const {id, parentId, parentType} = req.data;\n delete state.entities[req.type][id];\n\n if (parentType && parentId != null) {\n const pluralKey = `${req.type}s`;\n arrayRemove(state.entities[parentType][parentId][pluralKey], id);\n }\n }\n },\n },\n extraReducers: {\n /**\n * next-redux-wrapper implementation\n * This reducer is in charge of merging the server and client's states.\n * This is needed as some navigation operations will make requests to the\n * server for data, and the server may try to involve the store to calculate\n * properties for the client's components.\n */\n [HYDRATE]: (state: RecordsState, action: Action<{records: RecordsState}>): RecordsState => {\n const nextState = action.payload.records;\n console.log(\"cms:HYDRATE\", nextState);\n const entities = combineRecords(state.entities, nextState.entities);\n return {\n entities,\n reports: Object.values(entities.report).map((item) => item.id),\n requests: state.requests,\n // requests: combineRecords(state.requests, nextState.requests),\n tree: nextState.tree,\n };\n },\n },\n});\n\n/**\n * This function combines the records in multiple keys of the provided objects.\n * The first object provides the master structure, while the seconds provides\n * the new elements to add and might be partial to the original.\n */\nfunction combineRecords<T extends Record<string, AnyEntity>>(prev: T, next: Partial<T>): T {\n return (Object.fromEntries(\n Object.keys(prev).map((key) => [key, {...prev[key], ...next[key]}]),\n ) as unknown) as T;\n}\n\nfunction recalculateOrder(list: number[], records: Record<number, {id: number, ordering: string}>): number[] {\n const oldOrder = list.map((id) => records[id]);\n const newOrder = oldOrder.sort(orderSort);\n return newOrder.map((item) => item.id);\n}\n\nfunction arrayRemove<T>(list: T[], item: T): void {\n const index = list.indexOf(item);\n if (index > -1) {\n list.splice(index, 1);\n }\n}\n\nexport enum FetchStatus {\n UNINITIALIZED = \"UNINITIALIZED\",\n LOADING = \"LOADING\",\n SUCCESS = \"SUCCESS\",\n FAILURE = \"FAILURE\",\n FETCHING = \"FETCHING\",\n}\n\nexport type EntityRequest<T extends RecordsKey, D = NestedEntityMap[T][]> = {\n key: string;\n type: T;\n operation?: string;\n status: FetchStatus.UNINITIALIZED | FetchStatus.LOADING | FetchStatus.FETCHING;\n} | {\n key: string;\n type: T;\n operation?: string;\n status: FetchStatus.SUCCESS;\n data: D;\n} | {\n key: string;\n type: T;\n operation?: string;\n status: FetchStatus.FAILURE;\n error: {\n code: number;\n message: string;\n };\n}\n\nexport type CreateEntityRequest<T extends RecordsKey> = EntityRequest<T, CreateResponse<T>>;\nexport type ReadEntityRequest<T extends RecordsKey> = EntityRequest<T, ReadResponse<T>>;\nexport type UpdateEntityRequest<T extends RecordsKey> = EntityRequest<T, UpdateResponse<T>>;\nexport type DeleteEntityRequest<T extends RecordsKey> = EntityRequest<T, DeleteResponse>;\n\nexport type AnyCreateEntityRequest =\n | CreateEntityRequest<\"block\">\n | CreateEntityRequest<\"dimension\">\n | CreateEntityRequest<\"report\">\n | CreateEntityRequest<\"section\">\n | CreateEntityRequest<\"variant\">\n | CreateEntityRequest<\"formatter\">;\n\nexport type AnyReadEntityRequest =\n | ReadEntityRequest<\"block\">\n | ReadEntityRequest<\"dimension\">\n | ReadEntityRequest<\"report\">\n | ReadEntityRequest<\"section\">\n | ReadEntityRequest<\"variant\">\n | ReadEntityRequest<\"formatter\">;\n\nexport type AnyUpdateEntityRequest =\n | UpdateEntityRequest<\"block\">\n | UpdateEntityRequest<\"dimension\">\n | UpdateEntityRequest<\"report\">\n | UpdateEntityRequest<\"section\">\n | UpdateEntityRequest<\"variant\">\n | UpdateEntityRequest<\"formatter\">;\n\nexport type AnyDeleteEntityRequest =\n | DeleteEntityRequest<\"block\">\n | DeleteEntityRequest<\"dimension\">\n | DeleteEntityRequest<\"report\">\n | DeleteEntityRequest<\"section\">\n | DeleteEntityRequest<\"variant\">\n | DeleteEntityRequest<\"formatter\">;\n","import {showNotification} from \"@mantine/notifications\";\nimport {pickMethod} from \"../api/lib\";\nimport {Result} from \"../api\";\nimport {\n CreateParams, CreateResponse, DeleteParams, ReadParams, UpdateParams,\n} from \"../api/types\";\nimport {\n AnyCreateEntityRequest, AnyDeleteEntityRequest,\n AnyReadEntityRequest, AnyUpdateEntityRequest,\n FetchStatus, RecordsKey, recordsSlice,\n} from \"./recordsSlice\";\nimport {AppThunk} from \"./store\";\n\nconst recordsActions = recordsSlice.actions;\n\nexport const crudKeyMaker = {\n create: keyMakerCreate,\n read: keyMakerRead,\n update: keyMakerUpdate,\n delete: keyMakerDelete,\n};\n\nexport const createEntity = entityActionFactory({\n block: createHandlerFactory(\"block\"),\n dimension: createHandlerFactory(\"dimension\"),\n formatter: createHandlerFactory(\"formatter\"),\n report: createHandlerFactory(\"report\"),\n section: createHandlerFactory(\"section\"),\n variant: createHandlerFactory(\"variant\"),\n});\n\nexport const readEntity = entityActionFactory({\n block: readHandlerFactory(\"block\"),\n dimension: readHandlerFactory(\"dimension\"),\n formatter: readHandlerFactory(\"formatter\"),\n report: readHandlerFactory(\"report\"),\n section: readHandlerFactory(\"section\"),\n variant: readHandlerFactory(\"variant\"),\n});\n\nexport const updateEntity = entityActionFactory({\n block: updateHandlerFactory(\"block\"),\n dimension: updateHandlerFactory(\"dimension\"),\n formatter: updateHandlerFactory(\"formatter\"),\n report: updateHandlerFactory(\"report\"),\n section: updateHandlerFactory(\"section\"),\n variant: updateHandlerFactory(\"variant\"),\n});\n\nexport const deleteEntity = entityActionFactory({\n block: deleteHandlerFactory(\"block\"),\n dimension: deleteHandlerFactory(\"dimension\"),\n formatter: deleteHandlerFactory(\"formatter\"),\n report: deleteHandlerFactory(\"report\"),\n section: deleteHandlerFactory(\"section\"),\n variant: deleteHandlerFactory(\"variant\"),\n});\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyThunk = (p: any) => any;\n\n/**\n * Generates a single `ActionCreatorWithPayload` using other action creator\n * functions. This new action creator accepts two parameters: the key which maps\n * to the original action creator, which for now is limited to an `EntityType`,\n * and the payload, which is validated against the payload type defined in the\n * original action creator.\n */\nfunction entityActionFactory<R extends Record<RecordsKey, AnyThunk>>(entitySet: R) {\n return <T extends RecordsKey>(type: T, payload: Parameters<R[T]>[0]): ReturnType<R[T]> => {\n const action = entitySet[type];\n if (!action) {\n throw new Error(\n `Attempting to dispatch action for invalid entity type '${type}'`,\n );\n }\n return action(payload);\n };\n}\n\nfunction rpcAnnounce(entity: RecordsKey, key: string): AppThunk {\n return (dispatch, getState) => {\n const state = getState();\n const request = state.records.requests[entity][key];\n const status = !request || request.status === FetchStatus.UNINITIALIZED\n ? FetchStatus.LOADING\n : FetchStatus.FETCHING;\n\n dispatch(recordsActions.setRequest({key, type: entity, status}));\n };\n}\n\nfunction rpcFailure(entity: RecordsKey, key: string, code: number, message: string): AppThunk {\n return (dispatch) => {\n if (typeof window === \"object\") {\n showNotification({\n autoClose: 3000,\n color: \"red\",\n id: key,\n message,\n title: \"Error\",\n });\n }\n dispatch(recordsActions.setRequest({\n key, type: entity, status: FetchStatus.FAILURE, error: {code, message},\n }));\n };\n}\n\n/**\n * Generates an ActionCreatorWithPayload function to handle the loading stages\n * for the `rpcFunction` remote call, which executes a CREATE operation for\n * a `type` Entity.\n */\nfunction createHandlerFactory<T extends RecordsKey>(entity: T) {\n return (payload: CreateParams[T]): AppThunk<Promise<Result<CreateResponse<T>>>> => {\n const key = keyMakerCreate(entity, payload);\n\n return (dispatch, _, api) => {\n dispatch(rpcAnnounce(entity, key));\n\n const rpc = pickMethod(api, \"create\", entity);\n return rpc(payload).then((result) => {\n if (result.ok === true) {\n dispatch(recordsActions.setCreateRequest({\n key, operation: \"create\", status: FetchStatus.SUCCESS, type: entity, data: result.data,\n } as AnyCreateEntityRequest));\n } else {\n dispatch(rpcFailure(entity, key, result.status, result.error));\n }\n return result;\n });\n };\n };\n}\n\n/**\n * Generates an ActionCreatorWithPayload function to handle the loading stages\n * for the `rpcFunction` remote call, which executes a READ operation for\n * a `type` Entity.\n */\nfunction readHandlerFactory<T extends RecordsKey>(entity: T) {\n return (payload: ReadParams): AppThunk<Promise<void>> => {\n const key = keyMakerRead(entity, payload);\n\n return (dispatch, _, api) => {\n dispatch(rpcAnnounce(entity, key));\n const rpc = pickMethod(api, \"read\", entity);\n return rpc(payload).then((result) => {\n if (result.ok === true) {\n dispatch(recordsActions.setReadRequest({\n key, operation: \"read\", status: FetchStatus.SUCCESS, type: entity, data: result.data,\n } as AnyReadEntityRequest));\n } else {\n dispatch(rpcFailure(entity, key, result.status, result.error));\n }\n });\n };\n };\n}\n\n/**\n * Generates an ActionCreatorWithPayload function to handle the loading stages\n * for the `rpcFunction` remote call, which executes an UPDATE operation for\n * a `type` Entity.\n */\nfunction updateHandlerFactory<T extends RecordsKey>(entity: T) {\n return (payload: UpdateParams[T]): AppThunk<Promise<void>> => {\n const key = keyMakerUpdate(entity, payload);\n\n return (dispatch, _, api) => {\n dispatch(rpcAnnounce(entity, key));\n const rpc = pickMethod(api, \"update\", entity);\n return rpc(payload).then((result) => {\n if (result.ok === true) {\n dispatch(recordsActions.setUpdateRequest({\n key, operation: \"update\", status: FetchStatus.SUCCESS, type: entity, data: result.data,\n } as AnyUpdateEntityRequest));\n } else {\n dispatch(rpcFailure(entity, key, result.status, result.error));\n }\n });\n };\n };\n}\n\n/**\n * Generates an ActionCreatorWithPayload function to handle the loading stages\n * for the `rpcFunction` remote call, which executes a DELETE operation for\n * a `type` Entity.\n */\nfunction deleteHandlerFactory<T extends RecordsKey>(entity: T) {\n return (payload: DeleteParams): AppThunk<Promise<void>> => {\n const key = keyMakerDelete(entity, payload);\n\n return (dispatch, _, api) => {\n dispatch(rpcAnnounce(entity, key));\n const rpc = pickMethod(api, \"delete\", entity);\n return rpc(payload).then((result) => {\n if (result.ok === true) {\n dispatch(recordsActions.setDeleteRequest({\n key, operation: \"delete\", status: FetchStatus.SUCCESS, type: entity, data: result.data,\n } as AnyDeleteEntityRequest));\n } else {\n dispatch(rpcFailure(entity, key, result.status, result.error));\n }\n });\n };\n };\n}\n\nfunction keyMakerCreate(entity: RecordsKey, params: CreateParams[RecordsKey]) {\n if (entity === \"variant\") {\n const p = params as CreateParams[\"variant\"];\n return `create(variant, [${p.dimension_id}, ${p.name}])`;\n }\n return `create(${entity}, [${Object.keys(params)}])`;\n}\n\nfunction keyMakerRead(entity: RecordsKey, params: ReadParams = {}) {\n const id = params.id == null ? null : `'${params.id}'`;\n return `read(${entity}, ${id}, ${!!params.include})`;\n}\n\nfunction keyMakerUpdate<T extends RecordsKey>(entity: T, params: UpdateParams[T]) {\n const {id, ...otherParams} = params;\n return `update(${entity}, ${id}, [${Object.keys(otherParams)}])`;\n}\n\nfunction keyMakerDelete(entity: RecordsKey, params: DeleteParams) {\n return `delete(${entity}, ${params})`;\n}\n","export const localeDefault = process.env.NEXT_PUBLIC_REPORTS_LOCALE_DEFAULT || \"en\";\n\nexport const locales = process.env.NEXT_PUBLIC_REPORTS_LOCALES?.split(\",\") || [localeDefault];\n\nif (!locales.includes(localeDefault)) locales.push(localeDefault);\n","/* eslint-disable no-param-reassign */\n\nimport {createSlice, PayloadAction as Action} from \"@reduxjs/toolkit\";\nimport {HYDRATE} from \"next-redux-wrapper\";\nimport {localeDefault, locales} from \"./envvars\";\n\nexport type StatusState = {\n localeDefault: string;\n locales: string[];\n showToolbar: boolean;\n activeSection: number | null;\n previews: Record<string, unknown>[];\n query: Record<string, unknown>;\n};\n\nconst initialState: StatusState = {\n localeDefault,\n locales,\n showToolbar: false,\n activeSection: null,\n previews: [],\n query: {},\n};\n\nexport const statusSlice = createSlice({\n name: \"status\",\n initialState,\n reducers: {\n setStatus: (state, action) => {\n Object.assign(state, action.payload);\n },\n },\n extraReducers: {\n /**\n * next-redux-wrapper implementation\n * This reducer is in charge of merging the server and client's states.\n * This is needed as some navigation operations will make requests to the\n * server for data, and the server may try to involve the store to calculate\n * properties for the client's components.\n */\n [HYDRATE]: (_state: StatusState, _action: Action<{status: StatusState}>): StatusState => (initialState),\n },\n});\n","/* eslint-disable no-param-reassign */\n\nimport {createSlice, PayloadAction as Action} from \"@reduxjs/toolkit\";\nimport {HYDRATE} from \"next-redux-wrapper\";\n\nexport type VariablesState = {\n attributes: Record<string, any>;\n variables: Record<string, any>;\n status: Record<string, any>;\n};\n\nconst initialState: VariablesState = {\n attributes: {},\n variables: {},\n status: {},\n};\n\nexport const variablesSlice = createSlice({\n name: \"variables\",\n initialState,\n reducers: {\n setVariableChange: (state, action) => {\n state.attributes = {...state.attributes, ...action.payload.attributes};\n state.variables = {...state.variables, ...action.payload.variables};\n state.status = {...state.status, ...action.payload.status};\n },\n },\n extraReducers: {\n /**\n * next-redux-wrapper implementation\n * This reducer is in charge of merging the server and client's states.\n * This is needed as some navigation operations will make requests to the\n * server for data, and the server may try to involve the store to calculate\n * properties for the client's components.\n */\n [HYDRATE]: (state: VariablesState, action: Action<{variables: VariablesState}>): VariablesState => (initialState),\n },\n});\n","import type {RegenerateSearchResponse} from \"../api/db/regenerateSearch\";\nimport type {\n ReadMemberParams, ReadMemberResponse, \n ReadMetadataParams, ReadMetadataResponse, \n SearchReportParams, SearchReportResponse,\n ValidateVariantSlugResponse\n} from \"../api/types\";\nimport {runConsumers} from \"../libs/blocks/runConsumers\";\nimport previewsToAttributes from \"../libs/variables/previewsToAttributes\";\nimport {parseVariableUpdateParams, VariableUpdateParams} from \"./lib\";\nimport {readEntity} from \"./recordsActions\";\nimport {statusSlice} from \"./statusSlice\";\nimport {AppThunk} from \"./store\";\nimport {variablesSlice} from \"./variablesSlice\";\nimport {BlockContextPartial} from \"../models/block\";\nimport {ResourceContextType} from \"../context/ResourceProvider\";\nimport {localeDefault} from \"./envvars\";\n\nexport {\n createEntity, deleteEntity, readEntity, updateEntity,\n} from \"./recordsActions\";\n\nexport function initialize(): AppThunk<void> {\n return (dispatch) => Promise.all([\n dispatch(readEntity(\"report\", {include: true})),\n dispatch(readEntity(\"formatter\", {})),\n ]);\n}\n\nexport function variantValidateSlug(dimension: number, slug: string): AppThunk<Promise<ValidateVariantSlugResponse>> {\n return async (_, __, api) => {\n const result = await api.validateVariantSlug({dimension, slug});\n if (\"error\" in result) {\n throw new Error(result.error);\n }\n return result.data;\n };\n}\n\nexport function reportSearch(filters: SearchReportParams): AppThunk<Promise<SearchReportResponse>> {\n return async (_, __, api) => {\n const result = await api.searchReport(filters);\n if (\"error\" in result) {\n throw new Error(result.error);\n }\n return result.data;\n };\n}\n\nexport function searchRegenerate(): AppThunk<Promise<RegenerateSearchResponse>> {\n return async (_, __, api) => {\n const result = await api.regenerateSearch(undefined);\n if (\"error\" in result) {\n throw new Error(result.error);\n }\n return result.data;\n };\n}\n\nexport function memberRead(params: ReadMemberParams): AppThunk<Promise<ReadMemberResponse>> {\n // const key = `memberRead(${params.locale}-${params.ids}-${params.slugs})`;\n return async (_, __, api) => {\n const result = await api.readMember(params);\n if (\"error\" in result) {\n throw new Error(result.error);\n }\n return result.data;\n };\n}\n\n/** Helper function for editing the status' query parameters */\nasync function setStatusQuery(resource, dispatch, getState, status) {\n const oldStatus = getState().status;\n const newStatus = {...oldStatus, ...status};\n const newQuery = {...oldStatus.query, ...status.query};\n // filter out undefined properties (so keys can be deleted if necessary)\n Object.keys(newQuery).forEach((key) => newQuery[key] === undefined && delete newQuery[key]);\n const payload = {...newStatus, query: newQuery};\n dispatch(statusSlice.actions.setStatus(payload));\n if (oldStatus.activeSection) {\n dispatch(recalculateVariables(resource, {query: newQuery}));\n }\n}\n\n/** Deletes a given key from the current query parameters */\nexport function deleteQueryParam(resource, key) {\n return async (dispatch, getState) => setStatusQuery(resource, dispatch, getState, {query: {[key]: undefined}});\n}\n\n/** Adds to or edits the current status query parameters to include the given key/val */\nexport function setQueryParam(resource, key, value) {\n return async (dispatch, getState) => setStatusQuery(resource, dispatch, getState, {query: {[key]: value}});\n}\n\nexport function recalculateVariables(\n resource:ResourceContextType,\n params?: Partial<VariableUpdateParams>,\n) {\n return async (dispatch, getState) => {\n const state = getState();\n const blocks = state.records.entities.block;\n const formatterFunctions = resource.formatterFunctions[localeDefault];\n const {parsedParams, statusPayload} = parseVariableUpdateParams(state.status, params);\n const {\n sid, bid, previews, query,\n } = parsedParams;\n if (Object.keys(statusPayload).length) dispatch(statusSlice.actions.setStatus(statusPayload));\n const attributes = previewsToAttributes(previews);\n const blockContext:BlockContextPartial = {\n variables: attributes,\n query,\n };\n const data = await runConsumers(\n blocks,\n sid,\n bid,\n formatterFunctions,\n blockContext,\n );\n const {variables} = data;\n dispatch(variablesSlice.actions.setVariableChange({attributes, variables, status: data.status}));\n };\n}\n\nexport function readMetadata(filters: ReadMetadataParams): AppThunk<Promise<ReadMetadataResponse>> {\n return async (_, __, api) => {\n const result = await api.readMetadata(filters);\n if (\"error\" in result) {\n throw new Error(result.error);\n }\n return result.data;\n };\n}\n\nexport function urlProxy(url: string): AppThunk<Promise<any>> {\n return async (_, __, api) => {\n const result = await api.urlProxy({url});\n if (\"error\" in result) {\n throw new Error(result.error);\n }\n return result.data;\n };\n}\n","import {createContext, useMemo} from \"react\";\nimport getLocales from \"../libs/configs/getLocales\";\nimport {funcifyFormattersByLocale} from \"../store/lib\";\nimport {useFormatterList} from \"../store\";\n\nconst {locales} = getLocales();\n\nconst initialContext = {\n formatterFunctions: locales.reduce((acc, d) => ({...acc, [d]: {}}), {}),\n};\n\nexport type ResourceContextType = typeof initialContext;\n\nexport const ResourceContext = createContext(initialContext);\n\nexport function ResourceProvider({children}) {\n const formatters = useFormatterList();\n\n const value = useMemo(() => ({\n formatterFunctions: locales.reduce((acc, locale) => ({\n ...acc,\n [locale]: formatters.data\n ? funcifyFormattersByLocale(formatters.data, locale)\n : {},\n }), {}),\n }), [formatters]);\n\n return (\n <ResourceContext.Provider\n value={value}\n >\n {children}\n </ResourceContext.Provider>\n );\n}\n","import {\n useCallback, useContext, useEffect, useMemo,\n} from \"react\";\nimport type {TypedUseSelectorHook} from \"react-redux\";\nimport {useDispatch, useSelector} from \"react-redux\";\nimport {EntityType, NormalizedEntityMap} from \"../models\";\nimport * as actions from \"./actions\";\nimport {crudKeyMaker} from \"./recordsActions\";\nimport {EntityRequest, FetchStatus} from \"./recordsSlice\";\nimport {AppDispatch, AppState} from \"./store\";\nimport {AnyBlock, BlockContext} from \"../models/block\";\nimport {ResourceContext} from \"../context/ResourceProvider\";\nimport getLocales from \"../libs/configs/getLocales\";\n\nconst {localeDefault} = getLocales();\n\n// Use throughout your app instead of plain `useDispatch` and `useSelector`\nexport const useAppDispatch: () => AppDispatch = useDispatch;\nexport const useAppSelector: TypedUseSelectorHook<AppState> = useSelector;\n\nexport const useReportList = useEntityListFactory(\"report\");\nexport const useDimensionList = useEntityListFactory(\"dimension\");\nexport const useVariantList = useEntityListFactory(\"variant\");\nexport const useSectionList = useEntityListFactory(\"section\");\nexport const useBlockList = useEntityListFactory(\"block\");\nexport const useFormatterList = useEntityListFactory(\"formatter\");\n\nexport const useReportRef = useEntityRefFactory(\"report\");\nexport const useSectionRef = useEntityRefFactory(\"section\");\nexport const useBlockRef = useEntityRefFactory(\"block\");\nexport const useDimensionRef = useEntityRefFactory(\"dimension\");\nexport const useVariantRef = useEntityRefFactory(\"variant\");\nexport const useFormatterRef = useEntityRefFactory(\"formatter\");\n\nexport const useInputVariablesFlat = (id:number | undefined) => {\n if (!id) return {};\n const block = useBlockRef(id).data;\n const variables = useAppSelector((state) => state.variables.variables);\n const attributes = useAppSelector((state) => state.variables.attributes);\n const result = useMemo(() => {\n if (!block) return {};\n return block.inputs\n .reduce((acc, d) => ({...acc, ...variables[d]}), attributes);\n }, [block, attributes, variables]);\n return result;\n};\n\nexport const useInputVariablesHash = (id: number) => {\n const block = useBlockRef(id).data;\n const variables = useAppSelector((state) => state.variables.variables);\n const attributes = useAppSelector((state) => state.variables.attributes);\n if (!block) return {};\n const result = useMemo(() => {\n if (!block) return {attributes};\n return Object.keys(variables).reduce((acc, d) => ({\n ...acc,\n ...(block.inputs.includes(parseInt(d, 10)) ? {[d]: variables[d]} : {}),\n }), {attributes});\n }, [block, variables, attributes]);\n return result;\n};\n\nexport const useOutputVariablesForId = (id: number) => {\n const variables = useAppSelector((state) => state.variables.variables);\n return variables[id] || {};\n};\n\nexport const useBlockStatus = (id: number) => useAppSelector((state) => state.variables.status[id]);\n\nexport const useFormatterFunctionsForLocale = (locale = localeDefault) => {\n const resource = useContext(ResourceContext);\n return resource.formatterFunctions[locale];\n};\n\n/** Generate an object with all the resources needed to run a block */\nexport const useBlockContext = (id = undefined, locale = undefined):BlockContext => {\n const localeDefault = useAppSelector((state) => state.status.localeDefault);\n const query = useAppSelector((state) => state.status.query);\n const variables = useInputVariablesFlat(id);\n return {\n variables,\n locale: locale || localeDefault,\n query,\n };\n};\n\nconst getFormatterUsageCount = (formatterName, blockList) => {\n const blocksUsingFormatter = Object.values(blockList)\n .filter((block:AnyBlock) => Object.keys(block.contentByLocale).some((lang) => {\n const {logic} = block.contentByLocale[lang].content;\n return logic\n && (`${logic}`.includes(`formatters.${formatterName}(`) || `${logic}`.includes(`${formatterName}{{`));\n }));\n return blocksUsingFormatter.length;\n};\n\n/** Retrieves an usage count number for an specific formatter name */\nexport const useFormatterUsageCount = (formatterName) => {\n if (!formatterName) return 0;\n const formatterList = useAppSelector((state) => state.records.entities.formatter);\n const blockList = useAppSelector((state) => state.records.entities.block);\n return useMemo(() => getFormatterUsageCount(formatterName, blockList), [formatterList, blockList]);\n};\n\n/** Retrieves an usage count number per every formatter */\nexport const useFormatterUsageCountList = () => {\n const formatterList = useAppSelector((state) => state.records.entities.formatter);\n const blockList = useAppSelector((state) => state.records.entities.block);\n return useMemo(() => Object.values(formatterList).reduce((acc, f) => {\n acc[f.name] = getFormatterUsageCount(f.name, blockList);\n return acc;\n }, {}), [formatterList, blockList]);\n};\n\nfunction useEntityListFactory<T extends EntityType>(entity: T) {\n return (id?: number[]) => {\n const dispatch = useAppDispatch();\n\n const key = useMemo(() => crudKeyMaker.read(entity, {include: true}), []);\n\n const selector = useCallback((state: AppState): RecordRef<NormalizedEntityMap[T][]> => {\n const data = Object.values(state.records.entities[entity]);\n const req = state.records.requests[entity][key] || {\n key,\n type: entity,\n status: data == null ? FetchStatus.UNINITIALIZED : FetchStatus.SUCCESS,\n };\n return processResult(data, req as EntityRequest<T, NormalizedEntityMap[T][]>);\n }, [key]);\n\n const value = useAppSelector(selector);\n\n useEffect(() => {\n if (value.isUninitialized) {\n dispatch(actions.readEntity(entity, {id, include: true}));\n }\n }, [value.status]);\n\n return value;\n };\n}\n\nfunction useEntityRefFactory<T extends EntityType>(entity: T) {\n return (id: number): RecordRef<NormalizedEntityMap[T]> => {\n const dispatch = useAppDispatch();\n\n const key = useMemo(() => crudKeyMaker.read(entity, {id, include: true}), [id]);\n\n // useSelector cache results when the selector function is the same\n const selector = useCallback((state: AppState): RecordRef<NormalizedEntityMap[T]> => {\n const data = state.records.entities[entity][id];\n const req = state.records.requests[entity][key] || {\n key,\n type: entity,\n status: data == null ? FetchStatus.UNINITIALIZED : FetchStatus.SUCCESS,\n };\n return processResult(data, req as EntityRequest<T, NormalizedEntityMap[T]>);\n }, [key]);\n\n const value = useAppSelector(selector);\n\n useEffect(() => {\n if (value.isUninitialized) {\n dispatch(actions.readEntity(entity, {id, include: true}));\n }\n return () => {\n // console.log(\"useEntityRef\", \"unload\", entity, id);\n // dispatch(actions.eraseEntity(\"report\", req.key));\n };\n }, [key, value.isUninitialized]);\n\n return value;\n };\n}\n\nfunction processResult<T extends EntityType, U = NormalizedEntityMap[T]>(\n data: U,\n req: EntityRequest<T, U>,\n) {\n const result = {\n data: undefined,\n error: undefined,\n status: req.status,\n isUninitialized: req.status === FetchStatus.UNINITIALIZED,\n isLoading: req.status === FetchStatus.LOADING,\n isFetching: req.status === FetchStatus.LOADING || req.status === FetchStatus.FETCHING,\n isSuccess: req.status === FetchStatus.SUCCESS,\n isError: req.status === FetchStatus.FAILURE,\n };\n\n if (req.status === FetchStatus.UNINITIALIZED) {\n return result as UninitializedRef;\n }\n if (req.status === FetchStatus.LOADING) {\n return {...result, data} as LoadingRef<U>;\n }\n if (req.status === FetchStatus.FETCHING) {\n return {...result, data} as FetchingRef<U>;\n }\n if (req.status === FetchStatus.FAILURE) {\n return {...result, error: req.error} as ErrorRef;\n }\n return {...result, data} as SuccessRef<U>;\n}\n\ntype UninitializedRef = {\n data: undefined;\n error: undefined;\n status: FetchStatus.UNINITIALIZED;\n isUninitialized: true;\n isLoading: false;\n isFetching: false;\n isSuccess: false;\n isError: false;\n}\n\ntype LoadingRef<T> = {\n data?: T;\n error: undefined;\n status: FetchStatus.LOADING;\n isUninitialized: false;\n isLoading: true;\n isFetching: true;\n isSuccess: false;\n isError: false;\n}\n\ntype FetchingRef<T> = {\n data?: T;\n error: undefined;\n status: FetchStatus.FETCHING;\n isUninitialized: false;\n isLoading: false;\n isFetching: true;\n isSuccess: false;\n isError: false;\n}\n\ntype ErrorRef = {\n data?: undefined;\n error: { code: number; message: string };\n status: FetchStatus.FAILURE;\n isUninitialized: false;\n isLoading: false;\n isFetching: false;\n isSuccess: false;\n isError: true;\n}\n\ntype SuccessRef<T> = {\n data: T;\n error?: undefined;\n status: FetchStatus.SUCCESS;\n isUninitialized: false;\n isLoading: false;\n isFetching: false;\n isSuccess: true;\n isError: false;\n}\n\nexport type RecordRef<T> =\n | UninitializedRef\n | LoadingRef<T>\n | FetchingRef<T>\n | ErrorRef\n | SuccessRef<T>;\n","import {Action, configureStore, ThunkAction} from \"@reduxjs/toolkit\";\nimport {Context, createWrapper} from \"next-redux-wrapper\";\nimport {httpApiFactory, PublicAPI} from \"../api\";\nimport {recordsSlice} from \"./recordsSlice\";\nimport {statusSlice} from \"./statusSlice\";\nimport {variablesSlice} from \"./variablesSlice\";\n\nexport const storeFactory = (_context: Context) => configureStore({\n reducer: {\n [recordsSlice.name]: recordsSlice.reducer,\n [statusSlice.name]: statusSlice.reducer,\n [variablesSlice.name]: variablesSlice.reducer,\n },\n middleware(getDefaultMiddleware) {\n return getDefaultMiddleware({\n thunk: {\n extraArgument: httpApiFactory(\"/api/cms/\"),\n },\n });\n },\n});\nexport const storeWrapper = createWrapper(storeFactory);\n\ntype AppStore = ReturnType<typeof storeFactory>;\nexport type AppState = ReturnType<AppStore[\"getState\"]>;\nexport type AppDispatch = AppStore[\"dispatch\"];\nexport type AppThunk<ReturnType = void> = ThunkAction<ReturnType, AppState, PublicAPI, Action<string>>;\n","import {Skeleton} from \"@mantine/core\";\nimport React from \"react\";\nimport {RecordRef} from \"./hooks\";\n\ntype ComponentWithFetcherProps = {\n id: number;\n skelWidth?: number;\n skelHeight?: number;\n}\n\nexport function withFetcher<T extends {for: unknown}>(\n Component: React.ComponentType<T>,\n useRef: (id: number) => RecordRef<T[\"for\"]>,\n) {\n const ComponentWithFetcher: React.FC<Omit<T, \"for\"> & ComponentWithFetcherProps> = (props) => {\n const {\n id, skelHeight, skelWidth, ...otherProps\n } = props;\n\n const ref = useRef(id);\n\n if (ref.isUninitialized || ref.isFetching) {\n return (\n <Skeleton width={skelWidth} height={skelHeight} />\n );\n }\n\n if (ref.isError) {\n return null;\n }\n\n return <Component {...(otherProps as unknown) as T} for={ref.data} />;\n };\n\n ComponentWithFetcher.displayName = `withFetcher(${Component.displayName || Component.name || \"Component\"})`;\n\n return ComponentWithFetcher;\n}","import {\n Container, LoadingOverlay, TextInput, Alert, ActionIcon, Loader, Group,\n} from \"@mantine/core\";\nimport {useDebouncedValue} from \"@mantine/hooks\";\nimport {\n useEffect, useRef, useState, MutableRefObject,\n} from \"react\";\nimport {IconTrash, IconSearch} from \"@tabler/icons\";\nimport {SearchReportItem, SearchReportResponse} from \"../../types\";\nimport {SearchReportParams, ReadMetadataResponse} from \"../../../api/types\";\nimport ExploreFilters from \"./ExploreFilters\";\nimport ExploreResults from \"./ExploreResults\";\nimport {actions, useAppDispatch} from \"../../../store\";\n\nexport type BespokeExploreProps = {\n locale: string;\n profilePrefix: string;\n initialReportId?: number;\n initialVariantId?: number;\n}\n\n/**\n * React component for rendering a fully featured explore page\n */\nfunction BespokeExplore({\n locale, profilePrefix, initialReportId, initialVariantId,\n}: BespokeExploreProps) {\n const dispatch = useAppDispatch();\n\n const defaultFilters = {\n profile: undefined,\n variant: undefined,\n };\n\n const [query, setQuery] = useState(\"\");\n const [debouncedQuery] = useDebouncedValue(query, 500);\n const [results, setResults] = useState<SearchReportItem[]>([]);\n const [loading, setLoading] = useState(false);\n const [filters, setFilters] = useState(defaultFilters);\n const [metadata, setMetadata] = useState<{[key: string]: any;}[]>();\n\n const inputRef = useRef() as MutableRefObject<HTMLInputElement>;\n\n // Launch initialize to grab the tree\n useEffect(() => {\n // TO-DO Get report->dimension->variant tree metadata or action initialize\n dispatch(actions.readMetadata({}))\n .then((resp:ReadMetadataResponse) => {\n setMetadata(resp.data);\n }, (err) => {\n console.error(err);\n });\n }, []);\n\n useEffect(() => {\n if (metadata) {\n setLoading(true);\n const filterProfile = filters.profile && !Number.isNaN(filters.profile) ? filters.profile : [];\n const filterVariant = filters.variant && !Number.isNaN(filters.variant) ? filters.variant : [];\n const params:SearchReportParams = {\n query: debouncedQuery,\n format: \"profiles\",\n locale,\n limit: 25,\n visible: true,\n includes: true,\n noImage: false,\n variant: filterVariant,\n dimension: [],\n report: filterProfile,\n all: false,\n };\n dispatch(actions.reportSearch(params))\n .then((resp:SearchReportResponse) => {\n if (resp && resp.results) {\n setResults(resp.results);\n }\n setLoading(false);\n inputRef.current?.focus();\n })\n .catch((e) => {\n console.error(e);\n setLoading(false);\n });\n }\n }, [debouncedQuery, filters, metadata]);\n\n const onFilterChange = (newFilters) => {\n setFilters(newFilters);\n };\n\n const onClearInput = () => {\n setQuery(\"\");\n };\n\n return (\n <Container fluid pt=\"1em\">\n <TextInput\n placeholder=\"Search\"\n size=\"xl\"\n onChange={(e) => setQuery(e.target.value)}\n readOnly={loading}\n icon={<IconSearch size={24} />}\n value={query}\n rightSectionWidth={100}\n rightSectionProps={{\n style: {\n \"justify-content\": \"flex-end\",\n padding: \"0 15px 0 0\",\n },\n }}\n rightSection={(\n <Group align=\"center\">\n {loading && <Loader size={28} />}\n {query !== \"\" && (\n <ActionIcon onClick={onClearInput}>\n <IconTrash size={24} />\n </ActionIcon>\n )}\n </Group>\n )}\n ref={inputRef}\n />\n <ExploreFilters\n metadata={metadata}\n onFilter={onFilterChange}\n initialReportId={initialReportId}\n initialVariantId={initialVariantId}\n />\n <LoadingOverlay visible={loading} />\n {!loading && results.length === 0 && (\n <Alert title=\"No results\" color=\"blue\">\n Try another search or filter.\n </Alert>\n )}\n {!loading && <ExploreResults results={results} profilePrefix={profilePrefix} />}\n </Container>\n );\n}\n\nexport default BespokeExplore;\n","import {\n Modal, ActionIcon, ActionIconProps, ModalProps,\n} from \"@mantine/core\";\nimport {ReactElement, useState} from \"react\";\nimport {IconSearch} from \"@tabler/icons\";\nimport Explore, {BespokeExploreProps} from \"./Explore\";\nimport getLocales from \"../../../libs/configs/getLocales\";\n\ntype BespokeExploreModalProps = {\n exploreProps: BespokeExploreProps;\n icon?: ReactElement;\n actionIconProps?: ActionIconProps | Record<string, never>;\n modalProps?: ModalProps | Record<string, never>;\n}\n\nconst {localeDefault} = getLocales();\n\n/**\n * React component for rendering a button that opens the Modal with explore\n */\nfunction BespokeExploreModal({\n exploreProps = {profilePrefix: \"/\", locale: localeDefault},\n icon = <IconSearch />,\n actionIconProps = {},\n modalProps = {},\n} : BespokeExploreModalProps) {\n const [opened, setOpened] = useState(false);\n\n const btnConfig:ActionIconProps = {\n variant: \"subtle\",\n size: \"md\",\n radius: \"md\",\n ...actionIconProps,\n };\n\n const mdlConfig:ModalProps = {\n fullScreen: true,\n opened,\n onClose: () => setOpened(false),\n };\n\n return (\n <>\n <Modal {...modalProps} {...mdlConfig}>\n <Explore {...exploreProps} />\n </Modal>\n <ActionIcon {...btnConfig} onClick={() => setOpened(true)}>\n {icon}\n </ActionIcon>\n </>\n );\n}\n\nexport default BespokeExploreModal;\n","import {\n Text, SelectItemProps, Group, Stack, Badge,\n} from \"@mantine/core\";\nimport {forwardRef} from \"react\";\nimport {SearchReportItem} from \"../../types\";\n\ntype ItemProps = SearchReportItem & SelectItemProps;\n\n/**\n * Renderer for a single member\n */\nconst SearchItem = forwardRef<HTMLDivElement, ItemProps>(\n ({\n id: uniqueKey, members, ...others\n }: ItemProps, ref) => {\n const names = members.map((m) => (\n <Stack key={m.id} align=\"center\">\n <Text weight={500}>{m.name}</Text>\n <Badge color=\"green\" variant=\"light\">\n {m.metadata.variant.name}\n </Badge>\n </Stack>\n ));\n return (\n <div key={uniqueKey} ref={ref}>\n <Group position=\"apart\" grow {...others}>{names}</Group>\n </div>\n );\n },\n);\n\nexport default SearchItem;\n","import {\n Autocomplete, AutocompleteItem, AutocompleteProps, Loader,\n} from \"@mantine/core\";\nimport {useDebouncedValue} from \"@mantine/hooks\";\nimport {\n MutableRefObject, useEffect, useRef, useState,\n} from \"react\";\nimport {useRouter} from \"next/router\";\nimport {IconSearch} from \"@tabler/icons\";\nimport {SearchReportParams} from \"../../../api/types\";\nimport {actions, useAppDispatch} from \"../../../store\";\nimport SearchItem from \"./SearchItem\";\nimport {SearchReportItem, SearchReportResponse} from \"../../types\";\n\nexport type BespokeSearchProps = {\n locale: string;\n profilePrefix: string;\n autocompleteProps?: AutocompleteProps | Record<string, never>;\n}\n\n/**\n * React component for rendering a fully featured explore page\n */\nfunction BespokeSearch({locale, profilePrefix, autocompleteProps = {}}: BespokeSearchProps) {\n const dispatch = useAppDispatch();\n\n const router = useRouter();\n\n const [query, setQuery] = useState(\"\");\n const [debouncedQuery, cancel] = useDebouncedValue(query, 500);\n const [results, setResults] = useState<Array<SearchReportItem> | []>([]);\n const [loading, setLoading] = useState(false);\n const [redirecting, setRedirecting] = useState(false);\n const [initialized, setInitialized] = useState(false);\n\n const inputRef = useRef() as MutableRefObject<HTMLInputElement>;\n\n const doSearch = () => {\n console.log(\"doSearch\", debouncedQuery);\n setLoading(true);\n // setResults([]);\n const params:SearchReportParams = {\n query: debouncedQuery,\n format: \"profiles\",\n locale,\n limit: 10,\n visible: true,\n includes: true,\n noImage: false,\n variant: [],\n dimension: [],\n report: [],\n all: false,\n };\n dispatch(actions.reportSearch(params))\n .then((value:SearchReportResponse) => {\n if (value && value.results) {\n setResults(value.results.map((r) => {\n // eslint-disable-next-line no-param-reassign\n r.value = `VALUE: ${r.name}...`; // Required for Autocomplete to generate keys.\n return r;\n }));\n }\n setLoading(false);\n inputRef.current?.focus();\n })\n .catch((e) => {\n console.error(e);\n setLoading(false);\n });\n };\n\n useEffect(() => {\n if (initialized) {\n doSearch();\n }\n }, [debouncedQuery]);\n\n useEffect(() => {\n cancel();\n if (inputRef.current) {\n setInitialized(true);\n }\n }, []);\n\n const acConfig:AutocompleteProps = {\n placeholder: \"Search\",\n size: \"md\",\n icon: <IconSearch />,\n ...autocompleteProps,\n data: results,\n };\n\n const onItemSubmit = (item:AutocompleteItem) => {\n setRedirecting(true);\n router.push(`${profilePrefix}${item.path}`);\n };\n\n const onChange = (searchTerm) => {\n if (!searchTerm.includes(\"VALUE:\")) {\n setQuery(searchTerm);\n }\n };\n\n return (\n <Autocomplete\n value={query}\n itemComponent={SearchItem}\n onItemSubmit={onItemSubmit}\n onChange={onChange}\n filter={() => true}\n disabled={(loading || redirecting) && !initialized}\n limit={10}\n maxDropdownHeight={250}\n rightSection={loading ? <Loader size={20} /> : \"\"}\n ref={inputRef}\n {...acConfig}\n />\n );\n}\n\nexport default BespokeSearch;\n","import {\n ActionIcon, Chip, Container, Group, Stack, Tooltip,\n} from \"@mantine/core\";\nimport {IconInfoCircle} from \"@tabler/icons\";\n/**\n * React component for rendering a report\n */\nfunction Report({members}) {\n return (\n <Container fluid px={0}>\n <Group grow spacing={0}>\n {members.map((member) => {\n const pills = [\n member.report_name,\n member.dimension_name,\n member.variant_name,\n ];\n const imageTxt = member.image ? [\n `Meta: ${member.image.meta}`,\n `Author: ${member.image.author}`,\n `Link: ${member.image.url}`,\n `License: ${member.image.license}`,\n ]\n : [];\n return (\n <Stack\n align=\"center\"\n justify=\"center\"\n key={member.content_id}\n p=\"1em\"\n style={{\n backgroundImage: `url('/api/cms/member/image.png?member=${member.content_id}&size=splash')`,\n backgroundSize: \"cover\",\n height: \"100vh\",\n backgroundPosition: \"center center\",\n }}\n >\n <h1 style={{\n color: \"white\", fontSize: \"50px\", textShadow: \"2px 2px #000000\", textAlign: \"center\",\n }}\n >\n {member.name}\n </h1>\n <Group>\n {pills.map((p, ix) => (\n <Chip key={`${ix}-${p}`} checked={false}>{p}</Chip>\n ))}\n </Group>\n {member.image && (\n <Tooltip label={imageTxt.join(\" - \")} multiline position=\"bottom\">\n <ActionIcon variant=\"default\" radius=\"xl\">\n <IconInfoCircle size={24} />\n </ActionIcon>\n </Tooltip>\n )}\n </Stack>\n );\n })}\n </Group>\n </Container>\n );\n}\n\nexport default Report;\n","export default (obj) => Object.keys(obj).map((key) => `${key}=${obj[key]}`).join(\"&\");\n","import {Autocomplete, Select} from \"@mantine/core\";\nimport {useDebouncedValue} from \"@mantine/hooks\";\nimport axios from \"axios\";\nimport {\n forwardRef, useEffect, useRef, useState,\n} from \"react\";\nimport paramString from \"../../libs/js/paramString\";\nimport {useAppSelector, useDimensionRef} from \"../../store\";\n\ntype DimensionAutocompleteProps = {\n id: number;\n locale: string;\n onSelect: (previewMember: any) => void;\n}\n\ntype ResultMember = {\n id: string,\n name: string,\n}\n\ntype DataMember = {\n value: string,\n name: string\n}\n\n/**\n * It display:\n * - A selector with all the variants from the given dimension\n * - An autocomplete search component to choose a member from the selected variant\n */\nexport function DimensionAutocomplete({id, locale, onSelect}: DimensionAutocompleteProps) {\n const dimensionRef = useDimensionRef(id);\n\n const dimension:any = dimensionRef.data;\n\n const variants = useAppSelector(\n (state) => (dimension ? dimension.variants.map((vId) => state.records.entities.variant[vId]) : []),\n );\n const [query, setQuery] = useState(\"\");\n const [debouncedQuery] = useDebouncedValue(query, 500);\n const [results, setResults] = useState<ResultMember[]>([]);\n const [data, setData] = useState<DataMember[]>([]);\n const [currentVariant, setCurrentVariant] = useState<Record<string, any> | undefined>();\n const [currentMember, setCurrentMember] = useState<any>();\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n const variantsOptions = Object.values(variants)\n .map((d: any) => ({value: String(d.id), label: `${d.name}`}));\n\n useEffect(() => {\n const url = `/api/cms/search/members?${paramString({\n query: debouncedQuery,\n locale,\n dimension: dimension.id,\n variant: currentVariant ? currentVariant.id : \"\",\n })}`;\n\n axios.get(url)\n .then((resp) => {\n if (resp.data.data && resp.data.data.results) {\n const res = resp.data.data.results;\n setResults(res);\n }\n })\n .catch((e) => console.error(e));\n }, [debouncedQuery]);\n\n useEffect(() => {\n if (!currentVariant && variants[0]) {\n setCurrentVariant(variants[0]);\n }\n }, [variants]);\n\n useEffect(() => {\n setData(results.map((d) => ({value: d.id, name: d.name})));\n }, [results]);\n\n useEffect(() => {\n if (currentMember) {\n onSelect(currentMember);\n }\n }, [currentMember]);\n\n const onSelectPreview = (previewMember) => {\n const fullMember = results.find((d) => d.id === previewMember.value);\n if (fullMember) {\n setQuery(fullMember.name);\n setCurrentMember(fullMember);\n }\n };\n\n const onChangeVariant = (value) => {\n const newVariantId = parseInt(value, 10);\n if (currentVariant && currentVariant.id !== newVariantId) {\n const newVariant = variants.find((v) => v.id === parseInt(value, 10));\n if (newVariant) setCurrentVariant(newVariant);\n setQuery(\"\");\n onSelect(undefined);\n }\n };\n\n if (!dimensionRef.isSuccess) {\n return (\n <div>{`Error loading Dimension '${id}'`}</div>\n );\n }\n\n if (variants.length === 0) return null;\n\n return (\n <>\n <Select\n style={{width: 100}}\n size=\"xs\"\n data={variantsOptions}\n value={currentVariant ? String(currentVariant.id) : null}\n onChange={onChangeVariant}\n />\n <small>\n {currentVariant && `/${currentVariant.slug}`}\n {currentMember && `/${currentMember.slug}`}\n </small>\n <Autocomplete\n key={dimension.id}\n style={{width: 200}}\n filter={() => true}\n size=\"xs\"\n limit={10}\n ref={inputRef}\n onClick={() => inputRef.current?.select()}\n placeholder={`Choose a ${dimension.name} to preview`}\n itemComponent={forwardRef(({ id, name, ...others }, ref) => <div {...others} key={`${id}-${name}`} ref={ref}>{name}</div>)} //eslint-disable-line\n value={query}\n onChange={(e) => setQuery(e)}\n onItemSubmit={onSelectPreview}\n data={data}\n onDropdownClose={() => setResults([])}\n />\n </>\n );\n}\n","import * as VariantModel from \"./variant\";\nimport * as ReportModel from \"./report\";\n\nexport const ID = \"dimension\";\n\nexport const MODEL_NAME = \"Dimension\";\n\nexport const PARENT_MODEL = ReportModel.ID;\n\nexport interface Dimension {\n /** Entity ID */\n id: number;\n /** Parent Report ID */\n report_id: number;\n\n name: string;\n ordering: string;\n settings: Record<string, unknown>;\n visible: boolean;\n}\n\nexport interface NestedDimension extends Dimension {\n variants: VariantModel.Variant[];\n}\n\nexport interface NormalizedDimension extends Dimension {\n variants: number[];\n}\n","export const ID = \"formatter\";\n\nexport const MODEL_NAME = \"Formatter\";\n\nexport const PARENT_MODEL = null;\n\nexport interface FormatterContent {\n description: string;\n inputType: string;\n logic: string;\n testValue: string;\n type: string;\n [key: string]: string;\n}\n\nexport interface Formatter {\n id: number;\n name: string;\n content: FormatterContent;\n}\n","import * as DimensionModel from \"./dimension\";\n\nexport const ID = \"variant\";\n\nexport const MODEL_NAME = \"Variant\";\n\nexport const PARENT_MODEL = DimensionModel.ID;\n\nexport interface VariantLocaleAttribute {\n name: string;\n type: \"constant\" | \"variable\";\n value: string;\n}\n\nexport interface VariantLocaleSettings {\n idKey: string,\n labelKey: string,\n accessor: string,\n path: string,\n properties?: Record<string, unknown>;\n attributes: VariantLocaleAttribute[];\n [key: string]: unknown;\n}\n\nexport interface Variant {\n id: number;\n dimension_id: number;\n settings: Record<string, unknown>;\n config: Record<string, VariantLocaleSettings>;\n name: string;\n slug: string;\n visible: boolean;\n}\n","import * as BlockModel from \"./block\";\nimport * as DimensionModel from \"./dimension\";\nimport * as FormatterModel from \"./formatter\";\nimport * as InputModel from \"./input\";\nimport * as ReportModel from \"./report\";\nimport * as SectionModel from \"./section\";\nimport * as VariantModel from \"./variant\";\n\nexport {\n BlockModel, DimensionModel, FormatterModel, InputModel, SectionModel, ReportModel, VariantModel,\n};\n\nexport type EntityType =\n | typeof BlockModel.ID\n | typeof DimensionModel.ID\n | typeof ReportModel.ID\n | typeof SectionModel.ID\n | typeof VariantModel.ID\n | typeof FormatterModel.ID;\n\nexport type SimpleEntityMap = {\n block: BlockModel.AnyBlock;\n dimension: DimensionModel.Dimension;\n formatter: FormatterModel.Formatter;\n report: ReportModel.AnyReport;\n section: SectionModel.Section;\n variant: VariantModel.Variant;\n};\nexport type NestedEntityMap = {\n block: BlockModel.AnyNestedBlock;\n dimension: DimensionModel.NestedDimension;\n formatter: FormatterModel.Formatter;\n report: ReportModel.AnyNestedReport;\n section: SectionModel.NestedSection;\n variant: VariantModel.Variant;\n}\nexport type NormalizedEntityMap = {\n block: BlockModel.AnyNormalizedBlock;\n dimension: DimensionModel.NormalizedDimension;\n formatter: FormatterModel.Formatter;\n report: ReportModel.AnyNormalizedReport;\n section: SectionModel.NormalizedSection;\n variant: VariantModel.Variant;\n}\n\n/**\n * Represents any object in any of the previous EntityMaps.\n */\nexport type AnyEntity = Record<string, unknown>;\n\nexport const ENTITY_TYPE = {\n BLOCK: BlockModel.ID,\n DIMENSION: DimensionModel.ID,\n FORMATTER: FormatterModel.ID,\n REPORT: ReportModel.ID,\n SECTION: SectionModel.ID,\n VARIANT: VariantModel.ID,\n} as const;\n\n// TODO: i18n\nexport const ENTITY_PRETTY_NAMES = {\n [BlockModel.ID]: BlockModel.MODEL_NAME,\n [DimensionModel.ID]: DimensionModel.MODEL_NAME,\n [FormatterModel.ID]: FormatterModel.MODEL_NAME,\n [ReportModel.ID]: ReportModel.MODEL_NAME,\n [SectionModel.ID]: SectionModel.MODEL_NAME,\n [VariantModel.ID]: VariantModel.MODEL_NAME,\n} as const;\n\nexport const ENTITY_PARENT = {\n [BlockModel.ID]: BlockModel.PARENT_MODEL,\n [DimensionModel.ID]: DimensionModel.PARENT_MODEL,\n [FormatterModel.ID]: FormatterModel.PARENT_MODEL,\n [ReportModel.ID]: ReportModel.PARENT_MODEL,\n [SectionModel.ID]: SectionModel.PARENT_MODEL,\n [VariantModel.ID]: VariantModel.PARENT_MODEL,\n} as const;\n","import {ActionIcon} from \"@mantine/core\";\nimport {useCallback} from \"react\";\nimport {IconTrash} from \"@tabler/icons\";\nimport {useDispatch} from \"react-redux\";\nimport {useDialog} from \"../commons/Dialog\";\nimport {EntityType, ENTITY_PRETTY_NAMES} from \"../../models\";\nimport {actions} from \"../../store\";\n\ntype EntityDeleteButtonProps = {\n type: EntityType;\n id: number;\n warning?: string;\n disabled?: boolean;\n}\n\nexport function EntityDeleteButton({\n id, type, warning, disabled = false,\n} : EntityDeleteButtonProps) {\n const dispatch = useDispatch();\n const {newConfirmation} = useDialog();\n\n const maybeDelete = useCallback(async () => {\n const PRETTY_NAME = ENTITY_PRETTY_NAMES[type] || \"Entity\";\n const message = warning || `Delete this ${PRETTY_NAME} and all its contents? This action cannot be undone.`;\n try {\n if (!disabled) {\n await newConfirmation({\n title: \"Are you sure?\",\n message,\n confirmText: \"Yes, Delete it.\",\n });\n dispatch(actions.deleteEntity(type, id));\n }\n } catch {\n console.debug(`${PRETTY_NAME} deletion aborted:`, id);\n }\n }, [id, type, warning, disabled]);\n\n return (\n <ActionIcon disabled={disabled} color=\"red\" onClick={maybeDelete}>\n <IconTrash size={20} />\n </ActionIcon>\n );\n}\n","import {\n Badge, Button, Card, Center, Group, Space, Text, useMantineTheme,\n} from \"@mantine/core\";\nimport {useCallback} from \"react\";\nimport {IconDatabase, IconPencil, IconServer} from \"@tabler/icons\";\n\nimport {DimensionModel, VariantModel} from \"../../models\";\nimport {useDimensionRef, useVariantRef, withFetcher} from \"../../store\";\nimport {useDialog} from \"../commons/Dialog\";\nimport {EntityDeleteButton} from \"./EntityDeleteButton\";\n\ntype DimensionCardProps = {\n for: DimensionModel.NormalizedDimension;\n onEdit: (id: number) => void;\n}\n\n/**\n *\n */\nexport function DimensionCard({for: dimension, onEdit}: DimensionCardProps) {\n const theme = useMantineTheme();\n\n const {newConfirmation} = useDialog();\n\n const secondaryColor = theme.colorScheme === \"dark\"\n ? theme.colors.dark[1]\n : theme.colors.gray[7];\n\n const maybeEdit = useCallback(async () => {\n try {\n await newConfirmation({\n title: \"Are you sure?\",\n message: \"Modifying dimensions can be destructive and break the site. Make sure you know what you're doing!\",\n confirmText: \"Continue\",\n });\n onEdit(dimension.id);\n } catch {\n console.debug(\"Dimension edition aborted.\");\n }\n }, [onEdit]);\n\n const {name, ordering} = dimension;\n\n return (\n <Card shadow=\"xs\" withBorder style={{margin: theme.spacing.sm}}>\n <Group position=\"apart\">\n <Center>\n <IconDatabase size={22} />\n <Space w=\"xs\" />\n <Text weight=\"bold\">{name}</Text>\n </Center>\n </Group>\n <Text size=\"sm\" style={{color: secondaryColor, lineHeight: 2}}>\n Order:\n {ordering}\n </Text>\n <Space w=\"xs\" />\n <Group position=\"apart\">\n <Center>\n <IconServer size={22} />\n <Space w=\"xs\" />\n <Text weight=\"bold\">Variants</Text>\n </Center>\n <Badge variant=\"light\">{0}</Badge>\n </Group>\n\n <ul>\n {dimension.variants.map((variantId) => (\n <li key={variantId} style={{color: secondaryColor}}>\n <VariantPreviewWithFetcher id={variantId} />\n </li>\n ))}\n </ul>\n\n <Group position=\"apart\">\n <Button onClick={maybeEdit} leftIcon={<IconPencil />} compact>\n Edit\n </Button>\n <EntityDeleteButton\n id={dimension.id}\n type=\"dimension\"\n warning=\"Deleting dimensions can be destructive and break the site. Make sure you know what you're doing!\"\n />\n </Group>\n </Card>\n );\n}\n\nexport const DimensionCardWithFetcher = withFetcher(DimensionCard, useDimensionRef);\n\nfunction VariantPreview({for: variant}: {for: VariantModel.Variant}) {\n return (\n <Text size=\"sm\">{`${variant.name}: /${variant.slug}`}</Text>\n );\n}\n\nconst VariantPreviewWithFetcher = withFetcher(VariantPreview, useVariantRef);\n","/**\n* Converts html tags to spaces, then removes redundant spaces\n* @param {string} n <b>My text</b>\n*/\nexport default function stripHTML(n:string) {\n // Internal list of HTML entities for escaping.\n const entities = {\n \"&amp;\": \"&\",\n \"&lt;\": \"<\",\n \"&gt;\": \">\",\n \"&quot;\": \"\\\"\",\n \"&#x27;\": \"'\",\n \"&#x60;\": \"`\",\n \"&nbsp;\": \"\",\n };\n\n const source = `(?:${Object.keys(entities).join(\"|\")})`;\n const testRegexp = RegExp(source);\n const replaceRegexp = RegExp(source, \"g\");\n\n const s = String(n).replace(/<[^>]+>/g, \" \").replace(/\\s+/g, \" \").trim();\n return testRegexp.test(s) ? s.replace(replaceRegexp, (match) => entities[match]) : s;\n}\n","/**\n* Removes non breaking spaces & other html entities from a string\n* @param {string} n <b>MyText</b>\n*/\nexport default function stripEntities(n:string) {\n return typeof n === \"string\" ? String(n).replace(/&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-f]{1,6});/ig, \" \") : n;\n}\n","import slugifyFn from \"slugify\";\nimport stripHTML from \"./stripHTML\";\nimport stripEntities from \"./stripEntities\";\n\nfunction slugify(str) {\n if (!str) return \"\";\n return slugifyFn(\n stripEntities(stripHTML(str)),\n {\n replacement: \"-\", // replace spaces with replacement character, defaults to `-`\n remove: /[*+~.()'\"!:@]/g, // remove characters that match regex, defaults to `undefined`\n lower: true, // convert to lower case, defaults to `false`\n strict: true, // strip special characters except replacement, defaults to `false`\n // locale: locale, // language code of the locale to use\n trim: true, // trim leading and trailing replacement chars, defaults to `true`\n },\n );\n}\n\nexport default slugify;\n","import {\n Button, Checkbox, Popover, Radio, Select, Switch, TextInput,\n} from \"@mantine/core\";\nimport {useDisclosure, useHotkeys} from \"@mantine/hooks\";\nimport React, {\n ReactElement, ReactNode, useCallback, useMemo, useState,\n} from \"react\";\n\ntype EntityAddButtonProps = {\n target: ReactElement;\n fields?: FieldProps[];\n onSubmit: (value: ValueMap) => void;\n}\n\nexport function EntityCreateButton(props: EntityAddButtonProps) {\n const {target, fields, onSubmit} = props;\n\n const [jsxFields, value, resetValue] = useFields(fields || []);\n\n const [isOpen, openHandler] = useDisclosure(false, {\n onClose: resetValue,\n });\n\n const submitHandler = useCallback((evt) => {\n if (isOpen) {\n evt.preventDefault();\n if (typeof onSubmit === \"function\") onSubmit(value);\n openHandler.close();\n }\n }, [value, isOpen]);\n\n useHotkeys([\n [\"enter\", submitHandler],\n ]);\n\n if (jsxFields.length === 0) return target;\n\n return (\n <Popover\n onClose={openHandler.close}\n opened={isOpen}\n trapFocus\n withArrow\n withinPortal\n zIndex={1001}\n >\n <Popover.Target>\n {React.cloneElement(props.target, {onClick: openHandler.open})}\n </Popover.Target>\n <Popover.Dropdown>\n <form onSubmit={submitHandler}>\n {jsxFields}\n <Button type=\"submit\">Submit</Button>\n </form>\n </Popover.Dropdown>\n </Popover>\n );\n}\n\ntype SelectProps = {\n type: \"select\" | \"radio\";\n /** Input name, used as key for the value */\n name: string;\n /** Label for the input element, shown to the user */\n label: string;\n options: { label: string, value: string | number }[];\n initialValue?: string | number;\n}\ntype InputProps = {\n type: \"text\";\n /** Input name, used as key for the value */\n name: string;\n /** Label for the input element, shown to the user */\n label: string;\n initialValue?: string;\n placeholder?: string;\n}\ntype CheckboxProps = {\n type: \"checkbox\" | \"switch\";\n /** Input name, used as key for the value */\n name: string;\n /** Label for the input element, shown to the user */\n label: string;\n initialValue?: boolean;\n}\n\ntype FieldProps = SelectProps | InputProps | CheckboxProps;\n\ntype ValueMap = Record<string, string | number | boolean | undefined | null>;\n\nfunction useFields(fields: FieldProps[]): [ReactNode[], ValueMap, () => void] {\n const [value, setValue] = useState<ValueMap>({});\n\n const fieldsKey = fields.map((field) => encodeURIComponent(`${field.name}:${field.type}/${field.label}`)).join(\"&\");\n\n const resetValue = useCallback(() => {\n setValue({});\n }, []);\n\n const jsxFields: ReactNode[] = useMemo(() => fields.map((field) => {\n const fieldValue = `${value[field.name] ?? (field.initialValue || \"\")}`;\n\n if (field.type === \"checkbox\") {\n return (\n <Checkbox\n key={field.name}\n label={field.label}\n name={field.name}\n checked={fieldValue == \"true\"}\n />\n );\n }\n if (field.type === \"radio\") {\n return (\n <Radio.Group\n key={field.name}\n // name={field.name} todo fix\n label={field.label}\n value={fieldValue}\n >\n {field.options.map((opt) => <Radio label={opt.label} value={`${opt.value}`} />)}\n </Radio.Group>\n );\n }\n if (field.type === \"select\") {\n return (\n <Select\n key={field.name}\n data={field.options.map((opt) => ({value: `${opt.value}`, label: opt.label}))}\n label={field.label}\n onChange={(val) => {\n setValue({...value, [field.name]: val});\n }}\n searchable\n value={fieldValue}\n zIndex={1002}\n />\n );\n }\n if (field.type === \"switch\") {\n return (\n <Switch\n key={field.name}\n label={field.label}\n name={field.name}\n checked={fieldValue == \"true\"}\n />\n );\n }\n if (field.type === \"text\") {\n return (\n <TextInput\n key={field.name}\n label={field.label}\n onChange={(evt) => {\n setValue({...value, [field.name]: evt.target.value});\n }}\n placeholder={field.placeholder}\n value={fieldValue}\n />\n );\n }\n\n return null;\n }), [fieldsKey, value]);\n\n return [jsxFields, value, resetValue];\n}\n","type IconTitleProps = {\n icon: React.ReactNode;\n children: React.ReactNode;\n}\n\nexport function IconTitle(props: IconTitleProps) {\n return (\n <span style={{display: \"flex\", alignItems: \"center\", gap: \"0.5rem\"}}>\n {props.icon}\n {props.children}\n </span>\n );\n}\n","import {\n Badge, Button, Card, Center, Group, Space, Text, useMantineTheme,\n} from \"@mantine/core\";\nimport {useCallback} from \"react\";\nimport {IconPencil, IconServer} from \"@tabler/icons\";\n\nimport {EntityDeleteButton} from \"./EntityDeleteButton\";\nimport {useDialog} from \"../commons/Dialog\";\nimport {VariantModel} from \"../../models\";\nimport {useVariantRef, withFetcher} from \"../../store\";\n\ntype VariantCardProps = {\n for: VariantModel.Variant;\n onEdit: (id: number) => void;\n}\n\nexport function VariantCard({for: variant, onEdit}: VariantCardProps) {\n const theme = useMantineTheme();\n\n const {newConfirmation} = useDialog();\n\n const secondaryColor = theme.colorScheme === \"dark\"\n ? theme.colors.dark[1]\n : theme.colors.gray[7];\n\n const maybeEdit = useCallback(async () => {\n try {\n await newConfirmation({\n title: \"Are you sure?\",\n message: \"Modifying variants can be destructive and break the site. Make sure you know what you're doing!\",\n confirmText: \"Continue\",\n });\n onEdit(variant.id);\n } catch {\n console.debug(\"Variant edition aborted.\");\n }\n }, [onEdit]);\n\n const {slug, name} = variant;\n\n return (\n <Card shadow=\"xs\" withBorder style={{margin: theme.spacing.sm}}>\n <Group position=\"apart\">\n <Center>\n <IconServer size={22} />\n <Space w=\"xs\" />\n <Text weight=\"bold\">{name}</Text>\n </Center>\n <Badge variant=\"light\">\n /\n {slug}\n </Badge>\n </Group>\n <Text size=\"sm\" style={{color: secondaryColor, lineHeight: 2}}>\n Description of variant will go here\n </Text>\n <Space w=\"xs\" />\n <Group position=\"apart\">\n <Button onClick={() => maybeEdit()} leftIcon={<IconPencil />} compact>\n Edit\n </Button>\n <EntityDeleteButton\n id={variant.id}\n type=\"variant\"\n warning=\"Deleting variants can be destructive and break the site. Make sure you know what you're doing!\"\n />\n </Group>\n </Card>\n );\n}\n\nexport const VariantCardWithFetcher = withFetcher(VariantCard, useVariantRef);\n","/**\n * Given an object, crawls down keys recursively looking for arrays. Returns a list of\n * string accessors, separated by dots if nested, e.g., \"data.payload.results\"\n */\nconst arrayFinder = (obj) => {\n const keys = [];\n if (Array.isArray(obj)) return [];\n const parse = (obj, prefix = \"\") => {\n if (!obj || typeof obj !== \"object\") return;\n Object.keys(obj).forEach((key) => {\n if (Array.isArray(obj[key])) {\n keys.push(`${prefix ? `${prefix}.` : \"\"}${key}`);\n } else if (typeof obj[key] === \"object\") {\n parse(obj[key], `${prefix ? `${prefix}.` : \"\"}${key}`);\n } else return;\n });\n };\n parse(obj);\n return keys;\n};\n\n/**\n * Given an object and a dot-separated string accessor like \"prop1.prop2.prop3\", drill down to find the nested value\n */\nconst keyDiver = (obj, str) => (!str ? obj : typeof str === \"string\" ? str.split(\".\").reduce((o, i) => o[i], obj) : obj);\n\n/**\n *\n */\nconst insertAtOrdering = (array, id, ordering) => {\n // remove the item from the array by id\n let items = array.filter((d) => d !== id);\n // insert it at the ordering spot\n items.splice(ordering, 0, id);\n // set orderings based on array location\n items = items.map((d, i) => ({id: d, ordering: i}));\n // create an ordering lookup hash\n const itemOrderings = items.reduce((acc, d) => ({...acc, [d.id]: d.ordering}), {});\n return items.map((d) => ({...d, ordering: itemOrderings[d.id]})).sort((a, b) => a.ordering - b.ordering).map((d) => d.id);\n};\n\nexport {arrayFinder, keyDiver, insertAtOrdering};\n","// Strip leading/trailing spaces and URL-breaking characters\nexport default (str) => str.replace(/^\\s+|\\s+$/gm, \"\").replace(/[^a-zA-ZÀ-ž0-9-\\ _]/g, \"\");\n","import React from \"react\";\nimport {\n Accordion, Group, Text, useMantineTheme,\n} from \"@mantine/core\";\nimport {Prism} from \"@mantine/prism\";\nimport \"./ConsoleVariable.css\";\n\nconst evalType = (value) => {\n let t:string = typeof value;\n if (t === \"object\") {\n if (value === null) return \"undefined\";\n if (Array.isArray(value)) t = \"array\";\n else if ([\"Error\", \"EvalError\", \"ReferenceError\", \"SyntaxError\"].includes(value.constructor.name)) t = \"error\";\n }\n return t;\n};\n\nconst sortOrder = [\"object\", \"array\", \"string\", \"number\"];\n\n/**\n * Displays a variable output by a block.\n * @param {*} value\n */\nfunction ConsoleVariable({\n dimmed = false, label, root = true, value,\n}) {\n const t = evalType(value);\n let v = value;\n\n if (t === \"object\") {\n return (\n <Accordion className=\"cr-variable-accordion\">\n <Accordion.Item value=\"label\">\n <Accordion.Control>\n <Text lineClamp={1} size=\"xs\" weight={700}>{label}</Text>\n </Accordion.Control>\n <Accordion.Panel>\n { Object.keys(value)\n .sort((a, b) => {\n const aType = evalType(value[a]);\n const bType = evalType(value[b]);\n if (aType !== bType) return sortOrder.indexOf(aType) - sortOrder.indexOf(bType);\n return a.localeCompare(b);\n })\n .map((k:any) => <ConsoleVariable root={false} key={k} label={k} value={value[k]} />) }\n </Accordion.Panel>\n </Accordion.Item>\n </Accordion>\n );\n }\n if (t === \"array\") {\n return (\n <Accordion className=\"cr-variable-accordion\">\n <Accordion.Item value=\"label\">\n <Accordion.Control>\n <Text lineClamp={1} size=\"xs\" weight={700}>{label}</Text>\n </Accordion.Control>\n <Accordion.Panel>\n { value.map((k:any, i) => <ConsoleVariable root={false} key={i} label={i} value={k} />) }\n </Accordion.Panel>\n </Accordion.Item>\n </Accordion>\n );\n }\n\n if (t === \"string\") v = `\"${v}\"`;\n else if (t === \"error\") v = `Error: ${v.message}`;\n else if (t === \"undefined\") v = t;\n else if (v.toString) v = v.toString();\n\n const theme = useMantineTheme();\n\n return (\n <Group noWrap>\n <Text\n color={dimmed ? \"dimmed\" : theme.primaryColor}\n lineClamp={1}\n size=\"xs\"\n style={{\n overflow: \"visible\",\n wordBreak: \"keep-all\",\n whiteSpace: \"nowrap\",\n }}\n weight={700}\n >\n { root ? `{{${label}}}` : label }\n </Text>\n <Prism\n className=\"cr-variable\"\n language=\"jsx\"\n noCopy\n style={{\n flex: \"1 1 100%\",\n overflowY: \"scroll\",\n textAlign: \"right\",\n }}\n >\n {v}\n </Prism>\n </Group>\n );\n}\n\nexport default ConsoleVariable;\n","/* react */\nimport React from \"react\";\n\n/* components */\nimport {Text} from \"@mantine/core\";\nimport ConsoleVariable from \"./ConsoleVariable\";\nimport {useBlockRef} from \"../../../store\";\n\n/** */\nfunction InputMenuItem({\n reserved = [], id = null, variables = {},\n}) {\n const blockId:any = id === \"attributes\" ? null : id;\n\n const block = useBlockRef(blockId).data;\n\n const label = block ? block.type : \"block\";\n const keys = Object.keys(variables);\n\n return (\n <div>\n { keys.length\n ? keys\n .filter((o) => variables[o])\n .map((d) => (\n <ConsoleVariable\n key={d}\n dimmed={reserved.includes(d)}\n label={d}\n value={variables[d]}\n />\n ))\n : (\n <Text color=\"dimmed\" size=\"xs\">\n <i>\n empty\n {label}\n </i>\n </Text>\n )}\n </div>\n );\n}\n\nexport default InputMenuItem;\n","import {useEffect, useState} from \"react\";\nimport {\n Divider, Group, ScrollArea, Space,\n} from \"@mantine/core\";\n\ninterface DrawerContentWithScrollProps {\n content: React.ReactElement;\n buttons: React.ReactElement;\n size: number\n}\n\nexport function DrawerContentWithScroll({content, buttons, size}: DrawerContentWithScrollProps) {\n const [scrollSize, setScrollSize] = useState(500);\n\n useEffect(() => {\n // Updated scroller area size, replace with a proper css layout\n const {innerHeight} = window;\n setScrollSize(innerHeight - size);\n }, []);\n\n return (\n <div style={{height: \"100%\"}}>\n <ScrollArea offsetScrollbars type=\"always\" style={{height: scrollSize}}>\n {content}\n </ScrollArea>\n <Space h=\"xs\" />\n <Divider />\n <Group mt=\"xs\" grow style={{height: 45}}>\n {buttons}\n </Group>\n </div>\n );\n}\n","/* react */\nimport {\n ActionIcon,\n Button, Code, Divider, Group, SegmentedControl, Select, Space, TextInput, Title, Text,\n} from \"@mantine/core\";\nimport {useEffect, useState} from \"react\";\n\nimport {\n IconAlertCircle, IconCircleCheck, IconPlayerPlay, IconTrash,\n} from \"@tabler/icons\";\nimport {arrayFinder, keyDiver} from \"../../libs/js/arrayUtils\";\nimport slugifyInput from \"../../libs/web/slugifyInput\";\nimport {VariantModel} from \"../../models\";\nimport {\n actions, useAppDispatch, useAppSelector, useVariantRef, withFetcher,\n} from \"../../store\";\nimport InputMenuItem from \"../../cms/components/components/InputMenuItem\";\nimport {DrawerContentWithScroll} from \"../DrawerContentWithScroll\";\n\ntype VariantEditorProps = {\n for: VariantModel.Variant;\n onClose: () => void;\n}\n\nexport function VariantEditor({for: variant, onClose: closeHandler}: VariantEditorProps) {\n const dispatch = useAppDispatch();\n\n const localeDefault = useAppSelector((state) => state.status.localeDefault);\n const locales = useAppSelector((state) => state.status.locales);\n\n const localesItems = locales.map((locale) => ({value: locale, label: locale.toUpperCase()}));\n\n /* state */\n const [sample, setSample] = useState();\n const [selectedLocale, setSelectedLocale] = useState(localeDefault);\n const [variantConfig, setVariantConfig] = useState<any>(variant);\n const [loading, setLoading] = useState(false);\n const [loadingFetch, setLoadingFetch] = useState(false);\n const [loadingValidSlug, setLoadingValidSlug] = useState(false);\n const [validSlug, setValidSlug] = useState({valid: false, suggestion: \"\"});\n const [payload, setPayload] = useState();\n const [accessors, setAccessors] = useState([]);\n\n const getMembers = (path) => {\n setLoadingFetch(true);\n dispatch(actions.urlProxy(path)).then((resp) => {\n setPayload(resp);\n setLoadingFetch(false);\n // todo1.0 error/toast/else\n }).catch((e) => {\n console.error(e);\n setLoadingFetch(false);\n // todo1.0 toast\n });\n };\n\n const setConfigFromSample = (sample, accessor = \"\") => {\n if (sample) {\n const sampleKeys = Object.keys(sample);\n const guessId = sampleKeys.find((d) => d.toLowerCase().includes(\"id\")) || sampleKeys[0];\n const guessName = sampleKeys.find((d) => !d.toLowerCase().includes(\"id\")) || sampleKeys[0];\n setVariantConfig({\n ...variantConfig,\n config: {\n ...variantConfig.config,\n [selectedLocale]: {\n ...variantConfig.config[selectedLocale],\n idKey: variantConfig.config[selectedLocale].idKey || guessId,\n labelKey: variantConfig.config[selectedLocale].labelKey || guessName,\n accessor,\n },\n },\n });\n }\n setSample(sample);\n };\n\n useEffect(() => {\n // If language is not present in the config, create it empty\n if (!variantConfig.config[selectedLocale]) {\n setVariantConfig({\n ...variantConfig,\n config: {\n ...variantConfig.config,\n [selectedLocale]: {attributes: []},\n },\n });\n }\n\n // Initial request to get the sample data if path is set in the selectedLocale\n if (variantConfig.config[selectedLocale] && variantConfig.config[selectedLocale].path) {\n getMembers(variantConfig.config[selectedLocale].path);\n }\n }, []);\n\n useEffect(() => {\n // On change language clear payload\n setPayload(undefined);\n\n // If language is different from default, update them and merge values with selected ones\n let attributesList = [];\n if (selectedLocale !== localeDefault) {\n const defaultAttributes = variantConfig.config[localeDefault]\n ? [...variantConfig.config[localeDefault].attributes].map((item) => {\n const newItem = {...item};\n newItem.value = \"\";\n return newItem;\n })\n : [];\n if (variantConfig.config[selectedLocale] && variantConfig.config[selectedLocale].attributes) {\n attributesList = defaultAttributes.map((da) => {\n const item = variantConfig.config[selectedLocale].attributes.find((sa) => da.name === sa.name);\n if (item) {\n // eslint-disable-next-line no-param-reassign\n da.value = item.value;\n }\n return da;\n });\n } else {\n attributesList = defaultAttributes;\n }\n\n setVariantConfig({\n ...variantConfig,\n config: {\n ...variantConfig.config,\n [selectedLocale]: {\n ...variantConfig.config[selectedLocale],\n attributes: attributesList,\n },\n },\n });\n }\n\n // If has path, force to load them\n if (variantConfig.config[selectedLocale] && variantConfig.config[selectedLocale].path) {\n getMembers(variantConfig.config[selectedLocale].path);\n }\n }, [selectedLocale]);\n\n // const enterPress = useKeyPress(13);\n\n useEffect(() => {\n if (payload) {\n const keys = arrayFinder(payload);\n setAccessors(keys);\n if (variantConfig.config[selectedLocale].accessor && payload[variantConfig.config[selectedLocale].accessor]) {\n setConfigFromSample(\n payload[variantConfig.config[selectedLocale].accessor][0],\n variantConfig.config[selectedLocale].accessor,\n );\n } else if (keys.length === 0) {\n if (payload && payload[0]) setConfigFromSample(payload[0]);\n }\n }\n }, [payload]);\n\n // If slug changes, validate uniqueness constraints vs other dimensions\n useEffect(() => {\n if (variantConfig.slug) {\n setLoadingValidSlug(true);\n dispatch(actions.variantValidateSlug(variantConfig.dimension_id, variantConfig.slug))\n .then(setValidSlug)\n .then(() => {\n setLoadingValidSlug(false);\n }, (err) => {\n console.error(err);\n });\n }\n }, [variantConfig.slug]);\n\n const onChangeAccessor = (accessor) => {\n const dataArray = keyDiver(payload, accessor);\n if (dataArray[0]) {\n setConfigFromSample(dataArray[0], accessor);\n } else {\n // todo1.0 toast\n }\n };\n\n const onChange = (field, value) => {\n let newValue = value;\n if (field === \"slug\") {\n newValue = slugifyInput(value);\n }\n setVariantConfig({...variantConfig, [field]: newValue});\n };\n\n const onChangeConfig = (field, value) => {\n setVariantConfig({\n ...variantConfig,\n config: {\n ...variantConfig.config,\n [selectedLocale]: {\n ...variantConfig.config[selectedLocale],\n [field]: value,\n },\n },\n });\n };\n\n const onSubmit = () => {\n setLoading(true);\n dispatch(actions.updateEntity(\"variant\", variantConfig)).then(() => {\n setLoading(false);\n closeHandler();\n }).catch((e) => {\n console.error(e);\n setLoading(false);\n });\n };\n\n // Update attribute state\n const updateAttributes = (attrs) => {\n setVariantConfig({\n ...variantConfig,\n config: {\n ...variantConfig.config,\n [selectedLocale]: {\n ...variantConfig.config[selectedLocale],\n attributes: attrs,\n },\n },\n });\n };\n\n const addAttributes = () => {\n const sampleKeys = Object.keys(sample);\n const sampleKey = sampleKeys[0];\n if (sampleKey) {\n const existingAttributes = variantConfig.config[selectedLocale]?.attributes || [];\n const attrCount = existingAttributes.length || 0;\n updateAttributes([\n ...existingAttributes,\n {type: \"constant\", name: `attr${attrCount + 1}`, value: \"\"},\n ]);\n }\n };\n\n const onChangeAttribute = (key, targetIx, value) => {\n const newAttrs = variantConfig.config[selectedLocale].attributes.map((item, ix) => {\n if (ix === targetIx) {\n return {\n ...item,\n [key]: value,\n };\n }\n return item;\n });\n updateAttributes(newAttrs);\n };\n\n const deleteAttribute = (targetIx) => {\n const newAttrs = variantConfig.config[selectedLocale].attributes.filter((item, ix) => ix !== targetIx);\n updateAttributes(newAttrs);\n };\n\n // if (variantConfig.config.path && enterPress) getMembers(variantConfig.config.path);\n\n const keys = sample ? Object.keys(sample).map((d) => ({value: d, label: `${d}: ${sample[d]}`})) : [];\n const accessorSelectData = accessors.map((d) => ({value: d, label: d}));\n\n return (\n <DrawerContentWithScroll\n content={(\n <>\n <Title order={2}>{`Editing Variant: ${variantConfig.name}`}</Title>\n <Space h=\"xs\" />\n <TextInput value={variantConfig.name} label=\"Name\" onChange={(e) => onChange(\"name\", e.target.value)} />\n <Space h=\"xs\" />\n <TextInput\n value={variantConfig.slug}\n icon={!loadingValidSlug && !validSlug.valid ? <IconAlertCircle /> : <IconCircleCheck />}\n label=\"Slug\"\n description={loadingValidSlug ? \"Validating slug...\" : validSlug.valid ? \"Valid slug.\" : \"Invalid slug.\"}\n error={\n !loadingValidSlug && !validSlug.valid\n ? (\n <Text>\n Duplicated slug. Suggestion:\n <Code\n onClick={() => onChange(\"slug\", validSlug.suggestion)}\n style={{cursor: \"pointer\"}}\n >\n {validSlug.suggestion}\n </Code>\n </Text>\n )\n : false\n }\n onChange={(e) => onChange(\"slug\", e.target.value)}\n />\n\n <Divider my=\"lg\" />\n <Title order={2} size=\"h4\">Members data</Title>\n <Space h=\"xs\" />\n <SegmentedControl\n value={selectedLocale}\n fullWidth\n onChange={setSelectedLocale}\n data={localesItems}\n />\n {variantConfig.config[selectedLocale] && (\n <>\n <Space h=\"lg\" />\n <Group grow>\n <TextInput\n onChange={(e) => onChangeConfig(\"path\", e.target.value)}\n placeholder=\"Enter a source API\"\n value={variantConfig.config[selectedLocale].path}\n />\n <Button\n disabled={loadingFetch}\n onClick={() => getMembers(variantConfig.config[selectedLocale].path)}\n loading={loadingFetch}\n leftIcon={<IconPlayerPlay />}\n >\n {loadingFetch ? \"Fetching\" : \"Fetch\"}\n </Button>\n </Group>\n {payload\n && (\n <div>\n <Space h=\"md\" />\n <Select\n value={variantConfig.config[selectedLocale].accessor}\n label=\"Accessor property (array)\"\n data={accessorSelectData}\n onChange={(e) => onChangeAccessor(e)}\n />\n <Divider label=\"First element preview\" labelPosition=\"center\" />\n {payload[variantConfig.config[selectedLocale].accessor] && (\n <InputMenuItem variables={payload[variantConfig.config[selectedLocale].accessor][0]} />\n )}\n <Space h=\"md\" />\n <Select\n value={variantConfig.config[selectedLocale].idKey}\n label=\"Key property\"\n data={keys}\n onChange={(e) => onChangeConfig(\"idKey\", e)}\n />\n <Space h=\"md\" />\n <Select\n value={variantConfig.config[selectedLocale].labelKey}\n label=\"Label property\"\n data={keys}\n onChange={(e) => onChangeConfig(\"labelKey\", e)}\n />\n <Space h=\"md\" />\n <Title order={3} size=\"h5\">Attributes</Title>\n <Space h=\"xs\" />\n\n {variantConfig.config[selectedLocale].attributes\n && variantConfig.config[selectedLocale].attributes.map((attr, ix) => (\n <Group key={ix} align=\"end\" grow>\n <Select\n value={variantConfig.config[selectedLocale].attributes[ix].type}\n label=\"Type\"\n data={[{value: \"variable\", label: \"Data based\"}, {value: \"constant\", label: \"Constant\"}]}\n readOnly={selectedLocale !== localeDefault}\n disabled={selectedLocale !== localeDefault}\n onChange={(e) => onChangeAttribute(\"type\", ix, e)}\n />\n <TextInput\n value={variantConfig.config[selectedLocale].attributes[ix].name}\n label=\"Name\"\n readOnly={selectedLocale !== localeDefault}\n disabled={selectedLocale !== localeDefault}\n onChange={(e) => onChangeAttribute(\"name\", ix, e.target.value)}\n />\n { attr.type === \"variable\" && (\n <Select\n value={variantConfig.config[selectedLocale].attributes[ix].value}\n label=\"Value\"\n data={keys}\n onChange={(e) => onChangeAttribute(\"value\", ix, e)}\n />\n ) }\n { attr.type === \"constant\" && (\n <TextInput\n value={variantConfig.config[selectedLocale].attributes[ix].value}\n label=\"Value\"\n onChange={(e) => onChangeAttribute(\"value\", ix, e.target.value)}\n />\n ) }\n <ActionIcon\n color=\"red\"\n onClick={() => deleteAttribute(ix)}\n disabled={selectedLocale !== localeDefault}\n >\n <IconTrash size={20} />\n </ActionIcon>\n </Group>\n ))}\n <Space h=\"md\" />\n <Button\n onClick={addAttributes}\n leftIcon=\"+\"\n disabled={loading || (selectedLocale !== localeDefault)}\n >\n Add Attribute\n </Button>\n </div>\n )}\n </>\n )}\n <Space h=\"md\" />\n <Code block>\n TO-DO Settings for member ingestion (all languages), checkboxes.\n <br />\n (x) override names?\n <br />\n (x) regenerate slugs based on names changes?\n <br />\n (x) keep old members that doesn&apos;t exists?\n <br />\n (x) keep metadata: tags, images?\n <br />\n </Code>\n </>\n )}\n buttons={(\n <>\n <Button\n disabled={loading || loadingFetch || (!loadingValidSlug && !validSlug.valid)}\n onClick={closeHandler}\n variant=\"outline\"\n >\n Cancel\n </Button>\n <Button\n disabled={loading || loadingFetch || (!loadingValidSlug && !validSlug.valid)}\n loading={loading || loadingFetch}\n onClick={onSubmit}\n >\n Ingest & Save\n </Button>\n </>\n )}\n size={145}\n />\n );\n}\n\nexport const VariantEditorWithFetcher = withFetcher(VariantEditor, useVariantRef);\n","import {\n ActionIcon, Button, Divider, Group, Space, TextInput, Title,\n} from \"@mantine/core\";\nimport {useCallback, useEffect, useState} from \"react\";\nimport {IconCirclePlus, IconServer} from \"@tabler/icons\";\n\nimport slugify from \"../../libs/js/slugify\";\nimport {DimensionModel} from \"../../models\";\nimport {actions, useAppDispatch, useDimensionRef} from \"../../store\";\nimport {EntityCreateButton} from \"./EntityCreateButton\";\nimport {IconTitle} from \"../commons/Typography\";\nimport {VariantCardWithFetcher} from \"./VariantCard\";\nimport {VariantEditorWithFetcher} from \"./VariantEditor\";\nimport {DrawerContentWithScroll} from \"../DrawerContentWithScroll\";\n\ntype DimensionEditorProps = {\n id: number;\n onClose: () => void;\n}\n\nexport function DimensionEditor({id, onClose: closeHandler}: DimensionEditorProps) {\n const dispatch = useAppDispatch();\n\n const ref = useDimensionRef(id);\n\n /* state */\n const [config, setConfig] = useState<Partial<DimensionModel.Dimension>>({id});\n const [isEditing, setEditing] = useState<null | number>(null);\n\n useEffect(() => {\n if (ref.isSuccess) setConfig(ref.data);\n }, [ref.status]);\n\n const createHandler = useCallback((values: Record<string, string>) => {\n dispatch(actions.createEntity(\"variant\", {\n dimension_id: id,\n name: values.name,\n slug: slugify(values.name),\n }));\n }, [id]);\n\n const submitHandler = useCallback(() => {\n dispatch(actions.updateEntity(\"dimension\", {...config, id})).then(closeHandler);\n }, [config]);\n\n const onChange = useCallback((field, value) => {\n setConfig({\n ...config,\n [field]: field === \"slug\" ? slugify(value) : value,\n });\n }, []);\n\n if (isEditing) {\n return <VariantEditorWithFetcher id={isEditing} onClose={() => setEditing(null)} />;\n }\n\n const loading = ref.isFetching;\n const variants = ref.isSuccess ? ref.data.variants : [];\n\n return (\n <DrawerContentWithScroll\n content={(\n <>\n <Title order={2}>{`Dimension metadata: ${config.name}`}</Title>\n <Space h=\"xs\" />\n <TextInput\n value={config.name}\n label=\"Name\"\n onChange={(e) => onChange(\"name\", e.target.value)}\n />\n <Space h=\"xs\" />\n <TextInput\n value={config.ordering}\n type=\"number\"\n label=\"Order\"\n onChange={(e) => onChange(\"ordering\", e.target.value)}\n />\n\n <Divider my=\"xl\" />\n\n <IconTitle icon={<IconServer size={22} />}>\n <Title order={2} size=\"h4\">Variants</Title>\n </IconTitle>\n\n {variants.map((variantId) => <VariantCardWithFetcher key={variantId} id={variantId} onEdit={setEditing} />)}\n\n <EntityCreateButton\n fields={[{\n name: \"name\",\n type: \"text\",\n label: \"Add Variant\",\n }]}\n onSubmit={createHandler}\n target={<ActionIcon size=\"xl\" radius=\"xl\"><IconCirclePlus size={30} /></ActionIcon>}\n />\n </>\n )}\n buttons={(\n <>\n <Button variant=\"outline\" disabled={loading} loading={loading} onClick={closeHandler}>Cancel</Button>\n <Button disabled={loading} loading={loading} onClick={submitHandler}>Save Dimension</Button>\n </>\n )}\n size={145}\n />\n );\n}\n","import {\n ActionIcon, Button, Divider, Grid, Group, Space, TextInput, Title,\n} from \"@mantine/core\";\nimport {useCallback, useEffect, useState} from \"react\";\nimport {IconDatabase, IconCirclePlus} from \"@tabler/icons\";\n\nimport {ReportModel} from \"../../models\";\nimport {actions, useAppDispatch, useReportRef} from \"../../store\";\nimport {DimensionCardWithFetcher} from \"./DimensionCard\";\nimport {DimensionEditor} from \"./DimensionEditor\";\nimport {EntityCreateButton} from \"./EntityCreateButton\";\nimport {IconTitle} from \"../commons/Typography\";\nimport slugify from \"../../libs/js/slugify\";\nimport {DrawerContentWithScroll} from \"../DrawerContentWithScroll\";\n\ntype ReportEditorProps = {\n id: number;\n onClose: () => void;\n}\n\nexport function ReportEditor({id, onClose: closeHandler}: ReportEditorProps) {\n const dispatch = useAppDispatch();\n\n const ref = useReportRef(id);\n\n /* state */\n const [config, setConfig] = useState<Partial<ReportModel.AnyReport>>({id});\n const [isEditing, setEditing] = useState<number | null>(null);\n\n useEffect(() => {\n ref.isSuccess && setConfig(ref.data);\n }, [ref.status]);\n\n const createHandler = useCallback((values: Record<string, string>) => {\n dispatch(actions.createEntity(\"dimension\", {\n report_id: id,\n name: values.name,\n })).then((response) => {\n if (response.ok) {\n // Automatically, create a variant after dimension is created.\n dispatch(actions.createEntity(\"variant\", {\n dimension_id: response.data.id,\n name: response.data.name,\n slug: slugify(response.data.name),\n }));\n }\n });\n }, [id]);\n\n const submitHandler = useCallback(() => {\n dispatch(actions.updateEntity(\"report\", {...config, id})).then(closeHandler);\n }, [id]);\n\n const onChange = useCallback((field, value) => {\n setConfig({...config, [field]: value});\n }, []);\n\n if (isEditing) {\n return <DimensionEditor id={isEditing} onClose={() => setEditing(null)} />;\n }\n\n const loading = ref.isFetching;\n const dimensions = ref.isSuccess ? ref.data.dimensions : [];\n\n return (\n <DrawerContentWithScroll\n content={(\n <>\n <Title order={2}>{`Report metadata: ${config.name}`}</Title>\n <Space h=\"xs\" />\n <TextInput\n value={config.name}\n label=\"Name\"\n onChange={(e) => onChange(\"name\", e.target.value)} />\n\n <Divider my=\"xl\" />\n\n <IconTitle icon={<IconDatabase size={22} />}>\n <Title order={2} size=\"h4\">Dimensions</Title>\n </IconTitle>\n\n <Grid>\n {dimensions.map((d) => (\n <Grid.Col key={d} span={6}>\n <DimensionCardWithFetcher id={d} onEdit={setEditing} />\n </Grid.Col>\n ))}\n </Grid>\n\n <EntityCreateButton\n fields={[{\n type: \"text\",\n name: \"name\",\n label: \"Add Dimension\",\n }]}\n onSubmit={createHandler}\n target={<ActionIcon size=\"xl\" radius=\"xl\"><IconCirclePlus size={30} /></ActionIcon>} />\n </>\n )}\n buttons={(\n <>\n <Button variant=\"outline\" disabled={loading} loading={loading} onClick={closeHandler}>Cancel</Button>\n <Button disabled={loading} loading={loading} onClick={submitHandler}>Save Report</Button>\n </>\n )}\n size={145}\n />\n );\n}\n","import {\n ActionIcon, Button, Drawer, Group, Header, Modal, Select, Skeleton,\n} from \"@mantine/core\";\nimport {useDisclosure, useUncontrolled} from \"@mantine/hooks\";\nimport {\n useCallback, useContext, useEffect, useMemo, useState,\n} from \"react\";\nimport {IconChevronLeft, IconSettings, IconFileAnalytics} from \"@tabler/icons\";\nimport {Link, useNavigate} from \"react-router-dom\";\n\nimport {\n AppState, useAppDispatch, useAppSelector, useReportList, useReportRef,\n} from \"../../store\";\nimport {recalculateVariables} from \"../../store/actions\";\nimport {DimensionAutocomplete} from \"./DimensionAutocomplete\";\nimport {ReportEditor} from \"./ReportEditor\";\nimport {IconTitle} from \"../commons/Typography\";\nimport {ResourceContext} from \"../../context/ResourceProvider\";\n\ntype CMSHeaderProps = {\n id: number;\n}\n\n/**\n *\n */\nexport function CMSHeader(props: CMSHeaderProps) {\n const {id} = props;\n\n const nav = useNavigate();\n const dispatch = useAppDispatch();\n const resource = useContext(ResourceContext);\n\n const localeDefault = useAppSelector((state) => state.status.localeDefault);\n // const previews = useAppSelector((state) => state.status.previews);\n\n const localeOptions = useAppSelector(selectLocaleOptions);\n\n const reportList = useReportList();\n const reportRef = useReportRef(id);\n\n // Modal state\n const [opened, handlers] = useDisclosure(false);\n\n // Locale selector state\n const [currentLocale, setCurrentLocale] = useUncontrolled({\n defaultValue: localeDefault,\n });\n\n const reportOptions = useMemo(() => {\n if (!reportList.isSuccess) return [];\n return reportList.data.map((d) => ({value: `${d.id}`, label: d.name}));\n }, [reportList.status]);\n\n const onChangeReport = useCallback((value) => {\n nav(`/reports/${value}`);\n }, []);\n\n const onSelectPreview = (previewMember) => {\n const newPreviews = currentReport.dimensions.map((dId) => {\n let member;\n if (previewMember) {\n if (previewMember.dimension.id === dId) {\n member = previewMember;\n } else {\n const anotherMember = previewMembers.find((m) => (m ? m.dimension.id === dId : false));\n if (anotherMember) {\n member = anotherMember;\n }\n }\n }\n return member;\n });\n\n setPreviewMembers(newPreviews);\n };\n\n const currentReport = reportRef.data;\n const dimensions = currentReport?.dimensions || [];\n const showPreviewSelector = dimensions.length > 0;\n\n const [previewMembers, setPreviewMembers] = useState(dimensions.map(() => undefined));\n\n useEffect(() => {\n setPreviewMembers(dimensions.map(() => undefined));\n }, [dimensions]);\n\n /* When a preview member changed:\n - Dispatch to the status to recalculate variables\n - (is not working when you switch profiles)\n */\n useEffect(() => {\n dispatch(recalculateVariables(resource, {previews: previewMembers}));\n }, [previewMembers]);\n\n if (reportRef.isUninitialized || reportRef.isFetching) {\n return (\n <HeaderLayout\n left={(\n <ActionIcon component={Link} to=\"/\" color=\"blue\" variant=\"filled\">\n <IconChevronLeft size={24} />\n </ActionIcon>\n )}\n center={(\n <Group spacing=\"xs\">\n <Skeleton height={30} width={100} />\n <Skeleton height={30} width={200} />\n </Group>\n )}\n />\n );\n }\n\n if (reportRef.isError) {\n return null;\n }\n\n return (\n <HeaderLayout\n center={(\n <Group spacing=\"xs\">\n <Select\n style={{width: 60}}\n size=\"xs\"\n data={localeOptions}\n defaultValue={localeDefault}\n onChange={setCurrentLocale}\n />\n <Select\n style={{width: 100}}\n size=\"xs\"\n data={reportOptions}\n value={String(id)}\n onChange={onChangeReport}\n />\n {showPreviewSelector && currentReport.dimensions.map((dId) => (\n <DimensionAutocomplete\n key={dId}\n id={dId}\n onSelect={onSelectPreview}\n locale={currentLocale}\n />\n ))}\n {!showPreviewSelector && (\n <Button\n size=\"xs\"\n variant=\"outline\"\n onClick={handlers.open}\n >\n Import Data\n </Button>\n )}\n\n </Group>\n )}\n right={(\n <ActionIcon color=\"blue\" variant=\"filled\">\n <IconSettings onClick={handlers.open} size={20} />\n <Drawer\n opened={opened}\n onClose={handlers.close}\n title={(\n <IconTitle icon={<IconFileAnalytics size={24} />}>\n {`Editing Report: ${currentReport.name}`}\n </IconTitle>\n )}\n size=\"50%\"\n padding=\"xl\"\n position=\"right\"\n >\n <ReportEditor id={id} onClose={handlers.close} />\n </Drawer>\n </ActionIcon>\n )}\n />\n );\n}\n\ntype HeaderLayoutProps = {\n left?: JSX.Element;\n center?: JSX.Element;\n right?: JSX.Element;\n}\n\nfunction HeaderLayout(props: HeaderLayoutProps) {\n const {left, center, right} = props;\n return (\n <Header fixed height={50} p=\"xs\">\n <Group position=\"apart\">\n <div className=\"left\">{left}</div>\n <div className=\"center\">{center}</div>\n <div className=\"right\">{right}</div>\n </Group>\n </Header>\n );\n}\n\nconst selectLocaleOptions = (state: AppState) => state.status.locales.map((d) => ({value: d, label: d.toUpperCase()}));\n","/* react */\nimport React from \"react\";\nimport {useDispatch} from \"react-redux\";\nimport {ActionIcon} from \"@mantine/core\";\nimport {IconTrash} from \"@tabler/icons\";\n\n/* redux */\nimport {actions} from \"../../../store\";\n\n/* hooks */\nimport {useDialog} from \"../../../components/commons/Dialog\";\n\n/* enums */\nimport {ENTITY_PRETTY_NAMES} from \"../../../types/cms\";\n\n/**\n *\n */\nfunction DeleteButton({type, id, warning = \"\"}) {\n const PRETTY_NAME = ENTITY_PRETTY_NAMES[type] || \"Entity\";\n const message = warning || `Delete this ${PRETTY_NAME} and all its contents? This action cannot be undone.`;\n\n const dispatch = useDispatch();\n const {newConfirmation} = useDialog();\n\n const maybeDelete = async () => {\n try {\n await newConfirmation({\n title: \"Are you sure?\",\n message,\n confirmText: \"Yes, Delete it.\",\n });\n dispatch(actions.deleteEntity(type, id));\n } catch {\n // close window\n }\n };\n\n return (\n <ActionIcon color=\"red\" onClick={maybeDelete}>\n <IconTrash size={20} />\n </ActionIcon>\n );\n}\n\nexport default DeleteButton;\n","import React from \"react\";\nimport {IconAlignLeft, IconAlignCenter, IconAlignRight} from \"@tabler/icons\";\n\nexport default {\n display: {\n label: \"Size\",\n defaultValue: \"block\",\n options: [\n {label: \"Full Width\", value: \"block\"},\n {label: \"Inline\", value: \"inline\"},\n ],\n },\n align: {\n label: \"Alignment\",\n defaultValue: \"left\",\n options: [\n {label: <IconAlignLeft />, value: \"left\"},\n {label: <IconAlignCenter />, value: \"center\"},\n {label: <IconAlignRight />, value: \"right\"},\n ],\n },\n};\n","import {\n ActionIcon, Checkbox, Group, NumberInput, Popover, SegmentedControl,\n} from \"@mantine/core\";\nimport {useState} from \"react\";\nimport {IconPalette} from \"@tabler/icons\";\n\nimport settings from \"../../../libs/settings/block\";\nimport {actions, useAppDispatch, useBlockRef} from \"../../../store\";\n\n/**\n *\n */\nfunction DesignMenu({id}: { id: number }) {\n const dispatch = useAppDispatch();\n\n const block = useBlockRef(id).data;\n\n const [opened, setOpened] = useState(false);\n\n const defaultWidth = \"400\";\n\n const handleChangeWidth = (value) => {\n let result;\n if (typeof value === \"boolean\") {\n result = value ? \"stretch\" : String(defaultWidth);\n } else {\n result = value;\n }\n handleChange(\"width\", result);\n };\n\n const handleChange = (field, value) => {\n if (block) {\n dispatch(actions.updateEntity(\"block\", {\n id,\n settings: {...block.settings, [field]: value},\n }));\n }\n };\n\n if (!block) return null;\n\n const width = block?.settings?.width ?? \"stretch\";\n\n return (\n <Popover\n opened={opened}\n onClose={() => setOpened(false)}\n position=\"bottom\"\n withinPortal\n >\n <Popover.Target>\n <ActionIcon\n onClick={() => setOpened((o) => !o)}\n >\n <IconPalette size={20} />\n </ActionIcon>\n </Popover.Target>\n <Popover.Dropdown>\n <div>\n {\n Object.entries(settings).map(([key, {label, defaultValue, options}]) => (\n <Group key={key} spacing=\"xs\" position=\"apart\" noWrap style={{width: \"100%\"}}>\n {label && <span>{label}</span>}\n <SegmentedControl\n defaultValue={String(block.settings[key] || defaultValue)}\n onChange={(e) => handleChange(key, e)}\n data={options}\n />\n </Group>\n ))\n }\n <Group key=\"width\" spacing=\"xs\">\n <span>Width</span>\n <Group spacing=\"xs\">\n {width !== \"stretch\" && (\n <NumberInput\n defaultValue={parseInt(defaultWidth, 10)}\n disabled={width === \"stretch\"}\n min={25}\n onChange={(value) => handleChangeWidth(value)}\n placeholder={width === \"stretch\" ? defaultWidth : width}\n step={5}\n style={{width: 80}}\n value={!Number.isNaN(width) ? parseInt(width, 10) : undefined}\n />\n ) }\n <Checkbox\n label=\"Stretch\"\n checked={width === \"stretch\"}\n onChange={(e) => handleChangeWidth(e.currentTarget.checked)}\n />\n </Group>\n </Group>\n </div>\n </Popover.Dropdown>\n </Popover>\n );\n}\n\nexport default DesignMenu;\n","/* react */\nimport React, {useState, useRef, useContext} from \"react\";\n\n/* components */\nimport {\n ActionIcon, Badge, Group, Popover, Text, TextInput,\n} from \"@mantine/core\";\nimport {IconCircleCheck, IconPencil} from \"@tabler/icons\";\n\n/* utils */\nimport {getHotkeyHandler} from \"@mantine/hooks\";\nimport varSwap from \"../../../libs/variables/varSwap\";\n\nimport {\n useBlockStatus, useBlockContext, useFormatterFunctionsForLocale,\n} from \"../../../store/hooks\";\nimport {BlockResultStatus} from \"../../../libs/blocks/runConsumers\";\n\n/** */\nfunction ApiInput({\n defaultValue, id, onChange, onEnterPress,\n}) {\n // const variables = useInputVariablesFlat(id);\n\n const status:BlockResultStatus = useBlockStatus(id);\n\n const formatterFunctions = useFormatterFunctionsForLocale();\n\n const blockContext = useBlockContext(id);\n\n const [preview, setPreview] = useState(() => varSwap(defaultValue, formatterFunctions, blockContext));\n const [editing, setEditing] = useState(false);\n\n const submit = (evt) => {\n if (editing) {\n evt.preventDefault();\n if (onEnterPress) onEnterPress();\n setEditing(false);\n }\n };\n\n const apiRef = useRef<HTMLInputElement>(null);\n\n const onChangeLocal = (e) => {\n const {value} = e.target;\n setPreview(varSwap(value, formatterFunctions, blockContext));\n onChange(value);\n };\n\n const getColor = (duration) => {\n if (duration < 150) return \"green\";\n if (duration < 1000) return \"yellow\";\n return \"red\";\n };\n\n const duration = status?.duration;\n\n return (\n <Group noWrap position=\"apart\" spacing=\"xs\">\n <Text lineClamp={1} size=\"xs\">\n <a href={preview} target=\"_blank\" rel=\"noreferrer\">{preview}</a>\n </Text>\n <Group noWrap spacing=\"xs\">\n { duration && (\n <Badge color={getColor(duration)}>\n {duration}\n ms\n </Badge>\n ) }\n <Popover\n onClose={() => setEditing(false)}\n opened={editing}\n position=\"right\"\n radius=\"xs\"\n withArrow\n >\n <Popover.Target>\n <ActionIcon\n size=\"xs\"\n onClick={() => setEditing((e) => !e)}\n variant=\"filled\"\n color={editing ? \"green\" : \"gray\"}\n >\n { editing ? <IconCircleCheck /> : <IconPencil /> }\n </ActionIcon>\n </Popover.Target>\n <Popover.Dropdown>\n <TextInput\n key=\"text-input\"\n placeholder=\"API\"\n defaultValue={defaultValue}\n ref={apiRef}\n type=\"url\"\n onChange={onChangeLocal}\n size=\"xs\"\n style={{\n maxWidth: 800,\n width: \"60vw\",\n }}\n onKeyDown={getHotkeyHandler([[\"enter\", submit]])}\n />\n </Popover.Dropdown>\n </Popover>\n </Group>\n </Group>\n );\n}\n\nexport default ApiInput;\n","/* react */\nimport React, {useCallback, useEffect, useState} from \"react\";\nimport Editor, {useMonaco} from \"@monaco-editor/react\";\n\nimport \"./MonacoWrapper.css\";\n\n/**\n *\n */\nfunction MonacoWrapper({monacoOptions, variables = {}}) {\n const monaco = useMonaco();\n\n useEffect(() => {\n if (monaco) {\n const theme = \"Monokai\";\n import(`monaco-themes/themes/${theme}.json`).then((data) => {\n monaco.editor.defineTheme(theme, data);\n monaco.editor.setTheme(theme);\n }).catch(() => {\n throw new Error(\"Invalid Monaco theme\");\n });\n }\n }, [monaco]);\n\n return (\n <div\n className=\"cr-monaco-container\"\n >\n <Editor\n height=\"50vh\"\n defaultLanguage=\"javascript\"\n theme=\"Monokai\"\n {...monacoOptions} // eslint-disable-line\n />\n </div>\n );\n}\n\nexport default MonacoWrapper;\n","// If a draftjs editor field ends with a trailing space, a &nbsp; is glommed onto the end of the field.\n// Before persisting this to the db, strip out the trailing space if necessary\nconst stripTrail = (d) => (typeof d === \"string\" ? d.replace(/\\&nbsp;<\\/p>/g, \"</p>\") : d);\n// Further, if a field is left blank, draftjs sees it as <p><br></p>. Don't write this to the DB either.\nconst clearBlank = (d) => (typeof d === \"string\" && d === \"<p><br></p>\" ? \"\" : d);\n// Finally, strip off the leading and trailing p tags that the editor adds\nconst stripOuterTags = (d) => (typeof d === \"string\" ? d.replace(/^<p>(.*)<\\/p>$/, \"$1\") : d);\nconst sanitizeBlockContent = (d) => (d ? stripOuterTags(clearBlank(stripTrail(d))) : d);\n\nexport default sanitizeBlockContent;\n","import React from \"react\";\nimport {\n Text, MantineSize, Tooltip, ActionIcon,\n} from \"@mantine/core\";\nimport {IconInfoCircle} from \"@tabler/icons\";\n\nimport sanitizeBlockContent from \"../../../../libs/blocks/sanitizeBlockContent\";\n\ninterface ParagraphProps {\n paragraph: string,\n tooltip: string,\n size: MantineSize\n}\n\n/**\n * \"paragraph\" block renderer\n*/\nexport default function ParagraphPreview({paragraph, tooltip, size = \"md\"}:ParagraphProps) {\n const paragraphHTML = sanitizeBlockContent(paragraph)\n || `<span class='cr-block-placeholder'>Lorem ipsum dolor sit amet, \n consectetur adipiscing elit. Etiam justo purus, placerat ac turpis at, \n dignissim interdum eros. Curabitur non tincidunt libero. \n Suspendisse quis nibh in massa tincidunt feugiat sit amet vitae nisl. \n In pulvinar sapien ut tincidunt volutpat. Donec auctor tellus eu augue feugiat, \n a viverra sapien pulvinar.</span>`;\n const tooltipHTML = sanitizeBlockContent(tooltip);\n\n return (\n <div>\n {tooltip && (\n <div key=\"tooltip\" style={{position: \"absolute\", right: \"50px\"}}>\n <Tooltip label={tooltipHTML} withArrow withinPortal>\n <ActionIcon><IconInfoCircle /></ActionIcon>\n </Tooltip>\n </div>\n )}\n <Text size={size} dangerouslySetInnerHTML={{__html: paragraphHTML}} />\n </div>\n );\n}\n","import React from \"react\";\nimport {Text, Tooltip, ActionIcon} from \"@mantine/core\";\nimport {IconInfoCircle} from \"@tabler/icons\";\n\nimport sanitizeBlockContent from \"../../../../libs/blocks/sanitizeBlockContent\";\n\nexport type StatParams = {\n title: string,\n subtitle: string,\n value: string,\n tooltip: string\n}\nexport default function StatPreview({\n subtitle, title, value, tooltip,\n}:StatParams) {\n let titleHTML = sanitizeBlockContent(title);\n let valueHTML = sanitizeBlockContent(value);\n let subtitleHTML = sanitizeBlockContent(subtitle);\n const tooltipHTML = sanitizeBlockContent(tooltip);\n\n if (!titleHTML && !valueHTML && !subtitleHTML) {\n titleHTML = \"<span class='cr-block-placeholder'>Title</span>\";\n valueHTML = \"<span class='cr-block-placeholder'>Big Stat</span>\";\n subtitleHTML = \"<span class='cr-block-placeholder'>Subtitle</span>\";\n }\n\n return (\n <div>\n {tooltip && (\n <div key=\"tooltip\" style={{position: \"absolute\", right: \"50px\"}}>\n <Tooltip label={tooltipHTML} withArrow withinPortal>\n <ActionIcon><IconInfoCircle /></ActionIcon>\n </Tooltip>\n </div>\n )}\n <div key=\"stat\">\n <Text size=\"md\" dangerouslySetInnerHTML={{__html: titleHTML}} />\n <Text size=\"xl\" dangerouslySetInnerHTML={{__html: valueHTML}} />\n <Text size=\"sm\" dangerouslySetInnerHTML={{__html: subtitleHTML}} />\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport {Text, Tooltip, ActionIcon} from \"@mantine/core\";\nimport {IconInfoCircle} from \"@tabler/icons\";\n\nimport sanitizeBlockContent from \"../../../../libs/blocks/sanitizeBlockContent\";\n\ninterface SubtitleProps {\n subtitle: string,\n tooltip: string,\n}\nexport default function SubtitlePreview({subtitle, tooltip}: SubtitleProps) {\n const subtitleHTML = sanitizeBlockContent(subtitle)\n || \"<span class='cr-block-placeholder'>Small subtitle.</span>\";\n const tooltipHTML = sanitizeBlockContent(tooltip);\n\n return (\n <div>\n {tooltip && (\n <div key=\"tooltip\" style={{position: \"absolute\", right: \"50px\"}}>\n <Tooltip label={tooltipHTML} withArrow withinPortal>\n <ActionIcon><IconInfoCircle /></ActionIcon>\n </Tooltip>\n </div>\n )}\n <div>\n <Text size=\"sm\" dangerouslySetInnerHTML={{__html: subtitleHTML}} />\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport {\n Title, TitleOrder, Tooltip, ActionIcon,\n} from \"@mantine/core\";\nimport {IconInfoCircle} from \"@tabler/icons\";\nimport sanitizeBlockContent from \"../../../../libs/blocks/sanitizeBlockContent\";\n\ninterface TitleProps {\n title: string,\n tooltip: string,\n size: TitleOrder\n}\n\nexport default function TitlePreview({title, tooltip, size = 4}:TitleProps) {\n const titleHTML = sanitizeBlockContent(title)\n || `<span class='cr-block-placeholder'>${[\"Large\", \"Medium\", \"Small\"][size - 2]} Title</span>`;\n const tooltipHTML = sanitizeBlockContent(tooltip);\n\n return (\n <div>\n {tooltip && (\n <div key=\"tooltip\" style={{position: \"absolute\", right: \"50px\"}}>\n <Tooltip label={tooltipHTML} withArrow withinPortal>\n <ActionIcon><IconInfoCircle /></ActionIcon>\n </Tooltip>\n </div>\n )}\n <div><Title order={size} dangerouslySetInnerHTML={{__html: titleHTML}} /></div>\n </div>\n );\n}\n","/* react */\nimport React, {useState, useEffect, useContext} from \"react\";\nimport {useDispatch} from \"react-redux\";\nimport {Select, MultiSelect} from \"@mantine/core\";\n\n/* hooks */\nimport {deleteQueryParam, setQueryParam} from \"../../../../store/actions\";\n\n/* utils */\nimport valueInOptions from \"../../../../libs/selectors/valueInOptions\";\n\n/* consts */\nimport {SELECTOR_TYPES} from \"../../../../types/cms\";\nimport {useAppSelector} from \"../../../../store\";\nimport {ResourceContext} from \"../../../../context/ResourceProvider\";\n\nconst getSelectorIdentifier = (id) => `selector${id}id`;\n\nconst parseMultiValue = (selectorValue, defaultValue) => {\n if (selectorValue && typeof selectorValue === \"string\") {\n return selectorValue.split(\",\");\n }\n return defaultValue;\n};\n\n/**\n * \"selector\" block renderer\n*/\nexport default function SelectorPreview(config) {\n const dispatch = useDispatch();\n const resource = useContext(ResourceContext);\n\n const query = useAppSelector((state) => state.status.query);\n\n const selectorIdentifier = getSelectorIdentifier(config.id);\n\n const [value, setValue] = useState(query[selectorIdentifier] || config.defaultValue);\n const [multiValue, setMultiValue] = useState(\n parseMultiValue(query[selectorIdentifier], config.defaultValue)\n );\n const [data, setData] = useState(config.options?.map((d) => ({value: d.id, label: d.label})) || []);\n const [serializedOptions, setSerializedOptions] = useState((config.options || []).map((d) => d.id).join(\"-\"));\n\n // change value if option list changes\n useEffect(() => {\n // options change ref when setStatus is called, so encode option content to compare equality\n const serializedNew = config.options.map((d) => d.id).join(\"-\");\n if (serializedOptions === serializedNew) return;\n setSerializedOptions(serializedNew);\n\n const newOptions = config.options.map((d) => ({value: d.id, label: d.label}));\n setData(newOptions);\n\n const relevantValue = config.type === SELECTOR_TYPES.SINGLE ? value : multiValue;\n const relevantSetter = config.type === SELECTOR_TYPES.SINGLE ? setValue : setMultiValue;\n\n // if the selected value is not in the new list of options...\n if (!valueInOptions(config.type, relevantValue, config.options)) {\n // set the value to the new default\n relevantSetter(config.defaultValue);\n // and remove the query params for this selector\n dispatch(deleteQueryParam(resource, selectorIdentifier));\n }\n }, [config.options, config.id]);\n\n // when a selector is edited and saved, make sure to set the current value\n useEffect(() => {\n if (config.type === SELECTOR_TYPES.MULTI) {\n setMultiValue(parseMultiValue(query[selectorIdentifier], config.defaultValue));\n } else {\n setValue(query[selectorIdentifier] || config.defaultValue);\n }\n }, [config]);\n\n const onChangeSingle = (e) => {\n dispatch(setQueryParam(resource, selectorIdentifier, e));\n setValue(e);\n };\n\n const onChangeMulti = (e) => {\n dispatch(setQueryParam(resource, selectorIdentifier, e.join()));\n setMultiValue(e);\n };\n\n const {name} = config;\n\n return {\n [SELECTOR_TYPES.SINGLE]: <Select\n label={name}\n data={data}\n value={value}\n onChange={onChangeSingle}\n />,\n [SELECTOR_TYPES.MULTI]: <MultiSelect\n label={name}\n data={data}\n value={multiValue}\n onChange={onChangeMulti}\n />,\n }[config.type];\n}\n","import React from \"react\";\nimport {Badge, Center, Divider} from \"@mantine/core\";\nimport InputMenuItem from \"../../../../cms/components/components/InputMenuItem\";\n\n/**\n *\n */\nfunction Generator({outputVariables, debug}) {\n return debug\n ? (\n <>\n <Divider label=\"Output Variables\" labelPosition=\"center\" />\n <InputMenuItem variables={outputVariables} />\n </>\n )\n : <Center><Badge key=\"type\" color=\"gray\" variant=\"outline\">GENERATOR</Badge></Center>;\n}\n\nexport default Generator;\n","import React from \"react\";\n\nimport {Center, Badge} from \"@mantine/core\";\n\nimport sanitizeBlockContent from \"../../../../libs/blocks/sanitizeBlockContent\";\n\n/**\n * \"image\" block renderer\n*/\nexport default function ImagePreview(props) {\n const {alt, src, ...rest} = props;\n const altText = sanitizeBlockContent(alt);\n\n return src && altText\n ? <img src={src} alt={altText} style={rest} />\n : <Center><Badge key=\"type\" color=\"gray\" variant=\"outline\">IMAGE</Badge></Center>;\n}\n","import dynamic from \"next/dynamic\";\nimport {BLOCK_TYPES} from \"../../../../types/cms\";\n\nimport ParagraphPreview from \"./Paragraph\";\nimport StatPreview from \"./Stat\";\nimport SubtitlePreview from \"./Subtitle\";\nimport TitlePreview from \"./Title\";\nimport SelectorPreview from \"./Selector\";\nimport GeneratorPreview from \"./Generator\";\nimport ImagePreview from \"./Image\";\n\nconst VizPreview = dynamic(\n () => import(\"./Viz\"),\n {ssr: false},\n);\n\nexport default {\n [BLOCK_TYPES.PARAGRAPH]: ParagraphPreview,\n [BLOCK_TYPES.STAT]: StatPreview,\n [BLOCK_TYPES.SUBTITLE]: SubtitlePreview,\n [BLOCK_TYPES.TITLE]: TitlePreview,\n [BLOCK_TYPES.SELECTOR]: SelectorPreview,\n [BLOCK_TYPES.VIZ]: VizPreview,\n [BLOCK_TYPES.GENERATOR]: GeneratorPreview,\n [BLOCK_TYPES.IMAGE]: ImagePreview,\n};\n","import {SELECTOR_TYPES} from \"../../../../types/cms\";\nimport valueInOptions from \"../../../../libs/selectors/valueInOptions\";\n\nconst validateOptionsArray = (options) => {\n if (!Array.isArray(options)) return [];\n return options.map((d) => (typeof d === \"string\" ? {id: d, label: d} : d));\n};\n\nconst maybeFixForMulti = (defaultValue, type) => (type === SELECTOR_TYPES.MULTI && !Array.isArray(defaultValue)\n ? [defaultValue]\n : defaultValue);\n\n/** @type {import(\".\").BlockPreviewAdapterFunction} */\nexport default (vars, id) => {\n const type = vars.type || SELECTOR_TYPES.SINGLE;\n const name = vars.name || \"Unlabeled Selector\";\n const options = validateOptionsArray(vars.options || []);\n let defaultValue;\n\n // check that given default is in options array\n if (vars.defaultValue) {\n const potentialDefaultValue = maybeFixForMulti(vars.defaultValue, type);\n if (valueInOptions(type, potentialDefaultValue, options)) defaultValue = potentialDefaultValue;\n }\n\n if (!defaultValue) {\n const fallbackValue = options && options[0] && options[0].id\n || options[0]\n || \"\";\n defaultValue = maybeFixForMulti(fallbackValue, type);\n }\n\n return {\n id, name, type, options, defaultValue,\n };\n};\n","import {BLOCK_TYPES} from \"../../../../types/cms\";\n\nimport selectorAdapter from \"./Selector\";\n\n/**\n * @callback BlockAdapterFunction\n * A type of function to be implemented if a certain\n * Block type needs to be rendered a specfic way when being previewed.\n *\n * @param {Object} variables - an object of the materialized variables for a block that is the output of\n * @param {string} id - block ID of the block being adapted\n * its evaluated logic content\n * @returns {Object} returns an object which serves as the props for a Block's renderer component\n */\n\nexport default {\n [BLOCK_TYPES.SELECTOR]: selectorAdapter,\n};\n","const newLine = (d) => \"\\n\".padEnd(d * 2 + 1, \" \");\n\n/**\n * Custom stringify function that takes care of converting functions from strings\n * @param {*} obj\n * @param {*} depth\n * @returns\n */\nconst stringifyObject = (obj, depth = 0) => {\n // Arrays are Objects. Needed to determine if the wrapper\n // charactares should be square brackets or curly braces.\n const isArray = obj instanceof Array;\n\n return `${isArray ? \"[\" : \"{\"}${newLine(depth + 1)}${Object.keys(obj)\n .sort((a, b) => a.localeCompare(b))\n .map((key) => {\n let str = isArray ? \"\" : `${key}: `;\n const val = obj[key];\n\n // recursive check for objects/arrays\n if (typeof val === \"object\") str += `${stringifyObject(val, depth + 1)}`;\n // detect fat arrow functions and don't wrap with quotation marks\n else if (typeof val === \"string\" && (val.includes(\"=>\") || val.startsWith(\"variables[\"))) str += `${val}`;\n // set all empty strings to a false Boolean\n else if (typeof val === \"string\" && !val.length) str += \"false\";\n // skip undefined variables\n else if (val === undefined) str = null;\n // coerce leftover values into strings\n else str += `\"${val}\"`;\n\n return str;\n })\n .filter(Boolean)\n .join(`,${newLine(depth + 1)}`)}${newLine(depth)}${isArray ? \"]\" : \"}\"}`;\n};\n\nexport default stringifyObject;\n","import React, {useCallback, useEffect, useState} from \"react\";\nimport {\n ActionIcon, Checkbox, Input, Select, TextInput,\n} from \"@mantine/core\";\nimport {IconTrash, IconPlus} from \"@tabler/icons\";\n\nimport stringifyObject from \"../../../../libs/js/stringifyObject\";\n\nimport \"./SelectorUI.css\";\nimport {useInputVariablesFlat} from \"../../../../store/hooks\";\n\n// TYPEDEFS\n\n/** @typedef {\"single\" | \"multi\"} SelectorType */\n/** @typedef {\"static\" | \"dynamic\"} OptionType */\n/**\n * @typedef DynamicOptionsSimpleState\n * @property {string} optionsVar - variable name that provides list of data used to generate Selector options\n * @property {string} idKey - property name of data objects in optionsVar list to be used as options' identifier\n * @property {string} labelKey - property name of data objects in optionsVar list to be used as options' human readable label\n * @property {string} defaultVar - variable name of variable that specifies the ID of the option that should be selected\n * @property {boolean} isPrimitiveType - flag telling whether or not the variable contains primitive elements (not objects)\n * by default in a selector\n */\n\n/**\n * @typedef SelectorSimpleState\n * @property {string} name - label used to when rendering the selector\n * @property {{static: StaticOptionsArray, dynamic: DynamicOptionsSimpleState}} options - state for describing the editor state\n * for both methods of generating options\n * @property {OptionType} optionsType - the chosen method of defining a Selector's options\n * @property {SelectorType} type - whether selector is single choice or multi-choice\n */\n\n// CONSTANTS\n\nconst SELECTOR_TYPE = {\n SINGLE: \"single\",\n MULTI: \"multi\",\n};\n\nconst OPTION_TYPE = {\n STATIC: \"static\",\n DYNAMIC: \"dynamic\",\n};\n\n// HELPER FUNCTIONS\n\n/** Function to determine whether a variable could be used as a list of Selector options */\nconst isValidSelectorOptionsArray = (variable) => variable && Array.isArray(variable) && variable.length > 0;\n\nconst isPrimitiveTypeVariable = (variable) => isValidSelectorOptionsArray(variable) && [\"string\"].includes(typeof variable[0]);\n\n/**\n * Determines whether the current state of the UI is a valid selector config\n * @param {SelectorSimpleState} simpleState - state of the Selector Editor\n */\nconst isValidSelectorState = (simpleState) => {\n const {\n name, type, optionsType, options,\n } = simpleState;\n // check that all required high level properties are present\n if (![name, type, optionsType, options].every(Boolean)) return false;\n // make sure static options have at least one option\n if (optionsType === OPTION_TYPE.STATIC) return options.static?.length > 0 && options.static?.every((o) => o.id);\n // make sure dynamic options of non-primitive type specify idKey\n if (!options.dynamic?.isPrimitiveType) return !!options.dynamic?.idKey;\n return true;\n};\n\n// COMPONENTS\n\n/**\n * Renders a single option row for a static option selector\n * @param {*} props\n */\nfunction StaticSelectorOptionRow({option, editOption, deleteOption}) {\n return (\n <tr className=\"reports-selector-static-option\">\n <td>\n <Checkbox\n checked={option.isDefault}\n onChange={(event) => editOption({isDefault: event.currentTarget.checked})}\n />\n </td>\n <td>\n <TextInput\n placeholder=\"myOption\"\n value={option.id}\n onChange={(event) => editOption({id: event.currentTarget.value})}\n />\n </td>\n <td>\n <TextInput\n placeholder=\"myOption\"\n value={option.label}\n onChange={(event) => editOption({label: event.currentTarget.value})}\n />\n </td>\n <td>\n <ActionIcon onClick={deleteOption}>\n <IconTrash />\n </ActionIcon>\n </td>\n </tr>\n );\n}\n\n/** Component for defining and editing static, pre-defined options for a Selector block */\nfunction StaticSelectorOptionsEditor({staticOptions, setStaticOptions}) {\n /** Add another option to selector */\n const addOption = useCallback(\n () => setStaticOptions([...staticOptions, {isDefault: !staticOptions.length, id: \"\", label: \"\"}]),\n [staticOptions, setStaticOptions],\n );\n\n /** Change the values of an option at a specific index */\n const editOption = useCallback(\n (idx, newValues) => {\n if (!newValues || idx >= staticOptions.length || idx < 0) return;\n\n const newOptions = [...staticOptions];\n newOptions.splice(idx, 1, {...staticOptions[idx], ...newValues});\n setStaticOptions(newOptions);\n // TODO - set error\n },\n [staticOptions, setStaticOptions],\n );\n\n const deleteOption = useCallback(\n (idx) => {\n const newOptions = [...staticOptions];\n newOptions.splice(idx, 1);\n setStaticOptions(newOptions);\n },\n [staticOptions, setStaticOptions],\n );\n return (\n <>\n <Input.Wrapper\n required\n label=\"Static Selector Options\"\n >\n <table>\n <thead>\n {staticOptions.length > 0\n && (\n <tr>\n {[\"Default\", \"ID\", \"Label\", \"\"]\n .map((label, idx) => (\n <td\n className={`${idx === 0 ? \"selector-option-default-col\" : \"\"} ${idx === 1 ? \"required\" : \"\"}`}\n key={`heading-${idx}`}\n >\n {label}\n </td>\n ))}\n </tr>\n )}\n </thead>\n <tbody>\n {\n staticOptions.map((option, idx) => (\n <StaticSelectorOptionRow\n option={option}\n key={`option-${idx}`}\n editOption={(vals) => editOption(idx, vals)}\n deleteOption={() => deleteOption(idx)}\n />\n ))\n }\n </tbody>\n </table>\n </Input.Wrapper>\n <ActionIcon onClick={addOption}><IconPlus /></ActionIcon>\n </>\n );\n}\n\n/**\n * Component that handles the UI for composing Selector state for a dynamic options-type Selector\n * @param {{id: string, dynamicOptions: DynamicOptionsSimpleState, setDynamicOptions}} props\n * @returns\n */\nfunction DynamicSelectorOptionsEditor({id, dynamicOptions, setDynamicOptions}) {\n const {\n optionsVar, idKey, labelKey, defaultVar, isPrimitiveType,\n } = dynamicOptions;\n\n // State that will actually be stored in the selector block state\n const variables = useInputVariablesFlat(id);\n const [isInitialized, setIsInitialized] = useState(false);\n\n // State that is used to populate the select component options\n const [optionVariableMap, setOptionVariableMap] = useState({});\n const [defaultVariableList, setDefaultVariableList] = useState([]);\n const [valueSelectorList, setValueSelectorList] = useState([]);\n\n // populate the select options for choosing variables for the Selector options list and the default ID\n useEffect(() => {\n // if no variables, set to empty\n if (!variables) {\n setOptionVariableMap({});\n setDefaultVariableList([]);\n }\n // get and set all possible variables that can be used as a list of options for the Selector\n const validVariableMap = Object.entries(variables)\n .filter(([variableName, variableContent]) => isValidSelectorOptionsArray(variableContent))\n .reduce((acc, [variableName, variableContent]) => {\n acc[variableName] = variableContent;\n return acc;\n }, {});\n setOptionVariableMap(validVariableMap);\n\n // get and set all possible variables that can be used to get the default Selector value ID\n const validDefaultIdList = Object.keys(variables);\n\n setDefaultVariableList(validDefaultIdList);\n setIsInitialized(true);\n }, [variables]);\n\n const setState = useCallback((key, val) => {\n setDynamicOptions({...dynamicOptions, [key]: val});\n }, [dynamicOptions]);\n\n // populate option list for the value and label selectors when the variable option list changes\n useEffect(() => {\n if (!Object.keys(optionVariableMap).length) return;\n // if selected variable contains objects\n const isPrimitiveType = isPrimitiveTypeVariable(optionVariableMap[optionsVar]);\n\n if (!isPrimitiveType) {\n // get list of all unique keys in variable arrays\n const keySet = new Set();\n (optionVariableMap[dynamicOptions.optionsVar] || []).forEach(\n (content) => Object.keys(typeof content === \"object\" ? content : {}).forEach((varProperty) => keySet.add(varProperty)),\n );\n const allPropertyOptions = Array.from(keySet).sort().map((propertyName) => propertyName);\n // set available options for choosing each of the selector's option's value and label\n setValueSelectorList(allPropertyOptions);\n }\n // else, set the ID and label fields to null\n else {\n setValueSelectorList([]);\n setState(\"idKey\", null);\n setState(\"labelKey\", null);\n }\n setState(\"isPrimitiveType\", isPrimitiveType);\n }, [optionVariableMap, optionsVar]);\n\n const setOptionVar = useCallback((val) => {\n setDynamicOptions({\n ...dynamicOptions,\n optionsVar: val,\n idKey: null,\n labelKey: null,\n });\n }, [dynamicOptions, setDynamicOptions]);\n\n if (!isInitialized) return null;\n\n const optionsVarList = Object.keys(optionVariableMap);\n const isPopulated = (list) => list && Array.isArray(list) && list.length;\n\n return (\n <>\n <Select\n label=\"Options List Variable\"\n placeholder=\"Pick a variable\"\n value={isPopulated(optionsVarList) && optionsVar}\n required\n onChange={setOptionVar}\n data={optionsVarList}\n />\n <Select\n label=\"Options ID Key\"\n placeholder=\"Pick a property key\"\n value={isPopulated(valueSelectorList) && idKey}\n required={!isPrimitiveType}\n disabled={isPrimitiveType}\n onChange={(val) => setState(\"idKey\", val)}\n data={valueSelectorList}\n />\n <Select\n label=\"Options Label Key\"\n placeholder=\"Pick a property key\"\n disabled={isPrimitiveType}\n clearable\n value={isPopulated(valueSelectorList) && labelKey}\n onChange={(val) => setState(\"labelKey\", val)}\n data={valueSelectorList}\n />\n <Select\n label=\"Default ID Variable\"\n placeholder=\"Pick a variable\"\n clearable\n value={isPopulated(defaultVariableList) && defaultVar}\n onChange={(val) => setState(\"defaultVar\", val)}\n data={defaultVariableList}\n />\n </>\n );\n}\n\n/**\n * Component for rendering user-friendly simple UI for creating selector-type blocks\n * and converting a user's selections into code.\n * @param {import(\"../SimpleUI\").BlockEditorUIProps} props\n */\nfunction SelectorUI(props) {\n const {\n id, locale, executeButton, onChange, simpleState,\n } = props;\n\n // TODO - improve variables names\n const [selectorIdentifier, setSelectorIdentifier] = useState(\"\");\n const [selectorType, setSelectorType] = useState(SELECTOR_TYPE.SINGLE);\n const [options, setOptions] = useState({static: [], dynamic: {}});\n const [optionsType, setOptionsType] = useState(OPTION_TYPE.STATIC);\n\n // gather all state-changing fields to detect when this block's content logic\n // and simple state needs to be updated\n const stateFields = [selectorIdentifier, selectorType, options, optionsType];\n\n // on mount, set form state using existing simpleState\n useEffect(() => {\n if (!simpleState) return;\n setSelectorIdentifier(simpleState.name || \"\");\n setSelectorType(simpleState.type);\n if (simpleState.options?.hasOwnProperty(\"dynamic\") && simpleState.options?.hasOwnProperty(\"static\")) {\n setOptions(simpleState.options);\n }\n setOptionsType(simpleState.optionsType);\n }, []);\n\n /**\n * Make parent component aware of changes when internal state changes\n */\n useEffect(\n () => {\n // derive JS function from interal form state\n const logicObj:any = {\n name: selectorIdentifier,\n type: selectorType,\n };\n let defaultValue;\n let logicOptions;\n\n // for selectors with statically-defined options...\n if (optionsType === OPTION_TYPE.STATIC) {\n // choose one or more default values based on whether they have been marked as default\n defaultValue = selectorType === SELECTOR_TYPE.SINGLE\n ? options.static.find((o) => o.isDefault)?.id\n : options.static.filter((o) => o.isDefault).map((o) => o.id);\n // and simply return the user-defined options with a copied ID as a label (if none exists)\n logicOptions = options.static.map(({id, label}) => ({id, label: label || id}));\n }\n // for selectors with dynamically-defined options...\n else {\n const {\n optionsVar, idKey, labelKey, defaultVar, isPrimitiveType,\n } = options.dynamic as any;\n if (defaultVar) defaultValue = `variables[\"${defaultVar}\"]`;\n logicOptions = isPrimitiveType\n ? `variables[\"${optionsVar}\"]`\n : `(variables[\"${optionsVar}\"] || []).map(d => ({id: String(d[\"${idKey}\"]), label: String(d[\"${labelKey || idKey}\"])}))`;\n }\n\n if (defaultValue) logicObj.defaultValue = defaultValue;\n logicObj.options = logicOptions;\n\n // const logic = `return ${JSON.stringify(logicObj, null, \"\\t\")};`;\n const logic = `return ${stringifyObject(logicObj)};`;\n\n // derive object for saving form state\n const simpleState = {\n name: selectorIdentifier,\n type: selectorType,\n optionsType,\n options,\n };\n // todo1.0 - add actual validation function\n const isValid = isValidSelectorState(simpleState);\n onChange(simpleState, logic, isValid);\n },\n [...stateFields],\n );\n\n return (\n <>\n <TextInput\n placeholder=\"mySelector\"\n label=\"Selector Name\"\n required\n value={selectorIdentifier}\n onChange={(e) => setSelectorIdentifier(e.currentTarget.value)}\n />\n <Select\n label=\"Selector Type\"\n value={selectorType}\n onChange={setSelectorType}\n data={Object.values(SELECTOR_TYPE)}\n />\n <Select\n label=\"Options Type\"\n value={optionsType}\n onChange={setOptionsType}\n data={Object.values(OPTION_TYPE)}\n />\n {\n optionsType === OPTION_TYPE.STATIC\n ? (\n <StaticSelectorOptionsEditor\n staticOptions={options.static}\n setStaticOptions={(optionsState) => setOptions({...options, static: optionsState})}\n />\n )\n : (\n <DynamicSelectorOptionsEditor\n dynamicOptions={options.dynamic}\n setDynamicOptions={(optionsState) => setOptions({...options, dynamic: optionsState})}\n id={id}\n />\n )\n }\n {executeButton}\n </>\n );\n}\n\nexport default SelectorUI;\n","import {BLOCK_TYPES} from \"../../../../types/cms\";\n\nimport SelectorUI from \"./SelectorUI\";\n\nexport default {\n [BLOCK_TYPES.SELECTOR]: SelectorUI,\n};\n","import {BLOCK_TYPES} from \"../../../types/cms\";\n\nimport adapters from \"./adapters\";\nimport editors from \"./simpleEditors\";\nimport renderers from \"./renderers\";\n\n/**\n * @typedef BlockConfig\n * Config object that determines a block's behavior when it is being rendered and edited\n * @property {string} type - a unique identifier for this block type\n * @property {} renderer - component that will render the visual element of a block\n * @property {} [adapter] - transform function to turn the output of a block's logic to the\n * renderer's required props\n * @property {} [nonActiveAdapter] - transform function that produces the config for a\n * renderer when a block is inactive, meaning it is being rendered, but its upstream\n * blocks have not been run so its input variables have not been materialized. (This\n * happens both in the CMS editor and in an unloaded profile)\n * @property {boolean} [evalWhenNonActive=false] - whether a block's logic will be\n * evaluated even if i\n * @property {} [editor] - component used to provide a user-friendly way to create\n * and edit a block and its logic\n * @property {boolean} [renderPreviewOnEdit=true] - flag that says whether a block\n * should be updated everytime\n * it is updated in the CMS\n * @property {number} [debounceEditInMs] - time in milliseconds that edits to the\n * block's content should\n * be debounced (overrides default debounce time)\n */\n\n/** @type {{[blockType: string]: BlockConfig}} */\nconst allBlocks = {\n\n [BLOCK_TYPES.AUTHOR]: {\n type: BLOCK_TYPES.AUTHOR,\n renderer: renderers[BLOCK_TYPES.AUTHOR],\n renderPreviewOnEdit: true,\n evalWhenNonActive: true,\n },\n\n [BLOCK_TYPES.GENERATOR]: {\n type: BLOCK_TYPES.GENERATOR,\n renderer: renderers[BLOCK_TYPES.GENERATOR],\n renderPreviewOnEdit: false,\n },\n\n [BLOCK_TYPES.IMAGE]: {\n type: BLOCK_TYPES.IMAGE,\n renderer: renderers[BLOCK_TYPES.IMAGE],\n renderPreviewOnEdit: false,\n },\n\n [BLOCK_TYPES.PARAGRAPH]: {\n type: BLOCK_TYPES.PARAGRAPH,\n renderer: renderers[BLOCK_TYPES.PARAGRAPH],\n renderPreviewOnEdit: true,\n evalWhenNonActive: true,\n },\n\n [BLOCK_TYPES.SELECTOR]: {\n type: BLOCK_TYPES.SELECTOR,\n renderer: renderers[BLOCK_TYPES.SELECTOR],\n adapter: adapters[BLOCK_TYPES.SELECTOR],\n nonActiveAdapter: () => adapters[BLOCK_TYPES.SELECTOR]({name: \"Selector Preview\"}),\n editor: editors[BLOCK_TYPES.SELECTOR],\n renderPreviewOnEdit: false,\n },\n\n [BLOCK_TYPES.STAT]: {\n type: BLOCK_TYPES.STAT,\n renderer: renderers[BLOCK_TYPES.STAT],\n renderPreviewOnEdit: true,\n evalWhenNonActive: true,\n },\n\n [BLOCK_TYPES.SUBTITLE]: {\n type: BLOCK_TYPES.SUBTITLE,\n renderer: renderers[BLOCK_TYPES.SUBTITLE],\n renderPreviewOnEdit: true,\n evalWhenNonActive: true,\n },\n\n [BLOCK_TYPES.TITLE]: {\n type: BLOCK_TYPES.TITLE,\n renderer: renderers[BLOCK_TYPES.TITLE],\n renderPreviewOnEdit: true,\n evalWhenNonActive: true,\n },\n\n [BLOCK_TYPES.VIZ]: {\n type: BLOCK_TYPES.VIZ,\n renderer: renderers[BLOCK_TYPES.VIZ],\n renderPreviewOnEdit: false,\n },\n};\n\nexport default allBlocks;\n\nexport {adapters, editors, renderers};\n","/* react */\nimport React, {\n CSSProperties, Fragment, useEffect, useState,\n} from \"react\";\nimport {Badge, Center, Textarea} from \"@mantine/core\";\nimport {format} from \"pretty-format\";\n\n/* utils */\nimport {getBlockContent} from \"../../libs/blocks/getBlockContent\";\n\n/** type-specific render components */\nimport TypeRenderers from \"./types/renderers\";\n\n/** type-specific methods for deriving data needed for rendering from current Block state */\nimport PreviewAdapters from \"./types/adapters\";\nimport BLOCK_CONFIG from \"./types\";\nimport {BLOCK_TYPES} from \"../../types/cms\";\nimport {useBlockRef} from \"../../store\";\nimport {useInputVariablesFlat, useBlockContext, useFormatterFunctionsForLocale} from \"../../store/hooks\";\nimport {BlockResultStatus, runSingleBlock} from \"../../libs/blocks/runConsumers\";\nimport varSwap from \"../../libs/variables/varSwap\";\nimport mortarEval from \"../../libs/variables/mortarEval\";\n\n/**\n * BlockPreview shows the varswapped version of the content currently being edited, it is used\n * both in BlockOutputPanel as a live preview, and on the main page as the blocks that make\n * up the report. A \"debug\" key is passed to all previews to indicate they are allowed to show\n * stacktraces to the content creator\n */\nfunction BlockPreview(props) {\n const {\n active, allowed, blockStateContent, debug, id, locale,\n } = props;\n\n const variables = useInputVariablesFlat(id);\n const block:any = useBlockRef(id).data;\n const formatterFunctions = useFormatterFunctionsForLocale();\n const blockContext = useBlockContext(id, locale);\n\n /**\n * The block content data to use for rendering.\n * If no \"blockStateContent\" prop is given, defaults to the redux store value of block.\n * Use the \"blockStateContent\" prop to provide override values if you want to show a\n * live preview of unsaved changes.\n */\n\n const blockContent = BLOCK_CONFIG[block.type].renderPreviewOnEdit && blockStateContent\n ? blockStateContent\n : getBlockContent(block, locale);\n\n const [content, setContent] = useState<Record<string, any> | null>(null);\n const [status, setStatus] = useState < BlockResultStatus>({});\n\n useEffect(() => {\n const fetch = async () => {\n // todo1.0 - Viz is handled as a special case for now until Viz component is overhauled.\n // This should be changed so that the adapter(s) are used to create the props for the component\n if (block.type === BLOCK_TYPES.VIZ) {\n const config = {\n block, locale, variables, active,\n };\n setContent(config);\n setStatus({error: undefined, log: []});\n return;\n }\n\n if (!active && !BLOCK_CONFIG[block.type].evalWhenNonActive) {\n const {nonActiveAdapter} = BLOCK_CONFIG[block.type];\n const config = nonActiveAdapter && typeof nonActiveAdapter === \"function\" ? nonActiveAdapter() : {};\n setContent(config);\n setStatus({error: undefined, log: []});\n return;\n }\n if (block.type === BLOCK_TYPES.GENERATOR) {\n const {outputVariables, status} = await runSingleBlock(block, formatterFunctions, blockContext);\n // if (!active) return [{}, false, false];\n setContent({outputVariables});\n setStatus(status);\n return;\n }\n\n if (block.type === BLOCK_TYPES.SELECTOR) {\n const {renderVariables, status} = await runSingleBlock(block, formatterFunctions, blockContext);\n const content = PreviewAdapters[block.type] && typeof PreviewAdapters[block.type] === \"function\"\n ? PreviewAdapters[block.type](renderVariables, id)\n : renderVariables;\n setContent(content);\n setStatus(status);\n return;\n }\n\n const swappedLogic = varSwap(blockContent?.logic, formatterFunctions, blockContext);\n const {vars, error, log} = mortarEval(\n \"variables\",\n variables,\n swappedLogic,\n formatterFunctions,\n undefined,\n blockContext,\n );\n\n // adapt content using type transformer\n const content = PreviewAdapters[block.type] && typeof PreviewAdapters[block.type] === \"function\"\n ? PreviewAdapters[block.type](vars, id)\n : vars;\n\n setContent(content);\n setStatus({error, log});\n };\n\n fetch();\n }, [blockContent, variables]);\n\n // type RenderType = ReturnType<typeof TypeRenderers[block.type]>; ?? help francisco\n\n const Renderer:any = TypeRenderers[block.type];\n\n const overlayStyle:CSSProperties = {\n width: \"100%\",\n height: \"100%\",\n position: \"absolute\",\n top: -1,\n left: -1,\n opacity: 0.3,\n zIndex: 5,\n pointerEvents: \"none\",\n };\n const allowedOverlay = <div style={{...overlayStyle, backgroundColor: \"pink\"}} />;\n\n if (!content) return null;\n\n const {error, log} = status;\n const textLog = log ? log.map((d) => format(d)).join(\"\\n\") : \"\";\n\n return (\n <div className=\"cms-block-preview\" style={{width: \"100%\"}}>\n {!allowed && allowedOverlay}\n { Renderer\n ? <Fragment key=\"renderer\"><Renderer debug={debug} {...content} /></Fragment>\n : (\n <Center style={{minHeight: 100}}>\n <Badge key=\"type\" color=\"gray\" variant=\"outline\">{block.type}</Badge>\n </Center>\n )}\n {debug && textLog && (\n <Textarea\n label=\"Console\"\n minRows={3}\n readOnly\n value={textLog}\n error={error}\n />\n )}\n {debug && error && <Textarea label=\"Error\" readOnly minRows={3} value={error} />}\n </div>\n );\n}\n\nexport default BlockPreview;\n","/* react */\nimport React from \"react\";\n\n/* editors */\nimport MonacoWrapper from \"../../cms/editors/MonacoWrapper\";\nimport {getBlockContent} from \"../../libs/blocks/getBlockContent\";\nimport {useBlockRef} from \"../../store\";\n\n/**\n *\n */\nfunction VizSettings({id, onChange}) {\n /* redux */\n const block = useBlockRef(id).data;\n const content = getBlockContent(block);\n const logic = content?.logic || \"\";\n\n const handleChange = (value) => {\n onChange({logic: value});\n };\n\n return (\n <div>\n <span>Viz Options</span>\n <MonacoWrapper\n key=\"code-editor\"\n monacoOptions={{\n onChange: handleChange,\n value: logic,\n }}\n />\n </div>\n );\n}\n\nexport default VizSettings;\n","/* react */\nimport React, {useMemo, useState} from \"react\";\nimport {useDispatch} from \"react-redux\";\nimport {\n Select, Button, SegmentedControl,\n} from \"@mantine/core\";\n\n/* enums */\nimport {BLOCK_SETTINGS, BLOCK_TYPES, ENTITY_TYPES} from \"../../types/cms\";\n\nimport {useDialog} from \"../commons/Dialog\";\n\n/* utils */\nimport VizSettings from \"./VizSettings\";\nimport {actions, useBlockRef} from \"../../store\";\nimport {useInputVariablesFlat} from \"../../store/hooks\";\n\n/**\n *\n */\nfunction BlockSettings({id, setBlockSettings, setBlockContent}) {\n const dispatch = useDispatch();\n const {newConfirmation} = useDialog();\n\n const block:any = useBlockRef(id).data;\n\n /* state */\n const [allowedLogic, setAllowedLogic] = useState(block.settings.allowedLogic);\n\n const variables = useInputVariablesFlat(id);\n\n // todo move this to a hook?\n const allowed = useMemo(() => [\n {value: \"always\", label: \"always\"},\n {value: \"never\", label: \"never\"},\n ].concat(Object.keys(variables)\n .map((d) => ({value: d, label: `${d}: ${variables[d]}`}))), [variables]);\n const shared = [{label: \"Section-wide\", value: \"false\"}, {label: \"Report-wide\", value: \"true\"}];\n\n const maybeDelete = async () => {\n try {\n await newConfirmation({\n title: \"Are you sure?\",\n message: \"Delete this block and all its contents? This action cannot be undone.\",\n confirmText: \"Yes, Delete it.\",\n });\n dispatch(actions.deleteEntity(\"block\", id));\n } catch {\n //\n }\n };\n\n const handleChange = (field, value) => {\n setBlockSettings({[field]: value});\n };\n\n const handleChangeAllowedLogic = (logic) => {\n setAllowedLogic(logic);\n handleChange(BLOCK_SETTINGS.ALLOWED_LOGIC, logic);\n };\n\n const handleChangeAllowedDropdown = (allowed) => {\n let allowedLogic = `return variables.${allowed}`;\n if (allowed === \"always\") allowedLogic = \"return true;\";\n if (allowed === \"never\") allowedLogic = \"return false;\";\n // These need to occur in the same setBlockSettings action to avoid a race condition\n setBlockSettings({\n [BLOCK_SETTINGS.ALLOWED]: allowed,\n [BLOCK_SETTINGS.ALLOWED_LOGIC]: allowedLogic,\n });\n setAllowedLogic(allowedLogic);\n };\n\n return (\n <div>\n <div>\n <Select\n label=\"Allowed\"\n defaultValue={block.settings[BLOCK_SETTINGS.ALLOWED] || \"always\"}\n onChange={handleChangeAllowedDropdown}\n data={allowed}\n />\n {/*\n <MonacoWrapper\n key=\"code-editor\"\n monacoOptions={{\n onChange: handleChangeAllowedLogic,\n value: allowedLogic,\n }}\n />\n */}\n <span>Sharing</span>\n <SegmentedControl\n defaultValue={String(block.shared)}\n onChange={(e) => handleChange(\"shared\", e === \"true\")}\n data={shared}\n />\n <Button variant=\"outline\" color=\"red\" onClick={maybeDelete}>Delete Block</Button>\n </div>\n {block.type === BLOCK_TYPES.VIZ\n && <VizSettings id={id} onChange={setBlockContent} />}\n </div>\n );\n}\n\nexport default BlockSettings;\n","import React, {useContext, useMemo} from \"react\";\nimport {ThemeIcon, Button, Menu} from \"@mantine/core\";\nimport {\n IconLogin, IconLogout, IconCircleCheck, IconCirclePlus, IconGlobe,\n} from \"@tabler/icons\";\nimport InputMenuItem from \"./InputMenuItem\";\nimport {\n useAppSelector, useAppDispatch, useBlockRef, actions,\n} from \"../../../store\";\nimport {recalculateVariables} from \"../../../store/actions\";\nimport {ResourceContext} from \"../../../context/ResourceProvider\";\n\nconst Icons = {\n Consumer: <ThemeIcon size=\"xs\" radius=\"xl\" color=\"red\" variant=\"light\"><IconLogout /></ThemeIcon>,\n Input: <ThemeIcon size=\"xs\" radius=\"xl\" color=\"green\"><IconCircleCheck /></ThemeIcon>,\n None: <ThemeIcon size=\"xs\" radius=\"xl\" color=\"gray\"><IconCirclePlus /></ThemeIcon>,\n};\n\n/** */\nfunction InputMenu({id}) {\n const dispatch = useAppDispatch();\n const resource = useContext(ResourceContext);\n\n /* redux */\n const blocks = useAppSelector((state) => state.records.entities.block);\n const block = useBlockRef(id).data;\n const variables = useAppSelector((state) => state.variables.variables);\n\n // Lookup object of the input blocks this block is subscribed to.\n const inputBlocks = useMemo(() => (block\n ? block.inputs.reduce((acc:any, d:any) => ({...acc, [d]: blocks[d]}), {})\n : []), [block]);\n\n // todo jimmy redo this terrible sort\n const inputMenuSort = (a:any, b:any) => {\n if (!block) return 0;\n const aActive = block.inputs.includes(a.id);\n const bActive = block.inputs.includes(b.id);\n if (aActive !== bActive) return aActive ? 1 : -1; // sorts active to the top\n\n const aKeys = Object.keys(variables[a.id] || {}).length;\n const bKeys = Object.keys(variables[b.id] || {}).length;\n if (aKeys !== bKeys) return bKeys - aKeys; // sort blocks descending by # of keys\n\n return a.shared ? 1 : -1; // otherwise send shared variables to bottom of list\n };\n\n // Blocks from this section are always available, as well as ones that are shared by other sections.\n const availableBlocks = useMemo(\n () => Object.values(blocks)\n .filter((d:any) => d.id !== block.id\n && (d.section_id === block.section_id || d.shared))\n .sort(inputMenuSort),\n [blocks],\n );\n\n if (!block) return null;\n\n const handleClick = (blockId) => {\n const operation = inputBlocks[blockId] ? \"delete\" : \"create\";\n dispatch(actions.updateEntity(\"block\", {\n id,\n inputAction: {\n operation,\n input: {\n input_id: blockId,\n block_id: id,\n },\n },\n })).then(() => {\n dispatch(recalculateVariables(resource));\n });\n };\n\n const determineIcon = (blockId) => {\n if (block.consumers.includes(blockId)) return Icons.Consumer;\n if (block.inputs.includes(blockId)) return Icons.Input;\n return Icons.None;\n };\n\n return (\n <Menu\n withinPortal\n >\n <Menu.Target>\n <Button\n fullWidth\n style={{marginBottom: \"15px\"}}\n leftIcon={<IconLogin style={{transform: \"scaleX(-1)\"}} />}\n >\n Add New Input\n </Button>\n </Menu.Target>\n <Menu.Dropdown>\n {availableBlocks.map(({id, shared}) => (\n <Menu.Item\n // active={block.inputs.includes(id)}\n disabled={block.consumers.includes(id)}\n onClick={() => handleClick(id)}\n icon={determineIcon(id)}\n rightSection={shared ? <ThemeIcon size=\"xs\" radius=\"xl\"><IconGlobe /></ThemeIcon> : null}\n key={id}\n >\n <InputMenuItem\n id={id}\n variables={variables[id]}\n // active={block.inputs.includes(id) ? Object.keys(variables[id]) : []}\n />\n </Menu.Item>\n ))}\n </Menu.Dropdown>\n </Menu>\n );\n}\n\nexport default InputMenu;\n","/* react */\nimport React, {useRef, useState} from \"react\";\nimport {Editor} from \"@tinymce/tinymce-react\";\n\nimport \"./MCEWrapper.css\";\n\n/**\n *\n */\nfunction MCEWrapper({\n initialValue, onChange, variables = {}, showToolbar = true,\n}) {\n const [value, setValue] = useState(initialValue);\n\n const editorRef = useRef(null);\n\n const onChangeLocal = (text) => {\n setValue(text);\n if (onChange) onChange(text);\n };\n\n return (\n <Editor\n onInit={(_evt, editor) => { editorRef.current = editor; }}\n onEditorChange={onChangeLocal}\n value={value}\n init={{\n height: 100,\n menubar: false,\n toolbar: false,\n statusbar: false,\n /*\n plugins: [\n \"advlist autolink lists link image charmap print preview anchor\",\n \"searchreplace visualblocks code fullscreen\",\n \"insertdatetime media table paste code help wordcount\",\n ],\n\n toolbar: \"undo redo | formatselect | \"\n + \"bold italic backcolor | alignleft aligncenter \"\n + \"alignright alignjustify | bullist numlist outdent indent | \"\n + \"removeformat | help\",\n */\n content_style: \"body { font-family:Helvetica,Arial,sans-serif; font-size:14px }\",\n }}\n />\n );\n}\n\nexport default MCEWrapper;\n","const deepClone = (o) => {\n if (!o) return o;\n const output = Array.isArray(o) ? [] : {};\n Object.keys(o).forEach((key) => {\n output[key] = typeof o[key] === \"object\" ? deepClone(o[key]) : o[key];\n });\n return output;\n};\n\nexport default deepClone;\n","export default (object) => {\n const regex = /([A-z0-9]*)\\{\\{([^}]+)\\}\\}/g;\n const matcher = (_, formatter, variable) => (\n formatter ? `$\\{formatters.${formatter}(variables.${variable})}` : `$\\{variables.${variable}}`\n );\n const codified = Object.keys(object).reduce((acc, d) => (\n {\n ...acc,\n [d]: object[d].replace(regex, matcher),\n }), {});\n return Object.keys(codified)\n .reduce((acc, d) => acc.concat(`\"${d}\": \\`${codified[d]}\\`,\\n`), \"return {\").concat(\"};\");\n};\n","/* react */\nimport React, {useState, useEffect} from \"react\";\nimport {titleCase} from \"d3plus-text\";\nimport {Text, useMantineTheme} from \"@mantine/core\";\nimport {useDebouncedValue} from \"@mantine/hooks\";\nimport {useAppSelector} from \"../../store\";\n\n/* components */\n// import DraftWrapper from \"./DraftWrapper\";\nimport MCEWrapper from \"./MCEWrapper\";\n\nimport sanitizeBlockContent from \"../../libs/blocks/sanitizeBlockContent\";\nimport deepClone from \"../../libs/js/deepClone\";\nimport stringifyWithTemplate from \"../../libs/blocks/stringifyWithTemplate\";\n\n/**\n *\n */\nfunction RichTextEditor({\n fields, locale, defaultContent, onChange, variables,\n}) {\n /* redux */\n const showToolbar = useAppSelector((state) => state.status.showToolbar);\n\n /* state */\n const [stateContent, setStateContent] = useState(() => deepClone(defaultContent));\n\n /**\n * There is a race condition when this component is mounted with several fields. Each of the fields\n * calls handleEditor on instantiation, which happens too fast for the handler in Block.jsx to merge them.\n * On mount, call onChange *one* time to send up the full object so that the preview can be populated.\n */\n useEffect(() => {\n onChange(stateContent, locale);\n }, []);\n\n /* Update *local* state on each keystroke, but use the debouncer below to space out update callbacks */\n const handleEditor = (field, text) => {\n setStateContent((currentContent) => ({...currentContent, [field]: text}));\n };\n\n /* Rate-limit the slightly expensive state update out in Block.jsx */\n const [debounced] = useDebouncedValue(stateContent, 500);\n\n useEffect(() => {\n const simple = Object.keys(debounced).reduce((acc, d) => ({...acc, [d]: sanitizeBlockContent(debounced[d])}), {});\n const logic = stringifyWithTemplate(simple);\n onChange({simple, logic}, locale);\n }, [debounced]);\n\n const theme = useMantineTheme();\n\n return (\n <table className=\"cr-rich-text-editor\" style={{width: \"100%\"}}>\n <tbody>\n {fields.map((field) => (\n <tr className=\"cr-field-container\" key={field}>\n <td style={{paddingRight: theme.spacing.xs}}>\n <label key=\"label\" htmlFor={field} style={{whiteSpace: \"nowrap\"}}>\n <Text size=\"xs\" transform=\"uppercase\" weight=\"bold\" color=\"gray\">\n {titleCase(field)}\n </Text>\n </label>\n </td>\n <td style={{width: \"100%\"}}>\n <MCEWrapper\n key={`${field}-dw`}\n variables={variables}\n initialValue={stateContent[field] || \"\"}\n onChange={(text) => handleEditor(field, text)}\n showToolbar={showToolbar}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\nexport default RichTextEditor;\n","/* react */\nimport React from \"react\";\nimport {useInputVariablesFlat} from \"../../store/hooks\";\nimport {BLOCK_MAP} from \"../../types/cms\";\nimport {editors} from \"../../components/blocks/types\";\n\nimport RichTextEditor from \"./RichTextEditor\";\n\n/**\n * Props expected by generalized SimpleUI components.\n * @typedef {Object} SimpleUIProps\n * @property {string} blockType - type of block being edited (BLOCK_TYPES)\n * @property {React.Component} executeButton - button for saving changes to database\n * @property {number} id - the ID of the block that this editor is editing\n * @property {string} locale - locale key for locale currently being edited\n * @property {(content: Object, locale: string, flagModified: boolean, isValidated: boolean) => void} setBlockContent\n * - callback for submitting changes to a Block's working state while editing\n * @property {Object} simpleState - saved state of simple UI form\n */\n\n/**\n * Props expected by all SimpleUI-type component implementations.\n * @typedef {Object} BlockEditorUIProps\n * @property {React.Component} executeButton - button for saving changes to database\n * @property {number} id - the ID of the block that this editor is editing\n * @property {string} locale - locale key for locale currently being edited\n * @property {(logic: string, simpleState: string, isValidated: boolean) => void} onChange - callback submitting changes\n * @property {Object} simpleState - saved state of simple UI form\n */\n\n/**\n * Generalized wrapper component that renders a simple GUI editor\n * for the appropriate block type\n * @param {SimpleUIProps} props\n */\nfunction SimpleUI(props) {\n const {\n blockType, executeButton, id, locale, setBlockContent, simpleState,\n } = props;\n\n const variables = useInputVariablesFlat(id);\n\n /** Tailor-made component for editing and composing a specific Block type */\n const CustomUIComponent = editors[blockType];\n\n // if a custom \"simple\" UI editor is implemented for Block type, use that\n if (CustomUIComponent) {\n return (\n <CustomUIComponent\n id={id}\n executeButton={executeButton}\n onChange={(simple, logic, isValidated = true) => setBlockContent({simple, logic}, locale, true, isValidated)}\n simpleState={simpleState}\n />\n );\n }\n\n // else, fall back to RichTextEditor\n return (\n <RichTextEditor\n key=\"text-editor\"\n fields={BLOCK_MAP[blockType]}\n locale={locale}\n defaultContent={simpleState}\n variables={variables}\n onChange={setBlockContent}\n />\n );\n}\n\nexport default SimpleUI;\n","/* react */\nimport React from \"react\";\nimport {ActionIcon, Divider, Tooltip} from \"@mantine/core\";\nimport {IconSettings} from \"@tabler/icons\";\nimport {titleCase} from \"d3plus-text\";\n\n/* components */\nimport InputMenuItem from \"../../cms/components/components/InputMenuItem\";\n\n/* consts */\nimport {BLOCK_TYPES} from \"../../types/cms\";\nimport {useAppSelector, useBlockRef} from \"../../store\";\nimport {useInputVariablesHash} from \"../../store/hooks\";\n\n/**\n *\n */\nfunction VariableList({id, setInlineId}) {\n const blocks = useAppSelector((state) => state.records.entities.block);\n const block = useBlockRef(id).data;\n\n const variablesById:any = useInputVariablesHash(id);\n const attributeKeys = Object.keys(variablesById.attributes);\n\n return (\n <div style={{\n display: \"flex\", flex: \"1 1 auto\", flexDirection: \"column\", overflowY: \"scroll\",\n }}\n >\n {\n Object.keys(variablesById)\n .sort((a) => (a === \"attributes\" ? -1 : 1))\n .map((vid) => {\n const block = blocks[vid];\n const isGenerator = block && block.type === BLOCK_TYPES.GENERATOR;\n\n return (\n <div key={vid} className=\"cr-variable-group\" style={{position: \"relative\"}}>\n <Divider\n label={block ? titleCase(block.type) : \"Dimension Attributes\"}\n labelPosition=\"center\"\n />\n <InputMenuItem id={vid} variables={variablesById[vid]} reserved={attributeKeys} />\n { isGenerator\n ? (\n <Tooltip\n disabled={!isGenerator}\n label=\"Edit this Generator\"\n style={{position: \"absolute\", right: 0, top: 0}}\n transition=\"pop\"\n withArrow\n >\n <ActionIcon size=\"xs\" onClick={() => setInlineId(vid)} variant=\"filled\">\n <IconSettings />\n </ActionIcon>\n </Tooltip>\n )\n : null}\n </div>\n );\n })\n }\n </div>\n );\n}\n\nexport default VariableList;\n","import React, {useState} from \"react\";\nimport {\n Col, Divider, Grid, Tabs,\n} from \"@mantine/core\";\nimport {IconEye, IconSettings} from \"@tabler/icons\";\n\nimport {BLOCK_TYPES} from \"../../types/cms\";\n\nimport ApiInput from \"../../cms/components/components/ApiInput\";\nimport MonacoWrapper from \"../../cms/editors/MonacoWrapper\";\nimport BlockPreview from \"./BlockPreview\";\nimport BlockSettings from \"./BlockSettings\";\nimport InputMenu from \"../../cms/components/components/InputMenu\";\nimport InputMenuItem from \"../../cms/components/components/InputMenuItem\";\nimport SimpleUI from \"../../cms/editors/SimpleUI\";\nimport VariableList from \"./VariableList\";\n\n/* css */\nimport \"./BlockEditor.css\";\nimport {useBlockRef} from \"../../store\";\nimport {BlockResultStatus} from \"../../libs/blocks/runConsumers\";\nimport {useInputVariablesFlat, useBlockStatus} from \"../../store/hooks\";\n\n/**\n *\n * @param {*} param0\n * @returns\n */\nfunction BlockEditor({\n blockContent, blockType, currentMode, executeButton, id, locale,\n onSave, setBlockContent, setBlockSettings, setInlineId,\n}) {\n /* HOOKS */\n const [tab, setTab] = useState<string | null>(\"Content\");\n const block:any = useBlockRef(id).data;\n const status:BlockResultStatus = useBlockStatus(id);\n const resp = status?.resp;\n const variables = useInputVariablesFlat(id);\n // const response = useAppSelector((state) => state\n // const response = block._status && block._status.response ? block._status.response : false;\n\n /* CHANGE HANDLERS */\n\n const onChangeCode = (logic, locale) => setBlockContent({logic}, locale);\n const onChangeAPI = (api) => setBlockContent({api});\n\n /**\n * Gen/Viz/Selector editors should not re-render on every single change, as their javascript is often broken mid-keystroke.\n * Therefore, render these blocks using the static props version, which only updates on Save. Normal stat-likes\n * can update on keystroke, so the user can watch the prose change as they type.\n */\n // const usePropBlock = [BLOCK_TYPES.GENERATOR, BLOCK_TYPES.VIZ, BLOCK_TYPES.SELECTOR].includes(blockType);\n\n const blockPreview = (\n <BlockPreview\n id={id}\n key=\"block-preview\"\n active\n blockStateContent={blockContent}\n locale={locale}\n allowed\n debug\n />\n );\n\n /** Editor for modifying a block's JS logic directly */\n // The codeEditor is the only editor that changes *based on another editor, i.e, the simpleUI.\n // Therefore it must be controlled, and its state must live here in Block.jsx\n const codeEditor = (\n <MonacoWrapper\n key=\"code-editor\"\n monacoOptions={{\n onChange: (logic) => onChangeCode(logic, locale),\n value: blockContent?.logic || \"\",\n }}\n variables={variables}\n />\n );\n\n const simpleState = blockContent?.simple || {};\n\n const uiEditor = (\n <SimpleUI\n blockType={blockType}\n id={id}\n locale={locale}\n simpleState={simpleState}\n setBlockContent={setBlockContent}\n executeButton={executeButton}\n />\n );\n\n return (\n <Grid style={{height: \"60vh\"}}>\n <Col\n span={3}\n style={{\n alignSelf: \"stretch\",\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n }}\n >\n <InputMenu id={id} />\n <VariableList id={id} setInlineId={setInlineId} />\n { blockType === BLOCK_TYPES.GENERATOR && (\n <div>\n <Divider label=\"API Data (resp)\" labelPosition=\"center\" />\n <ApiInput\n defaultValue={blockContent?.api}\n id={id}\n onChange={onChangeAPI}\n onEnterPress={() => onSave(true)}\n />\n { resp && (\n <div\n style={{\n maxHeight: 200,\n overflowY: \"scroll\",\n }}\n >\n <InputMenuItem variables={resp} />\n </div>\n ) }\n </div>\n )}\n </Col>\n <Col\n span={9}\n style={{\n alignSelf: \"stretch\",\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n }}\n >\n <Tabs\n value={tab}\n onTabChange={setTab}\n styles={{\n root: {\n display: \"flex\",\n flex: 1,\n flexDirection: \"column\",\n width: \"100%\",\n body: {\n display: \"flex\",\n flex: \"1 1 100%\",\n },\n },\n }}\n variant=\"pills\"\n >\n <Tabs.List position=\"center\">\n <Tabs.Tab value=\"Content\" icon={<IconEye />} />\n <Tabs.Tab value=\"Settings\" icon={<IconSettings />} />\n </Tabs.List>\n <Tabs.Panel value=\"Content\">\n {/** Block Editor */}\n <Grid className=\"cr-block-output\" style={{flex: 1, width: \"100%\"}}>\n <Col key=\"content-col\" span={8} className={`cr-block-output-editor ${currentMode}`}>\n {/*\n * todo1.0 - the button for changing modes is in parent component, but it needs to be disabled if a SimpleUI does not exist.\n * This is only a problem if there exists types of Blocks with no simple UI mode of editing\n */}\n {currentMode === \"code\"\n && (\n <>\n {codeEditor}\n {executeButton}\n </>\n )}\n {currentMode !== \"code\" && uiEditor}\n </Col>\n {/** Block Preview */}\n <Col span={4} style={{display: \"flex\", flexDirection: \"column\"}}>\n {blockPreview}\n </Col>\n </Grid>\n </Tabs.Panel>\n <Tabs.Panel value=\"Settings\">\n <BlockSettings\n id={id}\n setBlockSettings={setBlockSettings}\n setBlockContent={setBlockContent}\n />\n </Tabs.Panel>\n </Tabs>\n </Col>\n </Grid>\n );\n}\n\nexport default BlockEditor;\n","/* react */\nimport React from \"react\";\nimport {Button, Menu} from \"@mantine/core\";\nimport {IconRss} from \"@tabler/icons\";\nimport {useAppSelector, useBlockRef} from \"../../../store\";\n\n/** */\nfunction ConsumerMenu({id}) {\n /* redux */\n const blocks = useAppSelector((state) => state.records.entities.block);\n const block = useBlockRef(id).data;\n\n /*\n\n const consumers = useAppSelector((state) => state.cms.reportsNormalized.entities.consumers);\n const consumerBlocks = useMemo(() => Object.values(consumers || [])\n .filter((d:any) => block.consumers.includes(d.id)), [consumers]);\n\n */\n\n const consumerBlocks = [];\n\n return (\n consumerBlocks.length\n ? (\n <Menu\n position=\"top\"\n transition=\"pop\"\n trigger=\"hover\"\n zIndex={1001}\n >\n <Menu.Target>\n <Button variant=\"filled\"><IconRss size={16} /></Button>\n </Menu.Target>\n <Menu.Dropdown>\n <Menu.Label>Consumers</Menu.Label>\n {consumerBlocks.map(({id, type}) => (\n <Menu.Item key={id}>\n {`${type}(${id})`}\n </Menu.Item>\n ))}\n </Menu.Dropdown>\n </Menu>\n )\n : null\n );\n}\n\nexport default ConsumerMenu;\n","export const scaffoldEmptyBlock = block => {\n if (!block || !block.contentByLocale) return block;\n Object.keys(block.contentByLocale).forEach(locale => {\n const content = block.contentByLocale[locale]?.content;\n if (content && Object.keys(content).length === 0) {\n content.simpleEnabled = true;\n content.simple = {};\n }\n })\n return block;\n}","/* react */\nimport React, {useState, useEffect, useContext} from \"react\";\nimport {\n Button, Group, Space, Tooltip,\n} from \"@mantine/core\";\nimport {IconCode} from \"@tabler/icons\";\nimport {\n useAppSelector,\n useAppDispatch,\n useBlockRef,\n actions,\n} from \"../../store\";\n\n/* components */\nimport BlockEditor from \"./BlockEditor\";\nimport ConsumerMenu from \"../../cms/components/components/ConsumerMenu\";\n\n/* utils */\nimport deepClone from \"../../libs/js/deepClone\";\n/* hooks */\nimport {getBlockContent, getLocaleDerived} from \"../../libs/blocks/getBlockContent\";\nimport {recalculateVariables} from \"../../store/actions\";\n\nimport {\n BLOCK_FIELDS,\n} from \"../../types/cms\";\nimport {ResourceContext} from \"../../context/ResourceProvider\";\nimport {scaffoldEmptyBlock} from \"../../libs/blocks/scaffoldEmptyBlock\";\n\nconst MODES = {\n UI: \"ui\",\n CODE: \"code\",\n};\n\n/**\n * A Block is a visual element of any kind embedded in a Section. It can be a stat, generator,\n * selector, or anything listed in BLOCK_TYPES\n */\nfunction Block({\n id, modified, callbacks, inline,\n}) {\n const dispatch = useAppDispatch();\n const resource = useContext(ResourceContext);\n\n const {\n setOpened, setModified, maybeCloseWithoutSaving, setInlineId,\n } = callbacks;\n\n /* REDUX SELECTORS */\n\n /** Block data object from database */\n const block = useBlockRef(id).data;\n\n /** Locale key that has been set as default */\n const localeDefault = useAppSelector((state) => state.status.localeDefault);\n const localeDerived = getLocaleDerived(block);\n\n /* LOCAL STATE VARIABLES */\n\n /**\n * The content of the entire CMS is kept in a normalized redux object called reports.\n * These redux-level props cannot be edited directly, so each of the editors (draft, ace)\n * will clone their contents on mount, and report their new states here via callbacks.\n * When the user presses save, we have access to the current blockState here, so it can\n * be persisted to psql, pulled back into redux, and redistributed as props again.\n *\n * NOTE: Might want to move this to its own reducer in the future\n */\n const [blockState, setBlockState] = useState<typeof block>();\n\n const [ready, setReady] = useState(false);\n const [loading, setLoading] = useState(false);\n const [isValid, setIsValid] = useState(true);\n\n // deep clone block state on mount\n useEffect(() => {\n setBlockState(scaffoldEmptyBlock(deepClone(block)));\n setReady(true);\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // block execution if there is no block state\n if (!block || !ready || !blockState) return null;\n\n /** This blockState's content object */\n\n const blockContent = getBlockContent(blockState);\n\n /**\n * Generic method for updating the content of the current block's working state.\n * Meant to be used by the various editors that a Block might have\n * @param {Object} content - partial object that will be used to patch the current content object\n * @param {string} locale - locale key that the edits pertain to (Optional)\n * @param {boolean} flagModified - flag that decides whether this change will signal that state has been modified (Default: true)\n * @param {boolean} isValidated - says whether given changes have been validated\n * @returns\n */\n const setBlockContent = (content = {}, _locale = localeDefault, flagModified = true, isValidated = undefined) => {\n const locale = getLocaleDerived(block, _locale);\n // flag as modified if changes are made and user does not override\n if (flagModified && !modified) setModified(true);\n // only change validated status if boolean is given\n if (isValidated !== undefined && isValid !== isValidated) setIsValid(isValidated);\n // don't update state if no content given\n if (!content || Object.keys(content).length < 1) return;\n const existingContent = blockState.contentByLocale[locale] || {id, locale, content: {}};\n setBlockState({\n ...blockState,\n contentByLocale: {\n ...blockState.contentByLocale,\n [locale]: {\n ...existingContent,\n content: {\n ...existingContent.content,\n ...content,\n },\n },\n },\n });\n };\n\n const buildPayload = () => {\n const {settings} = blockState;\n const contentByLocale = Object.values(blockState.contentByLocale)\n .reduce((acc, d:any) => ({[d.locale]: {...d, content: d.content}}), {});\n const properties = [\"id\", \"api\", \"shared\", \"type\"]\n .reduce((acc, d) => ({...acc, [d]: blockState[d]}), {});\n return {\n ...properties,\n contentByLocale,\n settings,\n };\n };\n\n const onSave = (keepWindowOpen) => {\n const payload:any = buildPayload();\n setLoading(true);\n dispatch(actions.updateEntity(\"block\", payload)).then(() => {\n dispatch(recalculateVariables(resource));\n setModified(false);\n if (!keepWindowOpen) {\n if (inline) {\n setInlineId(null);\n } else {\n setOpened(false);\n }\n }\n });\n };\n\n const currentMode = blockState.type && blockContent && blockContent[BLOCK_FIELDS.SIMPLE_ENABLED]\n ? MODES.UI\n : MODES.CODE;\n\n const onChangeMode = (mode) => {\n const newMode = {[BLOCK_FIELDS.SIMPLE_ENABLED]: mode === MODES.UI};\n setBlockContent(newMode, localeDerived, true);\n };\n\n const setBlockSettings = (settings) => {\n if (!modified) setModified(true);\n // Unlike other settings, type and shared are top-level, not stored in the settings object\n if (settings.type || settings.shared !== undefined) {\n setBlockState({...blockState, ...settings});\n } else {\n setBlockState({...blockState, settings: {...blockState.settings, ...settings}});\n }\n };\n\n const executeButton = (\n <Button\n style={{minHeight: 40}}\n disabled={!isValid}\n onClick={() => onSave(true)}\n >\n Save &amp; Execute\n </Button>\n );\n\n return (\n <>\n <BlockEditor\n blockContent={blockContent}\n blockType={block.type}\n currentMode={currentMode}\n executeButton={executeButton}\n id={id}\n key=\"be\"\n locale={localeDefault}\n onSave={onSave}\n setBlockContent={setBlockContent}\n setBlockSettings={setBlockSettings}\n setInlineId={setInlineId}\n />\n <Space h=\"xs\" />\n <Group\n position=\"right\"\n style={{flexDirection: inline ? \"row-reverse\" : \"row\"}}\n >\n <Tooltip\n label={`${currentMode === MODES.UI ? \"Show\" : \"Hide\"} Code`}\n withArrow\n color={currentMode === MODES.CODE ? \"dark\" : \"lime\"}\n >\n <Button\n key=\"mode-control\"\n className=\"cr-block-output-mode-control\"\n variant={currentMode === MODES.UI ? \"outline\" : \"filled\"}\n color={currentMode === MODES.UI ? \"dark\" : \"lime\"}\n onClick={() => onChangeMode(currentMode === MODES.UI ? MODES.CODE : MODES.UI)}\n >\n <IconCode size={16} />\n </Button>\n </Tooltip>\n <ConsumerMenu id={id} />\n <Button key=\"cancel\" color=\"red\" onClick={maybeCloseWithoutSaving}>Cancel</Button>\n <Button\n key=\"save\"\n color=\"green\"\n disabled={!isValid}\n onClick={() => onSave(false)}\n >\n {`Save & ${inline ? \"Return\" : \"Close\"}`}\n\n </Button>\n </Group>\n </>\n );\n}\n\nexport default Block;\n","export default {\n backgroundColor: \"#fafafa\",\n block: {\n padding: 10,\n },\n column: {\n padding: 12,\n },\n section: {\n backgroundColor: \"white\",\n borderRadius: 10,\n boxShadow: \"0px 6px 10px rgba(12, 32, 50, 0.14), 0px 1px 15px rgba(12, 32, 50, 0.12), 0px 3px 5px rgba(12, 32, 50, 0.15)\",\n margin: 16,\n padding: 32,\n },\n};\n","/* react */\nimport {\n ActionIcon, Modal, Tooltip, useMantineTheme,\n} from \"@mantine/core\";\nimport {useMemo, useState, useCallback} from \"react\";\nimport {\n IconEyeOff, IconLogin, IconLogout, IconPencil, IconWorld,\n} from \"@tabler/icons\";\n\n/* components */\nimport DeleteButton from \"../../cms/components/components/DeleteButton\";\nimport DesignMenu from \"../../cms/components/components/DesignMenu\";\nimport Block from \"./Block\";\nimport BlockPreview from \"./BlockPreview\";\n\n/* hooks */\nimport {useAppSelector, useBlockRef} from \"../../store\";\nimport {useDialog} from \"../commons/Dialog\";\n\n/* enums */\nimport site from \"../../libs/settings/site\";\nimport {ENTITY_TYPES} from \"../../types/cms\";\n\n/* css */\nimport \"./BlockElement.css\";\nimport {useInputVariablesFlat, useBlockStatus} from \"../../store/hooks\";\n\n/**\n * A Block is a visual element of any kind embedded in a Section. It can be a stat, generator,\n * selector, or anything listed in BLOCK_TYPES.\n * id - the id for this block\n */\nfunction BlockElement({\n id, setHoverBlock, isInput, isConsumer, active,\n}) {\n /* redux */\n const localeDefault = useAppSelector((state) => state.status.localeDefault);\n const block:any = useBlockRef(id).data;\n const blockStatus = useBlockStatus(id);\n\n const {newConfirmation} = useDialog();\n\n const [opened, setOpened] = useState(false);\n const [modified, setModified] = useState(false);\n const [inlineId, setInlineId] = useState(null);\n\n const variables = useInputVariablesFlat(id);\n\n const {allowed, allowedMessage} = useMemo(() => {\n const allowed = !blockStatus?.hiddenByCascade;\n const allowedMessage = blockStatus?.hiddenByCascade === id\n ? `Hidden by ${block?.settings?.allowed}: ${variables[block?.settings?.allowed]}`\n : `Hidden by ${blockStatus?.hiddenByCascade}`;\n return {allowed, allowedMessage};\n }, [variables, blockStatus, block]);\n\n if (!block) return null;\n\n const theme = useMantineTheme();\n\n const reset = useCallback(() => {\n setOpened(false);\n setModified(false);\n setInlineId(null);\n }, []);\n\n const maybeCloseWithoutSaving = async () => {\n if (modified) {\n try {\n await newConfirmation({\n title: \"Are you sure?\",\n message: \"Close editor without saving?\",\n confirmText: \"Yes, abandon changes.\",\n });\n reset();\n } catch {\n // do nothing\n }\n } else {\n reset();\n }\n };\n\n const modalProps = {\n centered: true,\n withCloseButton: false,\n opened,\n onClose: maybeCloseWithoutSaving,\n overflow: \"inside\" as \"inside\" | \"outside\",\n padding: theme.spacing.sm,\n size: \"90%\",\n };\n\n const hoverActions = {\n onMouseEnter: () => setHoverBlock(id),\n onMouseLeave: () => setHoverBlock(false),\n };\n\n const callbacks = {\n setOpened,\n setModified,\n setInlineId,\n maybeCloseWithoutSaving,\n };\n\n return (\n <>\n <div\n id={`cms-block-${id}`}\n key=\"block\"\n className=\"cr-section-block\"\n {...hoverActions}\n style={{\n display: \"flex\",\n height: \"100%\",\n padding: site.block.padding,\n }}\n >\n { isInput || isConsumer ? (\n <div\n className={`cr-block-link ${isInput ? \"input\" : \"consumer\"}`}\n key=\"link\"\n style={{\n color: isInput ? theme.colors.red[5] : theme.colors.green[5],\n }}\n >\n { isInput ? <IconLogout size={20} /> : <IconLogin size={20} /> }\n </div>\n ) : null }\n <BlockPreview\n style={{color: \"red\"}}\n key=\"bp\"\n id={id}\n debug={block.type === \"generator\" || block.type === \"visualization\"}\n active={active}\n locale={localeDefault}\n allowed={allowed}\n />\n <div\n key=\"bc\"\n className=\"cr-block-controls export-hidden\"\n style={{\n borderRadius: theme.radius.md,\n padding: theme.spacing.xs / 2,\n right: theme.spacing.xs / 2,\n top: theme.spacing.xs / 2,\n }}\n >\n {block.shared\n && (\n <Tooltip key=\"tt\" withArrow label=\"Sharing: Enabled\">\n <ActionIcon key=\"globe\"><IconWorld size={20} /></ActionIcon>\n </Tooltip>\n )}\n {!allowed\n && (\n <Tooltip key=\"allowed\" withArrow label={allowedMessage}>\n <ActionIcon><IconEyeOff size={20} /></ActionIcon>\n </Tooltip>\n )}\n <DesignMenu key=\"design\" id={id} />\n <ActionIcon key=\"edit\" onClick={() => setOpened(true)}><IconPencil size={20} /></ActionIcon>\n <DeleteButton key=\"cog\" type={ENTITY_TYPES.BLOCK} id={id} />\n </div>\n </div>\n <Modal key=\"d\" {...modalProps}>\n <Block\n callbacks={callbacks}\n id={inlineId || id}\n inline={inlineId}\n key={inlineId || id}\n modified={modified}\n />\n </Modal>\n </>\n );\n}\n\nexport default BlockElement;\n","import {useState} from \"react\";\nimport {ActionIcon, Checkbox, Popover} from \"@mantine/core\";\nimport {IconPalette} from \"@tabler/icons\";\n\nimport {actions, useAppDispatch, useSectionRef} from \"../../store\";\n\n/**\n *\n */\nexport function DesignSectionMenu({sectionId}:{sectionId:number}) {\n const dispatch = useAppDispatch();\n\n const section = useSectionRef(sectionId).data;\n\n const [opened, setOpened] = useState(false);\n\n const handleChange = (field, value) => {\n if (section) {\n dispatch(actions.updateEntity(\"section\", {\n id: sectionId,\n settings: {...section.settings, [field]: value},\n }));\n }\n };\n\n if (!section) return null;\n\n const {memberImageBg} = section.settings;\n\n return (\n <Popover\n opened={opened}\n onClose={() => setOpened(false)}\n position=\"bottom\"\n withinPortal\n >\n <Popover.Target>\n <ActionIcon\n onClick={() => setOpened((o) => !o)}\n >\n <IconPalette size={20} />\n </ActionIcon>\n </Popover.Target>\n <Popover.Dropdown>\n <div>\n <Checkbox\n label=\"Member image background\"\n checked={memberImageBg}\n onChange={(e) => handleChange(\"memberImageBg\", e.currentTarget.checked)}\n />\n </div>\n </Popover.Dropdown>\n </Popover>\n );\n}\n","/* react */\nimport React from \"react\";\nimport {Group} from \"@mantine/core\";\n\n/* components */\nimport {EntityDeleteButton} from \"../builder/EntityDeleteButton\";\nimport {DesignSectionMenu} from \"./DesignSectionMenu\";\n\n/**\n *\n */\nfunction SectionMenu({sectionId}) {\n return (\n <Group spacing={0}>\n <DesignSectionMenu sectionId={sectionId} />\n <EntityDeleteButton type=\"section\" id={sectionId} />\n </Group>\n );\n}\n\nexport default SectionMenu;\n","import {\n ActionIcon, CopyButton, Input, Tooltip,\n} from \"@mantine/core\";\nimport {IconLink, IconClipboardCopy, IconClipboardCheck} from \"@tabler/icons\";\n\ntype CopyInputProps = {\n title: string;\n url: string;\n}\n\nexport function CopyInput(props: CopyInputProps) {\n const {title, url} = props;\n\n return (\n <Input.Wrapper label={title}>\n <Input\n icon={<IconLink />}\n value={url}\n readOnly\n rightSection={(\n <CopyButton value={url} timeout={2000}>\n {({copied, copy}) => (\n <Tooltip label={copied ? \"Copied\" : \"Copy\"} withArrow position=\"right\">\n <ActionIcon color=\"blue\" variant={copied ? \"filled\" : \"subtle\"} onClick={copy}>\n {copied ? <IconClipboardCheck size={16} /> : <IconClipboardCopy size={16} />}\n </ActionIcon>\n </Tooltip>\n )}\n </CopyButton>\n )}\n />\n </Input.Wrapper>\n );\n}\n","import {useEffect, useState} from \"react\";\nimport {DataTable, DataTableSortStatus} from \"mantine-datatable\";\n\ninterface RowData {\n _key?: string;\n}\n\ninterface TableSortProps {\n data: RowData[];\n customIdAccessor?: string;\n}\n\nconst defaultIdAccessor = \"_key\";\n\nexport function SortableTable({data, customIdAccessor = \"id\"}: TableSortProps) {\n const [records, setRecords] = useState(data);\n const [sortStatus, setSortStatus] = useState<DataTableSortStatus>();\n\n // Retrieve all keys\n const keys:string[] = data && data[0] ? Object.keys(data[0]) : [];\n\n // What is the default id?\n // See https://icflorescu.github.io/mantine-datatable/examples/non-standard-record-ids\n const idAccessor = keys.includes(customIdAccessor) ? customIdAccessor : defaultIdAccessor;\n\n // Ignore the ones that starts with \"_\"\n const fields = keys.filter((k) => !k.startsWith(\"_\"));\n\n const columns = fields.map((field) => ({accessor: field, sortable: true}));\n\n const getSortedData = (sortField) => {\n let dataTemp = [...data];\n\n // Create a fake key to prevent errors in DataTable's .map()\n if (idAccessor === defaultIdAccessor) {\n dataTemp = dataTemp.map((item, ix) => ({...item, _key: `i-${ix}`}));\n }\n\n if (sortField) {\n dataTemp = dataTemp.sort((a, b) => a[sortField.columnAccessor].localeCompare(b[sortField.columnAccessor]));\n }\n return sortField && sortField.direction === \"desc\" ? dataTemp.reverse() : dataTemp;\n };\n\n useEffect(() => {\n if (sortStatus) {\n setRecords(getSortedData(sortStatus));\n }\n }, [sortStatus]);\n\n useEffect(() => {\n setSortStatus(undefined);\n setRecords(getSortedData(undefined));\n }, [data]);\n\n console.log(\"records\", records);\n\n return (\n <DataTable\n withBorder\n withColumnBorders\n records={records}\n columns={columns}\n sortStatus={sortStatus}\n onSortStatusChange={setSortStatus}\n idAccessor={idAccessor}\n minHeight={100}\n />\n );\n}\n","import {\n Button, Input, Space, Stack,\n} from \"@mantine/core\";\nimport {useEffect, useState} from \"react\";\nimport JSZip from \"jszip\";\nimport {\n IconDatabase, IconDownload, IconTable, IconExternalLink,\n} from \"@tabler/icons\";\nimport {saveAs} from \"file-saver\";\nimport {csvFormat} from \"d3-dsv\";\nimport {useAppSelector} from \"../../../store\";\nimport {CopyInput} from \"../CopyInput\";\nimport {SortableTable} from \"../../SortableTable\";\n\ntype DataTabProps = {\n section: any;\n}\n\ntype DataSource = {\n ix: number;\n id: number;\n title: string;\n path: string;\n data: []\n}\n\nconst formatOptions = {\n csv: \"CSV\",\n json: \"JSON\",\n xlsx: \"XLSX\",\n};\n\nexport function DataTab(props: DataTabProps) {\n const {section} = props;\n\n const blocksIds = section.blocks || [];\n\n // Grab generator blocks with API\n const apiBlocks = useAppSelector((state) => (\n blocksIds\n .map((blockId: number) => state.records.entities.block[blockId])\n .filter((block) => block.type === \"generator\" && block.contentByLocale.logic.content.api)\n .map((generator) => {\n const api = state.variables.status[generator.id]?.api || \"\";\n // todo 1.0 - prefer state.variables.status[generator.id].resp ?\n const data = state.variables.variables[generator.id]._data || [];\n return {\n ...generator,\n api,\n data,\n };\n })));\n\n const sourcesOptions: DataSource[] = apiBlocks\n .map((block, ix) => ({\n id: block.id,\n title: `Data Source ${ix + 1}`,\n path: block.api,\n data: block.data,\n }));\n\n const [selectedSource, setSelectedSource] = useState<DataSource | undefined>();\n const [fileProcessing, setFileProcessing] = useState(false);\n const [fileFormat, setFileFormat] = useState(formatOptions.csv);\n\n // When source options changes, select the first one\n useEffect(() => {\n if (sourcesOptions[0]) {\n setSelectedSource(sourcesOptions[0]);\n }\n }, []);\n\n const getFileName = (format: string) => {\n const sectionId = section.id;\n const sourceId = selectedSource.id;\n return `data_section_${sectionId}_block_${sourceId}.${format.toLowerCase()}`;\n };\n\n const onSaveClick = async () => {\n if (selectedSource) {\n setFileProcessing(true);\n const zipFile = new JSZip();\n const filename = getFileName(fileFormat);\n try {\n switch (fileFormat) {\n case formatOptions.json:\n zipFile.file(filename, JSON.stringify(selectedSource.data));\n break;\n case formatOptions.csv:\n zipFile.file(filename, csvFormat(selectedSource.data));\n break;\n case formatOptions.xlsx:\n const {utils, write} = await import(\"xlsx\");\n const wb = utils.book_new();\n utils.book_append_sheet(\n wb,\n utils.json_to_sheet(selectedSource.data),\n filename.substring(0, 30), // Sheet name max length\n );\n const xls = write(wb, {bookType: \"xlsx\", bookSST: true, type: \"binary\"});\n zipFile.file(filename, xls, {binary: true});\n break;\n\n default:\n break;\n }\n\n // Compress the zip file and ship it.\n zipFile.generateAsync({\n type: \"blob\",\n compression: \"DEFLATE\",\n compressionOptions: {level: 9},\n }).then((content) => {\n setFileProcessing(false);\n saveAs(content, getFileName(\"zip\"));\n });\n } catch (error) {\n console.error(\"Error generating file\", error);\n setFileProcessing(false);\n }\n }\n };\n\n return (\n <Stack className=\"cms-section-options-data\">\n <Space h=\"xs\" />\n {\n sourcesOptions.length === 0\n && <p>No data sources defined.</p>\n }\n {sourcesOptions.length > 0 && (\n <Input.Wrapper label=\"Choose Data Source:\">\n <Button.Group>\n {sourcesOptions.map((source, ix) => (\n <Button\n key={`source-${source.id}`}\n leftIcon={<IconDatabase size={16} />}\n onClick={() => setSelectedSource(source)}\n variant={selectedSource?.id === source.id ? \"filled\" : \"default\"}\n fullWidth\n >\n {source.title}\n </Button>\n ))}\n </Button.Group>\n </Input.Wrapper>\n )}\n {selectedSource && (<CopyInput title={`Original ${selectedSource.title}:`} url={selectedSource.path} />)}\n {selectedSource && (!selectedSource.data || selectedSource.data.length === 0) && (\n <a href={selectedSource.path} target=\"_blank\" rel=\"noreferrer\">\n <Button\n leftIcon={<IconExternalLink size={16} />}\n fullWidth\n >\n {`Open ${selectedSource.title} response in a new window`}\n </Button>\n </a>\n )}\n {selectedSource && selectedSource.data && selectedSource.data.length > 0 && (\n <Stack>\n <Input.Wrapper label={`Formatted ${selectedSource.title}:`} style={{height: \"300px\"}}>\n <SortableTable data={selectedSource.data} />\n </Input.Wrapper>\n <Space h=\"xs\" />\n <Input.Wrapper label=\"Choose format:\">\n <Button.Group>\n {Object.keys(formatOptions).map((format) => (\n <Button\n key={`format-${format}`}\n leftIcon={<IconTable size={16} />}\n onClick={() => setFileFormat(formatOptions[format])}\n variant={fileFormat === formatOptions[format] ? \"filled\" : \"default\"}\n fullWidth\n >\n {formatOptions[format]}\n </Button>\n ))}\n </Button.Group>\n </Input.Wrapper>\n <Button\n leftIcon={<IconDownload size={16} />}\n loading={fileProcessing}\n onClick={onSaveClick}\n fullWidth\n >\n <span>\n {fileProcessing ? \"Processing file...\" : `Download ${fileFormat}`}\n </span>\n </Button>\n </Stack>\n )}\n </Stack>\n );\n}\n","import {\n Button, Checkbox, Input, Image, Space, Stack, SimpleGrid, LoadingOverlay, ScrollArea,\n} from \"@mantine/core\";\nimport {useEffect, useState} from \"react\";\nimport {\n IconChartBar, IconCode, IconDownload, IconPolaroid, IconTemplate,\n} from \"@tabler/icons\";\nimport {select} from \"d3-selection\";\nimport {saveElement} from \"d3plus-export\";\nimport slugify from \"../../../libs/js/slugify\";\nimport {useAppSelector} from \"../../../store\";\n\nconst contextOptions = {\n viz: \"viz\",\n section: \"section\",\n};\n\nconst formatOptions = {\n png: \"PNG\",\n svg: \"SVG\",\n};\n\ntype ImageTabProps = {\n section: any;\n}\n\nexport function ImageTab(props: ImageTabProps) {\n const {section} = props;\n const blocksIds = section.blocks || [];\n const vizBlocks = useAppSelector((state) => (\n blocksIds\n .map((blockId:number) => state.records.entities.block[blockId])\n .filter((block) => block.type === \"visualization\")\n ));\n\n const [imageContext, setImageContext] = useState(contextOptions.section);\n const [imageFormat, setImageFormat] = useState(formatOptions.png);\n const [imageProcessing, setImageProcessing] = useState(false);\n const [svgAvailable, setSvgAvailable] = useState(false);\n const [vizAvailable, setVizAvailable] = useState(vizBlocks);\n const [vizPreviews, setVizPreviews] = useState([]);\n const [vizSelected, setVizSelected] = useState(vizAvailable.length > 0 ? vizAvailable[0].id : null);\n const [transparentBackground, setTransparentBackground] = useState(true);\n const [loadingPreviews, setLoadingPreviews] = useState(false);\n\n const vizSelectedHasSVG = () => {\n const vizNode = getVizNode(section.id, vizSelected);\n const svgCount = select(vizNode).select(\"svg\").size();\n return svgCount === 1;\n };\n\n const getFileName = () => (`${slugify(\"export-name\")}`);\n\n const getSectionNode = (sectionId) => {\n const sectionNode = document.getElementById(`cms-section-${sectionId}`);\n return select(sectionNode).select(\".cms-section-content\").node();\n };\n const getVizNode = (sectionId, vizId) => {\n const sectionNode = document.getElementById(`cms-section-${sectionId}`);\n return select(sectionNode).select(`#cms-block-${vizId} .cms-block-preview`).node();\n };\n\n const getSelectedNode = () => {\n let node;\n if (imageContext === contextOptions.section) {\n // Look for the entire section node\n node = getSectionNode(section.id);\n } else if (imageContext === contextOptions.viz) {\n // Look for the selected viz node\n node = getVizNode(section.id, vizSelected);\n }\n return node;\n };\n\n const getBackground = (elem) => {\n if (transparentBackground) return \"transparent\";\n // Is current element's background color set?\n const color = select(elem).style(\"background-color\");\n if (color !== \"rgba(0, 0, 0, 0)\" && color !== \"transparent\") return color;\n\n // if not: are you at the body element?\n if (elem === document.body) return \"white\";\n return getBackground(elem.parentNode);\n };\n\n const exportPng = async (node, config) => {\n const {toPng} = await import(\"html-to-image\");\n toPng(\n node,\n {\n backgroundColor: config.background,\n cacheBust: true,\n filter: (innerNode) => {\n if (innerNode && innerNode.classList) {\n return !config.exclusionClasses.some((classname) => innerNode.classList.contains(classname));\n }\n return true;\n },\n style: {\n // background: \"green\",\n },\n },\n )\n .then((dataUrl) => {\n const link = document.createElement(\"a\");\n link.download = `${config.filename}.png`;\n link.href = dataUrl;\n link.click();\n setImageProcessing(false);\n })\n .catch((err) => {\n console.log(err);\n });\n };\n\n const exportSvg = (node, config) => {\n saveElement(\n node,\n {filename: config.filename, type: \"svg\", callback: () => setImageProcessing(false)},\n {background: config.background},\n );\n };\n\n const onSaveClick = () => {\n setImageProcessing(true);\n const node = getSelectedNode();\n const exportConfig = {\n background: getBackground(node),\n exclusionClasses: [\"export-hidden\"],\n filename: getFileName(),\n };\n const exportFunction = imageFormat === formatOptions.png ? exportPng : exportSvg;\n try {\n if (node) {\n exportFunction(node, exportConfig);\n } else {\n throw new Error(\"Wrong node in export\");\n }\n } catch (error) {\n setImageProcessing(false);\n }\n };\n\n // Create a screenshot preview of every visuealization\n const generatePreviews = async () => {\n const {toCanvas} = await import(\"html-to-image\");\n Promise.all(\n vizAvailable.map((viz) => toCanvas(getVizNode(section.id, viz.id))),\n ).then((canvases) => {\n setVizPreviews(canvases.map((canvas) => canvas.toDataURL()));\n setLoadingPreviews(false);\n });\n };\n\n useEffect(() => {\n if (imageContext === contextOptions.viz && vizAvailable.length > 0) {\n setVizSelected(vizAvailable[0].id);\n setLoadingPreviews(true);\n generatePreviews();\n } else if (imageContext === contextOptions.section) {\n setVizPreviews([]);\n }\n }, [imageContext]);\n\n useEffect(() => {\n if (vizSelected) {\n if (vizSelectedHasSVG()) {\n setSvgAvailable(true);\n } else {\n setSvgAvailable(false);\n setImageFormat(formatOptions.png);\n }\n }\n }, [vizSelected]);\n\n return (\n <Stack className=\"cms-section-options-image\">\n <Space h=\"xs\" />\n <Input.Wrapper label=\"Choose image area:\">\n <Button.Group>\n <Button\n leftIcon={<IconTemplate size={16} />}\n onClick={() => {\n setImageContext(contextOptions.section);\n setImageFormat(formatOptions.png);\n }}\n variant={imageContext === contextOptions.section ? \"filled\" : \"default\"}\n fullWidth\n >\n Entire section\n </Button>\n {vizAvailable.length > 0 && (\n <Button\n leftIcon={<IconChartBar size={16} />}\n onClick={() => setImageContext(contextOptions.viz)}\n variant={imageContext === contextOptions.viz ? \"filled\" : \"default\"}\n fullWidth\n >\n Visualization only\n </Button>\n )}\n </Button.Group>\n </Input.Wrapper>\n {imageContext === contextOptions.viz && vizAvailable.length > 0 && (\n <Input.Wrapper\n label=\"Choose visualization:\"\n style={{minHeight: \"161px\", position: \"relative\"}}\n >\n {!loadingPreviews && vizPreviews.length > 0 && (\n <ScrollArea style={{height: 250}}>\n <SimpleGrid cols={3}>\n {vizAvailable.map((vizOption, ix) => (\n <Image\n key={`viz-option-${vizOption.id}`}\n onClick={() => { setVizSelected(vizOption.id); }}\n style={{\n cursor: \"pointer\",\n border: vizSelected === vizOption.id ? \"4px solid #228be6\" : \"4px solid #eee\",\n }}\n radius={0}\n src={vizPreviews[ix]}\n withPlaceholder\n />\n ))}\n </SimpleGrid>\n </ScrollArea>\n )}\n <LoadingOverlay visible={loadingPreviews} />\n </Input.Wrapper>\n )}\n {svgAvailable && imageContext !== contextOptions.section && (\n <Input.Wrapper label=\"Choose format:\">\n <Button.Group>\n <Button\n leftIcon={<IconPolaroid size={16} />}\n onClick={() => setImageFormat(formatOptions.png)}\n variant={imageFormat === formatOptions.png ? \"filled\" : \"default\"}\n fullWidth\n >\n {formatOptions.png}\n </Button>\n <Button\n leftIcon={<IconCode size={16} />}\n onClick={() => setImageFormat(formatOptions.svg)}\n variant={imageFormat === formatOptions.svg ? \"filled\" : \"default\"}\n fullWidth\n >\n {formatOptions.svg}\n </Button>\n </Button.Group>\n </Input.Wrapper>\n )}\n <Checkbox\n checked={transparentBackground}\n label=\"Transparent background\"\n onChange={() => setTransparentBackground(!transparentBackground)}\n radius=\"xl\"\n />\n <Button\n leftIcon={<IconDownload size={16} />}\n loading={imageProcessing}\n onClick={onSaveClick}\n fullWidth\n >\n <span>\n {imageProcessing ? \"Processing image...\" : `Download ${imageFormat}`}\n </span>\n </Button>\n </Stack>\n );\n}\n","import {Checkbox, Group, Space, Stack} from \"@mantine/core\";\nimport {useEffect, useState} from \"react\";\nimport {\n FacebookShareButton,\n LinkedinShareButton,\n TwitterShareButton,\n TelegramShareButton,\n WhatsappShareButton,\n RedditShareButton,\n EmailShareButton,\n FacebookIcon,\n TwitterIcon,\n LinkedinIcon,\n TelegramIcon,\n WhatsappIcon,\n RedditIcon,\n EmailIcon,\n} from \"react-share\";\nimport { CopyInput } from \"../CopyInput\";\n\ntype ShareTabProps = {\n section: any;\n}\n\nexport function ShareTab(props: ShareTabProps) {\n const {section} = props;\n\n const [shareUrl, setShareUrl] = useState(\"\");\n const [title, setTitle] = useState(\"\");\n const [includeSection, setIncludeSection] = useState(true);\n\n // This is triggered only on client side, so we can use window\n useEffect(() => {\n setTitle(document.title);\n const {origin, pathname} = window.location;\n const url = `${origin}${pathname}`;\n const sectionAnchor = includeSection ? `#cms-section-${section.id}` : \"\";\n setShareUrl(`${url}${sectionAnchor}`);\n }, [includeSection]);\n\n return (\n <Stack className=\"cms-section-options-share\">\n <Space h=\"xs\" />\n <CopyInput title={`Title: ${title}`} url={shareUrl} />\n <Checkbox\n checked={includeSection}\n label=\"Include section\"\n onChange={() => setIncludeSection(!includeSection)}\n radius=\"xl\"\n />\n <Group position=\"center\">\n <FacebookShareButton\n url={shareUrl}\n quote={title}\n >\n <FacebookIcon size={32} round />\n </FacebookShareButton>\n <TwitterShareButton\n url={shareUrl}\n title={title}\n >\n <TwitterIcon size={32} round />\n </TwitterShareButton>\n <TelegramShareButton\n url={shareUrl}\n title={title}\n >\n <TelegramIcon size={32} round />\n </TelegramShareButton>\n <WhatsappShareButton\n url={shareUrl}\n title={title}\n separator=\":: \"\n >\n <WhatsappIcon size={32} round />\n </WhatsappShareButton>\n <LinkedinShareButton url={shareUrl}>\n <LinkedinIcon size={32} round />\n </LinkedinShareButton>\n <RedditShareButton\n url={shareUrl}\n title={title}\n windowWidth={660}\n windowHeight={460}\n >\n <RedditIcon size={32} round />\n </RedditShareButton>\n <EmailShareButton\n url={shareUrl}\n subject={title}\n >\n <EmailIcon size={32} round />\n </EmailShareButton>\n </Group>\n </Stack>\n );\n}\n","import {useState, useEffect} from \"react\";\nimport {Modal, Tabs} from \"@mantine/core\";\nimport {DataTab} from \"./tabs/DataTab\";\nimport {ImageTab} from \"./tabs/ImageTab\";\nimport {ShareTab} from \"./tabs/ShareTab\";\n\ntype OptionsModalProps = {\n section: any;\n initialMode: string;\n open: boolean;\n onEnds: () => void;\n title: string;\n}\n\nexport function OptionsModal(props: OptionsModalProps) {\n const {\n section, initialMode, onEnds, open, title\n } = props;\n\n /** Inner states */\n const [selectedTab, setSelectedTab] = useState(initialMode || \"data\");\n\n // Validate initial view\n useEffect(() => {\n if (initialMode !== selectedTab) {\n setSelectedTab(initialMode);\n }\n }, [initialMode]);\n\n return (\n <div className=\"cms-section-options-modal\">\n {open && (\n <Modal\n opened={true}\n onClose={() => onEnds()}\n size=\"xl\"\n title={title}\n >\n <Tabs\n onTabChange={setSelectedTab}\n value={selectedTab}\n keepMounted={false}\n >\n <Tabs.List>\n <Tabs.Tab value=\"data\">Data</Tabs.Tab>\n <Tabs.Tab value=\"image\">Save image</Tabs.Tab>\n <Tabs.Tab value=\"share\">Share</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panel value=\"data\">\n <DataTab section={section} />\n </Tabs.Panel>\n <Tabs.Panel value=\"image\">\n <ImageTab section={section} />\n </Tabs.Panel>\n <Tabs.Panel value=\"share\">\n <ShareTab section={section} />\n </Tabs.Panel>\n </Tabs>\n </Modal>\n )}\n </div>\n );\n}\n","import {useState} from \"react\";\nimport {Button} from \"@mantine/core\";\nimport {IconCamera, IconShare, IconTable} from \"@tabler/icons\";\nimport {OptionsModal} from \"./OptionsModal\";\nimport {useSectionRef} from \"../../store\";\nimport \"./Options.css\";\n\ntype OptionsProps = {\n sectionId: number;\n}\n\nexport function Options(props: OptionsProps) {\n const {sectionId} = props;\n const [opened, setOpened] = useState(false);\n const [mode, setMode] = useState(\"data\");\n const sectionRef = useSectionRef(sectionId);\n\n const onClickOption = (mode) => {\n setMode(mode);\n setOpened(true);\n };\n\n const onModalEnds = () => {\n setOpened(false);\n };\n\n return (\n <div className=\"cms-section-options\">\n <Button.Group>\n <Button variant=\"default\" size=\"xs\" compact onClick={() => onClickOption(\"data\")}>\n <IconTable size={16} />\n </Button>\n <Button variant=\"default\" size=\"xs\" compact onClick={() => onClickOption(\"image\")}>\n <IconCamera size={16} />\n </Button>\n <Button variant=\"default\" size=\"xs\" compact onClick={() => onClickOption(\"share\")}>\n <IconShare size={16} />\n </Button>\n </Button.Group>\n {sectionRef.isSuccess && (\n <OptionsModal\n section={sectionRef.data}\n initialMode={mode}\n open={opened}\n onEnds={onModalEnds}\n title=\"Section title\"\n />\n )}\n </div>\n );\n}\n","import {\n ActionIcon, ActionIconProps, Code, useMantineTheme,\n} from \"@mantine/core\";\nimport {IconMenu} from \"@tabler/icons\";\nimport SectionMenu from \"./SectionMenu\";\nimport {Options} from \"../options/Options\";\n\nimport \"./SectionHeader.css\";\n\ntype SectionHeaderProps = {\n active: boolean;\n isDragging: boolean;\n id: number;\n dragHandleProps?: ActionIconProps;\n}\n\nexport function SectionHeader({\n active, isDragging, id, dragHandleProps,\n}: SectionHeaderProps) {\n const theme = useMantineTheme();\n\n return (\n <div\n className={`cms-section-header${active || isDragging ? \" active\" : \"\"}`}\n style={{padding: `2px ${theme.spacing.xs}px 0`}}\n >\n <div className=\"cms-section-header-editor\">\n <Code key=\"s1\" style={{backgroundColor: \"transparent\"}}>\n #\n {id || \"hello\"}\n </Code>\n <ActionIcon key=\"b1\" {...dragHandleProps}><IconMenu size={16} /></ActionIcon>\n <SectionMenu sectionId={id} />\n </div>\n {active && <Options sectionId={id} />}\n </div>\n );\n}\n","import {Group} from \"@mantine/core\";\nimport {useAppSelector} from \"../../store\";\n\nexport function SectionBackground() {\n const previews = useAppSelector((state) => state.status.previews);\n\n const images = previews.map((member, ix) => ({\n key: member ? `bg-${member.content_id}` : `bg-${ix}`,\n src: member ? `/api/cms/member/image.png?member=${member.content_id}&size=splash` : \"\",\n }));\n\n return (\n <Group\n className=\"cms-section-bg\"\n grow\n spacing={0}\n style={{\n background: \"white\",\n position: \"absolute\",\n width: \"100%\",\n height: \"100%\",\n }}\n >\n {images.map((image) => (\n <div\n key={image.key}\n className=\"cms-section-member-bg\"\n style={{\n backgroundImage: `url(${image.src})`,\n backgroundSize: \"cover\",\n backgroundPosition: \"center center\",\n height: \"100%\",\n }}\n />\n ))}\n </Group>\n );\n}\n","import {\n ActionIcon, Badge, Center, Overlay, useMantineTheme,\n} from \"@mantine/core\";\nimport {useMediaQuery} from \"@mantine/hooks\";\nimport {\n useEffect, useMemo, useState,\n} from \"react\";\nimport {\n DragDropContext, DragDropContextProps, Draggable, Droppable,\n} from \"react-beautiful-dnd\";\nimport {IconCirclePlus} from \"@tabler/icons\";\n\nimport BlockElement from \"../blocks/BlockElement\";\nimport {EntityCreateButton} from \"../builder/EntityCreateButton\";\nimport {\n determineOrdering, findMaxOrdering, FIRST_POSITION, orderSort,\n} from \"../../libs/ordering\";\nimport blockSettings from \"../../libs/settings/block\";\nimport siteSettings from \"../../libs/settings/site\";\nimport {BlockModel, SectionModel} from \"../../models\";\nimport {\n actions, useAppDispatch, useAppSelector, useSectionRef, withFetcher,\n} from \"../../store\";\n\nimport \"./Section.css\";\nimport {getLocaleDerived} from \"../../libs/blocks/getBlockContent\";\nimport {SectionHeader} from \"./SectionHeader\";\nimport {SectionBackground} from \"./SectionBackground\";\n\ntype SectionEditorProps = {\n for: SectionModel.NormalizedSection;\n isActive: boolean;\n isDragging: boolean;\n onActivate: () => void;\n dragHandleProps: any;\n}\n\nconst blockTypes = [\"title\", \"image\", \"paragraph\", \"selector\", \"stat\", \"subtitle\", \"generator\", \"visualization\"];\n\n/**\n *\n */\nexport function SectionEditor({\n for: section, isDragging, isActive, onActivate, dragHandleProps,\n}: SectionEditorProps) {\n const dispatch = useAppDispatch();\n\n const [columns, setColumns] = useState({});\n\n const blocks = useAppSelector((state) => state.records.entities.block);\n\n // Export Section settings\n const {memberImageBg} = section.settings;\n\n const [hoverBlock, setHoverBlock] = useState();\n\n const {inputs, consumers} = useMemo(() => {\n if (hoverBlock) {\n const block = blocks[hoverBlock];\n const {inputs, consumers} = block;\n return {inputs, consumers};\n }\n return {inputs: [], consumers: []};\n }, [hoverBlock]);\n\n const addBlock = (type: BlockModel.AnyBlock[\"type\"], targetColumn: string | boolean = false) => {\n let blockrow = FIRST_POSITION;\n let blockcol = FIRST_POSITION;\n // If given a column, use that column and set row to max\n if (typeof targetColumn === \"string\") {\n blockcol = targetColumn;\n blockrow = findMaxOrdering(Object.keys(columns[targetColumn]), true);\n }\n // If not given a column, add a brand new one\n else if (Object.keys(columns).length > 0) {\n blockcol = findMaxOrdering(Object.keys(columns), true);\n }\n const locale = getLocaleDerived({type});\n dispatch(actions.createEntity(\"block\", {\n blockrow,\n blockcol,\n type,\n section_id: section.id,\n locale,\n } as any));\n };\n\n useEffect(() => {\n const columns = Object.values(blocks || {})\n .filter((d:any) => d.section_id === section.id)\n .reduce((acc: any, d: any) => {\n if (!acc[d.blockcol]) {\n acc[d.blockcol] = {[d.blockrow]: d};\n } else {\n acc[d.blockcol][d.blockrow] = d;\n }\n return acc;\n }, {});\n setColumns(columns);\n }, [blocks]);\n\n const theme = useMantineTheme();\n const smallScreen = useMediaQuery(`(max-width: ${theme.breakpoints.sm}px)`);\n\n const onDragEnd: DragDropContextProps[\"onDragEnd\"] = (result) => {\n if (!result.destination) return;\n const {source, destination} = result;\n if (source.droppableId === destination.droppableId && source.index === destination.index) return;\n\n const blockId = Number(result.draggableId);\n const sourceColumnIndex = source.droppableId;\n const destinationColumnIndex = destination.droppableId;\n const sourceRowIndex = blocks[blockId].blockrow;\n\n const payload = {\n id: blockId,\n blockrow: FIRST_POSITION,\n blockcol: FIRST_POSITION,\n };\n\n const changedColumn = sourceColumnIndex !== destinationColumnIndex;\n payload.blockcol = changedColumn ? destinationColumnIndex : sourceColumnIndex;\n const rowItems = Object.values(columns[payload.blockcol]);\n const entities:any = rowItems.reduce((acc: any, d: any) => ({...acc, [d.id]: d}), {});\n const entityIds = rowItems.sort((a, b) => orderSort(a, b, \"blockrow\")).map((d: any) => d.id);\n const descending = destination.index > source.index;\n payload.blockrow = determineOrdering(\n entities,\n entityIds,\n destination.index,\n changedColumn,\n descending,\n \"blockrow\",\n );\n\n const {[sourceRowIndex]: draggingBlock, ...sourceColumnPruned} = columns[sourceColumnIndex];\n\n if (changedColumn) {\n setColumns({\n ...columns,\n [sourceColumnIndex]: sourceColumnPruned,\n [destinationColumnIndex]: {\n ...columns[destinationColumnIndex],\n [payload.blockrow]: {...draggingBlock, blockrow: payload.blockrow},\n },\n });\n } else {\n setColumns({\n ...columns,\n [sourceColumnIndex]: {\n ...sourceColumnPruned,\n [payload.blockrow]: {...draggingBlock, blockrow: payload.blockrow},\n },\n });\n }\n\n dispatch(actions.updateEntity(\"block\", payload));\n };\n\n return (\n <div\n id={`cms-section-${section.id}`}\n className={`cms-section${isDragging || isActive ? \" active\" : \"\"}`}\n style={{\n backgroundColor: siteSettings.section.backgroundColor,\n borderRadius: siteSettings.section.borderRadius,\n boxShadow: siteSettings.section.boxShadow,\n margin: `${siteSettings.section.margin}px ${siteSettings.section.margin}px 0`,\n overflow: \"hidden\",\n width: `calc(100% - ${siteSettings.section.margin * 2}px)`,\n }}\n >\n {memberImageBg && <SectionBackground />}\n <div\n className=\"cms-section-content\"\n style={{\n alignItems: \"stretch\",\n display: \"flex\",\n flexDirection: smallScreen ? \"column\" : \"row\",\n padding: \"64px 32px 32px 32px\",\n position: \"relative\",\n zIndex: 0,\n }}\n >\n <DragDropContext onDragEnd={onDragEnd}>\n {Object.keys(columns)\n .sort((a, b) => orderSort(a, b, \"blockcol\"))\n .map((columnIndex: string) => {\n const column = columns[columnIndex];\n const staticWidths = Object.values(column)\n .map(({id}) => parseFloat(blocks[id]?.settings?.width))\n .filter((d) => !Number.isNaN(d));\n\n return (\n <div\n className=\"cms-section-column\"\n style={{\n flex: \"1 1 100%\",\n maxWidth: staticWidths.length ? Math.max(...staticWidths) : \"none\",\n padding: siteSettings.column.padding,\n }}\n key={columnIndex}\n >\n <Droppable droppableId={columnIndex} key={columnIndex}>\n {(provided, snapshot) => (\n <div\n {...provided.droppableProps}\n ref={provided.innerRef}\n style={{\n alignContent: \"flex-start\",\n background: snapshot.isDraggingOver\n ? theme.colors[theme.primaryColor][0]\n : \"inherit\",\n display: \"flex\",\n flexDirection: Object.values(column).find((item: any) => blocks[item.id]?.settings?.display === \"inline\") ? \"row\" : \"column\",\n flexWrap: Object.values(column).find((item: any) => blocks[item.id]?.settings?.display === \"inline\") ? \"wrap\" : \"nowrap\",\n height: \"100%\",\n }}\n >\n {Object.values(column)\n .sort((a, b) => orderSort(a, b, \"blockrow\"))\n .map((item: any, rowIndex: number) => {\n /**\n * After a block is deleted, there is a quick render moment when there\n * is no block, and therefore no settings to access. todo1.0 Audit the\n * render loop and find a smarter way to protect against this\n * */\n if (!blocks[item.id]) return null;\n const {settings, type} = blocks[item.id];\n\n return (\n <Draggable\n key={item.id}\n draggableId={String(item.id)}\n index={rowIndex}\n >\n {(provided, snapshot) => (\n <div\n ref={provided.innerRef}\n {...provided.draggableProps}\n {...provided.dragHandleProps}\n style={{\n ...provided.draggableProps.style,\n alignSelf: type === \"visualization\" ? \"stretch\" : \"flex-start\",\n boxShadow: snapshot.isDragging ? theme.shadows.lg : \"none\",\n flex: type === \"visualization\" ? smallScreen ? \"1 1 300px\" : \"1 1 100%\"\n : settings.display === \"inline\" ? \"1 1 auto\" : \"0 0 auto\",\n margin: \"0\",\n textAlign: (settings.align || blockSettings.align.defaultValue) as \"left\",\n width: settings.width && settings.width !== \"stretch\" ? parseFloat(settings.width) : settings.display === \"inline\" ? \"auto\" : \"100%\",\n }}\n >\n <BlockElement\n id={Number(item.id)}\n key={`block-${item.id}`}\n active={isActive}\n isInput={inputs.includes(Number(item.id))}\n isConsumer={consumers.includes(Number(item.id))}\n setHoverBlock={setHoverBlock}\n />\n </div>\n )}\n\n </Draggable>\n );\n })}\n {isActive && (\n <EntityCreateButton\n fields={[{\n type: \"select\",\n name: \"type\",\n label: \"Block Type\",\n options: blockTypes.map((d) => ({label: d, value: d})),\n }]}\n onSubmit={(value: { type: BlockModel.AnyBlock[\"type\"] }) => addBlock(value.type, columnIndex)}\n target={<ActionIcon size=\"md\" radius=\"lg\"><IconCirclePlus size={20} /></ActionIcon>}\n />\n )}\n {provided.placeholder}\n </div>\n )}\n </Droppable>\n </div>\n );\n })}\n </DragDropContext>\n {isActive && (\n <EntityCreateButton\n fields={[{\n type: \"select\",\n name: \"type\",\n label: \"Block Type\",\n options: blockTypes.map((d) => ({label: d, value: d})),\n }]}\n onSubmit={(value: { type: BlockModel.AnyBlock[\"type\"] }) => addBlock(value.type)}\n target={<ActionIcon size=\"md\" radius=\"lg\"><IconCirclePlus size={20} /></ActionIcon>}\n />\n )}\n {!isActive && (\n <Center\n className=\"cms-section-click-to-edit\"\n style={{\n bottom: \"0\", position: \"absolute\", width: \"100%\", left: \"0\", top: \"0\",\n }}\n >\n <Badge size=\"xl\" variant=\"outline\" color=\"gray\">Click to Edit</Badge>\n </Center>\n )}\n {!isActive && (\n <Overlay\n className=\"cms-section-overlay\"\n onClick={onActivate}\n color={theme.black}\n opacity={0.5}\n style={{cursor: \"pointer\"}}\n />\n )}\n </div>\n <SectionHeader\n active={isActive}\n id={section.id}\n isDragging={isDragging}\n dragHandleProps={dragHandleProps}\n />\n </div>\n );\n}\n\nexport const SectionEditorWithFetcher = withFetcher(SectionEditor, useSectionRef);\n","import {\n ActionIcon, Alert, Center, Loader, LoadingOverlay, Stack, useMantineTheme,\n} from \"@mantine/core\";\nimport {\n useCallback, useContext, useEffect, useRef, useState,\n} from \"react\";\nimport {\n DragDropContext, DragDropContextProps, Draggable, Droppable, DroppableProps,\n} from \"react-beautiful-dnd\";\nimport {IconCirclePlus, IconCircleX} from \"@tabler/icons\";\nimport {useParams} from \"react-router-dom\";\n\nimport {CMSHeader} from \"../components/builder/CMSHeader\";\nimport {SectionEditorWithFetcher} from \"../components/sections/Section\";\nimport {determineOrdering} from \"../libs/ordering\";\nimport {ReportModel} from \"../models\";\nimport {\n actions, useAppDispatch, useAppSelector, useReportRef, withFetcher,\n} from \"../store\";\n\nimport \"./EditReport.css\";\nimport {recalculateVariables} from \"../store/actions\";\nimport {ResourceContext} from \"../context/ResourceProvider\";\nimport {useDialog} from \"../components/commons/Dialog\";\n\nexport function ReportEditor() {\n const params = useParams();\n const id = Number.parseInt(params.id || \"\", 10);\n\n const ref = useReportRef(id);\n\n if (ref.isError) {\n return (\n <Center style={{height: 300}}>\n <Alert icon={<IconCircleX size={20} />} title={`Error ${ref.error.code}`} color=\"red\">\n {ref.error.message}\n </Alert>\n </Center>\n );\n }\n\n if (ref.isUninitialized || !ref.data) {\n return <Loader />;\n }\n\n return <InteractiveReport for={ref.data} isLoading={ref.isFetching} />;\n}\n\ntype InteractiveReportProps = {\n for: ReportModel.AnyNormalizedReport;\n isLoading: boolean;\n}\n\nfunction InteractiveReport({for: report, isLoading}: InteractiveReportProps) {\n const theme = useMantineTheme();\n\n const dispatch = useAppDispatch();\n const resource = useContext(ResourceContext);\n const {newConfirmation} = useDialog();\n\n const sectionMap = useAppSelector((state) => state.records.entities.section);\n const previews = useAppSelector((state) => state.status.previews);\n const previewRef = useRef<object[]>([]);\n\n useEffect(() => { previewRef.current = previews; }, [previews]);\n\n const [activeSection, setActiveSection] = useState<null | number>(null);\n\n const [sectionOrder, setSectionOrder] = useState(report.sections);\n useEffect(() => {\n setSectionOrder(report.sections);\n }, [report.sections]);\n\n const maybeActivate = async (sectionId) => {\n if (previewRef.current.length < report.dimensions.length) {\n try {\n await newConfirmation({\n title: \"You haven't chosen a member!\",\n message: \"You may want to choose a member before editing this section.\",\n cancelText: \"OK, I'll choose one.\",\n confirmText: \"Don't tell me what to do!\",\n }).then(() => {\n onActivate(sectionId);\n });\n } catch {\n // do nothing\n }\n } else {\n onActivate(sectionId);\n }\n };\n\n const onActivate = useCallback((sectionId) => {\n setActiveSection(sectionId);\n dispatch(recalculateVariables(resource, {sid: sectionId}));\n }, [report.id]);\n\n const onDragEnd: DragDropContextProps[\"onDragEnd\"] = useCallback((result) => {\n if (!result.destination || result.source.index === result.destination.index) return;\n\n const id = Number.parseInt(result.draggableId, 10);\n const isDescending = result.destination.index > result.source.index;\n const ordering = determineOrdering(sectionMap, sectionOrder, result.destination.index, false, isDescending);\n\n const newOrder = sectionOrder.slice();\n const changed = newOrder.splice(result.source.index, 1);\n newOrder.splice(result.destination.index, 0, ...changed);\n setSectionOrder(newOrder);\n\n dispatch(actions.updateEntity(\"section\", {id, ordering})).then(() => {\n dispatch(actions.readEntity(\"report\", {id: report.id, include: true}));\n });\n }, [sectionMap, sectionOrder]);\n\n const droppableChild: DroppableProps[\"children\"] = useCallback((droppableProvided) => (\n <div\n ref={droppableProvided.innerRef}\n className=\"cms-droppable-container\"\n {...droppableProvided.droppableProps}\n >\n {sectionOrder.map((sectionId, index) => (\n <Draggable key={sectionId} draggableId={`${sectionId}`} index={index}>\n {(draggableProvided, snapshot) => (\n <div\n key={`section-${sectionId}`}\n className={`cms-section-container${snapshot.isDragging ? \" isDragging\" : \"\"}`}\n ref={draggableProvided.innerRef}\n {...draggableProvided.draggableProps}\n style={{\n ...draggableProvided.draggableProps.style,\n boxShadow: snapshot.isDragging ? theme.shadows.sm : undefined,\n }}\n >\n <SectionEditorWithFetcher\n id={sectionId}\n isActive={sectionId === activeSection}\n isDragging={snapshot.isDragging}\n onActivate={() => maybeActivate(sectionId)}\n dragHandleProps={draggableProvided.dragHandleProps}\n />\n <Center className=\"cms-section-controls\">\n <CreateSectionButton index={index + 1} report={report} />\n </Center>\n </div>\n )}\n </Draggable>\n ))}\n {droppableProvided.placeholder}\n </div>\n ), [sectionOrder, activeSection]);\n\n return (\n <Stack styles={{backgroundColor: theme.colors.gray[2]}}>\n <CMSHeader id={report.id} />\n <LoadingOverlay visible={isLoading} />\n {report.sections.length === 0\n && <CreateSectionButton index={0} report={report} />}\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable droppableId=\"sections\">\n {droppableChild}\n </Droppable>\n </DragDropContext>\n </Stack>\n );\n}\n\nexport const InteractiveReportWithFetcher = withFetcher(InteractiveReport, useReportRef);\n\ntype CreateSectionButtonProps = {\n index: number;\n report: ReportModel.AnyNormalizedReport;\n};\n\nfunction CreateSectionButton({index, report}: CreateSectionButtonProps) {\n const theme = useMantineTheme();\n\n const dispatch = useAppDispatch();\n\n const sectionMap = useAppSelector((state) => state.records.entities.section);\n\n const createHandler = useCallback(() => {\n dispatch(actions.createEntity(\"section\", {\n report_id: report.id,\n ordering: determineOrdering(sectionMap, report.sections, index, true),\n }));\n }, [index]);\n\n return (\n <ActionIcon\n onClick={createHandler}\n color=\"theme\"\n size=\"md\"\n radius=\"lg\"\n style={{boxShadow: theme.shadows.xs}}\n >\n <IconCirclePlus size={20} />\n </ActionIcon>\n );\n}\n","import {\n Button, Select, Space, TextInput, Checkbox,\n} from \"@mantine/core\";\nimport {useDebouncedValue} from \"@mantine/hooks\";\nimport {\n useCallback, useEffect, useMemo, useState,\n} from \"react\";\nimport {IconCircleX, IconRefresh} from \"@tabler/icons\";\n\nimport {EntityType} from \"../../models\";\nimport {actions, useAppDispatch, useAppSelector} from \"../../store\";\n\nconst allOption = {value: \"all\", label: \"All\"};\n\nconst buildOptions = (options) => {\n if (!options) return [];\n const selectOptions = options.map((d: any) => ({value: String(d.id), label: d.name}));\n return [allOption, ...selectOptions];\n};\n/**\n * Filter sidebar to reduce the number of results\n */\nexport function FilterSidebar({onChange, loading}) {\n const dispatch = useAppDispatch();\n\n const reportsNested = useAppSelector((state) => state.records.tree);\n const localeDefault = useAppSelector((state) => state.status.localeDefault);\n\n const [query, setQuery] = useState(\"\");\n const [loadingRegenerate, setLoadingRegenerate] = useState(false);\n const [debouncedQuery] = useDebouncedValue(query, 500);\n\n /* Internal state, manage filters in separate */\n const initialFilterState = {\n report: allOption.value,\n dimension: allOption.value,\n variant: allOption.value,\n visible: false,\n noImage: false,\n limit: \"10\",\n };\n\n const [filters, setFilters] = useState(initialFilterState);\n\n /* Calculate nested options */\n const options = useMemo(() => ({\n report: buildOptions(reportsNested),\n dimension: buildOptions(reportsNested\n .filter((report) => filters.report === allOption.value || filters.report === `${report.id}`)\n .reduce((acc, report:any) => acc.concat(report.dimensions), [])),\n variant: buildOptions(reportsNested\n .filter((report) => filters.report === allOption.value || filters.report === `${report.id}`)\n .reduce((acc, report) => {\n report.dimensions\n .filter((dim) => filters.dimension === allOption.value || filters.dimension === `${dim.id}`)\n .forEach((dim:any) => {\n acc = acc.concat(dim.variants);\n });\n return acc;\n }, [])),\n limit: [10, 25, 50].map((i) => ({value: String(i), label: String(i)})),\n }), [reportsNested, filters]);\n\n const onChangeFilter = useCallback((key: EntityType | \"limit\" | \"visible\" | \"noImage\", value) => {\n const newFilters = {\n ...filters,\n [key]: value,\n };\n switch (key) {\n case \"report\":\n newFilters.dimension = allOption.value;\n break;\n case \"dimension\":\n newFilters.variant = allOption.value;\n break;\n default:\n break;\n }\n\n setFilters(newFilters);\n }, [filters]);\n\n const onClearFilters = () => {\n setQuery(\"\");\n setFilters(initialFilterState);\n };\n\n const onRegenarateSearchIndex = () => {\n setLoadingRegenerate(true);\n dispatch(actions.searchRegenerate()).then(() => {\n setLoadingRegenerate(false);\n onChange(filters);\n });\n };\n\n // Any change call the prop function to the ouside\n useEffect(() => {\n onChange({...filters, query: debouncedQuery});\n }, [\n filters.report, filters.dimension,\n filters.variant, filters.visible,\n filters.limit, filters.noImage, debouncedQuery]);\n\n return (\n <div>\n <TextInput\n label={`Search item by name (${localeDefault.toUpperCase()})`}\n value={query}\n onChange={(event) => setQuery(event.currentTarget.value)}\n disabled={loading}\n />\n <Select\n label=\"Reports\"\n data={options.report}\n value={filters.report}\n onChange={(value) => onChangeFilter(\"report\", value)}\n disabled={loading}\n />\n <Select\n label=\"Dimensions\"\n data={options.dimension}\n value={filters.dimension}\n onChange={(value) => onChangeFilter(\"dimension\", value)}\n disabled={loading}\n />\n <Select\n label=\"Variants\"\n data={options.variant}\n value={filters.variant}\n onChange={(value) => onChangeFilter(\"variant\", value)}\n disabled={loading}\n />\n <Select\n label=\"Rows limit\"\n data={options.limit}\n value={filters.limit}\n onChange={(value) => onChangeFilter(\"limit\", value)}\n disabled={loading}\n />\n <Space h=\"md\" />\n <Checkbox\n label=\"Show visible members only\"\n checked={filters.visible}\n onChange={(event) => onChangeFilter(\"visible\", event.currentTarget.checked)}\n />\n <Space h=\"md\" />\n <Checkbox\n label=\"Show members with no image\"\n checked={filters.noImage}\n onChange={(event) => onChangeFilter(\"noImage\", event.currentTarget.checked)}\n />\n <Space h=\"md\" />\n <Button\n fullWidth\n disabled={loading}\n leftIcon={<IconCircleX />}\n onClick={onClearFilters}\n >\n Clear filters\n </Button>\n <Space h=\"md\" />\n <Button\n fullWidth\n disabled={loading}\n leftIcon={<IconRefresh />}\n onClick={onRegenarateSearchIndex}\n variant=\"light\"\n loading={loadingRegenerate}\n >\n Re-Index Search\n </Button>\n </div>\n );\n}\n","/* react */\nimport React, {useEffect, useState} from \"react\";\nimport axios, {AxiosRequestConfig} from \"axios\";\nimport {IconPlayerPlay, IconUpload} from \"@tabler/icons\";\n\n/* hooks */\n\n/* Mantine */\nimport {\n Alert,\n LoadingOverlay,\n Drawer,\n TextInput,\n Button,\n Group,\n Stack,\n SegmentedControl,\n ScrollArea,\n Image,\n SimpleGrid,\n FileInput,\n} from \"@mantine/core\";\n\n/**\n * Filter sidebar to reduce the number of results\n */\nfunction ImageSelector({member, onEditEnd}) {\n const initialPrompt = member.contentByLocale && member.contentByLocale[0] ? member.contentByLocale[0].name : \"\";\n\n // List of providers\n const imageProviders = {\n local: {\n title: \"Bespoke\",\n key: \"local\",\n input: \"text\",\n forceSearch: true,\n getAxiosSearchConfig: (prompt, image): AxiosRequestConfig => ({\n url: \"/api/cms/images/search/local\",\n method: \"get\",\n params: {prompt},\n }),\n },\n flickr: {\n title: \"Flickr\",\n key: \"flickr\",\n input: \"text\",\n forceSearch: true,\n getAxiosSearchConfig: (prompt, image): AxiosRequestConfig => ({\n url: \"/api/cms/images/search/flickr\",\n method: \"get\",\n params: {prompt},\n }),\n },\n unsplash: {\n title: \"Unsplash\",\n key: \"unsplash\",\n input: \"text\",\n forceSearch: true,\n getAxiosSearchConfig: (prompt, image): AxiosRequestConfig => ({\n url: \"/api/cms/images/search/unsplash\",\n method: \"get\",\n params: {prompt},\n }),\n },\n upload: {\n title: \"Upload\",\n key: \"upload\",\n input: \"file\",\n forceSearch: false,\n getAxiosSearchConfig: (prompt, image): AxiosRequestConfig => ({}),\n },\n\n };\n\n const imageProvidersOptions = Object.keys(imageProviders)\n .map((key) => ({value: key, label: imageProviders[key].title}));\n\n const [loading, setLoading] = useState(false);\n const [selectedProvider, setSelectedProvider] = useState(Object.values(imageProviders)[0]);\n const [scrollSize, setScrollSize] = useState(500);\n const [prompt, setPrompt] = useState(initialPrompt);\n const [imageToUpload, setImageToUpload] = useState<any>();\n const [results, setResults] = useState<any[]>([]);\n const [selectedImage, setSelectedImage] = useState<any>();\n const [error, setError] = useState(false);\n\n // Search images\n const onSearch = async () => {\n setError(false);\n setLoading(true);\n setResults([]);\n\n const providerAxiosConfig: AxiosRequestConfig = selectedProvider.getAxiosSearchConfig(prompt, imageToUpload);\n\n // Ask for results\n const imageRecords = await axios(providerAxiosConfig)\n .then((response) => (response.data.data && response.data.data.results ? response.data.data.results : []))\n .catch((e) => {\n console.error(e);\n setError(true);\n });\n\n setResults(imageRecords);\n setLoading(false);\n };\n\n // When an image is selected\n const onSelect = (img) => {\n setSelectedImage(img);\n };\n\n // When user actually click save\n const onSave = async () => {\n setLoading(true);\n\n const formData = new FormData();\n\n formData.append(\"content_id\", member.content_id);\n\n if (selectedImage && imageToUpload) {\n formData.append(\"file\", imageToUpload);\n delete selectedImage.file;\n }\n if (selectedImage) {\n formData.append(\"image_id\", selectedImage.id);\n formData.append(\"image_source\", selectedImage.source);\n }\n\n // Save the selected image\n await axios({\n method: \"post\",\n url: `/api/cms/images/save/${selectedProvider.key}`,\n data: formData,\n })\n .then((response) => {\n onEditEnd(true);\n })\n .catch((e) => {\n console.error(e);\n setError(true);\n });\n\n setLoading(false);\n };\n\n const onChangeProvider = (providerKey) => {\n setError(false);\n setSelectedProvider(imageProviders[providerKey]);\n setSelectedImage(undefined);\n };\n\n useEffect(() => {\n // Updated scroller area size, replace with a proper css layout\n const {innerHeight} = window;\n setScrollSize(innerHeight - 280);\n // Force initial search\n onSearch();\n }, []);\n\n useEffect(() => {\n setResults([]);\n if (!loading && selectedProvider.forceSearch) {\n // Force search when new provider is selected\n onSearch();\n }\n }, [selectedProvider]);\n\n const noResults = (results && results.length === 0 && !loading && selectedProvider.key !== \"upload\");\n\n return (\n <Drawer\n opened\n onClose={onEditEnd}\n title={`Edit image for ${initialPrompt} (${member.id}) `}\n padding=\"lg\"\n closeOnClickOutside={false}\n closeOnEscape={false}\n position=\"left\"\n size=\"50%\"\n lockScroll\n withCloseButton={false}\n >\n <div style={{height: \"100%\"}}>\n <Stack>\n <Stack spacing=\"xs\">\n <Group position=\"apart\" grow align=\"flex-end\">\n {selectedProvider.input === \"text\" && (\n <TextInput\n placeholder=\"Search term\"\n label=\"Search term\"\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n />\n )}\n {selectedProvider.input === \"file\" && (\n <FileInput\n label=\"Upload image\"\n placeholder=\"Choose a PNG image from your computer\"\n accept=\"image/png\"\n value={imageToUpload}\n onChange={(image) => {\n setSelectedImage(undefined);\n if (image) {\n const objectUrl = URL.createObjectURL(image);\n setResults([{\n id: \"custom\",\n source: objectUrl,\n file: image,\n }]);\n setImageToUpload(image);\n setSelectedImage(\"custom\");\n }\n }}\n icon={<IconUpload size={14} />}\n />\n )}\n {selectedProvider.forceSearch && (\n <Button\n fullWidth\n disabled={loading || !prompt || prompt === \"\"}\n onClick={onSearch}\n leftIcon={<IconPlayerPlay/>}\n >\n Search\n </Button>\n ) }\n </Group>\n <SegmentedControl\n disabled={loading}\n value={selectedProvider.key}\n onChange={(providerKey) => onChangeProvider(providerKey)}\n data={imageProvidersOptions}\n fullWidth\n />\n </Stack>\n <Group mt=\"xs\" grow>\n <ScrollArea offsetScrollbars type=\"always\" style={{height: scrollSize}}>\n <LoadingOverlay visible={loading} overlayBlur={2} overlayOpacity={50} />\n {error && (\n <Alert title={`${selectedProvider.title}`} color=\"red\">\n Error, please try again.\n </Alert>\n )}\n {noResults && (\n <Alert title={`${selectedProvider.title}`} color=\"blue\">\n No results, for try another prompt or provider.\n </Alert>\n )}\n {results && results.length > 0 && !loading && (\n <SimpleGrid cols={3}>\n {results.map((img) => (\n <Image\n key={img.id}\n radius=\"md\"\n src={img.source}\n style={{\n cursor: \"pointer\",\n borderRadius: 15,\n border: selectedImage && selectedImage.id === img.id ? \"5px solid black\" : \"\",\n }}\n onClick={() => onSelect(img)}\n />\n ))}\n </SimpleGrid>\n )}\n </ScrollArea>\n </Group>\n <Group mt=\"xs\" grow style={{height: 45}}>\n <Button\n variant=\"outline\"\n disabled={loading}\n onClick={() => onEditEnd(false)}\n >\n Cancel\n </Button>\n <Button\n onClick={onSave}\n loading={loading}\n disabled={loading || !selectedImage}\n >\n Save\n </Button>\n </Group>\n </Stack>\n </div>\n </Drawer>\n );\n}\n\nexport default ImageSelector;\n","/* react */\nimport React from \"react\";\n\nimport {Image} from \"@mantine/core\";\n\n/**\n * Image preview wrapper for metadata editor only\n */\nfunction ImagePreview({\n member, height = \"auto\", width = \"100%\", size = \"thumb\", forceRefreshTimestamp = false,\n}) {\n let extraParam = \"\";\n if (forceRefreshTimestamp) {\n extraParam = `&t=${new Date().getTime()}`;\n }\n\n const imageUrl = (member && member.image_id)\n ? `/api/cms/member/image.png?member=${member.content_id}&size=${size}${extraParam}`\n : \"https://placehold.jp/cccccc/ffffff/900x600.png?text=None\";\n return (\n <Image height={height} width={width} radius=\"md\" src={imageUrl} />\n );\n}\n\nexport default ImagePreview;\n","import React, {useEffect, useState} from \"react\";\nimport axios from \"axios\";\n\n/* hooks */\nimport {\n LoadingOverlay,\n Drawer,\n TextInput,\n Button,\n Checkbox,\n Group,\n Stack,\n SegmentedControl,\n MultiSelect,\n Badge,\n Divider,\n Space,\n Alert,\n Input,\n Code,\n} from \"@mantine/core\";\nimport {useForm} from \"@mantine/form\";\nimport {IconPolaroid, IconCircleMinus} from \"@tabler/icons\";\nimport {useAppSelector} from \"../../store\";\n\n/* Mantine */\nimport ImageSelector from \"./ImageSelector\";\nimport ImagePreview from \"../../views/ImagePreview\";\nimport {SortableTable} from \"../SortableTable\";\nimport {DrawerContentWithScroll} from \"../DrawerContentWithScroll\";\n\n/**\n * Filter sidebar to reduce the number of results\n */\nexport function MemberForm({memberId, onEditEnd}) {\n const localeDefault = useAppSelector((state) => state.status.localeDefault);\n const locales = useAppSelector((state) => state.status.locales);\n const localesItems = locales.map((locale) => ({value: locale, label: `${locale.toUpperCase()}`}));\n\n const opened = !!memberId;\n\n const [selectedLocale, setSelectedLocale] = useState(localeDefault);\n const [member, setMember] = useState(null);\n const [loading, setLoading] = useState(true);\n const [showImageSelector, setShowImageSelector] = useState(false);\n const [error, setError] = useState(false);\n\n // Create empty form objects\n const mainForm = useForm();\n const localizedForms = locales.reduce((acc, item) => {\n acc[item] = useForm({});\n return acc;\n }, {});\n const imageForm = useForm();\n const localizedImageForms = locales.reduce((acc, item) => {\n acc[item] = useForm({});\n return acc;\n }, {});\n\n const fetchMemberData = async () => {\n setLoading(true);\n setError(false);\n const memberRecord = await axios.get(\n \"/api/cms/read/members\",\n {\n params: {\n ids: memberId,\n locale: \"all\",\n },\n },\n )\n .then((response) => {\n // Retrieve the only result if exists\n let obj;\n if (response.data && response.data.data && response.data.data.results && response.data.data.results[0]) {\n setError(false);\n obj = response.data.data.results[0];\n } else {\n setError(true);\n }\n return obj;\n })\n .catch((e) => {\n console.error(e);\n setError(true);\n });\n\n if (memberRecord) {\n // Update state and form\n setMember(memberRecord);\n mainForm.setValues(memberRecord);\n\n // Set values into localized forms based on localized fields\n memberRecord.contentByLocale.forEach((item) => {\n localizedForms[item.locale].setValues({\n name: item.name,\n keywords: item.keywords ? item.keywords : [],\n attributes: item.attributes ? Object.keys(item.attributes).map(ak => ({key:ak,value:item.attributes[ak]})) : [],\n });\n });\n\n if (memberRecord.image) {\n // Update state and form\n imageForm.setValues(memberRecord.image);\n\n // Set values into localized forms based on localized fields for the image\n memberRecord.image.contentByLocale.forEach((item) => {\n localizedImageForms[item.locale].setValues({\n meta: item.meta,\n });\n });\n }\n }\n\n setLoading(false);\n };\n\n // Load data\n useEffect(() => {\n if (memberId) {\n // Ask for member\n fetchMemberData();\n } else {\n setMember(null);\n }\n }, [memberId]);\n\n const onImageSelectorClose = async (edited) => {\n if (edited) {\n // Refresh member\n fetchMemberData();\n }\n setShowImageSelector(false);\n };\n\n const clearImage = () => {\n setMember({\n ...member,\n image: null,\n image_id: null,\n });\n };\n\n const onSave = async () => {\n setLoading(true);\n // Generate the payload using all the forms together\n const payload = {\n ...mainForm.values,\n contentByLocale: member.contentByLocale.map((oldValues) => {\n const localizedItem = localizedForms[oldValues.locale] ? {...localizedForms[oldValues.locale].values} : {};\n\n // Convert to array of strings\n localizedItem.keywords = localizedItem.keywords && localizedItem.keywords.length > 0 ? localizedItem.keywords : null;\n return {\n ...oldValues,\n ...localizedItem,\n };\n }),\n image: member.image ? {\n ...imageForm.values,\n contentByLocale: locales.map((locale) => {\n const oldValues = member.image.contentByLocale.find((e) => e.locale === locale);\n const localizedItem = localizedImageForms[oldValues.locale] ? localizedImageForms[oldValues.locale].values : {};\n return {\n ...oldValues,\n ...localizedItem,\n };\n }),\n } : null,\n image_id: member.image_id,\n };\n\n // Update\n await axios.post(\"/api/cms/update/member\", payload)\n .then((resp) => {\n onEditEnd(); // Close the modal\n return resp.data.data;\n });\n };\n\n const isValidLocalizedForm = Object.keys(localizedForms[selectedLocale].values).length > 0;\n\n return (\n <>\n <Drawer\n opened={opened}\n onClose={() => onEditEnd()}\n title={`Edit member ID ${memberId}`}\n padding=\"lg\"\n closeOnClickOutside={false}\n closeOnEscape={false}\n position=\"right\"\n size=\"50%\"\n lockScroll\n withCloseButton={false}\n >\n <DrawerContentWithScroll\n content={(\n <>\n <LoadingOverlay visible={loading} overlayBlur={2} overlayOpacity={50} />\n {error && (\n <Alert title=\"Member Form\" color=\"red\">\n Error, please try again.\n </Alert>\n )}\n {member && !error\n && (\n <Stack justify=\"space-between\">\n <Group position=\"apart\" grow>\n <Stack>\n <ImagePreview member={member} forceRefreshTimestamp />\n <Button\n variant=\"outline\"\n disabled={loading}\n leftIcon={<IconPolaroid />}\n onClick={() => setShowImageSelector(true)}\n >\n Change image\n </Button>\n {member && member.image && (\n <Button\n variant=\"outline\"\n disabled={loading}\n leftIcon={<IconCircleMinus />}\n onClick={() => clearImage()}\n >\n Remove image\n </Button>\n )}\n <Space h=\"md\" />\n </Stack>\n <Stack justify=\"flex-start\">\n <TextInput\n disabled={!member || !member.image}\n label=\"Source\"\n {...imageForm.getInputProps(\"url\")}\n />\n <TextInput\n disabled={!member || !member.image}\n label=\"Author\"\n {...imageForm.getInputProps(\"author\")}\n />\n <TextInput\n disabled={!member || !member.image}\n label=\"License\"\n {...imageForm.getInputProps(\"license\")}\n />\n <SegmentedControl\n disabled={!member || !member.image}\n value={selectedLocale}\n onChange={setSelectedLocale}\n data={localesItems}\n />\n <TextInput\n disabled={!member || !member.image}\n label=\"Alternative image text\"\n {...localizedImageForms[selectedLocale].getInputProps(\"meta\")}\n />\n </Stack>\n </Group>\n <Code block>\n TO-DO apply same image also to some of these members? List of checkboxes\n <br />\n (x) another member, similar name\n <br />\n (x) another member, similar name\n <br />\n </Code>\n <Divider my=\"sm\" />\n <Group position=\"apart\" grow>\n <TextInput mt=\"xs\" disabled label=\"Original ID\" {...mainForm.getInputProps(\"id\")} />\n <TextInput mt=\"xs\" disabled label=\"Content ID\" {...mainForm.getInputProps(\"content_id\")} />\n </Group>\n <Group position=\"apart\" grow>\n <TextInput\n mt=\"xs\"\n icon=\"/\"\n disabled\n label=\"Variant Slug\"\n {...mainForm.getInputProps(\"variant_slug\")}\n />\n <TextInput mt=\"xs\" icon=\"/\" disabled label=\"Member Slug\" {...mainForm.getInputProps(\"slug\")} />\n </Group>\n <Group position=\"apart\" grow>\n <TextInput mt=\"xs\" disabled label=\"Report\" {...mainForm.getInputProps(\"report_name\")} />\n <TextInput mt=\"xs\" disabled label=\"Dimension\" {...mainForm.getInputProps(\"dimension_name\")} />\n <TextInput mt=\"xs\" disabled label=\"Variant\" {...mainForm.getInputProps(\"variant_name\")} />\n </Group>\n <Group position=\"apart\" grow>\n <Checkbox\n mt=\"xs\"\n label=\"Visible\"\n {...mainForm.getInputProps(\"visible\", {type: \"checkbox\"})}\n />\n </Group>\n <Group mt=\"xs\" position=\"apart\" grow>\n <SegmentedControl\n value={selectedLocale}\n onChange={setSelectedLocale}\n data={localesItems}\n />\n </Group>\n {!isValidLocalizedForm && (\n <Alert title=\"Unavailable locale\" color=\"blue\">\n This language was not ingested for the current member.\n Go to variant editor and provide the members there.\n </Alert>\n )}\n {isValidLocalizedForm && (\n <>\n <Group mt=\"xs\" position=\"apart\" grow>\n <TextInput label=\"Name\" {...localizedForms[selectedLocale].getInputProps(\"name\")} />\n </Group>\n <Group mt=\"xs\" position=\"apart\" align=\"top\" grow>\n <MultiSelect\n label=\"Keywords\"\n data={localizedForms[selectedLocale].values.keywords}\n placeholder=\"Enter keywords\"\n searchable\n creatable\n valueComponent={({\n value, label, image, name,\n }) => (\n <Badge onClick={() => {\n const current = localizedForms[selectedLocale].values.keywords;\n localizedForms[selectedLocale].setFieldValue(\"keywords\", current.filter((k) => k !== label));\n }}\n >\n {label}\n {\" \"}\n x\n </Badge>\n )}\n getCreateLabel={(query) => `+ Create ${query}`}\n value={localizedForms[selectedLocale].values.keywords}\n onCreate={(query) => {\n const current = localizedForms[selectedLocale].values.keywords;\n localizedForms[selectedLocale].setFieldValue(\"keywords\", [...current, query]);\n return query;\n }}\n />\n </Group>\n <Input.Wrapper label=\"Attributes\">\n <SortableTable data={localizedForms[selectedLocale].values.attributes} />\n </Input.Wrapper>\n </>\n )}\n </Stack>\n )}\n </>\n )}\n buttons={(\n <>\n <Button\n variant=\"outline\"\n disabled={loading}\n onClick={() => onEditEnd()}\n >\n Cancel\n </Button>\n <Button\n onClick={onSave}\n loading={loading}\n disabled={loading}\n >\n Save Member\n </Button>\n </>\n )}\n size={145}\n />\n </Drawer>\n {showImageSelector && <ImageSelector member={member} onEditEnd={onImageSelectorClose} />}\n </>\n );\n}\n","import {\n ActionIcon, Avatar, Badge, Group, Tooltip,\n} from \"@mantine/core\";\nimport {DataTable, DataTableSortStatus} from \"mantine-datatable\";\nimport {useEffect, useState} from \"react\";\nimport {IconEyeOff, IconPencil} from \"@tabler/icons\";\nimport ImagePreview from \"../../views/ImagePreview\";\nimport {useAppSelector} from \"../../store\";\n\n/**\n * Filter sidebar to reduce the number of results\n */\nexport function MembersTable({members, onClickEdit, onSort}) {\n const [sortStatus, setSortStatus] = useState <DataTableSortStatus>();\n const [records, setRecords] = useState([]);\n\n useEffect(() => {\n if (sortStatus) {\n onSort(sortStatus);\n }\n }, [sortStatus]);\n\n useEffect(() => {\n setRecords(members);\n }, [members]);\n\n useEffect(() => {\n setRecords(members);\n }, []);\n\n const localeDefault = useAppSelector((state) => state.status.localeDefault);\n\n /*\n type mixedType =\n | DataTableColumn<{slug: string, variant: {slug:string}}>\n | DataTableColumn<{contentByLocale: object[]}>\n | DataTableColumn<{member: object}>\n */\n\n const cols: any = [\n {\n title: \"\",\n accessor: \"visible\",\n width: \"10px\",\n render: ({visible}) => (\n <>{!visible?<Tooltip label=\"Visible: false\"><span><IconEyeOff size={20}/></span></Tooltip>:<span/>}</>\n ),\n },\n {\n title: \"ID\", accessor: \"id\", sortable: true, textAlignment: \"right\" as const,\n },\n {\n title: \"Report\", accessor: \"report.name\",\n },\n {\n title: \"Dimension\", accessor: \"dimension.name\",\n },\n {\n title: \"Variant\", accessor: \"variant.name\",\n },\n {\n title: \"Slug\",\n accessor: \"slug\",\n render: ({slug, variant}) => (\n <span>/{variant.slug}/{slug}</span>\n ),\n },\n {\n title: `Name ${localeDefault.toUpperCase()}`,\n sortable: true,\n accessor: \"name\",\n render: ({contentByLocale}) => {\n const defaultLocalized = contentByLocale.find((item) => item.locale === localeDefault);\n const othersLocalized = contentByLocale.filter((item) => item.locale !== localeDefault);\n const nameTooltipContent = othersLocalized.reduce((acc, item) => {\n const extraName = `${item.locale.toUpperCase()}: ${item.name}`;\n const newLine = acc !== \"\" ? \"\\n\" : \"\";\n return `${acc}${newLine}${extraName}`;\n }, \"\");\n return (\n <Group>\n <span>{defaultLocalized.name}</span>\n {othersLocalized.length > 0 && (\n <Tooltip label={nameTooltipContent}>\n <Avatar size=\"sm\" color=\"pink\" radius=\"xl\">\n +\n {othersLocalized.length}\n </Avatar>\n </Tooltip>\n )}\n </Group>\n );\n },\n },\n {\n title: `Keywords ${localeDefault.toUpperCase()}`,\n accessor: \"keywords\",\n render: ({contentByLocale}) => {\n const defaultLocalized = contentByLocale.find((item) => item.locale === localeDefault);\n const othersLocalized = contentByLocale.filter((item) => item.locale !== localeDefault);\n const keywords = (defaultLocalized.keywords ? defaultLocalized.keywords : [])\n .map((k) => <Badge key={k}>{k}</Badge>);\n const keywordsTooltipContent = othersLocalized.reduce((acc, item) => {\n const otherKeywords = item.keywords || [];\n const extraKeywords = `${item.locale.toUpperCase()}: ${otherKeywords.length > 0\n ? otherKeywords.join(\",\")\n : \"None\"\n }`;\n const newLine = acc !== \"\" ? \"\\n\" : \"\";\n return `${acc}${newLine}${extraKeywords}`;\n }, \"\");\n return (\n <Group>\n <span>{keywords.length > 0 ? keywords : <Badge color=\"gray\">None</Badge>}</span>\n {othersLocalized.length > 0 && (\n <Tooltip label={keywordsTooltipContent}>\n <Avatar size=\"sm\" color=\"pink\" radius=\"xl\">\n +\n {othersLocalized.length}\n </Avatar>\n </Tooltip>\n )}\n </Group>\n );\n },\n },\n {\n title: \"Image\",\n accessor: \"image\",\n render: (member) => (<ImagePreview member={member} height=\"50px\" />),\n },\n {\n title: \"\",\n accessor: \"actions\",\n render: (member) => (\n <ActionIcon key=\"edit\" onClick={() => onClickEdit(member)}><IconPencil size={20} /></ActionIcon>\n ),\n },\n ];\n\n return (\n <DataTable\n striped\n minHeight={150}\n records={records}\n columns={cols}\n sortStatus={sortStatus}\n onSortStatusChange={(s) => setSortStatus(s)}\n idAccessor=\"content_id\"\n withBorder\n />\n );\n}\n","import {\n Container, Grid, LoadingOverlay, Space, Text,\n} from \"@mantine/core\";\nimport axios from \"axios\";\nimport {DataTableSortStatus} from \"mantine-datatable\";\nimport {useEffect, useState} from \"react\";\n\nimport {FilterSidebar} from \"../components/metadata/FilterSidebar\";\nimport {MemberForm} from \"../components/metadata/MemberForm\";\nimport {MembersTable} from \"../components/metadata/MembersTable\";\n\n/**\n * Search members metadata editor\n */\nexport function MetadataEditor() {\n const [editingId, setEditingId] = useState(null);\n const [results, setResults] = useState([]);\n const [loading, setLoading] = useState(true);\n const [internalFilters, setInternalFilters] = useState<any>(true);\n const [internalSort, setInternalSort] = useState<DataTableSortStatus>();\n\n // When any filter changed\n const onChangeFilters = (filters) => {\n setInternalFilters(filters);\n };\n\n const onChangeSort = (sort) => {\n setInternalSort(sort);\n };\n\n // Edit\n const setEditMember = (member) => {\n setEditingId(member.content_id);\n };\n\n const onEditClose = () => {\n setEditingId(null);\n doSearch();\n };\n\n const doSearch = async () => {\n setLoading(true);\n\n // Clean \"all\" keys\n const getParams = Object.keys({...internalFilters})\n .reduce((acc, key) => {\n if (internalFilters[key] !== \"all\") acc[key] = internalFilters[key];\n return acc;\n }, {});\n\n // Ask for results\n const entityRecords = await axios.get(\n \"/api/cms/search/members\",\n {\n params: {\n ...getParams,\n locale: \"all\",\n includes: true,\n sort: internalSort ? internalSort.columnAccessor : \"id\",\n direction: internalSort ? internalSort.direction : \"asc\",\n },\n },\n )\n .then((response) => (\n response.data\n && response.data.data\n && response.data.data.results ? response.data.data.results : []));\n\n setResults(entityRecords);\n setLoading(false);\n };\n\n useEffect(() => {\n doSearch();\n }, [internalFilters, internalSort]);\n\n return (\n <Container fluid>\n <Grid>\n <Grid.Col span={2}>\n <Text ml=\"xl\" my=\"sm\" weight=\"bold\">Metadata</Text>\n <FilterSidebar onChange={onChangeFilters} loading={loading} />\n </Grid.Col>\n <Grid.Col span={10} style={{height: \"100vh\", position: \"relative\"}}>\n <LoadingOverlay visible={loading} overlayBlur={2} overlayOpacity={50} />\n <Space h=\"xs\" />\n <MembersTable members={results} onClickEdit={setEditMember} onSort={onChangeSort} />\n </Grid.Col>\n </Grid>\n {editingId && <MemberForm memberId={editingId} onEditEnd={onEditClose} />}\n </Container>\n );\n}\n","import {\n Button, Select, Space, TextInput,\n} from \"@mantine/core\";\nimport {useDebouncedValue} from \"@mantine/hooks\";\nimport {\n useCallback, useEffect, useMemo, useState,\n} from \"react\";\nimport {IconCircleX, IconPlus} from \"@tabler/icons\";\nimport {actions, useAppDispatch} from \"../../store\";\nimport {FORMATTER_TYPES_NAMES} from \"../../types/cms\";\n\nconst allOption = {value: \"all\", label: \"All\"};\n\nconst buildOptionsFromMap = (options) => {\n if (!options) return [];\n const selectOptions = Object.keys(options).map((k: any) => ({value: String(k), label: String(options[k])}));\n return [allOption, ...selectOptions];\n};\n\n/**\n * Filter sidebar to reduce the number of results\n */\nexport function FilterSidebar({onChange, loading, onEditCreation}) {\n const dispatch = useAppDispatch();\n\n const [query, setQuery] = useState(\"\");\n const [loadingCreate, setLoadingCreate] = useState(false);\n const [debouncedQuery] = useDebouncedValue(query, 500);\n\n /* Internal state, manage filters in separate */\n const initialFilterState = {\n type: allOption.value,\n };\n\n const [filters, setFilters] = useState(initialFilterState);\n\n const onClearFilters = () => {\n setQuery(\"\");\n setFilters(initialFilterState);\n };\n\n /* Calculate options */\n const options = useMemo(() => ({\n type: buildOptionsFromMap(FORMATTER_TYPES_NAMES),\n }), []);\n\n // Any change call the prop function to the ouside\n useEffect(() => {\n onChange({...filters, query: debouncedQuery});\n }, [filters.type, debouncedQuery]);\n\n const onAddNewFormatter = () => {\n setLoadingCreate(true);\n const newId = Math.random().toString(16).substring(2, 10);\n dispatch(actions.createEntity(\"formatter\", {\n name: `formatter_${newId}`,\n content: {\n type: \"formatter\",\n logic: \"return n;\",\n inputType: \"string\",\n testValue: \"123456\",\n description: \"New formatter\",\n },\n })).then((response) => {\n setLoadingCreate(false);\n onClearFilters();\n if (response.ok) {\n onEditCreation(response.data.id);\n }\n });\n };\n\n const onChangeFilter = useCallback((key: \"type\", value) => {\n const newFilters = {\n ...filters,\n [key]: value,\n };\n setFilters(newFilters);\n }, [filters]);\n\n return (\n <div>\n <TextInput\n label=\"Search by name or description\"\n value={query}\n onChange={(event) => setQuery(event.currentTarget.value)}\n disabled={loading}\n />\n <Select\n label=\"Type\"\n data={options.type}\n value={filters.type}\n onChange={(value) => onChangeFilter(\"type\", value)}\n disabled={loading}\n />\n <Space h=\"md\" />\n <Button\n fullWidth\n disabled={loading}\n leftIcon={<IconCircleX />}\n onClick={onClearFilters}\n >\n Clear filters\n </Button>\n <Space h=\"md\" />\n <Button\n fullWidth\n disabled={loading}\n leftIcon={<IconPlus />}\n onClick={onAddNewFormatter}\n variant=\"light\"\n loading={loadingCreate}\n >\n New formatter\n </Button>\n </div>\n );\n}\n","import React, {useEffect, useState} from \"react\";\n\n/* hooks */\nimport {\n LoadingOverlay,\n Drawer,\n TextInput,\n Button,\n Group,\n Stack,\n Alert,\n Textarea,\n Select,\n} from \"@mantine/core\";\nimport {IconCircleCheck, IconAlertCircle, IconPlayerPlay} from \"@tabler/icons\";\nimport {\n useAppSelector, useFormatterRef, actions, useAppDispatch, useFormatterList,\n} from \"../../store\";\nimport MonacoWrapper from \"../../cms/editors/MonacoWrapper\";\nimport {\n FORMATTER_TYPES_NAMES, FORMATTER_INPUT_TYPES, FORMATTER_INPUT_TYPES_NAMES,\n} from \"../../types/cms\";\nimport {Formatter} from \"../../models/formatter\";\nimport {parse} from \"../../libs/FUNC\";\nimport slugifyInput from \"../../libs/web/slugifyInput\";\nimport {useFormatterUsageCount} from \"../../store/hooks\";\nimport {DrawerContentWithScroll} from \"../DrawerContentWithScroll\";\n\nconst buildOptionsFromMap = (options) => {\n if (!options) return [];\n return Object.keys(options).map((k: any) => ({value: String(k), label: String(options[k])}));\n};\n\nconst getCastedValue = (type, value) => {\n switch (type) {\n case FORMATTER_INPUT_TYPES.OBJECT:\n return JSON.parse(value);\n default:\n return `${value}`;\n }\n};\n\n/**\n * Filter sidebar to reduce the number of results\n */\nexport function FormatterForm({formatterId, onEditEnd}) {\n const localeDefault = useAppSelector((state) => state.status.localeDefault);\n const locales = useAppSelector((state) => state.status.locales);\n const localesItems = locales.map((locale) => ({value: locale, label: `${locale.toUpperCase()}`}));\n\n const opened = !!formatterId;\n\n const [formatter, setFormatter] = useState<Formatter | undefined>();\n const [testResults, setTestResults] = useState(\"\");\n const [formatterNames, setFormatterNames] = useState<string[]>([]);\n const [initialLoading, setInitialLoading] = useState(true);\n const [saveLoading, setSaveLoading] = useState(false);\n const [isDirty, setIsDirty] = useState(true);\n const [isValid, setIsValid] = useState(true);\n const [error, setError] = useState(false);\n\n const dispatch = useAppDispatch();\n\n // Use hooks to grab some lists and the current formatter\n const ref = useFormatterRef(formatterId);\n const formattersList = useFormatterList();\n const usageCount = useFormatterUsageCount(ref.data?.name);\n\n // Global loading state\n const isLoading = initialLoading || saveLoading;\n\n // Load data\n useEffect(() => {\n if (!ref.isLoading) {\n setFormatter(ref.data);\n }\n }, [ref.isLoading]);\n\n // When all references are loaded\n useEffect(() => {\n if (!ref.isLoading && !formattersList.isLoading) {\n const formatterItem = (!ref.isSuccess) ? undefined : ref.data;\n const formatters = (!formattersList.isSuccess) ? [] : formattersList.data;\n\n if (formatterItem) {\n // Create formatters list names\n const formatterNamesList = formatters.filter((f) => (f.id !== formatterItem.id)).map((f) => f.name);\n setFormatterNames(formatterNamesList);\n }\n\n // Force to run test at the begining\n onTest();\n\n setInitialLoading(false);\n }\n }, [ref.isLoading, formattersList.isLoading]);\n\n const isValidName = formatter && !formatterNames.includes(formatter.name) && formatter.name !== \"\";\n\n /** On change function just for name */\n const onChangeName = (value) => {\n if (isValidName) {\n setIsValid(false);\n }\n if (formatter) {\n setFormatter({\n ...formatter,\n name: slugifyInput(value).replace(\"-\", \"\"),\n });\n }\n };\n\n /** On change function for properties inside \"content\" blob key */\n const onContentValueChange = (key, value) => {\n if (key !== \"description\") {\n // setIsValid(false);\n setIsDirty(true);\n }\n if (formatter) {\n setFormatter({\n ...formatter,\n content: {\n ...formatter.content,\n [key]: value,\n },\n });\n }\n };\n\n /** Function that runs the logic with the example */\n const onTest = () => {\n if (formatter) {\n let results = \"\";\n try {\n // TODO add other vars as globals\n const newFunction = parse({vars: [\"n\"], logic: formatter.content.logic}, {}, localeDefault, {});\n const castedValue = getCastedValue(formatter.content.inputType, formatter.content.testValue);\n results = newFunction(castedValue);\n setIsValid(true);\n } catch (e) {\n results = `ERROR: ${e.message}`;\n console.log(e);\n setIsValid(false);\n }\n setIsDirty(false);\n setTestResults(`${results}`);\n }\n };\n\n const onSave = () => {\n setSaveLoading(true);\n if (isValid && isValidName) {\n dispatch(actions.updateEntity(\"formatter\", formatter))\n .then(onEditEnd);\n }\n };\n\n return (\n <Drawer\n opened={opened}\n onClose={() => onEditEnd()}\n title={`Edit formatter ID ${formatterId}`}\n padding=\"lg\"\n closeOnClickOutside={false}\n closeOnEscape={false}\n position=\"right\"\n size=\"50%\"\n lockScroll\n withCloseButton={false}\n >\n <DrawerContentWithScroll\n content={(\n <>\n <LoadingOverlay visible={initialLoading} overlayBlur={2} overlayOpacity={50} />\n {error && (\n <Alert title=\"Formatter Form\" color=\"red\">\n Error, please try again.\n </Alert>\n )}\n {formatter && !error\n && (\n <Stack justify=\"space-between\">\n <Group grow align=\"flex-start\">\n <TextInput\n label={`Name ${isValidName && usageCount > 0 ? `(Read only, used in ${usageCount} blocks)` : \"\"}`}\n value={formatter.name}\n icon={isValidName ? <IconCircleCheck /> : <IconAlertCircle />}\n readOnly={isValidName && usageCount > 0}\n disabled={isValidName && usageCount > 0}\n onChange={(evt) => onChangeName(evt.target.value)}\n error={isValidName ? false : \"Duplicate or empty name, choose a different one.\"}\n />\n <Select\n label=\"Type\"\n data={buildOptionsFromMap(FORMATTER_TYPES_NAMES)}\n value={formatter.content.type}\n onChange={(value) => onContentValueChange(\"type\", value)}\n />\n </Group>\n <Textarea\n label=\"Description\"\n value={formatter.content.description}\n onChange={(evt) => onContentValueChange(\"description\", evt.target.value)}\n />\n <MonacoWrapper\n key=\"formatter-code-editor\"\n monacoOptions={{\n onChange: (newLogic) => onContentValueChange(\"logic\", newLogic),\n value: formatter.content.logic,\n }}\n />\n <Group grow align=\"flex-end\">\n <Select\n label=\"Input Type\"\n data={buildOptionsFromMap(FORMATTER_INPUT_TYPES_NAMES)}\n value={formatter.content.inputType}\n onChange={(value) => onContentValueChange(\"inputType\", value)}\n />\n <TextInput\n label=\"Test Value\"\n value={formatter.content.testValue}\n onChange={(evt) => onContentValueChange(\"testValue\", evt.target.value)}\n error={formatter.content.testValue === \"\" && !isValid}\n />\n </Group>\n <Textarea\n readOnly\n icon={isValid ? <IconCircleCheck /> : <IconAlertCircle />}\n label=\"Test Results\"\n value={testResults}\n error={\n (testResults.includes(\"ERROR\") && !isValid)\n ? \"There is a problem in the function, input type or test value. Please check and run again.\"\n : false\n }\n />\n </Stack>\n )}\n </>\n )}\n buttons={(\n <>\n <Button\n variant=\"outline\"\n disabled={isLoading}\n onClick={() => onEditEnd()}\n >\n Cancel\n </Button>\n <Button\n onClick={onTest}\n disabled={!isDirty}\n color={isDirty ? \"blue\" : isValid ? \"green\" : \"red\"}\n leftIcon={<IconPlayerPlay />}\n >\n Run Test\n </Button>\n <Button\n onClick={onSave}\n loading={isLoading}\n disabled={isLoading || !isValid || isDirty || !isValidName}\n >\n Save\n </Button>\n </>\n )}\n size={145}\n />\n </Drawer>\n );\n}\n","import {\n ActionIcon, Code, Group, Tooltip,\n} from \"@mantine/core\";\nimport {\n IconPencil, IconMathFunction, IconVariable, IconArrowRightCircle,\n} from \"@tabler/icons\";\nimport {DataTable, DataTableSortStatus} from \"mantine-datatable\";\nimport {\n useEffect, useMemo, useState,\n} from \"react\";\nimport {EntityDeleteButton} from \"../builder/EntityDeleteButton\";\nimport {useFormatterList} from \"../../store\";\nimport {useFormatterFunctionsForLocale, useFormatterUsageCountList} from \"../../store/hooks\";\nimport {\n FORMATTER_INPUT_TYPES, FORMATTER_INPUT_TYPES_NAMES, FORMATTER_TYPES_NAMES, FORMATTER_TYPES,\n} from \"../../types/cms\";\n\nconst getCastedValue = (type, value) => {\n switch (type) {\n case FORMATTER_INPUT_TYPES.OBJECT:\n return JSON.parse(value);\n default:\n return `${value}`;\n }\n};\n\n/**\n * Filter sidebar to reduce the number of results\n */\nexport function FormattersTable({filters, onClickEdit}) {\n // Internal state\n const [sortStatus, setSortStatus] = useState <DataTableSortStatus>();\n const [records, setRecords] = useState([]);\n\n // Grab blocks and formatters from state\n const formattersList = useFormatterList();\n const formatters = (!formattersList.isSuccess) ? [] : formattersList.data;\n const formatterFunctions = useFormatterFunctionsForLocale();\n const formattersUsageCount = useFormatterUsageCountList();\n\n // Memo only if formatters or blocks change\n const formattersFull = useMemo(() => formatters.map((f) => {\n // Merge formatters with its usage count.\n const usageCount = formattersUsageCount[f.name] ? formattersUsageCount[f.name] : 0;\n\n // Calculate results values\n let result = \"\";\n try {\n const castedValue = getCastedValue(f.content.inputType, f.content.testValue);\n result = formatterFunctions[f.name](castedValue);\n } catch (e) {\n result = `ERROR: ${e.message}`;\n console.log(`Error in ${f.name}`);\n console.log(e);\n }\n\n return {\n ...f,\n result,\n usageCount,\n };\n }), [formatters]);\n\n // Filter and sort function\n const doSearch = () => {\n let filteredResults = formattersFull.filter(\n (formatter) => {\n let findQuery = true; let\n findType = true;\n if (filters.query) {\n findQuery = (formatter.name.toLowerCase().indexOf(filters.query.toLowerCase()) > -1\n || formatter.content.description.indexOf(filters.query) > -1);\n }\n if (filters.type !== \"all\") {\n findType = formatter.content.type === filters.type;\n }\n return findQuery && findType;\n },\n );\n\n if (sortStatus) {\n const sortIndex = sortStatus.direction === \"asc\" ? -1 : 1;\n filteredResults = filteredResults.sort((a, b) => (a[sortStatus.columnAccessor] > b[sortStatus.columnAccessor] \n ? 1 * sortIndex\n : -1 * sortIndex));\n }\n\n setRecords(filteredResults);\n };\n\n useEffect(() => {\n doSearch();\n }, [sortStatus, filters, formattersFull]);\n\n /*\n type mixedType =\n | DataTableColumn<{slug: string, variant: {slug:string}}>\n | DataTableColumn<{contentByLocale: object[]}>\n | DataTableColumn<{member: object}>\n */\n\n const cols: any = [\n {\n title: \"ID\", accessor: \"id\", sortable: true, textAlignment: \"right\" as const,\n },\n {\n title: \"Name\",\n accessor: \"name\",\n sortable: true,\n render: (member) => {\n const icon = member.content.type === FORMATTER_TYPES.FORMATTER\n ? <IconVariable size=\"1.3em\" />\n : <IconMathFunction size=\"1.3em\" />;\n return (\n <Group noWrap align=\"center\" spacing={2}>\n <span>{member.name}</span>\n <Tooltip label={FORMATTER_TYPES_NAMES[member.content.type]}><span>{icon}</span></Tooltip>\n </Group>\n );\n },\n },\n {\n title: \"Description\", accessor: \"content.description\",\n },\n {\n title: \"Demo\",\n accessor: \"content.testValue\",\n render: (member) => {\n let input = member.content.testValue;\n if (member.content.inputType === FORMATTER_INPUT_TYPES.STRING) {\n input = `\"${input}\"`;\n }\n let output = member.result;\n if (typeof (member.result) === \"string\") {\n output = `\"${output}\"`;\n }\n return (\n <Group spacing={2}>\n <Tooltip label={`Input Type: ${FORMATTER_INPUT_TYPES_NAMES[member.content.inputType]}`}>\n <Code color=\"blue\">{input}</Code>\n </Tooltip>\n <IconArrowRightCircle />\n <Code color={member.result && `${member.result}`.includes(\"ERROR\") ? \"red\" : \"teal\"}>{output}</Code>\n </Group>\n );\n },\n },\n {\n title: \"Usage\", accessor: \"usageCount\", textAlignment: \"right\" as const, sortable: true,\n },\n {\n title: \"\",\n accessor: \"actions\",\n render: (member) => (\n <Group position=\"center\" spacing=\"xs\" noWrap>\n <ActionIcon key=\"edit\" onClick={() => onClickEdit(member)}><IconPencil size={20} /></ActionIcon>\n <EntityDeleteButton\n id={member.id}\n type=\"formatter\"\n disabled={member.usageCount > 0}\n warning={`Delete formatter called \"${member.name}\" (id:${member.id}) ? It is not used in any block.`}\n />\n </Group>\n ),\n },\n ];\n\n return (\n <DataTable\n striped\n minHeight={150}\n records={records}\n columns={cols}\n sortStatus={sortStatus}\n onSortStatusChange={(s) => setSortStatus(s)}\n idAccessor=\"id\"\n withBorder\n />\n );\n}\n","import {\n Container, Grid, Space, Text,\n} from \"@mantine/core\";\nimport {useState} from \"react\";\n\nimport {FilterSidebar} from \"../components/formatters/FilterSidebar\";\nimport {FormatterForm} from \"../components/formatters/FormatterForm\";\nimport {FormattersTable} from \"../components/formatters/FormattersTable\";\n\n\n/**\n * Search formatters metadata editor\n */\nexport function FormatterEditor() {\n const [editingId, setEditingId] = useState(null);\n const [internalFilters, setInternalFilters] = useState<any>(true);\n\n // When any filter changed\n const onChangeFilters = (filters) => {\n setInternalFilters(filters);\n };\n\n // Create\n const onCreateFormatter = (id) => {\n setEditingId(id);\n };\n\n // Edit\n const setEditFormatter = (formatter) => {\n if (formatter) {\n setEditingId(formatter.id);\n }\n };\n\n const onEditClose = () => {\n setEditingId(null);\n };\n\n\n/* useEffect(() => {\n doSearch();\n }, [internalFilters, formattersList.isFetching, editingId]);*/\n\n return (\n <Container fluid>\n <Grid>\n <Grid.Col span={2}>\n <Text ml=\"xl\" my=\"sm\" weight=\"bold\">Formatters</Text>\n <FilterSidebar onChange={onChangeFilters} onEditCreation={onCreateFormatter} loading={false} />\n </Grid.Col>\n <Grid.Col span={10} style={{height: \"100vh\"}}>\n <Space h=\"xs\" />\n <FormattersTable filters={internalFilters} onClickEdit={setEditFormatter} />\n </Grid.Col>\n </Grid>\n {editingId && <FormatterForm formatterId={editingId} onEditEnd={onEditClose} />}\n </Container>\n );\n}\n","import {\n Badge, Button, Card, Center, Group, Space, Text, useMantineTheme,\n} from \"@mantine/core\";\nimport {IconFileAnalytics, IconPencil} from \"@tabler/icons\";\nimport {Link} from \"react-router-dom\";\n\nimport {ReportModel} from \"../../models\";\nimport {useReportRef, withFetcher} from \"../../store\";\nimport {EntityDeleteButton} from \"./EntityDeleteButton\";\n\ntype ReportCardProps = {\n for: ReportModel.AnyNormalizedReport;\n}\n\nexport function ReportCard(props: ReportCardProps) {\n const {for: report} = props;\n\n const theme = useMantineTheme();\n\n const secondaryColor = theme.colorScheme === \"dark\"\n ? theme.colors.dark[1]\n : theme.colors.gray[7];\n\n return (\n <Card shadow=\"xs\" p=\"lg\" withBorder style={{margin: theme.spacing.sm}}>\n <Group position=\"apart\">\n <Center>\n <IconFileAnalytics size={22} />\n <Space w=\"xs\" />\n <Text m=\"xl\" weight=\"bold\">{report.name}</Text>\n </Center>\n <Badge variant=\"light\">{report.type}</Badge>\n </Group>\n <Text size=\"sm\" style={{color: secondaryColor, lineHeight: 2}}>\n Description of report will go here\n </Text>\n <Space w=\"xs\" />\n <Group position=\"apart\">\n <Button component={Link} to={`/reports/${report.id}`} leftIcon={<IconPencil />} compact>\n Edit\n </Button>\n <EntityDeleteButton type=\"report\" id={report.id} />\n </Group>\n </Card>\n );\n}\n\nexport const ReportCardWithFetcher = withFetcher(ReportCard, useReportRef);\n","import {\n ActionIcon, Alert, Center, Group, LoadingOverlay, Space,\n} from \"@mantine/core\";\nimport {useCallback, useMemo} from \"react\";\nimport {IconFileAnalytics, IconPlus} from \"@tabler/icons\";\n\nimport {EntityCreateButton} from \"../components/builder/EntityCreateButton\";\nimport {ReportCard} from \"../components/builder/ReportCard\";\nimport {actions, useAppDispatch} from \"../store\";\nimport {useReportList} from \"../store/hooks\";\n\nexport function ReportPicker() {\n const dispatch = useAppDispatch();\n\n const ref = useReportList();\n\n const createHandler = useCallback((value) => {\n dispatch(actions.createEntity(\"report\", value));\n }, []);\n\n const content = useMemo(() => {\n if (ref.isUninitialized || ref.isFetching) {\n return <LoadingOverlay visible overlayBlur={2} />;\n }\n if (ref.isError) {\n return (\n <Alert icon={<IconFileAnalytics size={22} />} title=\"Server Error\">\n {ref.error.message}\n </Alert>\n );\n }\n if (ref.data.length === 0) {\n return (\n <Alert icon={<IconFileAnalytics size={22} />} title=\"No Saved Reports\">\n Please use the button below to create your first report.\n </Alert>\n );\n }\n return ref.data.map((report) => <ReportCard key={report.id} for={report} />);\n }, [ref.data, ref.error, ref.status]);\n\n return (\n <Center style={{flexDirection: \"column\", height: \"100vh\"}}>\n <h1>Reports</h1>\n <Group position=\"center\" style={{width: \"100%\"}}>\n {content}\n </Group>\n <Space h=\"xl\" w=\"xl\" />\n <EntityCreateButton\n fields={[{\n type: \"text\",\n name: \"name\",\n label: \"Report Name\",\n initialValue: \"\",\n }]}\n onSubmit={createHandler}\n target={\n <ActionIcon size=\"xl\" radius=\"xl\"><IconPlus size={30} /></ActionIcon>\n }\n />\n </Center>\n );\n}\n","import {\n AppShell, Burger, Group, MantineProvider, Navbar, Text, ThemeIcon, UnstyledButton,\n} from \"@mantine/core\";\nimport {NotificationsProvider} from \"@mantine/notifications\";\nimport {\n IconBoxMargin, IconMathFunction, IconCircleDashed, IconTable,\n} from \"@tabler/icons\";\nimport {\n Link, useLocation, HashRouter, Route, Routes,\n} from \"react-router-dom\";\nimport {useState} from \"react\";\n\nimport {DialogProvider} from \"../components/commons/Dialog\";\nimport {ReportEditor} from \"./EditReport\";\nimport {MetadataEditor} from \"./MetadataEditor\";\nimport {FormatterEditor} from \"./FormatterEditor\";\nimport {ReportPicker} from \"./PickReport\";\nimport {ResourceProvider} from \"../context/ResourceProvider\";\n\nfunction MainLink({item}) {\n const {pathname} = useLocation();\n return (\n <Link key={item.label} to={item.href}>\n <UnstyledButton\n mt=\"xs\"\n sx={(theme) => ({\n border: \"1px solid white\",\n borderColor: pathname === item.href ? \"#ccc\" : \"transparent\",\n backgroundColor: \"transparent\",\n display: \"block\",\n width: \"100%\",\n padding: theme.spacing.xs,\n borderRadius: theme.radius.sm,\n \"&:hover\": {\n backgroundColor: \"#f9f9f9\",\n },\n })}\n >\n <Group>\n <ThemeIcon color={item.color} variant=\"light\">\n {item.icon}\n </ThemeIcon>\n <Text size=\"sm\">{item.label}</Text>\n </Group>\n </UnstyledButton>\n </Link>\n );\n}\n\nfunction MenuBtn({opened, setOpened}) {\n const {pathname} = useLocation();\n const hasHeader = pathname.indexOf(\"/reports/\") === 0;\n return (\n <Burger\n style={{\n position: \"fixed\", top: hasHeader && opened ? 60 : 10, left: opened ? 215 : 10, zIndex: 101,\n }}\n opened={opened}\n onClick={() => setOpened((o) => !o)}\n size=\"sm\"\n />\n );\n}\n\nconst options = [\n {\n icon: <IconBoxMargin size={16} />, color: \"blue\", label: \"Reports Builder\", href: \"/reports\",\n },\n {\n icon: <IconTable size={16} />, color: \"teal\", label: \"Metadata Editor\", href: \"/metadata\",\n },\n {\n icon: <IconMathFunction size={16} />, color: \"violet\", label: \"Pala List\", href: \"/formatters\",\n },\n];\n\nexport function BespokeCMS() {\n const [opened, setOpened] = useState(true);\n const links = options.map((link) => (<MainLink key={link.label} item={link} />));\n return (\n <MantineProvider>\n <ResourceProvider>\n <NotificationsProvider position=\"bottom-center\">\n <DialogProvider>\n <div suppressHydrationWarning>\n {typeof window !== \"undefined\" && (\n <HashRouter>\n <AppShell\n fixed\n padding={0}\n navbar={(\n <>\n <MenuBtn opened={opened} setOpened={setOpened} />\n <Navbar\n p=\"md\"\n width={{base: 250, xs: opened ? 250 : 0}}\n hiddenBreakpoint={100000}\n hidden={!opened}\n >\n <Navbar.Section style={{position: \"relative\"}}>\n <Link to=\"/reports\">\n <UnstyledButton\n sx={(theme) => ({\n display: \"block\",\n width: \"100%\",\n borderRadius: theme.radius.sm,\n padding: theme.spacing.xs,\n })}\n >\n <Group>\n <IconCircleDashed size={30} color=\"black\" />\n <Text size=\"lg\">\n Bespoke\n <small><sub> beta</sub></small>\n </Text>\n </Group>\n </UnstyledButton>\n </Link>\n </Navbar.Section>\n <Navbar.Section grow>{links}</Navbar.Section>\n </Navbar>\n </>\n )}\n >\n <Routes>\n <Route path=\"/reports\" element={<ReportPicker />} />\n <Route path=\"/reports/:id\" element={<ReportEditor />} />\n <Route path=\"/metadata\" element={<MetadataEditor />} />\n <Route path=\"/formatters\" element={<FormatterEditor />} />\n <Route path=\"*\" element={<ReportPicker />} />\n </Routes>\n </AppShell>\n </HashRouter>\n )}\n </div>\n </DialogProvider>\n </NotificationsProvider>\n </ResourceProvider>\n </MantineProvider>\n );\n}\n","/**\n * React component for rendering a report\n */\nexport function BespokeRenderer() {\n return (\n <div>Report COMING SOON</div>\n );\n}\n"],"names":["value","__spreadValues","ID","MODEL_NAME","_a","localeDefault","locales","verbose","ENTITY_PRETTY_NAMES","match","obj","options","maybeFixForMulti","defaultValue","axios","__spreadProps","Axios","urlProxy","httpApiFactory","log","error","bid","position","actions","schema","initialState","list","FetchStatus","__objRest","actions.readEntity","useRef","actions.readMetadata","actions.reportSearch","Explore","id","BlockModel.ID","BlockModel.MODEL_NAME","DimensionModel.ID","DimensionModel.MODEL_NAME","FormatterModel.ID","FormatterModel.MODEL_NAME","ReportModel.ID","ReportModel.MODEL_NAME","SectionModel.ID","SectionModel.MODEL_NAME","VariantModel.ID","VariantModel.MODEL_NAME","actions.deleteEntity","parse","actions.urlProxy","sample","keys","actions.variantValidateSlug","actions.updateEntity","actions.createEntity","ReportEditor","Link","settings","duration","ImagePreview","GeneratorPreview","isPrimitiveType","simpleState","renderers","adapters","BLOCK_CONFIG","status","content","Fragment","allowed","allowedLogic","Editor","block","locale","allowedMessage","site","formatOptions","format","mode","inputs","consumers","columns","provided","snapshot","allOption","FilterSidebar","actions.searchRegenerate","prompt","buildOptionsFromMap","getCastedValue"],"mappings":"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"}