jamespot-react-core 1.2.28 → 1.2.30

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.
@@ -1 +1 @@
1
- {"version":3,"file":"199.091f4448d6a2131280cb.chunk.js","mappings":"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","sources":["webpack://ReactCore/./src/components/Avatar.tsx","webpack://ReactCore/./src/components/Audience.tsx","webpack://ReactCore/./src/components/tinymce/extension/AIModal.tsx","webpack://ReactCore/./src/displayer/DisplayForm.component.tsx","webpack://ReactCore/./src/components/comments/AddReportModal.tsx","webpack://ReactCore/./src/components/editors/const.ts","webpack://ReactCore/./src/components/editors/style.tsx","webpack://ReactCore/./src/components/editors/EditorPopup.tsx","webpack://ReactCore/./src/components/editors/Editor.tsx","webpack://ReactCore/./src/components/editors/EditorPosition.tsx","webpack://ReactCore/./src/components/editors/components/EditorInputColor.tsx","webpack://ReactCore/./src/components/editors/components/EditorInputNumber.tsx","webpack://ReactCore/./src/components/editors/components/EditorInputSelect.tsx","webpack://ReactCore/./src/components/editors/EditorTabWrapper.tsx","webpack://ReactCore/./src/components/editors/states/EditorIsBusy.tsx","webpack://ReactCore/./src/components/editors/states/EditorIsLocked.tsx","webpack://ReactCore/./src/components/editors/components/EditorSave.tsx","webpack://ReactCore/./src/components/editors/EditorTabWidgetSelection.tsx","webpack://ReactCore/./src/components/editors/EditorTabDisplayLevel.tsx","webpack://ReactCore/./src/components/editors/EditorWrapper.tsx","webpack://ReactCore/./src/components/editors/EditorsPortal.tsx","webpack://ReactCore/./src/components/widgets/components/WidgetEditorPanel.tsx","webpack://ReactCore/./src/components/widgets/WidgetList/WidgetList.style.tsx","webpack://ReactCore/./src/components/widgets/WidgetList/WidgetList.tsx","webpack://ReactCore/./src/components/widgets/namespace.ts","webpack://ReactCore/./src/hooks/useMarkdownModal.ts","webpack://ReactCore/./src/components/widgets/components/WidgetUploader.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetArticleAttachmentWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetArticleButtonWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetArticleGalleryWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetStylePadding.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetScroll.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetIntranetTitle.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetHeader.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetLuccaAbsenceWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetArticleImageWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetArticleSliderWrapper.tsx","webpack://ReactCore/./src/components/tinymce/extension/MarkdownModal.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetArticleTextWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetArticleTitleWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetRemove.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetFooterView.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetInlineInputText.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetIsPending.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetCheckListWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/utils.ts","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetDatasourceTableWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetExcelDatasourceTableWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetPresenceWrapperClosing.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetPresenceWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetQuickSurveyWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/OfficeConfigurationPrompt.tsx","webpack://ReactCore/./src/components/widgets/wrapper/WidgetContactCardDav/WidgetContactCardDavHeader.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetContactCardDavWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/WidgetCalendarCalDav/WidgetCalendarCalDavHeader.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetCalendarCalDavWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/WidgetEmailsImap/WidgetEmailsImapHeader.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetEmailsImapWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetTitle.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetTitleEdit.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetHeaderEdit.tsx","webpack://ReactCore/./src/components/widgets/wrapper/WidgetLicenseWrapper.tsx","webpack://ReactCore/./src/components/widgets/Widget.tsx","webpack://ReactCore/./src/components/widgets/WidgetLayer/WidgetLayer.style.tsx","webpack://ReactCore/./src/components/widgets/WidgetLayer/WidgetLayer.tsx","webpack://ReactCore/./src/components/widgets/WidgetState.tsx","webpack://ReactCore/./src/components/widgets/WidgetWrapperCoreEditHover.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetStyleWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetIconWrapper.tsx","webpack://ReactCore/./src/components/widgets/WidgetWrapperCore.tsx","webpack://ReactCore/./src/components/comments/CommentsBloc.styles.ts","webpack://ReactCore/./src/components/comments/CommentsBlocAddCommentWidgetsWrapper.tsx","webpack://ReactCore/./src/components/comments/CommentsBlocCommentWidgetsWrapper.tsx","webpack://ReactCore/./src/components/CommentsBloc.tsx","webpack://ReactCore/./src/hooks/useCommentsLikeRT.ts","webpack://ReactCore/./src/components/Empty.tsx","webpack://ReactCore/./src/components/FullPageLayout.tsx","webpack://ReactCore/./src/hooks/useAI.ts","webpack://ReactCore/./src/components/tinymce/JRCInputTinyMCEWithExt.tsx","webpack://ReactCore/./src/components/tinymce/JRCInputTinyMCEWithExtRaw.tsx","webpack://ReactCore/./src/components/modals/ModalAudience.tsx","webpack://ReactCore/./src/components/TwoColLayout.tsx"],"sourcesContent":["import { JRCAvatar, JRCAvatarProps } from 'jamespot-react-components';\r\nimport { Network } from 'jamespot-front-business';\r\nimport React from 'react';\r\nimport { useTheme } from 'styled-components';\r\nimport { commonComponentsRegistry } from '../registry/CommonRegistry';\r\nimport { useAppSelector } from '../redux/store';\r\n\r\nconst JRCIcon = commonComponentsRegistry.getLazyComponent('Icon');\r\n\r\nconst BASE_MULTIPLE = 8;\r\n\r\nexport const Avatar = (props: JRCAvatarProps) => {\r\n const theme = useTheme();\r\n const networkPublic = useAppSelector(Network.selectors.selectNetworkPublic);\r\n\r\n if (props.uri === networkPublic?.uri) {\r\n return (\r\n <JRCIcon\r\n name={'icon-fs-wall'}\r\n size={(props.size ?? 3) * BASE_MULTIPLE}\r\n color={theme.color.primary}\r\n variant={'circle'}\r\n />\r\n );\r\n }\r\n\r\n return <JRCAvatar {...props} />;\r\n};\r\n","import React, { useState } from 'react';\nimport styled, { useTheme } from 'styled-components';\nimport { useIntl } from 'react-intl';\nimport { Utils } from 'jamespot-react-components';\nimport { Avatar } from './Avatar';\nimport { jObjectLittle } from 'jamespot-user-api';\nimport { commonComponentsRegistry } from '../registry/CommonRegistry';\n\nconst JRCFlexBox = commonComponentsRegistry.getLazyComponent('FlexBox');\nconst JRCModalContent = commonComponentsRegistry.getLazyComponent('ModalContent');\nconst JRCModalLayout = commonComponentsRegistry.getLazyComponent('ModalLayout');\nconst JRCStyledHref = commonComponentsRegistry.getLazyComponent('StyledHref');\nconst JRCTooltip = commonComponentsRegistry.getLazyComponent('Tooltip');\nconst JRCTypography = commonComponentsRegistry.getLazyComponent('Typography');\n\nexport type AudienceProps<T extends jObjectLittle> = {\n audience: T[];\n limit?: number;\n};\n\nconst LIMIT = 2;\n\nconst AudienceWrapper = styled.div`\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-bottom: 24px;\n`;\n\nexport const AvatarLink = styled.a<{ overlap?: boolean }>`\n display: flex;\n justify-content: center;\n align-items: center;\n position: relative;\n width: 40px;\n height: 40px;\n border-radius: 40px;\n overflow: hidden;\n color: ${(props) => props.theme.color.white};\n background-color: ${(props) => props.theme.color.lavender};\n border: 4px solid ${(props) => props.theme.color.white};\n margin-left: ${(props) => (props.overlap ? '-18px' : '0')};\n cursor: pointer;\n`;\n\nexport const Audience = <T extends jObjectLittle>({ audience, limit = LIMIT }: AudienceProps<T>) => {\n const intl = useIntl();\n const theme = useTheme();\n const [isModalOpen, setModalOpen] = useState(false);\n\n return (\n <>\n <JRCFlexBox>\n {[...audience].splice(0, limit).map((item, index) => (\n <AvatarLink overlap={index !== 0} href={item._url} target={'_blank'} key={item.id}>\n <JRCTooltip description={item.title === undefined ? ' ' : item.title} position=\"left\">\n <Avatar\n uri={item.uri}\n size={4}\n variant=\"circle\"\n alt=\"image\"\n timestamp={item.dateModified ? Utils.date.strToTimestamp(item.dateModified) : undefined}\n focusable\n />\n </JRCTooltip>\n </AvatarLink>\n ))}\n {audience.length > limit && (\n <AvatarLink onClick={() => setModalOpen(true)} overlap={true}>\n +{audience.length - limit}\n </AvatarLink>\n )}\n </JRCFlexBox>\n {audience.length > limit && (\n <JRCModalLayout\n closeHandler={() => setModalOpen(false)}\n enableClickAwayCloseModal\n open={isModalOpen}\n variant={'fixed-height'}\n maxHeight={'800px'}>\n <JRCModalContent\n title={intl.formatMessage({ id: 'GLOBAL_Audience' })}\n overflow={'scroll'}\n onClickIconClose={() => setModalOpen(false)}>\n <AudienceWrapper>\n {audience.map((item, i) => (\n <JRCFlexBox key={`audience-${i}`} y={'center'} gap={theme.space.l}>\n <Avatar size={5} uri={`${item.type}/${item.id}`} />\n <JRCStyledHref href={`${item.type}/${item.id}`}>\n <JRCTypography>{item.title}</JRCTypography>\n </JRCStyledHref>\n </JRCFlexBox>\n ))}\n </AudienceWrapper>\n </JRCModalContent>\n </JRCModalLayout>\n )}\n </>\n );\n};\n","import jamespot from 'jamespot-user-api';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport styled, { useTheme } from 'styled-components';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { JiaTextEnhanceQuery } from '../../../hooks/useAI';\n\nconst JRCLoader = commonComponentsRegistry.getLazyComponent('Loader');\nconst JRCModalContent = commonComponentsRegistry.getLazyComponent('ModalContent');\nconst JRCModalLayout = commonComponentsRegistry.getLazyComponent('ModalLayout');\nconst JRCTypography = commonComponentsRegistry.getLazyComponent('Typography');\n\nconst TextWrapper = styled.div`\n padding: ${(props) => props.theme.space.md}px;\n`;\n\nexport type AIModalProps = {\n query: JiaTextEnhanceQuery | undefined;\n};\n\ntype ResponseType = {\n response: string | undefined;\n loading: boolean;\n error: string | undefined;\n};\n\nconst loadingResponse: ResponseType = {\n response: undefined,\n loading: true,\n error: undefined,\n};\n\nexport const AIModal = ({ query }: AIModalProps) => {\n const intl = useIntl();\n const [response, setResponse] = useState<ResponseType>(loadingResponse);\n const theme = useTheme();\n\n const sendAIRequest = useCallback(\n (query: JiaTextEnhanceQuery) => {\n setResponse(loadingResponse);\n jamespot.jia\n .textEnhancement({ text: query.text, capacity: query.capability })\n .then((response) => {\n if (response.error) {\n setResponse({\n error: `${intl.formatMessage({ id: 'JIA_ERROR_AI_CALL' })}${\n response.errorMsg && ': ' + response.errorMsg\n }`,\n loading: false,\n response: undefined,\n });\n return;\n }\n const textResponse = response.result.text;\n setResponse({\n error: undefined,\n loading: false,\n response: textResponse,\n });\n })\n .catch((_err) => {\n setResponse({\n error: intl.formatMessage({ id: 'JIA_ERROR_AI_CALL' }),\n loading: false,\n response: undefined,\n });\n });\n },\n [intl],\n );\n\n useEffect(() => {\n if (query && query.text.trim().length > 0) {\n sendAIRequest(query);\n }\n }, [query, sendAIRequest]);\n\n return (\n <JRCModalLayout\n zIndex={theme.zIndex.tinyMCEModal}\n open={!!query}\n closeHandler={() => {\n query?.reject();\n }}>\n <JRCModalContent\n overflow=\"scroll\"\n buttons={[\n {\n children: intl.formatMessage({ id: 'GLOBAL_Try_Again' }),\n clickHandler: () => {\n query && sendAIRequest(query);\n },\n },\n {\n children: intl.formatMessage({ id: 'GLOBAL_Validation' }),\n clickHandler: () => response.response && query?.resolve(response.response),\n },\n {\n children: intl.formatMessage({ id: 'GLOBAL_Cancel' }),\n clickHandler: () => query?.reject(),\n },\n ]}\n isFull>\n <TextWrapper>\n {response.loading && (\n <>\n <JRCLoader />\n <JRCTypography align=\"center\">\n {intl.formatMessage({ id: 'JIA_WAITING_WARNIG' })}\n </JRCTypography>\n </>\n )}\n {!response.loading && response.error && <p>{response.error}</p>}\n {!response.loading && response.response && <p>{response.response}</p>}\n </TextWrapper>\n </JRCModalContent>\n </JRCModalLayout>\n );\n};\n","import { DisplayFormFieldsConfig, DisplayFormRef } from './types';\nimport { useForm, Control, FieldValues } from 'react-hook-form';\nimport { useDisplayForm } from './useDisplay';\nimport styled, { css } from 'styled-components';\nimport React, {\n FormEventHandler,\n ForwardedRef,\n forwardRef,\n ReactNode,\n Ref,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { AudienceAutocomplete } from 'jamespot-user-api';\n\nconst StretchContainer = css`\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n`;\n\nconst Container = styled.div<{ stretch?: boolean }>`\n ${({ stretch }) => stretch && StretchContainer}\n`;\n\nconst Form = styled.form<{ stretch?: boolean }>`\n ${({ stretch }) => stretch && StretchContainer}\n`;\n\nconst FormElement = (\n props: {\n stretch?: boolean;\n onSubmit?: FormEventHandler<HTMLFormElement>;\n children: ReactNode;\n dataCy?: string;\n },\n ref: ForwardedRef<HTMLFormElement | HTMLDivElement>,\n) => {\n return props.onSubmit ? (\n <Form\n stretch={props.stretch}\n onSubmit={props.onSubmit}\n ref={ref as Ref<HTMLFormElement>}\n data-cy={props.dataCy}>\n {props.children}\n </Form>\n ) : (\n <Container stretch={props.stretch} ref={ref as Ref<HTMLDivElement>} data-cy={props.dataCy}>\n {props.children}\n </Container>\n );\n};\nconst FormElm = forwardRef(FormElement);\n\nconst FieldsetWrapper = styled.div<{ stretch?: boolean }>`\n ${(props) =>\n props.stretch &&\n `\n flex: 1;\n`}\n`;\n\ntype FormFn<TFieldValues extends FieldValues> = Omit<\n ReturnType<typeof useForm<TFieldValues>>,\n 'handleSubmit' | 'control' | 'reset'\n>;\n\nexport type DisplayFormProps<TFieldValues extends FieldValues> = {\n type: string;\n fields: DisplayFormFieldsConfig<TFieldValues>;\n extraInputs?: (control: Control<TFieldValues>) => ReactNode;\n defaultValues?: any;\n onSubmit?: any;\n buttons?: ReactNode;\n readOnly?: boolean;\n dataCy?: string;\n stretch?: boolean;\n children?: ReactNode;\n forceMandatory?: boolean;\n onInit?: (formFn: FormFn<TFieldValues>) => void;\n};\n\n/****\n * The jamespot model depend on the platform\n * For example a user can have the size attribute only for a given platform\n * The model specifics of a platform are stored in J.model\n *\n * This component display an array of attributes only if this attribute is activated on the platform\n */\nconst _DisplayForm = <TFieldValues extends FieldValues>(\n { onInit, ...props }: DisplayFormProps<TFieldValues>,\n ref: ForwardedRef<DisplayFormRef>,\n) => {\n const formRef = useRef<HTMLFormElement | HTMLDivElement>(null);\n\n const [configuration, defaultValues] = useDisplayForm(props.fields, props.type, props.forceMandatory);\n const [isInit, setIsInit] = useState(false);\n\n const { handleSubmit, control, reset, ...formFn } = useForm({\n defaultValues: {\n ...defaultValues,\n ...props.defaultValues,\n },\n criteriaMode: 'all',\n });\n\n useEffect(() => {\n if (onInit && !isInit) {\n onInit(formFn);\n setIsInit(true);\n }\n }, [onInit, formFn, isInit]);\n\n const formatValuesForSubmit = useCallback(\n (values: any) => {\n const toRet: any = {};\n Object.keys(values).forEach((k) => {\n const widget = configuration.find((c) => c.name === k)?.widget;\n switch (widget?.type) {\n case 'audience':\n toRet[k] = values[k].map((v: AudienceAutocomplete) => v.uri).join(',');\n break;\n case 'taxonomy':\n toRet[k] = values[k].map((v: any) => v.title).join(',');\n break;\n case 'toggle':\n toRet[k] = values[k] ? '1' : '0';\n break;\n default:\n toRet[k] = values[k];\n break;\n }\n });\n return toRet;\n },\n [configuration],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n ...formFn,\n handleSubmit,\n control,\n reset: () => {\n // in case the form is scrollable\n formRef?.current?.scrollTo(0, 0);\n // reset react-hook-form form\n reset();\n },\n getFormattedValues: () => {\n return formatValuesForSubmit(formFn.getValues());\n },\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n return (\n <FormElm\n dataCy={props.dataCy}\n stretch={props.stretch}\n onSubmit={props.onSubmit ? handleSubmit(props.onSubmit) : undefined}\n ref={formRef}>\n <FieldsetWrapper stretch={props.stretch}>\n {configuration.map(({ Input, ...conf }) => (\n <Input\n key={conf.name}\n control={control}\n {...conf}\n dataCy={`${props.dataCy}-${conf.name}`}\n readOnly={props.readOnly}\n />\n ))}\n {props.extraInputs && props.extraInputs(control)}\n </FieldsetWrapper>\n {props.buttons}\n </FormElm>\n );\n};\n\nexport const DisplayForm = forwardRef<DisplayFormRef>(_DisplayForm as any) as <TFieldValues extends FieldValues>(\n props: DisplayFormProps<TFieldValues> & {\n ref?: ForwardedRef<DisplayFormRef>;\n },\n) => ReturnType<typeof _DisplayForm>;\n","import { FormattedMessage, useIntl } from 'react-intl';\r\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\r\nimport jApi, { jArticleList, jCommentList } from 'jamespot-user-api';\r\nimport styled from 'styled-components';\r\nimport { Toast } from 'jamespot-front-business';\r\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\r\nimport { DisplayForm } from '../../displayer/DisplayForm.component';\r\nimport { useAppDispatch } from '../../redux/store';\r\nimport { DisplayFormRef } from '../../displayer/types';\r\nimport { useAbortController } from '../../hooks';\r\n\r\nconst ModalForm = commonComponentsRegistry.getLazyComponent('ModalForm');\r\nconst Loader = commonComponentsRegistry.getLazyComponent('Loader');\r\nconst Icon = commonComponentsRegistry.getLazyComponent('Icon');\r\nconst Typography = commonComponentsRegistry.getLazyComponent('Typography');\r\nconst Ellipsis = commonComponentsRegistry.getLazyComponent('Ellipsis');\r\nconst StyledHref = commonComponentsRegistry.getLazyComponent('StyledHref');\r\n\r\nconst Container = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n gap: ${({ theme }) => theme.space.md}px;\r\n`;\r\n\r\nconst ContentPreview = styled.div`\r\n display: flex;\r\n gap: ${({ theme }) => theme.space.md}px;\r\n align-items: center;\r\n border: 1px solid ${({ theme }) => theme.color.grey2};\r\n background-color: ${({ theme }) => theme.color.grey0};\r\n border-radius: ${({ theme }) => theme.size.sm}px;\r\n padding: ${({ theme }) => theme.space.md}px;\r\n`;\r\n\r\nconst ContentWrapper = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n gap: ${({ theme }) => theme.space.sm}px;\r\n`;\r\n\r\nexport type AddReportModalProps = {\r\n onClose: () => void;\r\n articleId: number;\r\n articleUri: string;\r\n commentUri: string;\r\n};\r\n\r\nexport const AddReportModal = ({ onClose, articleId, articleUri, commentUri }: AddReportModalProps) => {\r\n const intl = useIntl();\r\n const formRef = useRef<DisplayFormRef>(null);\r\n const dispatch = useAppDispatch();\r\n const [open, setOpen] = React.useState(true);\r\n const [article, setArticle] = useState<jArticleList>();\r\n const [comment, setComment] = useState<jCommentList>();\r\n const [contentLoading, setContentLoading] = useState(true);\r\n const [submitLoading, setSubmitLoading] = useState(false);\r\n const abortController = useAbortController();\r\n\r\n useEffect(() => {\r\n Promise.all([\r\n (async () => {\r\n const res = await jApi.article.get<jArticleList>(\r\n { idArticle: articleId, format: 'raw-list' },\r\n { signal: abortController.signal },\r\n );\r\n setArticle(res.result);\r\n })(),\r\n (async () => {\r\n if (commentUri) {\r\n const res = await jApi.article.getComments<jCommentList>(\r\n { idArticle: articleId },\r\n {\r\n format: 'raw-list',\r\n signal: abortController.signal,\r\n },\r\n );\r\n setComment(res.result.find((c) => c.uri === commentUri));\r\n }\r\n })(),\r\n ]).then(() => {\r\n setContentLoading(false);\r\n });\r\n }, [abortController, articleId, commentUri]);\r\n\r\n const closeModal = useCallback(() => {\r\n setOpen(false);\r\n onClose();\r\n }, [onClose]);\r\n\r\n const submit = useCallback(\r\n (description?: string) => {\r\n if (!description?.trim()) {\r\n dispatch(\r\n Toast.actions.error({ label: intl.formatMessage({ id: 'CRPT_Report_Description_Required' }) }),\r\n );\r\n } else {\r\n setSubmitLoading(true);\r\n jApi.contentReport\r\n .createReport({\r\n uri: commentUri || articleUri,\r\n description: description,\r\n })\r\n .then(() => {\r\n dispatch(Toast.actions.success({ label: intl.formatMessage({ id: 'CRPT_Report_Sent' }) }));\r\n closeModal();\r\n })\r\n .catch((e) => {\r\n Toast.actions.error({ label: e.errorMsg ?? 'GLOBAL_Error' });\r\n setSubmitLoading(false);\r\n });\r\n }\r\n },\r\n [articleUri, closeModal, commentUri, dispatch, intl],\r\n );\r\n\r\n const submitForm = useCallback(\r\n ({ description }: { description: string }) => {\r\n submit(description);\r\n },\r\n [submit],\r\n );\r\n\r\n return (\r\n <ModalForm\r\n title={intl.formatMessage({ id: 'CRPT_Add_Report' })}\r\n open={open}\r\n closeHandler={closeModal}\r\n onSubmit={async () => submit(formRef.current?.getValues().description)}\r\n enableClickAwayCloseModal\r\n maxHeight={'520px'}\r\n buttons={[\r\n {\r\n children: <FormattedMessage id=\"GLOBAL_Cancel\" />,\r\n color: 'cancel',\r\n clickHandler: closeModal,\r\n },\r\n {\r\n children: <FormattedMessage id=\"GLOBAL_Send\" />,\r\n clickHandler: () => submit(formRef.current?.getValues().description),\r\n color: 'valid',\r\n loading: submitLoading,\r\n },\r\n ]}>\r\n {contentLoading ? (\r\n <Loader size={'l'} />\r\n ) : (\r\n <Container>\r\n <ContentPreview>\r\n <Icon name={commentUri ? 'icon-comment' : 'icon-file'} size={50} variant={'square'} />\r\n <ContentWrapper>\r\n <Typography variant={commentUri ? 'h3' : 'h2'}>\r\n <Ellipsis label={article?.title} length={40} />\r\n </Typography>\r\n {comment && (\r\n <Typography>\r\n {intl.formatMessage({ id: 'CRPT_Comment_Of' })}{' '}\r\n <StyledHref href={comment?._user._url}>{comment?._user.title}</StyledHref>\r\n </Typography>\r\n )}\r\n </ContentWrapper>\r\n </ContentPreview>\r\n <DisplayForm ref={formRef} fields={['description']} type=\"contentReport\" onSubmit={submitForm} />\r\n </Container>\r\n )}\r\n </ModalForm>\r\n );\r\n};\r\n","export const EDITOR_TOP = 90;\nexport const EDITOR_WIDTH = 440;\nexport const EDITOR_MENU_WIDTH = 50;\nexport const EDITOR_CONTENT_WIDTH = EDITOR_WIDTH - EDITOR_MENU_WIDTH;\n","import styled from 'styled-components';\nimport { EDITOR_MENU_WIDTH, EDITOR_WIDTH } from './const';\nimport { DashedFocusBorder } from 'jamespot-react-components';\n\nconst INPUT_HEIGHT = 50;\nconst RADIUS = 8;\n\nexport const CSSEditorComponentWrapper = styled.div`\n margin-bottom: 24px;\n`;\n\nexport const CSSEditorComponentLabel = styled.div`\n margin-bottom: 4px;\n`;\n\nexport const CSSEditorPortal = styled.div<{ isActive: boolean }>`\n position: absolute;\n background-color: ${(props) => (props.isActive ? 'rgba(0,0,0,.1)' : 'transparent')};\n inset: 0;\n pointer-events: ${(props) => (props.isActive ? 'all' : 'none')};\n flex: 1;\n display: flex;\n overflow: hidden;\n`;\n\nexport const CSSEditorHeader = styled.div`\n flex-direction: row;\n display: flex;\n min-height: 60px;\n border-bottom: 1px solid ${(props) => props.theme.color.grey2};\n`;\n\nexport const CSSEditorAction = styled.div`\n width: 60px;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport const CSSEditorLabel = styled.div`\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\n// This is a mask to hide top shadow. EDITOR_WIDTH + 20 is used to keep the left shadow\nexport const CSSEditorMask = styled.div`\n position: relative;\n overflow: hidden;\n top: 0px;\n width: ${EDITOR_WIDTH + 20}px;\n`;\n\nexport const CSSEditor = styled.div<{ position: 'left' | 'right' }>`\n position: absolute;\n top: 0;\n ${(props) => (props.position === 'left' ? 'left: 0px;' : '')}\n ${(props) => (props.position === 'right' ? 'right: -1000px;' : '')}\n width: ${EDITOR_WIDTH}px;\n bottom: 00px;\n display: flex;\n background-color: ${(props) => props.theme.color.white};\n flex-direction: row;\n transition: all 0.4s;\n box-shadow: -4px 0px 20px 0px #00000017;\n\n &.animate {\n right: 0px;\n }\n`;\n\nexport const CSSEditorContent = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 12px;\n overflow: auto;\n margin-bottom: 12px;\n position: relative;\n`;\n\nexport const CSSEditorTab = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n`;\n\nexport const CSSEditorIsBusy = styled.div`\n position: absolute;\n inset: 0;\n background-color: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport const CSSEditorIsLocked = styled.div`\n position: absolute;\n inset: 0;\n background-color: ${(props) => props.theme.color.white};\n padding: ${(props) => props.theme.space.md}px;\n`;\n\nexport const CSSEditorMenu = styled.div`\n width: ${EDITOR_MENU_WIDTH}px;\n padding-top: 60px;\n display: flex;\n flex-direction: column;\n border-right: 1px solid ${(props) => props.theme.color.grey2};\n`;\n\nexport const CSSEditorMenuButton = styled.button<{ isActive?: boolean }>`\n border-radius: 4px;\n cursor: pointer;\n height: 42px;\n margin: 4px;\n width: 42px;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: ${(props) => (props.isActive ? props.theme.color.grey2 : props.theme.color.white)};\n\n ${DashedFocusBorder()}\n\n &:hover {\n background-color: ${(props) => props.theme.color.grey2};\n }\n`;\n\nexport const CSSInputWrapper = styled.div`\n display: flex;\n border: 1px solid ${(props) => props.theme.color.grey1};\n border-radius: ${RADIUS}px;\n margin-bottom: 24px;\n input {\n width: 100%;\n border: 0;\n height: ${INPUT_HEIGHT}px;\n margin: 0;\n }\n`;\n\nexport const CSSEditorWidget = styled.div`\n display: flex;\n flex-direction: row;\n padding: 12px;\n background-color: ${(props) => props.theme.color.grey0};\n border-radius: 8px;\n margin-bottom: 4px;\n`;\n\nexport const CSSEditorWidgetLabel = styled.div`\n display: flex;\n flex: 1;\n align-items: center;\n`;\n\nexport const CSSEditorWidgetOption = styled.div`\n width: 40px;\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nexport const CSSEditorLayer = styled.div`\n flex-direction: row;\n display: flex;\n align-items: center;\n`;\n\nexport const CSSEditorLayerTitle = styled.div`\n flex: 1;\n display: flex;\n align-items: center;\n`;\n","import React from 'react';\nimport { CSSEditorAction, CSSEditorHeader, CSSEditorLabel, CSSEditorMenuButton } from './style';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { WidgetEditor } from 'jamespot-front-business';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\nconst JRCIcon = commonComponentsRegistry.getLazyComponent('Icon');\n\n/*\n Editor popup (center part)\n*/\nexport const EditorPopup = ({ uniqid }: { uniqid: string }) => {\n const dispatch = useAppDispatch();\n const editor = useAppSelector((state) => WidgetEditor.selectors.selectEditor(state, uniqid));\n\n const onClick = () => {\n dispatch(WidgetEditor.slice.actions.flushEditorPopup({ uniqid }));\n };\n\n const onSave = () => {\n dispatch(WidgetEditor.slice.actions.flushEditorPopup({ uniqid }));\n };\n\n if (editor && editor.popup && editor.view) {\n return (\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', backgroundColor: 'white', marginTop: 90 }}>\n <CSSEditorHeader>\n <CSSEditorAction />\n <CSSEditorLabel>Popup</CSSEditorLabel>\n <CSSEditorAction>\n <CSSEditorMenuButton onClick={onClick}>\n <JRCIcon name=\"icon-times\" color=\"grey2\" size={26.75} />\n </CSSEditorMenuButton>\n </CSSEditorAction>\n </CSSEditorHeader>\n <div style={{ flex: 1, display: 'flex' }}>{editor.view}</div>\n <CSSEditorHeader>\n <JRCButton onClick={onSave}>Save</JRCButton>\n </CSSEditorHeader>\n </div>\n );\n }\n\n return <></>;\n};\n","import { Hook, Toast, updateWidgetContent, Widget, WidgetEditor } from 'jamespot-front-business';\nimport jamespot, {\n CombinedWidgetContent,\n ensureWidgetArticleAttachmentType,\n ensureWidgetArticleButtonType,\n ensureWidgetArticleGalleryType,\n ensureWidgetArticleImageType,\n ensureWidgetArticleSliderType,\n ensureWidgetArticleTextType,\n ensureWidgetArticleTitleType,\n ensureWidgetCalendarCalDavType,\n ensureWidgetCheckListType,\n ensureWidgetContactCardDavType,\n ensureWidgetDatasourceTableType,\n ensureWidgetEmailsImapType,\n ensureWidgetExcelDatasourceTableType,\n ensureWidgetLuccaAbsenceType,\n ensureWidgetPresenceType,\n ensureWidgetQuickSurveyType,\n HookListType,\n WidgetArticleAttachmentContent,\n WidgetArticleButtonContent,\n WidgetArticleGalleryContent,\n WidgetArticleImageContent,\n WidgetArticleSliderContent,\n WidgetArticleTextContent,\n WidgetArticleTitleContent,\n WidgetCheckListContent,\n WidgetDatasourceTableContent,\n WidgetPresenceContent,\n WidgetQuickSurveyContent,\n WidgetStateProps,\n} from 'jamespot-user-api';\nimport React, { ReactElement } from 'react';\n\nimport { shallowEqual } from 'react-redux';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { Utils } from 'jamespot-react-components';\nimport { store } from '../../redux/initStore';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\n\nconst WidgetArticleTitleEditor = commonComponentsRegistry.getLazyComponent('WidgetArticleTitleEditor');\nconst WidgetArticleTextEditor = commonComponentsRegistry.getLazyComponent('WidgetArticleTextEditor');\nconst WidgetArticleGalleryEditor = commonComponentsRegistry.getLazyComponent('WidgetArticleGalleryEditor');\nconst WidgetArticleAttachmentEditor = commonComponentsRegistry.getLazyComponent('WidgetArticleAttachmentEditor');\nconst WidgetArticleSliderEditor = commonComponentsRegistry.getLazyComponent('WidgetArticleSliderEditor');\n\nconst WidgetArticleImageEditor = commonComponentsRegistry.getLazyComponent('WidgetArticleImageEditor');\nconst WidgetButtonEditor = commonComponentsRegistry.getLazyComponent('WidgetButtonEditor');\nconst WidgetCheckListEditor = commonComponentsRegistry.getLazyComponent('WidgetCheckListEditor');\nconst WidgetQuickSurveyEditor = commonComponentsRegistry.getLazyComponent('WidgetQuickSurveyEditor');\n\nconst WidgetDatasourceTableEditor = commonComponentsRegistry.getLazyComponent('WidgetDatasourceTableEditor');\nconst WidgetExcelDatasourceTableEditor = commonComponentsRegistry.getLazyComponent('WidgetExcelDatasourceTableEditor');\n\nconst WidgetPresenceEditor = commonComponentsRegistry.getLazyComponent('WidgetPresenceEditor');\n\nconst WidgetLuccaAbsenceEditor = commonComponentsRegistry.getLazyComponent('WidgetLuccaAbsenceEditor');\n\nconst WidgetEmailsImapEditor = commonComponentsRegistry.getLazyComponent('WidgetEmailsImapEditor');\nconst WidgetContactCardDavEditor = commonComponentsRegistry.getLazyComponent('WidgetContactCardDavEditor');\nconst WidgetCalendarCalDavEditor = commonComponentsRegistry.getLazyComponent('WidgetCalendarCalDavEditor');\n\n/*\n Editor Factory\n*/\nexport const Editor = ({ uniqid }: { uniqid: string }) => {\n const dispatch = useAppDispatch();\n const token = useAppSelector(Widget.selectors.selectToken);\n const widgetWrapper = useAppSelector((state) => Widget.selectors.selectWidget(state, uniqid), shallowEqual);\n\n const onSaveCallback = useAppSelector(\n (state) => WidgetEditor.selectors.selectEditor(state, uniqid)?.onSave,\n shallowEqual,\n );\n\n const handleHookIsActive = (name: keyof HookListType) => {\n return Hook.selectors.selectHook(store.getState(), name)?.isActive;\n };\n\n const onSave = (content: Partial<CombinedWidgetContent>) => {\n /*\n Update widget & Flush editor\n */\n if (widgetWrapper) {\n dispatch(Widget.slice.actions.updateWidget({ uniqid, content }));\n }\n\n dispatch(WidgetEditor.slice.actions.flushEditor({ uniqid }));\n\n if (onSaveCallback) {\n onSaveCallback(content);\n }\n };\n\n const onStateChange = (states: WidgetStateProps, id?: string) => {\n /*\n Set widget state (busy, loading, initialized)\n */\n if (id !== undefined) {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid: id, ...states }));\n } else {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, ...states }));\n }\n };\n\n const onOpen = (view: ReactElement) => {\n /*\n Register popup (central)\n */\n dispatch(WidgetEditor.slice.actions.registerEditorPopup({ uniqid, view }));\n };\n\n const widget = widgetWrapper?.widget;\n\n if (!widget) return null;\n\n if (ensureWidgetArticleButtonType(widget)) {\n return (\n <WidgetButtonEditor\n {...widget.content}\n onChange={(content) => {\n dispatch(updateWidgetContent<WidgetArticleButtonContent>(uniqid, content, false));\n }}\n onSave={() => onSave({})}\n />\n );\n } else if (ensureWidgetArticleGalleryType(widget)) {\n return (\n <WidgetArticleGalleryEditor\n token={token}\n content={widget.content}\n onChange={(content) =>\n dispatch(updateWidgetContent<WidgetArticleGalleryContent>(uniqid, content, false))\n }\n onSave={onSave}\n onStateChange={onStateChange}\n />\n );\n } else if (ensureWidgetArticleAttachmentType(widget)) {\n return (\n <WidgetArticleAttachmentEditor\n token={token}\n content={widget.content}\n onChange={(content) => {\n dispatch(updateWidgetContent<WidgetArticleAttachmentContent>(uniqid, content, false));\n }}\n onSave={onSave}\n onStateChange={onStateChange}\n onOpen={onOpen}\n />\n );\n } else if (ensureWidgetLuccaAbsenceType(widget)) {\n return <WidgetLuccaAbsenceEditor />;\n } else if (ensureWidgetArticleImageType(widget)) {\n return (\n <WidgetArticleImageEditor\n content={widget.content}\n token={token}\n onChange={(content) => {\n dispatch(updateWidgetContent<WidgetArticleImageContent>(uniqid, content, false));\n }}\n onSave={onSave}\n onStateChange={onStateChange}\n />\n );\n } else if (ensureWidgetArticleSliderType(widget)) {\n return token !== undefined ? (\n <WidgetArticleSliderEditor\n slides={widget.content.slides ?? []}\n loop={widget.content.loop ?? false}\n useDots={widget.content.useDots ?? true}\n onChange={(content) => {\n dispatch(updateWidgetContent<WidgetArticleSliderContent>(uniqid, content, false));\n }}\n token={token}\n onSave={onSave}\n />\n ) : (\n <>Token is mandatory</>\n );\n } else if (ensureWidgetArticleTitleType(widget)) {\n return (\n <WidgetArticleTitleEditor\n onChange={(content) => {\n dispatch(updateWidgetContent<WidgetArticleTitleContent>(uniqid, content, false));\n }}\n onSave={onSave}\n content={widget.content}\n onOpen={onOpen}\n />\n );\n } else if (ensureWidgetArticleTextType(widget)) {\n return (\n <WidgetArticleTextEditor\n onChange={(content) => {\n dispatch(updateWidgetContent<WidgetArticleTextContent>(uniqid, content, false));\n }}\n onSave={onSave}\n content={widget.content}\n />\n );\n } else if (ensureWidgetPresenceType(widget)) {\n return (\n <WidgetPresenceEditor\n onChange={(content) => {\n dispatch(updateWidgetContent<WidgetPresenceContent>(uniqid, content, false));\n }}\n onSave={onSave}\n onStateChange={onStateChange}\n {...widget.content}\n />\n );\n } else if (ensureWidgetCheckListType(widget)) {\n return (\n <WidgetCheckListEditor\n token={token}\n uniqid={widget.uniqid}\n content={{\n ...widget.content,\n arr: widget.content.arr?.map((w) => ({\n ...w,\n title: Utils.html.htmlDecodeSpecialChars(w.title),\n })),\n }}\n onChangeContent={(uniqid, content) => {\n dispatch(updateWidgetContent(uniqid, content, false));\n }}\n onChangeWrapper={(content) => {\n dispatch(\n Widget.slice.actions.updateWidgetWrapper({\n ...content,\n title: Utils.html.htmlDecodeSpecialChars(content.title),\n }),\n );\n }}\n handleChange={(content) =>\n dispatch(updateWidgetContent<WidgetCheckListContent>(uniqid, content, false))\n }\n />\n );\n } else if (ensureWidgetQuickSurveyType(widget)) {\n return (\n <WidgetQuickSurveyEditor\n token={token}\n uniqid={widget.uniqid}\n content={widget.content}\n onChangeContent={(uniqid, content) => {\n dispatch(updateWidgetContent<WidgetQuickSurveyContent>(uniqid, content, false));\n }}\n onChangeWrapper={(content) => {\n dispatch(Widget.slice.actions.updateWidgetWrapper({ ...content }));\n }}\n handleChange={(content) =>\n dispatch(updateWidgetContent<WidgetQuickSurveyContent>(uniqid, content, false))\n }\n />\n );\n } else if (ensureWidgetExcelDatasourceTableType(widget)) {\n return (\n <WidgetExcelDatasourceTableEditor\n {...widget.content}\n uri={widget.content.uri}\n limit={widget.content.limit ?? 20}\n hook={{ isActive: handleHookIsActive }}\n handlers={{\n jamespot: {\n datasource: jamespot.datasource,\n network: jamespot.network,\n filebank: jamespot.filebank,\n wedoc: jamespot.wedoc,\n },\n handleStart: () => onStateChange({ busy: true }),\n handleCatch: (err) => dispatch(Toast.actions.error({ label: err.errorMsg })),\n handleFinally: () => onStateChange({ busy: false }),\n }}\n onSave={onSave}\n onChange={(content, override) =>\n dispatch(updateWidgetContent<WidgetDatasourceTableContent>(uniqid, content, override ?? false))\n }\n onStateChange={onStateChange}\n onError={(label) => dispatch(Toast.actions.error({ label }))}\n />\n );\n } else if (ensureWidgetEmailsImapType(widget)) {\n return <WidgetEmailsImapEditor />;\n } else if (ensureWidgetContactCardDavType(widget)) {\n return <WidgetContactCardDavEditor />;\n } else if (ensureWidgetCalendarCalDavType(widget)) {\n return <WidgetCalendarCalDavEditor />;\n } else if (ensureWidgetDatasourceTableType(widget)) {\n return (\n <WidgetDatasourceTableEditor\n {...widget.content}\n uri={widget.content.uri}\n limit={widget.content.limit ?? 20}\n hook={{ isActive: handleHookIsActive }}\n handlers={{\n jamespot: {\n datasource: jamespot.datasource,\n network: jamespot.network,\n application: jamespot.application,\n filebank: jamespot.filebank,\n },\n handleStart: () => onStateChange({ busy: true }),\n handleCatch: (err) => dispatch(Toast.actions.error({ label: err.errorMsg })),\n handleFinally: () => onStateChange({ busy: false }),\n }}\n onSave={onSave}\n onChange={(content, override) =>\n dispatch(updateWidgetContent<WidgetDatasourceTableContent>(uniqid, content, override ?? false))\n }\n onStateChange={onStateChange}\n onError={(label) => {\n dispatch(Toast.actions.error({ label }));\n }}\n />\n );\n } else {\n return <>cannot display editor</>;\n }\n};\n","import React from 'react';\nimport { CSSEditorAction, CSSEditorMenuButton } from './style';\nimport { WidgetEditor } from 'jamespot-front-business';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { useAppDispatch } from '../../redux/store';\n\nconst Icon = commonComponentsRegistry.getLazyComponent('Icon');\n\nimport { useTheme } from 'styled-components';\n\nexport const EditorPosition = ({ uniqid, position }: { uniqid: string; position: 'left' | 'right' }) => {\n const dispatch = useAppDispatch();\n const theme = useTheme();\n const onClick = () => {\n dispatch(\n WidgetEditor.slice.actions.setEditorPosition({ uniqid, position: position === 'left' ? 'right' : 'left' }),\n );\n };\n\n return (\n <CSSEditorAction>\n <CSSEditorMenuButton onClick={onClick}>\n <Icon\n name={position === 'left' ? 'icon-angle-right' : 'icon-angle-left'}\n color={theme.color.lavender}\n size={26.75}\n />\n </CSSEditorMenuButton>\n </CSSEditorAction>\n );\n};\n","import React from 'react';\n\nimport styled, { useTheme } from 'styled-components';\nimport { useIntl, FormattedMessage } from 'react-intl';\n\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\n\nconst InputColorRaw = commonComponentsRegistry.getLazyComponent('InputColorRaw');\n\nexport const Label = styled.label`\n margin-left: 2px;\n margin-right: 2px;\n margin-bottom: 8px;\n font-size: 14px;\n width: 100%;\n min-height: 20px;\n`;\n\nexport const Fieldset = styled.fieldset`\n margin: 12px 0px !important;\n width: 100% !important;\n`;\n\nexport const EditorInputColor = ({\n label,\n initialValue,\n handleChange,\n}: {\n label: string;\n initialValue?: string;\n handleChange: (color: string) => void;\n}) => {\n const theme = useTheme();\n const intl = useIntl();\n\n const palettes = [\n {\n name: intl.formatMessage({ id: 'GLOBAL_Platform_Color' }),\n colors: [\n theme.color.primary,\n theme.color.secondary,\n theme.color.headerColor,\n theme.color.lavender,\n theme.color.orange,\n theme.color.green,\n theme.color.navy,\n theme.color.overseas,\n ],\n },\n ];\n\n return (\n <Fieldset>\n <Label>\n <FormattedMessage id={label} />\n </Label>\n <InputColorRaw\n palettes={palettes}\n label={label}\n initialValue={initialValue ?? theme.color.primary}\n name={`background-color`}\n onChange={handleChange}\n />\n </Fieldset>\n );\n};\n","import React from 'react';\n\nimport { useForm } from 'react-hook-form';\nimport { useIntl } from 'react-intl';\n\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\n\nconst JRCInputNumber = commonComponentsRegistry.getLazyComponent('InputNumber');\n\nexport const EditorInputNumber = ({\n label,\n initialValue,\n handleChange,\n}: {\n label: string;\n initialValue?: string;\n handleChange: (value: string) => void;\n}) => {\n const intl = useIntl();\n\n const { control, watch } = useForm({\n defaultValues: { value: initialValue ?? '0' },\n criteriaMode: 'all',\n });\n\n React.useEffect(() => {\n const subscription = watch((data) => {\n handleChange(data.value ?? '');\n });\n return () => subscription.unsubscribe();\n }, [watch, handleChange]);\n\n return (\n <JRCInputNumber\n label={label}\n name={'value'}\n width=\"100%\"\n control={control}\n placeholder={intl.formatMessage({ id: label })}\n />\n );\n};\n","import React, { useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\n\nexport type EditorSelectOption = { label: string; value: string };\nexport type EditorSelectOptions = EditorSelectOption[];\n\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\n\nconst InputSelectExtended = commonComponentsRegistry.getLazyComponent('InputSelectExtended');\n\nexport const EditorInputSelect = ({\n label,\n options = [],\n initialValue,\n required = false,\n handleChange,\n}: {\n label: string;\n options: { label: string; value: string }[];\n initialValue?: string;\n required: boolean;\n handleChange: (value: string) => void;\n}) => {\n const optionFromInitialValue = useMemo(() => {\n if (initialValue && options.find((el) => el.value === initialValue)) {\n return options.find((el) => el.value === initialValue);\n }\n\n return options[0];\n }, [initialValue, options]);\n\n const { control, watch } = useForm({\n defaultValues: { select: optionFromInitialValue },\n criteriaMode: 'all',\n });\n\n React.useEffect(() => {\n const subscription = watch((data: any) => {\n handleChange(data.select.value);\n });\n return () => subscription.unsubscribe();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [watch, handleChange]);\n\n return (\n <InputSelectExtended\n options={options}\n label={label}\n getValue={(o) => o.value}\n getLabel=\"label\"\n getSearch=\"label\"\n rules={{ required }}\n hideDeleteIcon={true}\n required={required}\n control={control}\n name={'select'}\n />\n );\n};\n","import { Widget } from 'jamespot-front-business';\nimport React, { useCallback, useEffect, useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useIntl } from 'react-intl';\n\nimport { EditorInputColor } from './components/EditorInputColor';\nimport { EditorInputNumber } from './components/EditorInputNumber';\nimport { EditorInputSelect } from './components/EditorInputSelect';\n\nimport { shallowEqual } from 'react-redux';\nimport { useTheme } from 'styled-components';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\n\nconst JRCInputText = commonComponentsRegistry.getLazyComponent('InputText');\n\n/*\n Editor tab wrapper (this is all the properties available on a widget wrapper)\n*/\nexport const EditorTabWrapper = ({ uniqid }: { uniqid: string }) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const wrapper = useAppSelector((state) => Widget.selectors.selectWidget(state, uniqid));\n const widgetContext = useAppSelector((state) => Widget.selectors.selectWidgetContext(state, uniqid), shallowEqual);\n const theme = useTheme();\n\n const styles = useAppSelector((state) => Widget.selectors.selectWidgetTitleStyle(state, uniqid), shallowEqual);\n\n const { control, watch } = useForm({\n defaultValues: { text: wrapper?.title.replace(/&amp;/g, '&') ?? '' },\n criteriaMode: 'all',\n });\n\n useEffect(() => {\n const subscription = watch((data: any) => {\n dispatch(Widget.slice.actions.updateWidgetWrapper({ uniqid, title: data.text }));\n });\n return () => subscription.unsubscribe();\n }, [watch, uniqid, dispatch]);\n\n const initialValues = useMemo(() => {\n return {\n color: styles && styles['color'] ? String(styles['color']) : theme.color.black,\n backgroundColor: styles && styles['background-color'] ? String(styles['background-color']) : 'transparent',\n fontSize: styles && styles['font-size'] ? String(styles['font-size']) : '24',\n fontWeight: styles && styles['font-weight'] ? String(styles['font-weight']) : 'medium',\n textAlign: styles && styles['text-align'] ? String(styles['text-align']) : 'left',\n };\n }, [styles, theme]);\n\n const handleChange = useCallback(\n (name: string, value: string | number) => {\n dispatch(\n Widget.slice.actions.setWidgetTitleStyle({\n uniqid,\n styles: { [name]: value },\n }),\n );\n },\n [dispatch, uniqid],\n );\n\n return wrapper ? (\n <>\n <JRCInputText\n name={'text'}\n label={'WIDGET_Title'}\n width=\"100%\"\n control={control}\n placeholder={intl.formatMessage({ id: 'WIDGET_Title' })}\n />\n {widgetContext !== 'comment' && (\n <>\n <EditorInputColor\n label=\"STYLE_Text_Color\"\n initialValue={initialValues.color}\n handleChange={(colorValue) => handleChange('color', colorValue)}\n />\n <EditorInputColor\n label=\"STYLE_Background_Color\"\n initialValue={initialValues.backgroundColor}\n handleChange={(backgroundColorValue) => handleChange('background-color', backgroundColorValue)}\n />\n <EditorInputNumber\n label={'STYLE_Text_Size'}\n initialValue={initialValues.fontSize}\n handleChange={(fontSizeValue) => handleChange('font-size', fontSizeValue)}\n />\n <EditorInputSelect\n label={'STYLE_Font_Weight'}\n initialValue={initialValues.fontWeight}\n options={[\n { label: intl.formatMessage({ id: 'STYLE_Font_Weight_Normal' }), value: 'normal' },\n { label: intl.formatMessage({ id: 'STYLE_Font_Weight_Medium' }), value: 'medium' },\n { label: intl.formatMessage({ id: 'STYLE_Font_Weight_Bold' }), value: 'bold' },\n ]}\n required={false}\n handleChange={(fontWeightValue) => handleChange('font-weight', fontWeightValue)}\n />\n <EditorInputSelect\n label={'STYLE_Text_Align'}\n initialValue={initialValues.textAlign}\n options={[\n { label: intl.formatMessage({ id: 'STYLE_Text_Align_Left' }), value: 'left' },\n { label: intl.formatMessage({ id: 'STYLE_Text_Align_Center' }), value: 'center' },\n { label: intl.formatMessage({ id: 'STYLE_Text_Align_Justify' }), value: 'justify' },\n { label: intl.formatMessage({ id: 'STYLE_Text_Align_Right' }), value: 'right' },\n ]}\n required={false}\n handleChange={(textAlignValue) => handleChange('text-align', textAlignValue)}\n />\n </>\n )}\n </>\n ) : (\n <></>\n );\n};\n","import React from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { CSSEditorIsBusy } from '../style';\nimport { Widget } from 'jamespot-front-business';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppSelector } from '../../../redux/store';\n\nconst Loader = commonComponentsRegistry.getLazyComponent('Loader');\n\nexport const EditorIsBusy = ({ uniqid }: { uniqid: string }) => {\n const isBusy = useAppSelector((state) => Widget.selectors.selectWidgetState(state, uniqid), shallowEqual)?.busy;\n return (\n <>\n {isBusy && (\n <CSSEditorIsBusy>\n <Loader size={'l'} />\n </CSSEditorIsBusy>\n )}\n </>\n );\n};\n","import React from 'react';\n\nimport { useIntl } from 'react-intl';\nimport { CSSEditorIsLocked } from '../style';\nimport { shallowEqual } from 'react-redux';\nimport { Widget } from 'jamespot-front-business';\nimport { useAppSelector } from '../../../redux/store';\n\nexport const EditorIsLocked = ({ uniqid }: { uniqid: string }) => {\n const intl = useIntl();\n const isLocked = useAppSelector((state) => Widget.selectors.selectWidgetState(state, uniqid), shallowEqual)?.locked;\n return isLocked ? (\n <CSSEditorIsLocked>{intl.formatMessage({ id: 'INTRANET_Panel_Change_Off' })}</CSSEditorIsLocked>\n ) : (\n <></>\n );\n};\n","import React from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { Toast, Widget, WidgetEditor } from 'jamespot-front-business';\nimport jApi, { CombinedWidgetContent, WidgetDisplayMode } from 'jamespot-user-api';\nimport { useIntl } from 'react-intl';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\n\nexport const EditorSave = ({ uniqid, mode }: { uniqid: string; mode: WidgetDisplayMode }) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const wrapper = useAppSelector((state) => Widget.selectors.selectWidget(state, uniqid), shallowEqual);\n const uri = useAppSelector((state) => Widget.selectors.selectWidgetObjectUri(state, uniqid), shallowEqual);\n\n const handleClick = () => {\n dispatch(WidgetEditor.slice.actions.flushEditor({ uniqid }));\n const content = wrapper && wrapper.widget && wrapper.widget.content;\n if (!uri || !wrapper || !content) return;\n if (mode == 'view') {\n jApi.widget\n .updateWidget<CombinedWidgetContent>({\n uri,\n uniqid: uniqid,\n title: wrapper.title,\n content: content as CombinedWidgetContent,\n v2: true,\n })\n .catch((e: any) => {\n dispatch(\n Toast.actions.error({\n label: e.errorMsg ?? intl.formatMessage({ id: 'GLOBAL_Error' }),\n }),\n );\n });\n }\n\n if (mode === 'edit') {\n dispatch(Widget.slice.actions.updateWidget({ uniqid, content: content as CombinedWidgetContent }));\n }\n };\n\n return (\n <JRCButton color=\"valid\" onClick={handleClick}>\n {intl.formatMessage({ id: 'GLOBAL_Save' })}\n </JRCButton>\n );\n};\n","import React, { useCallback, useMemo } from 'react';\n\nimport { useIntl } from 'react-intl';\n\nimport { useTheme } from 'styled-components';\n\nimport { shallowEqual } from 'react-redux';\nimport { Widget } from 'jamespot-front-business';\nimport { EditorInputNumber } from './components/EditorInputNumber';\nimport { EditorInputSelect } from './components/EditorInputSelect';\nimport { EditorInputColor } from './components/EditorInputColor';\n\nimport { useAppSelector, useAppDispatch } from '../../redux/store';\n\nexport const EditorTabWidgetSelection = ({ uniqid }: { uniqid: string }) => {\n const theme = useTheme();\n const dispatch = useAppDispatch();\n const intl = useIntl();\n\n const styles = useAppSelector((state) => Widget.selectors.selectWidgetWrapperStyle(state, uniqid), shallowEqual);\n\n const initialValues = useMemo(() => {\n return {\n color: styles && styles['color'] ? String(styles['color']) : theme.color.black,\n backgroundColor:\n styles && styles['background-color'] ? String(styles['background-color']) : theme.color.white,\n padding: styles && styles['padding'] ? String(styles['padding']) : '0',\n borderRadius: styles && styles['border-radius'] ? String(styles['border-radius']) : '0',\n borderColor: styles['border-color'] ? String(styles['border-color']) : theme.color.black,\n borderWidth: styles['border-width'] ? String(styles['border-width']) : '0',\n borderStyle: styles['border-style'] ? String(styles['border-style']) : 'none',\n };\n }, [styles, theme]);\n\n const handleChange = useCallback(\n (name: string, value: string) => {\n dispatch(\n Widget.slice.actions.setWidgetWrapperStyle({\n uniqid,\n styles: { [name]: value },\n }),\n );\n },\n [uniqid, dispatch],\n );\n\n return (\n <>\n <EditorInputColor\n label={'STYLE_Background_Color'}\n initialValue={initialValues.backgroundColor}\n handleChange={(backgroundColorValue) => handleChange('background-color', backgroundColorValue)}\n />\n <EditorInputColor\n label={'STYLE_Text_Color'}\n initialValue={initialValues.color}\n handleChange={(color) => handleChange('color', color)}\n />\n <hr />\n <EditorInputNumber\n label={'STYLE_Padding'}\n initialValue={initialValues.padding}\n handleChange={(paddingValue) => handleChange('padding', String(paddingValue))}\n />\n <EditorInputNumber\n label={'STYLE_Radius'}\n initialValue={initialValues.borderRadius}\n handleChange={(borderRadiusValue) => handleChange('border-radius', String(borderRadiusValue))}\n />\n <EditorInputSelect\n label={'STYLE_Border_Style'}\n initialValue={initialValues.borderStyle}\n options={[\n { label: intl.formatMessage({ id: 'STYLE_Border_Style_None' }), value: 'none' },\n { label: intl.formatMessage({ id: 'STYLE_Border_Style_Solid' }), value: 'solid' },\n { label: intl.formatMessage({ id: 'STYLE_Border_Style_Dashed' }), value: 'dashed' },\n { label: intl.formatMessage({ id: 'STYLE_Border_Style_Dotted' }), value: 'dotted' },\n ]}\n required={false}\n handleChange={(borderStyleValue) => {\n handleChange('border-style', borderStyleValue);\n borderStyleValue !== 'none' && handleChange('border-color', theme.color.black);\n borderStyleValue !== 'none' && handleChange('border-width', '1');\n }}\n />\n {typeof initialValues.borderStyle === 'string' && initialValues.borderStyle !== 'none' && (\n <EditorInputColor\n label={'STYLE_Border_Color'}\n initialValue={initialValues.borderColor}\n handleChange={(borderColorValue) => handleChange('border-color', borderColorValue)}\n />\n )}\n {typeof initialValues.borderStyle === 'string' && initialValues.borderStyle !== 'none' && (\n <EditorInputNumber\n label={'STYLE_Border_Width'}\n initialValue={initialValues.borderWidth}\n handleChange={(borderWidthValue) => handleChange('border-width', borderWidthValue)}\n />\n )}\n </>\n );\n};\n","import React, { useCallback } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { WidgetEditor, Widget } from 'jamespot-front-business';\nimport { useIntl } from 'react-intl';\n\nimport { EditorInputSelect } from './components/EditorInputSelect';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\n\n/**\n *\n * level 1 : Icon only (iOS like)\n * level 2 : Icon + Notification cell (iOS like)\n * level 3 : Default display\n * Level 4 : ???\n *\n */\nexport const EditorTabDisplayLevel = ({ uniqid }: { uniqid: string }) => {\n const dispatch = useAppDispatch();\n const intl = useIntl();\n const editor = useAppSelector((state) => WidgetEditor.selectors.selectEditor(state, uniqid), shallowEqual);\n const def = Widget.definition(editor?.name);\n const level = useAppSelector((state) => Widget.selectors.selectWidgetLevel(state, uniqid), shallowEqual);\n\n const handleChange = useCallback(\n (level: string) => {\n dispatch(Widget.slice.actions.updateWidgetWrapper({ uniqid, level: Number(level) as 1 | 2 | 3 | 4 }));\n },\n [uniqid, dispatch],\n );\n\n return (\n <EditorInputSelect\n handleChange={handleChange}\n required={true}\n label={'WIDGET_Display_Level_Select'}\n initialValue={level ? String(level) : '3'}\n options={[\n { label: intl.formatMessage({ id: 'WIDGET_Display_Level_1' }), value: '1' },\n { label: intl.formatMessage({ id: 'WIDGET_Display_Level_2' }), value: '2' },\n { label: intl.formatMessage({ id: 'WIDGET_Display_Level_3' }), value: '3' },\n { label: intl.formatMessage({ id: 'WIDGET_Display_Level_4' }), value: '4' },\n ].filter((el) =>\n Array.isArray(def.displayLevel) ? def.displayLevel.includes(Number(el.value) as 1 | 2 | 3 | 4) : [],\n )}\n />\n );\n};\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { Editor } from './Editor';\nimport {\n CSSEditor,\n CSSEditorAction,\n CSSEditorContent,\n CSSEditorTab,\n CSSEditorHeader,\n CSSEditorLabel,\n CSSEditorMask,\n CSSEditorMenu,\n CSSEditorMenuButton,\n} from './style';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { useIntl } from 'react-intl';\nimport { EDITOR_CONTENT_WIDTH } from './const';\nimport { EditorPosition } from './EditorPosition';\nimport { EditorTabWrapper } from './EditorTabWrapper';\nimport { EditorIsBusy } from './states/EditorIsBusy';\nimport { EditorIsLocked } from './states/EditorIsLocked';\n\nimport { EditorSave } from './components/EditorSave';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\nimport { useTheme } from 'styled-components';\nimport { EditorTabWidgetSelection } from './EditorTabWidgetSelection';\nimport { EditorTabDisplayLevel } from './EditorTabDisplayLevel';\n\nconst OVERRIDE_SAVE = [\n 'widget-presence',\n 'widget-quick-survey',\n 'widget-check-list',\n 'widget-emails-imap',\n 'widget-contact-cardDav',\n 'widget-calendar-calDav',\n];\n\nconst Icon = commonComponentsRegistry.getLazyComponent('Icon');\nconst Tooltip = commonComponentsRegistry.getLazyComponent('Tooltip');\n\ntype EditorTabs = 'widget-settings' | 'widget-title' | 'widget-selection' | 'widget-level';\ntype EditorTab = {\n name: EditorTabs;\n label: string;\n icon: string;\n enable: boolean;\n};\n\n/*\n Editor wrapper (right part)\n*/\nexport const EditorWrapper = ({ uniqid, position }: { uniqid: string; position: 'left' | 'right' }) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const theme = useTheme();\n const ref = useRef<HTMLDivElement>(null);\n const editor = useAppSelector((state) => WidgetEditor.selectors.selectEditor(state, uniqid), shallowEqual);\n\n const def = Widget.definition(editor?.name);\n\n const enableWidgetLevel = useMemo<boolean>(() => {\n return def.displayLevel !== undefined && Array.isArray(def.displayLevel) && def.displayLevel.length !== 0;\n }, [def]);\n const tabs: EditorTab[] = useMemo(() => {\n return [\n {\n name: 'widget-title',\n label: intl.formatMessage({ id: 'PANEL_Title' }),\n enable: def.panel.useWrapper,\n icon: 'icon-font',\n },\n {\n name: 'widget-selection',\n label: intl.formatMessage({ id: 'PANEL_Widget_Selection' }),\n enable: def.panel.useSelection,\n icon: 'icon-sliders',\n },\n {\n name: 'widget-settings',\n label: intl.formatMessage({ id: 'PANEL_Widget_Settings' }),\n enable: def.panel.useEditor,\n icon: 'icon-pen',\n },\n {\n name: 'widget-level',\n label: intl.formatMessage({ id: 'PANEL_Widget_Level' }),\n enable: enableWidgetLevel,\n icon: 'icon-edit',\n },\n ];\n }, [def, intl, enableWidgetLevel]);\n\n const defaultTab = useMemo<EditorTab | undefined>(() => {\n if (def.panel.useEditor) {\n return tabs.find((el) => el.name === 'widget-settings');\n }\n\n return tabs.filter((el) => el.enable)[0];\n }, [def, tabs]);\n\n const [currentTab, setCurrentTab] = useState<EditorTab | undefined>(defaultTab);\n\n const onClose = () => {\n dispatch(WidgetEditor.slice.actions.flushEditor({ uniqid }));\n };\n\n useEffect(() => {\n setTimeout(() => {\n if (ref && ref.current) {\n ref.current.className = ref.current.className + ' animate';\n }\n }, 0);\n }, []);\n\n return editor ? (\n <CSSEditorMask>\n <CSSEditor ref={ref} position={position}>\n <CSSEditorMenu>\n {tabs\n .filter((tab) => tab.enable)\n .map((tab) => {\n return (\n <CSSEditorMenuButton\n key={tab.name}\n isActive={currentTab && currentTab.name === tab.name}\n onClick={() => setCurrentTab(tab)}>\n <Tooltip position={'left'} description={tab.label}>\n <Icon\n name={tab.icon}\n color={\n currentTab && currentTab.name === tab.name\n ? theme.color.white\n : theme.color.lavender\n }\n />\n </Tooltip>\n </CSSEditorMenuButton>\n );\n })}\n </CSSEditorMenu>\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', width: `${EDITOR_CONTENT_WIDTH}px` }}>\n <CSSEditorHeader>\n <EditorPosition uniqid={uniqid} position={editor.position} />\n <CSSEditorLabel>\n <h3>{currentTab ? currentTab.label : intl.formatMessage({ id: def.label })}</h3>\n </CSSEditorLabel>\n <CSSEditorAction>\n <CSSEditorMenuButton onClick={onClose}>\n <Icon name=\"icon-times\" color={theme.color.lavender} size={26.75} />\n </CSSEditorMenuButton>\n </CSSEditorAction>\n </CSSEditorHeader>\n <CSSEditorContent>\n <CSSEditorTab>\n {currentTab && currentTab.name === 'widget-settings' && def.panel.useEditor && (\n <Editor uniqid={editor.uniqid} />\n )}\n {currentTab && currentTab.name === 'widget-title' && def.panel.useWrapper && (\n <EditorTabWrapper uniqid={editor.uniqid} />\n )}\n {currentTab && currentTab.name === 'widget-selection' && (\n <EditorTabWidgetSelection uniqid={uniqid} />\n )}\n {currentTab && currentTab.name === 'widget-level' && enableWidgetLevel && (\n <EditorTabDisplayLevel uniqid={uniqid} />\n )}\n </CSSEditorTab>\n <EditorIsBusy uniqid={uniqid} />\n <EditorIsLocked uniqid={uniqid} />\n {OVERRIDE_SAVE.includes(editor.name) && <EditorSave uniqid={uniqid} mode={editor.mode} />}\n </CSSEditorContent>\n </div>\n </CSSEditor>\n {editor?.popup ? (\n <div style={{ position: 'absolute', inset: 0, backgroundColor: '#000', opacity: '.7' }}></div>\n ) : (\n <></>\n )}\n </CSSEditorMask>\n ) : (\n <></>\n );\n};\n","import React, { useEffect } from 'react';\n\nimport { shallowEqual } from 'react-redux';\n\nimport { EDITOR_TOP, EDITOR_WIDTH } from './const';\nimport { EditorPopup } from './EditorPopup';\nimport { EditorWrapper } from './EditorWrapper';\nimport { CSSEditorPortal } from './style';\nimport { WidgetEditor } from 'jamespot-front-business';\n\nimport styled from 'styled-components';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\n\nexport const CSSEditorPortalWrapper = styled.div`\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 1;\n`;\n\nexport const CSSEditorPortalPopupWrapper = styled.div<{ isActive: boolean }>`\n flex: 1;\n display: flex;\n margin-top: ${EDITOR_TOP}px;\n pointer-events: ${(props) => (props.isActive ? 'all' : 'none')};\n`;\n\nexport const CSSEditorPortalRow = styled.div`\n flex: 1;\n display: flex;\n flex-direction: row;\n pointer-events: none;\n`;\n\nexport const CSSEditorPortalFreeSpace = styled.div`\n width: ${EDITOR_WIDTH}px;\n pointer-events: none;\n`;\n\n/*\n Editors wrapper (template)\n*/\nexport const EditorsPortal = () => {\n const dispatch = useAppDispatch();\n useEffect(() => {\n const flush = () => {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n };\n\n window.addEventListener('NGWidgetEditorFlushAll', flush);\n return () => {\n window.removeEventListener('NGWidgetEditorFlushAll', flush);\n };\n }, [dispatch]);\n\n const editors = useAppSelector(WidgetEditor.selectors.selectEditors, shallowEqual);\n\n return (\n <CSSEditorPortalWrapper className=\"editor-portal-wrapper\">\n {editors.map((editor) => {\n return (\n <CSSEditorPortal isActive={false} key={editor.uniqid}>\n <CSSEditorPortalRow>\n {editor.position === 'left' ? (\n <>\n <EditorWrapper uniqid={editor.uniqid} position={editor.position}></EditorWrapper>\n <CSSEditorPortalPopupWrapper isActive={editor.popup !== undefined}>\n <EditorPopup uniqid={editor.uniqid} />\n </CSSEditorPortalPopupWrapper>\n <CSSEditorPortalFreeSpace />\n </>\n ) : (\n <>\n <CSSEditorPortalFreeSpace />\n <CSSEditorPortalPopupWrapper isActive={editor.popup !== undefined}>\n <EditorPopup uniqid={editor.uniqid} />\n </CSSEditorPortalPopupWrapper>\n <EditorWrapper uniqid={editor.uniqid} position={editor.position}></EditorWrapper>\n </>\n )}\n </CSSEditorPortalRow>\n </CSSEditorPortal>\n );\n })}\n </CSSEditorPortalWrapper>\n );\n};\n","import React, { useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { v4 as uuidv4 } from 'uuid';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { EditorsPortal } from '../../editors/EditorsPortal';\n\nconst JRCThemeProvider = commonComponentsRegistry.getLazyComponent('ThemeProvider');\n\nconst createPortalElement = (parent: HTMLElement): HTMLDivElement => {\n let portal = document.getElementById('react-portals') as HTMLDivElement;\n\n if (!portal) {\n portal = document.createElement('div');\n portal.id = uuidv4();\n parent.appendChild(portal);\n }\n\n return portal;\n};\nexport const EditorsPanel = () => {\n const portalDiv = document.getElementById('react-portals');\n const portal = useMemo(() => portalDiv && createPortalElement(portalDiv), [portalDiv]);\n\n if (!portal) {\n return null;\n }\n return createPortal(\n <JRCThemeProvider>\n <EditorsPortal />\n </JRCThemeProvider>,\n portal,\n );\n};\n","import { DashedFocusBorder } from 'jamespot-react-components';\nimport styled from 'styled-components';\n\nexport const CSSSquareWidgetWrapper = styled.div`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 10px;\n justify-content: center;\n`;\n\nexport const CSSSquareWidget = styled.div<{ available: boolean }>`\n border: 1px solid ${(props) => props.theme.color.grey2};\n border-radius: 8px;\n cursor: pointer;\n padding: 12px;\n position: relative;\n opacity: ${(props) => (props.available ? '1' : '.4')};\n pointer-events: ${(props) => (props.available ? 'all' : 'none')};\n\n .show-on-hover {\n position: absolute;\n inset: 0;\n border-radius: 8px;\n justify-content: center;\n align-items: center;\n display: flex;\n opacity: 0;\n background-color: #ffffffe6;\n }\n\n &:hover {\n .show-on-hover {\n opacity: 1;\n }\n }\n`;\n\nexport const CSSWidgetButton = styled.div<{ open: boolean; height: number }>`\n border: 2px solid ${(props) => props.theme.color.primary};\n height: ${(props) => (props.open ? props.height : '54')}px;\n border-radius: 8px;\n display: flex;\n justify-content: top;\n flex-direction: column;\n transition: height 0.4s;\n overflow: hidden;\n flex-direction: column;\n`;\n\nexport const CSSWrapWidgetWrapper = styled.div<{ column?: boolean }>`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: center;\n gap: 10px;\n ${(props) => props.column && `flex-direction: column;`}\n`;\n\nexport const CSSWrapTitle = styled.div`\n min-height: 50px;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n color: ${(props) => props.theme.color.primary};\n &:hover {\n background-color: ${(props) => props.theme.color.grey0};\n }\n`;\n\nexport const CSSWrapWidget = styled.button<{ open: boolean; index: number; full?: boolean; parentIsColumn?: boolean }>`\n display: flex;\n align-items: center;\n padding: ${(props) => (props.parentIsColumn ? '36px 16px' : '0 10px')};\n gap: 10px;\n width: 40%;\n border: 1px solid ${(props) => props.theme.color.grey1};\n border-radius: 8px;\n transition: opacity 0.4s ease ${(props) => props.index * 40}ms;\n opacity: ${(props) => (props.open ? 1 : 0)};\n img {\n width: 40px;\n }\n ${(props) => props.full && `flex: 1; width: 100%;`}\n ${(props) => props.parentIsColumn && `flex-basis: 72px;`}\n ${(props) => !props.parentIsColumn && `height: 72px;`}\n &:hover {\n background-color: ${(props) => props.theme.color.grey0};\n }\n\n ${DashedFocusBorder()}\n`;\n\nexport const Flex = styled.div<{ direction: 'row' | 'column'; gap?: number }>`\n display: flex;\n flex-direction: ${(props) => (props.direction === 'row' ? 'row' : 'column')};\n align-items: ${(props) => (props.direction === 'row' ? 'center' : 'flex-start')};\n justify-content: ${(props) => (props.direction === 'row' ? 'flex-start' : 'center')};\n flex: 1;\n ${(props) => props.gap && `gap:${props.gap}px`}\n`;\n","import React, { useMemo, useState } from 'react';\nimport { FormattedMessage, useIntl } from 'react-intl';\nimport { WidgetDefinitionProps, WidgetKeys, WidgetWrapperProps } from 'jamespot-user-api';\nimport { Widget } from 'jamespot-front-business';\nimport { JRCModalLayoutProps } from 'jamespot-react-components';\nimport { getBuilderWidgets } from '../namespace';\nimport {\n CSSSquareWidget,\n CSSSquareWidgetWrapper,\n CSSWidgetButton,\n CSSWrapTitle,\n CSSWrapWidget,\n CSSWrapWidgetWrapper,\n Flex,\n} from './WidgetList.style';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\nconst JRCModalLayout = commonComponentsRegistry.getLazyComponent('ModalLayout');\nconst JRCModalContent = commonComponentsRegistry.getLazyComponent('ModalContent');\nconst JRCTooltip = commonComponentsRegistry.getLazyComponent('Tooltip');\nconst JRCIconButton = commonComponentsRegistry.getLazyComponent('IconButton');\n\ntype WidgetListMode = 'button' | 'list' | 'gallery' | 'custom' | 'article' | 'comment';\n\n/*\n Widget Builder\n*/\nexport const WidgetList = ({\n mode,\n view,\n children,\n namespace = 'default',\n onChange,\n}: {\n mode?: WidgetListMode;\n view?: string;\n children?: any;\n namespace?: string;\n onChange: (widget: WidgetWrapperProps) => void;\n}) => {\n const [isOpen, setOpen] = useState<boolean>(false);\n const widgets = getBuilderWidgets(namespace);\n const intl = useIntl();\n\n const args: JRCModalLayoutProps = {\n open: isOpen,\n portalId: 'react-modal',\n variant: 'full-height',\n closeHandler: () => setOpen(false),\n };\n\n const onClick = (name: WidgetKeys) => {\n onChange(Widget.factory(name));\n setOpen(false);\n };\n return (\n <>\n <JRCModalLayout {...args}>\n <JRCModalContent\n onClickIconClose={args.closeHandler}\n buttons={\n mode === 'comment'\n ? [\n {\n children: <FormattedMessage id=\"GLOBAL_Close\" />,\n color: 'cancel',\n clickHandler: () => setOpen(false),\n },\n ]\n : undefined\n }\n title={intl.formatMessage({ id: 'WIDGET_Builder' })}>\n {mode === 'comment' ? (\n <CSSWrapWidgetWrapper column>\n {widgets.map((widget, index) => (\n <CSSWrapWidget\n key={widget.name}\n open={true}\n full\n parentIsColumn\n index={index}\n onClick={() => onClick(widget.name)}>\n <Flex direction={'row'} gap={12}>\n <img src={widget.img} />\n <Flex direction={'column'}>\n <h3>{intl.formatMessage({ id: widget.label })}</h3>\n <p>{intl.formatMessage({ id: widget.description })}</p>\n </Flex>\n </Flex>\n </CSSWrapWidget>\n ))}\n </CSSWrapWidgetWrapper>\n ) : (\n <CSSSquareWidgetWrapper>\n {widgets.map((widget, index: number) => {\n return (\n <CSSSquareWidget\n key={index}\n onClick={() => onClick(widget.name)}\n available={widget.available}>\n <img src={widget.img} />\n <div className=\"show-on-hover\">{intl.formatMessage({ id: widget.label })}</div>\n </CSSSquareWidget>\n );\n })}\n </CSSSquareWidgetWrapper>\n )}\n </JRCModalContent>\n </JRCModalLayout>\n {mode === 'custom' && children ? <div onClick={() => setOpen(true)}>{children}</div> : <></>}\n {mode === 'button' && view === 'edit' ? (\n <JRCButton onClick={() => setOpen(true)} variant={'outlined'} minWidth={'100%'}>\n {intl.formatMessage({ id: 'WIDGET_Add_Widget' })}\n </JRCButton>\n ) : (\n <></>\n )}\n {mode === 'gallery' && view === 'edit' ? (\n <CSSSquareWidgetWrapper>\n {widgets.map((widget, index: number) => {\n return (\n <CSSSquareWidget\n key={index}\n onClick={() => onClick(widget.name)}\n available={widget.available}>\n <img src={widget.img} />\n <div className=\"show-on-hover\">{intl.formatMessage({ id: widget.label })}</div>\n </CSSSquareWidget>\n );\n })}\n </CSSSquareWidgetWrapper>\n ) : (\n <></>\n )}\n {mode === 'article' && view === 'edit' ? <WidgetModeArticle widgets={widgets} onClick={onClick} /> : <></>}\n {mode === 'comment' && view === 'edit' ? (\n <WidgetModeComment\n onClick={() => {\n setOpen(true);\n }}\n />\n ) : (\n <></>\n )}\n </>\n );\n};\n\nconst HEIGHT_CLOSED = 50;\nconst HEIGHT = 80;\nconst MARGIN_BOTTOM = 10;\n\nconst WidgetModeArticle = ({\n widgets,\n onClick,\n}: {\n widgets: WidgetDefinitionProps[];\n onClick: (name: WidgetKeys) => void;\n}) => {\n const [open, isOpen] = useState(false);\n const intl = useIntl();\n\n const calcHeight = useMemo(() => {\n return Math.ceil(widgets.length / 2) * HEIGHT + HEIGHT_CLOSED + MARGIN_BOTTOM;\n }, [widgets]);\n\n return (\n <>\n <CSSWidgetButton open={open} height={calcHeight}>\n <CSSWrapTitle onClick={() => isOpen(!open)}>\n {intl.formatMessage({ id: 'WIDGET_Add_Widget' })}\n </CSSWrapTitle>\n <CSSWrapWidgetWrapper>\n {widgets.map((widget, index) => {\n return (\n <CSSWrapWidget\n key={widget.name}\n open={open}\n index={index}\n onClick={() => onClick(widget.name)}>\n <img src={widget.img} />\n {intl.formatMessage({ id: widget.label })}\n </CSSWrapWidget>\n );\n })}\n </CSSWrapWidgetWrapper>\n </CSSWidgetButton>\n </>\n );\n};\n\nconst WidgetModeComment = ({ onClick }: { onClick: () => void }) => {\n const intl = useIntl();\n return (\n <>\n <JRCTooltip description={intl.formatMessage({ id: 'COMMENT_Add_Widget' })}>\n <JRCIconButton\n bg={'grey1'}\n bgHover={'grey2'}\n color={'grey5'}\n iconSize={22}\n onClick={() => {\n onClick();\n }}\n icon={'icon-fs-puzzle'}\n />\n </JRCTooltip>\n </>\n );\n};\n","import { Widget } from 'jamespot-front-business';\nimport { WidgetDefinitionProps, WidgetsName } from 'jamespot-user-api';\n\nexport function getBuilderWidgets(namespace: string): WidgetDefinitionProps[] {\n switch (namespace) {\n case 'widget-article-image':\n return [Widget.definition(WidgetsName.ArticleTitle), Widget.definition(WidgetsName.ArticleButton)];\n case 'comment':\n return [\n Widget.definition(WidgetsName.CheckList),\n Widget.definition(WidgetsName.Presence),\n Widget.definition(WidgetsName.QuickSurvey),\n ];\n default:\n return [\n Widget.definition(WidgetsName.ArticleTitle),\n Widget.definition(WidgetsName.ArticleText),\n Widget.definition(WidgetsName.ArticleImage),\n Widget.definition(WidgetsName.ArticleButton),\n Widget.definition(WidgetsName.ArticleSlider),\n Widget.definition(WidgetsName.ArticleAttachment),\n Widget.definition(WidgetsName.Presence),\n ];\n }\n}\n","import { useMemo, useState } from 'react';\r\nimport { Editor, JTinyMCEExtensionsBuilders } from 'jamespot-react-components';\r\nimport { useIntl } from 'react-intl';\r\n\r\nexport const useMarkdownModal = (): {\r\n open: boolean;\r\n onInsert: (v: string) => void;\r\n close: () => void;\r\n ext: ReturnType<typeof JTinyMCEExtensionsBuilders.markdown>;\r\n isActive?: boolean;\r\n} => {\r\n const intl = useIntl();\r\n const [open, setOpen] = useState(false);\r\n const [editor, setEditor] = useState<Editor>();\r\n const ext = useMemo(\r\n () =>\r\n JTinyMCEExtensionsBuilders.markdown((ed) => {\r\n setEditor(ed);\r\n setOpen(true);\r\n }, intl),\r\n [intl],\r\n );\r\n return {\r\n open,\r\n onInsert: (v: string) => {\r\n editor?.execCommand('InsertHTML', false, v);\r\n },\r\n close: () => setOpen(false),\r\n ext,\r\n isActive: true,\r\n };\r\n};\r\n","import React, { ReactNode, useEffect, useRef, useState } from 'react';\nimport { jFileLittle } from 'jamespot-user-api';\nimport { Widget } from 'jamespot-front-business';\nimport styled from 'styled-components';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppSelector } from '../../../redux/store';\n\nconst JRCInputFileAdvancedRaw = commonComponentsRegistry.getLazyComponent('InputFileAdvancedRaw');\n\nexport const CSSHidden = styled.div`\n width: 0;\n height: 0;\n overflow: hidden;\n`;\n\ntype InplaceUploaderProps = {\n children: ReactNode;\n initialFiles: jFileLittle[];\n initialClick?: boolean;\n multiple: boolean;\n accept: string;\n onUploadStart: () => void;\n onUploadEnd: () => void;\n onUploadSuccess: (files: jFileLittle[]) => void;\n};\n\nexport const WidgetUploader = ({\n children,\n initialFiles,\n initialClick,\n multiple,\n accept,\n onUploadStart,\n onUploadEnd,\n onUploadSuccess,\n}: InplaceUploaderProps) => {\n const uploadRef = useRef<HTMLInputElement>(null);\n const token = useAppSelector(Widget.selectors.selectToken);\n const [total, setTotal] = useState<number>(0);\n const [files, setFiles] = useState<jFileLittle[]>(initialFiles);\n\n useEffect(() => {\n if (initialClick) {\n uploadRef.current?.click();\n }\n }, [initialClick]);\n\n useEffect(() => {\n if (initialFiles.length !== files.length) {\n setFiles(initialFiles);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialFiles]);\n\n useEffect(() => {\n onUploadSuccess(files);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [files]);\n\n useEffect(() => {\n if (total === 0) {\n onUploadEnd();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [total]);\n\n return (\n <>\n <div\n onClick={() => {\n if (initialClick) {\n uploadRef.current?.click();\n }\n }}>\n {children}\n </div>\n <CSSHidden>\n <JRCInputFileAdvancedRaw\n ref={uploadRef}\n id=\"widget-upload-file\"\n name=\"editorFiles\"\n content={''}\n accept={accept as any}\n multiple={multiple}\n token={token}\n onUploadStart={(totalFile) => {\n if (totalFile !== undefined) {\n setTotal((prevTotal) => prevTotal + totalFile);\n }\n if (typeof onUploadStart === 'function' && totalFile !== 0) {\n onUploadStart();\n }\n }}\n onUploadSuccess={(fileResponse) => {\n if (fileResponse === undefined) {\n return;\n }\n setTotal((prevTotal) => (prevTotal !== undefined ? prevTotal - 1 : 0));\n setFiles((prevFiles) => (multiple ? [...prevFiles, fileResponse] : [fileResponse]));\n }}\n />\n </CSSHidden>\n </>\n );\n};\n","import React, { useEffect } from 'react';\nimport styled from 'styled-components';\nimport { shallowEqual } from 'react-redux';\nimport { useIntl } from 'react-intl';\nimport jamespot, {\n jFileLittle,\n WidgetArticleAttachmentType,\n WidgetDisplayMode,\n WidgetArticleAttachmentContent,\n resolveFilePath,\n} from 'jamespot-user-api';\nimport { Application, Toast, Widget, updateWidgetContent } from 'jamespot-front-business';\nimport { JRCFileViewerOpenWithOptionsType } from 'jamespot-react-components';\nimport { WidgetUploader } from '../components/WidgetUploader';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst WidgetAttachment = commonComponentsRegistry.getLazyComponent('WidgetAttachment');\nconst JRCWidgetEmptyInplace = commonComponentsRegistry.getLazyComponent('WidgetEmptyInplace');\nconst FileViewer = commonComponentsRegistry.getLazyComponent('FileViewer');\n\n// DUPLICATE FROM WEDOC\nexport const wedocWindowOpen = (idFile: number, hash: string, target?: '_blank') => {\n window.open(getWedocFilePath(idFile, hash), target);\n};\n\n// DUPLICATE FROM WEDOC\nexport function getWedocFilePath(idFile: number, hash: string) {\n return `/ng/rr/file/${idFile}/${hash}`;\n}\n\nexport const CSSWrapper = styled.div`\n flex: 1;\n`;\n\nexport const JRCWidgetArticleAttachmentWrapper = ({\n widget,\n inplace,\n mode,\n}: {\n widget: WidgetArticleAttachmentType;\n inplace?: boolean;\n mode?: WidgetDisplayMode;\n}) => {\n const intl = useIntl();\n const { uniqid } = widget;\n const { files } = widget.content;\n const dispatch = useAppDispatch();\n const isActive = useAppSelector((state) => Widget.selectors.isActive(state, uniqid), shallowEqual);\n\n const onError = (message?: string) => {\n dispatch(Toast.actions.error({ label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\n };\n\n useEffect(() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, mounted: true }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n dispatch(\n Widget.slice.actions.setWidgetState({\n uniqid,\n empty: !files || files.length === 0,\n }),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [files]);\n\n const weDoc = useAppSelector((state) => Application.selectors.selectById(state, 'WeDocHook'));\n\n const onClick = (file: jFileLittle | undefined) => {\n if (!file) {\n return;\n }\n jamespot.object\n .getAccessHash(`fileArticle/${file.id}`)\n .then((response) => {\n if (response.result === '') {\n throw new Error('result empty');\n }\n const hash = response.result;\n wedocWindowOpen(file.id, hash);\n })\n .catch(() => {\n dispatch(Toast.actions.error({ label: 'WIDGET_Open_Failed' }, 6000));\n });\n };\n\n const option = [\n {\n label: intl.formatMessage({ id: 'WIDGET_Open_With_Wedoc' }),\n onClick: onClick,\n },\n ];\n\n const openWithOptions: JRCFileViewerOpenWithOptionsType = weDoc\n ? [\n {\n condition: (f) =>\n [\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n ].includes(f.mimetype),\n options: option,\n },\n ]\n : [];\n\n return files !== undefined ? (\n <CSSWrapper>\n {mode !== 'view' ? (\n <WidgetAttachment files={files} onClick={() => undefined} onError={onError} />\n ) : (\n <FileViewer files={files} openWithOptions={openWithOptions}>\n {(open) => {\n return (\n <WidgetAttachment\n files={files.map((f) => ({\n ...f,\n uri: resolveFilePath(f),\n }))}\n onClick={(idFile) => open(idFile)}\n onError={onError}\n />\n );\n }}\n </FileViewer>\n )}\n {inplace && mode !== 'view' && (\n <WidgetUploader\n initialFiles={files}\n initialClick={isActive}\n multiple={true}\n accept={'*'}\n onUploadSuccess={(files) => {\n if (Array.isArray(files)) {\n dispatch(\n updateWidgetContent<WidgetArticleAttachmentContent>(uniqid, {\n files: files.map((f) => ({\n ...f,\n uri: resolveFilePath(f) ?? '',\n })),\n }),\n );\n }\n }}\n onUploadStart={() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: true }));\n }}\n onUploadEnd={() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: false }));\n }}>\n {mode === 'edit' ? (\n <JRCWidgetEmptyInplace\n label={'WIDGET_Article_Attachment_Empty_Label'}\n description={'WIDGET_Article_Attachment_Empty_Description'}\n url={'widget-article-image-placeholder.png'}\n onClick={() => undefined}\n />\n ) : (\n <></>\n )}\n </WidgetUploader>\n )}\n </CSSWrapper>\n ) : (\n <></>\n );\n};\n","import React, { useEffect } from 'react';\nimport styled from 'styled-components';\nimport { WidgetArticleButtonType, WidgetDisplayMode } from 'jamespot-user-api';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch } from '../../../redux/store';\n\nconst JRCWidgetButton = commonComponentsRegistry.getLazyComponent('WidgetButton');\n\nconst CSSButtonWrapper = styled.div`\n display: flex;\n flex: 1;\n justify-content: center;\n align-items: center;\n`;\n\nconst CSSPointer = styled.div<{ clickable: boolean }>`\n pointer-events: ${(props) => (props.clickable ? 'all' : 'none')};\n cursor: pointer;\n display: flex;\n flex: 1;\n justify-content: center;\n align-items: center;\n`;\n\nexport const JRCWidgetArticleButtonWrapper = ({\n widget,\n mode,\n}: {\n widget: WidgetArticleButtonType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n}) => {\n const dispatch = useAppDispatch();\n const { uniqid } = widget;\n const { text, url, target, color, backgroundColor, buttonSize, borderRadius, variant } = widget.content;\n\n useEffect(() => {\n dispatch(\n Widget.slice.actions.setWidgetState({\n uniqid,\n empty: !text || text.length === 0,\n }),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [text]);\n\n return (\n <CSSButtonWrapper\n onClick={() => {\n if (mode === 'edit') {\n dispatch(WidgetEditor.slice.actions.registerEditor({ uniqid, name: widget.name }));\n }\n }}>\n <CSSPointer clickable={mode !== 'edit'}>\n <JRCWidgetButton\n text={text}\n url={url}\n target={target}\n color={color}\n backgroundColor={backgroundColor}\n buttonSize={buttonSize}\n borderRadius={borderRadius}\n variant={variant}\n />\n </CSSPointer>\n </CSSButtonWrapper>\n );\n};\n","import React, { useEffect } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport styled from 'styled-components';\nimport { WidgetArticleGalleryContent, WidgetArticleGalleryType, WidgetDisplayMode } from 'jamespot-user-api';\nimport { Widget, updateWidgetContent } from 'jamespot-front-business';\nimport { WidgetUploader } from '../components/WidgetUploader';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst JRCWidgetArticleGallery = commonComponentsRegistry.getLazyComponent('WidgetArticleGallery');\nconst JRCWidgetEmptyInplace = commonComponentsRegistry.getLazyComponent('WidgetEmptyInplace');\nconst FileViewer = commonComponentsRegistry.getLazyComponent('FileViewer');\n\nconst CSSImagePointer = styled.button`\n cursor: pointer;\n`;\n\nexport const JRCWidgetArticleGalleryWrapper = ({\n widget,\n inplace,\n mode,\n}: {\n widget: WidgetArticleGalleryType;\n inplace?: boolean;\n mode?: WidgetDisplayMode;\n}) => {\n const { uniqid } = widget;\n const { files } = widget.content;\n const dispatch = useAppDispatch();\n const isActive = useAppSelector((state) => Widget.selectors.isActive(state, uniqid), shallowEqual);\n\n useEffect(() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, mounted: true }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return files !== undefined ? (\n <>\n {mode === 'edit' ? (\n <JRCWidgetArticleGallery\n files={files}\n maxWidth={800}\n gap={widget.content.gap ?? '10'}\n column={widget.content.column ?? '3'}\n onClick={() => undefined}\n />\n ) : (\n <FileViewer files={files} openWithOptions={[]}>\n {(open) => {\n return (\n <CSSImagePointer>\n <JRCWidgetArticleGallery\n files={files}\n maxWidth={600}\n gap={widget.content.gap ?? '10'}\n column={widget.content.column ?? '3'}\n onClick={(idFile) => open(idFile)}\n />\n </CSSImagePointer>\n );\n }}\n </FileViewer>\n )}\n {inplace && mode === 'edit' ? (\n <WidgetUploader\n initialFiles={files}\n initialClick={isActive}\n accept={'image/png, image/jpeg, image/jpg'}\n multiple={true}\n onUploadSuccess={(files) => {\n if (Array.isArray(files)) {\n dispatch(updateWidgetContent<WidgetArticleGalleryContent>(uniqid, { files }));\n }\n }}\n onUploadStart={() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: true }));\n }}\n onUploadEnd={() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: false }));\n }}>\n <JRCWidgetEmptyInplace\n label={'WIDGET_Article_Gallery_Empty_Label'}\n description={'WIDGET_Article_Gallery_Empty_Description'}\n url={'widget-article-image-placeholder.png'}\n onClick={() => undefined}\n />\n </WidgetUploader>\n ) : (\n <></>\n )}\n </>\n ) : (\n <></>\n );\n};\n","import React, { useMemo } from 'react';\nimport { Widget } from 'jamespot-front-business';\n\nimport { shallowEqual } from 'react-redux';\nimport { useAppSelector } from '../../../../redux/store';\nimport styled from 'styled-components';\n\nexport const UIWrapper = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\nexport const WidgetStylePadding = ({ uniqid, children }: { uniqid: string; children: React.ReactNode }) => {\n const styles = useAppSelector((state) => Widget.selectors.selectWidgetWrapperStyle(state, uniqid), shallowEqual);\n\n const initialValues = useMemo(() => {\n return {\n padding: styles && styles['padding'] ? `${styles['padding']}px` : '0px',\n };\n }, [styles]);\n\n return <UIWrapper style={{ padding: initialValues.padding }}>{children}</UIWrapper>;\n};\n","import React from 'react';\nimport styled from 'styled-components';\n\nexport const UIFlex = styled.div`\n flex-direction: column;\n display: flex;\n flex: 1;\n`;\n\nexport const UIScrollWrapper = styled.div`\n position: relative;\n display: flex;\n flex: 1;\n`;\n\nexport const UIScroll = styled.div`\n overflow: auto;\n position: absolute;\n inset: 0;\n`;\n\n// TODO: BETTER NAMING ?\nexport const WidgetScroll = ({\n header,\n scrollable,\n footer,\n}: {\n header?: () => React.ReactNode;\n scrollable?: () => React.ReactNode;\n footer?: () => React.ReactNode;\n}) => {\n return (\n <UIFlex>\n {header && header()}\n <UIScrollWrapper>\n <UIScroll>{scrollable && scrollable()}</UIScroll>\n </UIScrollWrapper>\n {footer && footer()}\n </UIFlex>\n );\n};\n","import React from 'react';\n\nimport { Widget } from 'jamespot-front-business';\n\nimport { shallowEqual } from 'react-redux';\nimport { useAppSelector } from '../../../../redux/store';\nimport styled from 'styled-components';\n\nexport const CSSWidgetTitle = styled.div`\n padding: ${(props) => props.theme.space.md}px;\n padding-right: 0px;\n`;\n\nexport const UITitle = styled.div<{ fontSize: string; fontWeight: string; textAlign: string; color: string }>`\n text-align: ${(props) => props.textAlign};\n font-size: ${(props) => props.fontSize}px;\n font-weight: ${(props) => props.fontWeight};\n color: ${(props) => props.color};\n`;\n\nexport const WidgetIntranetTitle = ({\n uniqid,\n textAlign = 'left',\n fontSize = '16',\n fontWeight = 'medium',\n color,\n}: {\n uniqid: string;\n textAlign: string;\n fontSize: string;\n fontWeight: string;\n color: string;\n}) => {\n const widgetWrapper = useAppSelector((state) => Widget.selectors.selectWidget(state, uniqid), shallowEqual);\n return (\n <>\n {widgetWrapper && typeof widgetWrapper.title === 'string' && widgetWrapper.title.length !== 0 && (\n <CSSWidgetTitle>\n <UITitle textAlign={textAlign} fontSize={fontSize} fontWeight={fontWeight} color={color}>\n {widgetWrapper.title}\n </UITitle>\n </CSSWidgetTitle>\n )}\n </>\n );\n};\n","import { Widget } from 'jamespot-front-business';\nimport React, { useMemo } from 'react';\nimport { shallowEqual } from 'react-redux';\n\nimport styled, { useTheme } from 'styled-components';\nimport { useAppSelector } from '../../../../redux/store';\nimport { WidgetIntranetTitle } from './WidgetIntranetTitle';\n\nexport const UIHeaderWrapper = styled.div<{ backroundColor: string }>`\n background-color: ${(props) => props.backroundColor};\n`;\n\nexport const UIHeader = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n`;\n\nexport const UICount = styled.div`\n padding: ${(props) => props.theme.space.sm}px ${(props) => props.theme.space.md}px;\n color: ${(props) => props.theme.color.grey4};\n`;\n\nexport const UIHeaderFlex = styled.div`\n flex: 1;\n display: flex;\n flex-direction: row;\n gap: ${(props) => props.theme.space.xs}px;\n align-items: center;\n`;\n\nexport const WidgetHeader = ({\n uniqid,\n dropdown,\n subHeader,\n}: {\n uniqid: string;\n dropdown?: () => React.ReactNode;\n subHeader?: (color: string) => React.ReactNode;\n}) => {\n const theme = useTheme();\n const styles = useAppSelector((state) => Widget.selectors.selectWidgetTitleStyle(state, uniqid), shallowEqual);\n\n const styleValues = useMemo(() => {\n return {\n color: styles && styles['color'] ? String(styles['color']) : theme.color.black,\n backgroundColor: styles && styles['background-color'] ? String(styles['background-color']) : 'transparent',\n fontSize: styles && styles['font-size'] ? String(styles['font-size']) : '16',\n fontWeight: styles && styles['font-weight'] ? String(styles['font-weight']) : 'medium',\n textAlign: styles && styles['text-align'] ? String(styles['text-align']) : 'left',\n };\n }, [styles, theme]);\n\n return (\n <UIHeaderWrapper backroundColor={styleValues.backgroundColor}>\n <UIHeader>\n <UIHeaderFlex>\n <WidgetIntranetTitle\n uniqid={uniqid}\n fontWeight={styleValues.fontWeight}\n fontSize={styleValues.fontSize}\n textAlign={styleValues.textAlign}\n color={styleValues.color}\n />\n {subHeader && subHeader(styleValues.color)}\n </UIHeaderFlex>\n {dropdown && dropdown()}\n </UIHeader>\n </UIHeaderWrapper>\n );\n};\n","import React, { useEffect, useMemo, useState } from 'react';\n\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport jamespot, { WidgetLuccaAbsenceUser } from 'jamespot-user-api';\nimport { JRCLoader } from 'jamespot-react-components';\nimport { FormattedMessage } from 'react-intl';\n\nimport styled from 'styled-components';\nimport { WidgetStylePadding } from './components/WidgetStylePadding';\nimport { WidgetScroll } from './components/WidgetScroll';\nimport { WidgetHeader } from './components/WidgetHeader';\nimport { useAbortController } from '../../../hooks';\n\nexport const UIOverlay = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nconst WidgetLuccaAbsence = commonComponentsRegistry.getLazyComponent('WidgetLuccaAbsence');\n\nexport const JRCWidgetLuccaAbsenceWrapper = ({ uniqid }: { uniqid: string }) => {\n const [list, setList] = useState<WidgetLuccaAbsenceUser[]>([]);\n const [error, setError] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n\n const abortController = useAbortController();\n\n const today = useMemo(() => {\n return (\n new Date().getFullYear() +\n '-' +\n (new Date().getMonth() + 1).toString().padStart(2, '0') +\n '-' +\n new Date().getDate().toString().padStart(2, '0') +\n ' 00:00:00'\n );\n }, []);\n\n useEffect(() => {\n jamespot.lucca\n .getAbsence({ date: today }, { signal: abortController.signal })\n .then(({ result }) => setList(result))\n .catch(() => {\n if (!abortController.signal.aborted) {\n setError(true);\n }\n })\n .finally(() => setIsLoading(false));\n }, [today, abortController.signal]);\n\n if (isLoading) {\n return (\n <UIOverlay>\n <JRCLoader size={'m'} />\n </UIOverlay>\n );\n }\n\n if (error) {\n return (\n <UIOverlay>\n <FormattedMessage id={'WIDGET_Lucca_Absence_Url_Error'} />\n </UIOverlay>\n );\n }\n\n return (\n <WidgetScroll\n header={() => {\n return <WidgetHeader uniqid={uniqid} />;\n }}\n scrollable={() => {\n return (\n <WidgetStylePadding uniqid={uniqid}>\n <WidgetLuccaAbsence list={list} />\n </WidgetStylePadding>\n );\n }}\n />\n );\n};\n","import React, { useEffect, useState } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport {\n WidgetArticleImageContent,\n WidgetArticleImageType,\n WidgetDisplayMode,\n formatImgUrl,\n jFileLittle,\n} from 'jamespot-user-api';\nimport { useIntl } from 'react-intl';\nimport { Widget, updateWidgetContent } from 'jamespot-front-business';\nimport { WidgetUploader } from '../components/WidgetUploader';\n\nconst WidgetImage = commonComponentsRegistry.getLazyComponent('WidgetImage');\nconst FileViewer = commonComponentsRegistry.getLazyComponent('FileViewer');\nconst JRCWidgetEmptyInplace = commonComponentsRegistry.getLazyComponent('WidgetEmptyInplace');\n\nimport styled from 'styled-components';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst CSSImageWrapperHover = styled.div`\n position: absolute;\n inset: 0;\n background-color: rgba(0, 0, 0, 0.4);\n pointer-events: none;\n display: flex;\n justify-content: center;\n align-items: center;\n opacity: 0;\n color: ${(props) => props.theme.color.white};\n &:hover {\n opacity: 1;\n }\n`;\n\nconst CSSImagePointer = styled.button`\n cursor: pointer;\n`;\n\nconst mockFileLittle: jFileLittle = {\n id: 0,\n type: '',\n title: '',\n uri: '',\n mimetype: 'application/octet-stream',\n mainType: '',\n dateCreation: '',\n dateModified: '',\n _url: '',\n size: 10,\n};\n\nexport const strToTimestamp = (str: string): undefined | number => {\n if (str) {\n const timestamp = Date.parse(str);\n if (!isNaN(timestamp)) {\n return new Date(timestamp).getTime() / 1000;\n }\n }\n return;\n};\n\nexport const JRCWidgetArticleImageWrapper = ({\n widget,\n width,\n inplace,\n mode,\n}: {\n widget: WidgetArticleImageType;\n inplace?: boolean;\n mode?: WidgetDisplayMode;\n width?: number;\n}) => {\n const { uniqid } = widget;\n const { file, useFilter } = widget.content;\n const dispatch = useAppDispatch();\n const isActive = useAppSelector((state) => Widget.selectors.isActive(state, uniqid), shallowEqual);\n const [uri, setUri] = useState<string | undefined>(undefined);\n const intl = useIntl();\n\n useEffect(() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, mounted: true }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, empty: !file }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [file]);\n\n useEffect(() => {\n if (file) {\n setUri(\n formatImgUrl({\n timestamp: file.dateModified ? strToTimestamp(file.dateModified) : Date.now(),\n from: 'imagecache',\n size: 'fitx1200',\n uri: file.uri,\n }),\n );\n }\n }, [file]);\n\n return (\n <>\n {mode !== 'edit' && (\n <FileViewer\n files={[\n {\n ...mockFileLittle,\n ...file,\n path: uri,\n mimetype: 'image/png',\n },\n ]}\n openWithOptions={[]}>\n {(open) => {\n return (\n <CSSImagePointer onClick={() => open(file?.id ?? 0)}>\n <WidgetImage maxWidth={width ?? 600} uri={uri} useFilter={useFilter ?? false} />\n </CSSImagePointer>\n );\n }}\n </FileViewer>\n )}\n\n {mode === 'edit' && (\n <>\n {uri !== undefined && (\n <WidgetImage maxWidth={width ?? 600} uri={uri} useFilter={useFilter ?? false} />\n )}\n {inplace && (\n <WidgetUploader\n initialFiles={[]}\n initialClick={isActive}\n accept={'image/png, image/jpeg, image/jpg'}\n multiple={false}\n onUploadSuccess={(files) => {\n if (Array.isArray(files) && files[0] !== undefined) {\n dispatch(\n updateWidgetContent<WidgetArticleImageContent>(uniqid, { file: files[0] }),\n );\n }\n }}\n onUploadStart={() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: true }));\n }}\n onUploadEnd={() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: false }));\n }}>\n {file !== undefined ? (\n <CSSImageWrapperHover>\n {intl.formatMessage({ id: 'ARTICLE_Widget_Image_Change' })}\n </CSSImageWrapperHover>\n ) : (\n <JRCWidgetEmptyInplace\n label={'WIDGET_Article_Image_Empty_Label'}\n description={'WIDGET_Article_Image_Empty_Description'}\n url={'widget-article-image-placeholder.png'}\n onClick={() => undefined}\n />\n )}\n </WidgetUploader>\n )}\n </>\n )}\n </>\n );\n};\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { WidgetArticleSliderType, WidgetDisplayMode, formatImgUrl, jFileLittle } from 'jamespot-user-api';\nimport styled from 'styled-components';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { shallowEqual } from 'react-redux';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst FileViewer = commonComponentsRegistry.getLazyComponent('FileViewer');\nconst JRCWidgetEmptyInplace = commonComponentsRegistry.getLazyComponent('WidgetEmptyInplace');\nconst JRCWidgetSlider = commonComponentsRegistry.getLazyComponent('WidgetSlider');\n\nconst Wrapper = styled.div<{ maxWidth: number }>`\n flex: 1;\n display: flex;\n flex-direction: row;\n min-height: 60px;\n align-items: center;\n width: ${(props) => props.maxWidth}px;\n`;\n\nconst mockFileLittle: jFileLittle = {\n id: 0,\n type: '',\n title: '',\n uri: '',\n mimetype: 'application/octet-stream',\n mainType: '',\n dateCreation: '',\n dateModified: '',\n _url: '',\n size: 10,\n};\n\nexport const strToTimestamp = (str: string): undefined | number => {\n if (str) {\n const timestamp = Date.parse(str);\n if (!isNaN(timestamp)) {\n return new Date(timestamp).getTime() / 1000;\n }\n }\n return;\n};\n\nexport const JRCWidgetArticleSliderWrapper = ({\n widget,\n mode,\n width,\n}: {\n widget: WidgetArticleSliderType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n width?: number;\n}) => {\n const { uniqid } = widget;\n const dispatch = useAppDispatch();\n const isActive = useAppSelector((state) => Widget.selectors.isActive(state, uniqid), shallowEqual);\n const maxWidth = width ?? 600;\n const [dynamicWidth, setDynamicWidth] = useState<number | undefined>(undefined);\n const ref = useRef<HTMLDivElement>(null);\n const fileViewerFiles = useMemo(\n () =>\n widget.content.slides\n ? [\n ...widget.content.slides.map((slide, index) => {\n return {\n ...mockFileLittle,\n id: slide.file ? slide.file.id : index,\n mimetype: slide.file ? slide.file.mimetype : mockFileLittle.mimetype,\n path:\n slide.file && slide.file.uri\n ? formatImgUrl({\n size: 'fitx1200',\n uri: slide.file.uri,\n from: 'imagecache',\n timestamp:\n slide.file && slide.file.dateModified\n ? strToTimestamp(slide.file.dateModified)\n : Date.now(),\n })\n : '',\n };\n }),\n ]\n : [],\n [widget.content.slides],\n );\n\n const slides = useMemo(\n () =>\n widget.content.slides !== undefined\n ? [\n ...widget.content.slides.map((slide) => {\n if (slide.file) {\n return {\n ...slide,\n uri: formatImgUrl({\n timestamp: slide.file.dateModified\n ? strToTimestamp(slide.file.dateModified)\n : Date.now(),\n size: `fitx${dynamicWidth && dynamicWidth < maxWidth ? dynamicWidth : maxWidth}`,\n from: 'imagecache',\n uri: slide.file.uri,\n }),\n };\n } else {\n return {\n ...slide,\n uri: '',\n };\n }\n }),\n ]\n : [],\n [widget.content.slides, dynamicWidth, maxWidth],\n );\n\n useEffect(() => {\n if (isActive && mode === 'edit') {\n dispatch(WidgetEditor.slice.actions.registerEditor({ uniqid, name: widget.name }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isActive]);\n\n useEffect(() => {\n const handleResize = () => {\n if (ref.current) {\n setDynamicWidth(ref.current ? ref.current.offsetWidth : maxWidth);\n }\n };\n window.addEventListener('resize', handleResize);\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ref]);\n\n useEffect(() => {\n setDynamicWidth(ref.current ? ref.current.offsetWidth : maxWidth);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ref]);\n\n useEffect(() => {\n dispatch(\n Widget.slice.actions.setWidgetState({\n uniqid,\n empty: !widget.content.slides || widget.content.slides.length === 0,\n }),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [widget.content.slides]);\n\n const isEditable = useMemo(\n () => mode === 'edit' && Array.isArray(widget.content.slides) && widget.content.slides.length === 0,\n [widget.content.slides, mode],\n );\n\n const handleEditor = useCallback(() => {\n dispatch(\n WidgetEditor.slice.actions.registerEditor({\n uniqid: widget.uniqid,\n name: widget.name,\n }),\n );\n }, [dispatch, widget.uniqid, widget.name]);\n\n /** small hack to catch the real width of the div */\n if (dynamicWidth === undefined) {\n return <div ref={ref} style={{ width: '100%' }}></div>;\n }\n\n return (\n <Wrapper maxWidth={dynamicWidth && dynamicWidth < maxWidth ? dynamicWidth : maxWidth}>\n <FileViewer files={fileViewerFiles} openWithOptions={[]}>\n {(open) => {\n return (\n <JRCWidgetSlider\n slides={slides}\n maxWidth={dynamicWidth && dynamicWidth < maxWidth ? dynamicWidth : maxWidth}\n useDots={widget.content.useDots ?? true}\n loop={widget.content.loop ?? false}\n startAt={0}\n onClickSlide={(index) => {\n if (mode !== 'edit') {\n if (widget.content.slides) {\n const slide = widget.content.slides[index];\n if (slide && slide.file) {\n open(slide.file.id);\n }\n }\n } else {\n dispatch(WidgetEditor.slice.actions.registerEditor({ uniqid, name: widget.name }));\n }\n }}\n />\n );\n }}\n </FileViewer>\n {isEditable ? (\n <JRCWidgetEmptyInplace\n label={'WIDGET_Article_Slider_Empty_Label'}\n description={'WIDGET_Article_Slider_Empty_Description'}\n url={'widget-article-image-placeholder.png'}\n onClick={handleEditor}\n />\n ) : (\n <></>\n )}\n </Wrapper>\n );\n};\n","import React, { useCallback, useState } from 'react';\r\nimport { FormattedMessage, useIntl } from 'react-intl';\r\nimport { marked } from 'marked';\r\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\r\n\r\nconst InputTextareaRaw = commonComponentsRegistry.getLazyComponent('InputTextareaRaw');\r\nconst Modal = commonComponentsRegistry.getLazyComponent('Modal');\r\n\r\nexport type MarkdownModalProps = {\r\n onInsert: (html: string) => void;\r\n open: boolean;\r\n close: () => void;\r\n};\r\n\r\nexport const MarkdownModal = ({ onInsert, open, close }: MarkdownModalProps) => {\r\n const intl = useIntl();\r\n const [markdown, setMarkdown] = useState('');\r\n\r\n const doClose = useCallback(() => {\r\n setMarkdown('');\r\n close();\r\n }, [close]);\r\n\r\n return (\r\n <Modal\r\n title={intl.formatMessage({ id: 'TINY_MCE_Insert_Markdown' })}\r\n open={open}\r\n closeHandler={doClose}\r\n enableClickAwayCloseModal\r\n buttons={[\r\n {\r\n children: <FormattedMessage id=\"GLOBAL_Cancel\" />,\r\n color: 'cancel',\r\n clickHandler: doClose,\r\n },\r\n {\r\n children: <FormattedMessage id=\"GLOBAL_Insert\" />,\r\n color: 'valid',\r\n disabled: !markdown,\r\n clickHandler: () => {\r\n onInsert(marked.parse(markdown, { async: false }).replace(/<br>/g, '<br><br>'));\r\n doClose();\r\n },\r\n },\r\n ]}>\r\n <InputTextareaRaw value={markdown} onChange={(e) => setMarkdown(e.target.value)} height={'400px'} />\r\n </Modal>\r\n );\r\n};\r\n","import { Model, TinyMCE, Toast, Widget, updateWidgetContent } from 'jamespot-front-business';\nimport { WidgetArticleTextContent, WidgetArticleTextType, WidgetDisplayMode } from 'jamespot-user-api';\nimport React, { useCallback, useEffect, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport { shallowEqual } from 'react-redux';\nimport styled, { useTheme } from 'styled-components';\n\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { getTinyMCEMentionsQueries } from '../../../utils/tinymce';\nimport { useMarkdownModal } from '../../../hooks/useMarkdownModal';\nimport { MarkdownModal } from '../../tinymce/extension/MarkdownModal';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst WidgetArticleText = commonComponentsRegistry.getLazyComponent('WidgetArticleText');\n\nconst CSSTextWrapper = styled.div`\n width: 100%;\n cursor: text;\n\n p {\n word-wrap: break-word;\n }\n\n a {\n word-wrap: break-word;\n }\n`;\n\nexport const JRCWidgetArticleTextWrapper = ({\n widget,\n mode,\n}: {\n widget: WidgetArticleTextType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n}) => {\n const { uniqid } = widget;\n const theme = useTheme();\n const { text } = widget.content;\n const dispatch = useAppDispatch();\n const isActive = useAppSelector((state) => Widget.selectors.isActive(state, uniqid), shallowEqual);\n const isBusy = useAppSelector((state) => Widget.selectors.selectWidgetState(state, uniqid)?.busy);\n const token = useAppSelector(Widget.selectors.selectToken);\n const tinyMCECommonOptions = useAppSelector(TinyMCE.selectors.selectTinyMCECommonOptions);\n const models = useAppSelector(Model.selectors.selectAll);\n\n const intl = useIntl();\n\n const {\n open,\n onInsert,\n close: closeMarkdownModal,\n ext: extMarkdown,\n isActive: isMarkdownActive,\n } = useMarkdownModal();\n\n const onError = useCallback(\n (message?: string) => {\n dispatch(Toast.actions.error({ label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\n },\n [dispatch, intl],\n );\n\n useEffect(() => {\n dispatch(\n Widget.slice.actions.setWidgetState({\n uniqid,\n empty: !text || text.length === 0,\n }),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [text]);\n\n const tinyMentionsQueries = useMemo(() => {\n return getTinyMCEMentionsQueries(models, theme, onError);\n }, [models, onError, theme]);\n\n // small hack to hide and redraw tinymce to avoid initialization issue\n if (isBusy) {\n return <></>;\n }\n return (\n <CSSTextWrapper>\n <WidgetArticleText\n autoFocus={isActive}\n text={text ?? ''}\n token={mode === 'edit' && token !== undefined ? token : ''}\n tinyMCECommonOptions={\n mode === 'edit' && tinyMCECommonOptions\n ? {\n commonOptions: tinyMCECommonOptions,\n mentionsQueries: tinyMentionsQueries,\n }\n : undefined\n }\n mode={mode}\n onChange={(text) => {\n dispatch(updateWidgetContent<WidgetArticleTextContent>(uniqid, { text }));\n }}\n additionalExtensions={[extMarkdown]}\n />\n {isMarkdownActive && <MarkdownModal onInsert={onInsert} open={open} close={closeMarkdownModal} />}\n </CSSTextWrapper>\n );\n};\n","import React, { useEffect } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { WidgetArticleTitleContent, WidgetArticleTitleType, WidgetDisplayMode } from 'jamespot-user-api';\nimport { Widget, updateWidgetContent } from 'jamespot-front-business';\nimport styled from 'styled-components';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst WidgetArticleTitle = commonComponentsRegistry.getLazyComponent('WidgetArticleTitle');\n\nconst CSSTextWrapper = styled.div`\n flex: 1;\n display: flex;\n flex-direction: row;\n align-items: center;\n cursor: text;\n`;\n\nconst ToolWrapper = styled.div`\n display: flex;\n flex-direction: row;\n border-radius: 8px;\n overflow: hidden;\n margin: 4px;\n border: 1px solid ${(props) => props.theme.color.grey1};\n`;\n\nconst Tool = styled.button<{ isActive: boolean }>`\n display: flex;\n width: 40px;\n height: 40px;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n opacity: ${(props) => (props.isActive ? '1.0' : '.8')};\n background-color: ${(props) => (props.isActive ? props.theme.color.grey1 : props.theme.color.white)};\n &:hover {\n background-color: ${(props) => props.theme.color.grey1};\n }\n`;\n\nexport const JRCWidgetArticleTitleWrapper = ({\n widget,\n inplace,\n mode,\n dataCy,\n}: {\n widget: WidgetArticleTitleType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n dataCy?: string;\n}) => {\n const { uniqid } = widget;\n const { text, color, heading } = widget.content;\n const dispatch = useAppDispatch();\n const isActive = useAppSelector((state) => Widget.selectors.isActive(state, uniqid), shallowEqual);\n\n useEffect(() => {\n dispatch(\n Widget.slice.actions.setWidgetState({\n uniqid,\n empty: !text || text.length === 0,\n }),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [text]);\n\n return (\n <CSSTextWrapper>\n <WidgetArticleTitle\n dataCy={dataCy}\n text={text}\n color={color}\n heading={heading}\n autoFocus={isActive}\n inplace={inplace}\n mode={mode}\n onChange={(text) => {\n dispatch(updateWidgetContent<WidgetArticleTitleContent>(uniqid, { text }));\n }}\n />\n {isActive && mode === 'edit' ? (\n <Toolbar\n heading={heading}\n onClick={(heading) => {\n dispatch(updateWidgetContent<WidgetArticleTitleContent>(uniqid, { heading }));\n }}\n />\n ) : (\n <></>\n )}\n </CSSTextWrapper>\n );\n};\n\nexport const Toolbar = ({ heading = 'h1', onClick }: { heading?: string; onClick: (size: string) => void }) => {\n const sizes: string[] = ['h1', 'h2', 'h3', 'h4'];\n return (\n <ToolWrapper>\n {sizes.map((sizeValue, index: number) => (\n <Tool key={index} isActive={heading === sizeValue} onClick={() => onClick(sizeValue)}>\n {sizeValue}\n </Tool>\n ))}\n </ToolWrapper>\n );\n};\n","import React, { useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport jamespot from 'jamespot-user-api';\nimport styled from 'styled-components';\nimport { Toast, Widget } from 'jamespot-front-business';\nimport { JRCIconButton } from 'jamespot-react-components';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\nimport { useAppDispatch } from '../../../../redux/store';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\nconst JRCModalLayout = commonComponentsRegistry.getLazyComponent('ModalLayout');\nconst JRCModalContent = commonComponentsRegistry.getLazyComponent('ModalContent');\n\nexport const Button = styled.button`\n padding: ${(props) => props.theme.space.md}px;\n`;\n\nexport const Footer = styled.div`\n padding: ${(props) => props.theme.space.md}px;\n display: flex;\n flex-direction: row-reverse;\n`;\n\nexport const WidgetRemove = ({ id, type, uniqid }: { id: number; type: string; uniqid: string }) => {\n const dispatch = useAppDispatch();\n const intl = useIntl();\n const [isOpen, setIsOpen] = useState<boolean>(false);\n\n const handleRemove = () => {\n jamespot.widget\n .removeWidget({ id, type, uniqid })\n .then(() => {\n dispatch(Widget.slice.actions.flushWidget({ uniqid }));\n })\n .catch(() => dispatch(Toast.actions.error({ label: 'WIDGET_Presence_Error' })));\n };\n\n return (\n <>\n <JRCIconButton iconSize={14} onClick={() => setIsOpen(true)} icon=\"icon-trash\" />\n {isOpen && (\n <JRCModalLayout enableClickAwayCloseModal={true} open={isOpen} closeHandler={() => setIsOpen(false)}>\n <JRCModalContent\n overflow={'scroll'}\n title={intl.formatMessage({ id: 'WIDGET_Remove_Widget' })}\n onClickIconClose={() => setIsOpen(false)}>\n {intl.formatMessage({ id: 'WIDGET_Delete_Widget_Confirmation' })}\n </JRCModalContent>\n <Footer>\n <JRCButton label={intl.formatMessage({ id: 'GLOBAL_Confirm' })} onClick={handleRemove} />\n </Footer>\n </JRCModalLayout>\n )}\n </>\n );\n};\n","import React, { useCallback, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport { WidgetsName, ensureWidgetObjectHasMinimumProperties, Rights, WidgetDisplayMode } from 'jamespot-user-api';\n\nimport { shallowEqual } from 'react-redux';\n\nimport styled from 'styled-components';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { WidgetRemove } from './WidgetRemove';\nimport { useAppDispatch, useAppSelector } from '../../../../redux/store';\n\nexport const Footer = styled.div`\n display: flex;\n flex: 1;\n flex-direction: row;\n border-top: 1px solid ${(props) => props.theme.color.grey1};\n`;\n\nexport const Button = styled.button`\n display: flex;\n flex: 1;\n justify-content: center;\n align-items: center;\n background-color: ${(props) => props.theme.color.white};\n &:hover {\n background-color: ${(props) => props.theme.color.grey0};\n }\n`;\n\nexport const WidgetFooterView = ({\n name,\n uniqid,\n mode,\n collaborationRights,\n handleOpenEditor,\n}: {\n name: WidgetsName;\n uniqid: string;\n mode?: WidgetDisplayMode;\n collaborationRights?: Pick<Rights, 'update'>;\n handleOpenEditor?: () => void;\n}) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const widgetObject = useAppSelector((state) => Widget.selectors.selectWidgetObject(state, uniqid), shallowEqual);\n const widgetObjectRights = useAppSelector(\n (state) => Widget.selectors.selectWidgetObjectRights(state, uniqid),\n shallowEqual,\n );\n\n const canUpdate = useMemo(\n () =>\n (widgetObject && widgetObjectRights && widgetObjectRights.update) ||\n (collaborationRights && collaborationRights.update),\n [widgetObject, widgetObjectRights, collaborationRights],\n );\n\n const canDelete = useMemo(\n () => widgetObject && widgetObjectRights && widgetObjectRights.delete,\n [widgetObject, widgetObjectRights],\n );\n\n const handleOnClick = useCallback(() => {\n dispatch(\n WidgetEditor.slice.actions.registerEditor({\n uniqid,\n name,\n mode,\n }),\n );\n }, [uniqid, dispatch, name, mode]);\n\n return canUpdate && ensureWidgetObjectHasMinimumProperties(widgetObject) ? (\n <Footer>\n <Button onClick={handleOpenEditor ?? handleOnClick}>\n {intl.formatMessage({ id: 'WIDGET_Set_Widget' })}\n </Button>\n {canDelete && <WidgetRemove id={widgetObject.id} type={widgetObject.type} uniqid={uniqid} />}\n </Footer>\n ) : (\n <></>\n );\n};\n","import { JRCButton, JRCInputText } from 'jamespot-react-components';\nimport React, { useState, useEffect } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\nimport { useAppDispatch } from '../../../../redux/store';\n\nexport const CSSWrapper = styled.div`\n padding: ${(props) => props.theme.space.md}px;\n display: flex;\n flex-direction: row;\n fieldset {\n margin: 0.2rem !important;\n }\n`;\n\nexport const WidgetInlineInputText = ({\n placeholder,\n handleClick,\n}: {\n placeholder: string;\n handleClick: (label: string) => void;\n}) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const [label, setLabel] = useState<string>('');\n\n const { control, watch, reset } = useForm({\n defaultValues: { label },\n criteriaMode: 'all',\n });\n\n useEffect(() => {\n const subscription = watch((data) => {\n setLabel(data.label ?? '');\n });\n return () => subscription.unsubscribe();\n }, [watch, dispatch]);\n\n return (\n <CSSWrapper>\n <JRCInputText name={'label'} control={control} placeholder={placeholder} width=\"100%\" />\n <JRCButton\n label={intl.formatMessage({ id: 'GLOBAL_Confirm' })}\n disabled={!label.length}\n onClick={() => {\n handleClick(label);\n setLabel('');\n reset();\n }}\n />\n </CSSWrapper>\n );\n};\n","import React from 'react';\n\nimport styled from 'styled-components';\n\nimport { JRCLoader } from 'jamespot-react-components';\n\nexport const Wrapper = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: rgba(255, 255, 255, 0.4);\n`;\n\nexport const WidgetIsPending = () => {\n return (\n <Wrapper>\n <JRCLoader size={'m'} />\n </Wrapper>\n );\n};\n","import { Toast, updateWidgetContent, Widget, WidgetEditor } from 'jamespot-front-business';\nimport { JRCFileViewer, JRCWidgetCheckListEntries, Utils } from 'jamespot-react-components';\nimport jApi, {\n CombinedWidgetContent,\n ensureWidgetCheckListType,\n jFileLittle,\n WidgetCheckListContent,\n WidgetCheckListType,\n WidgetDisplayMode,\n WidgetsName,\n} from 'jamespot-user-api';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport { shallowEqual } from 'react-redux';\nimport styled from 'styled-components';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { RTProvider } from '../../RTProvider.component';\nimport { useWidgetRT } from '../hooks';\nimport { WidgetFooterView } from './components/WidgetFooterView';\nimport { WidgetInlineInputText } from './components/WidgetInlineInputText';\nimport { WidgetIsPending } from './components/WidgetIsPending';\n\nconst WidgetCheckList = commonComponentsRegistry.getLazyComponent('WidgetCheckList');\nconst WidgetCheckListEditor = commonComponentsRegistry.getLazyComponent('WidgetCheckListEditor');\n\nexport const CSSRowLinkWrapper = styled.div<{ border?: boolean }>`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n border: ${(props) => (props.border ? `1px solid ${props.theme.color.grey2}` : 'none')};\n min-height: 24px;\n border-radius: 4px;\n padding: 4px 8px;\n`;\n\nconst CommentContainer = styled.div`\n width: 100%;\n display: flex;\n gap: 14px;\n padding: 16px;\n`;\n\nexport const CSSWidgetCheckListWrapper = styled.div`\n position: relative;\n`;\n\ntype JRCWidgetCheckListWrapperProps = {\n widget: WidgetCheckListType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n onWidgetUpdate?: () => void;\n};\n\nexport const JRCWidgetCheckListWrapper = ({\n widget,\n inplace,\n mode,\n onWidgetUpdate,\n}: JRCWidgetCheckListWrapperProps) => {\n const intl = useIntl();\n const { uniqid, content: widgetContent } = widget;\n const dispatch = useAppDispatch();\n const [token, setToken] = useState<string>();\n const [tokenLoading, setTokenLoading] = useState(false);\n\n const [entries, setEntries] = useState<JRCWidgetCheckListEntries | undefined>();\n const [isPending, setIsPending] = useState(false);\n\n const tokenFromStore = useAppSelector(Widget.selectors.selectToken, shallowEqual);\n\n const uri = useAppSelector((state) => Widget.selectors.selectWidgetObjectUri(state, widget.uniqid), shallowEqual);\n\n const widgetObjectRights = useAppSelector(\n (state) => Widget.selectors.selectWidgetObjectRights(state, uniqid),\n shallowEqual,\n );\n\n const allRt = useAppSelector(\n (state) => Widget.selectors.selectAllWidgetRTObject(state, widget.uniqid),\n shallowEqual,\n );\n\n const canEditCollaboration = useMemo(() => {\n return widgetObjectRights && widgetObjectRights.update;\n }, [widgetObjectRights]);\n\n const canAdministrate = useMemo(() => {\n return widgetObjectRights && widgetObjectRights.administrate;\n }, [widgetObjectRights]);\n\n const onError = useCallback(\n (message?: string) => {\n dispatch(Toast.actions.error({ label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\n },\n [dispatch, intl],\n );\n\n const fetchToken = useCallback(() => {\n if (!token && !tokenLoading) {\n setTokenLoading(true);\n jApi.network\n .token()\n .then((res) => {\n setToken(res.result);\n setTokenLoading(false);\n\n // set comment token to our widget slice to be able to upload image inside our widgets\n dispatch(Widget.slice.actions.setToken({ token: res.result }));\n })\n .catch((e) => {\n onError(e.errorMsg);\n });\n }\n }, [onError, token, tokenLoading, dispatch]);\n\n if (!tokenFromStore) {\n fetchToken();\n } else if (!token) {\n setToken(tokenFromStore);\n }\n\n const onChange = useCallback(\n (uniqid: string, content: WidgetCheckListContent) => {\n dispatch(updateWidgetContent(uniqid, content));\n },\n [dispatch],\n );\n\n const onChangeWrapper = (content: { uniqid: string; title?: string }) => {\n dispatch(Widget.slice.actions.updateWidgetWrapper({ ...content }));\n };\n\n const handleCheckItem = (id: string, index: number) => {\n if (!uri) return;\n if (isPending) return;\n setIsPending(true);\n jApi.widget\n .checkListRespond({\n uri,\n uniqid: id,\n index: index,\n })\n .then(() => {\n if (onWidgetUpdate) onWidgetUpdate();\n })\n .catch((err) => {\n onError(err.message);\n setIsPending(false);\n });\n };\n\n const handleReloadWidget = useCallback(() => {\n if (!uri) return;\n setIsPending(true);\n jApi.widget\n .getWidget<WidgetCheckListType>({ uri, uniqid })\n .then((response) => {\n if (ensureWidgetCheckListType(response.result)) {\n onChange(uniqid, response.result.content);\n }\n })\n .catch((err) => {\n return !err.aborted && onError;\n })\n .finally(() => setIsPending(false));\n }, [uniqid, onError, uri, onChange]);\n\n const openEditorPanel = (token: string) => {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n dispatch(Widget.slice.actions.setToken({ token }));\n dispatch(\n WidgetEditor.slice.actions.registerEditor({\n uniqid: widget.uniqid,\n name: WidgetsName.CheckList,\n mode,\n }),\n );\n };\n\n useEffect(() => {\n if (!token && mode === 'edit') {\n jApi.network.token().then((response) => {\n dispatch(Widget.slice.actions.setToken({ token: response.result }));\n });\n }\n }, [mode, token, dispatch]);\n\n useEffect(() => {\n const finalEntries: JRCWidgetCheckListEntries | undefined = widget.content.arr?.map((item) => ({\n text: item.title ?? '',\n file: item.file ?? undefined,\n checked: item.value ?? false,\n ...(item.links && {\n links: item.links,\n }),\n ...(item.user && { user: item.user ?? undefined }),\n ...(item.id && { id: item.id, mimetype: 'image/png' }),\n }));\n\n setEntries(finalEntries);\n }, [widget.content.arr, widgetContent]);\n\n useEffect(() => {\n if (!Array.isArray(allRt)) return;\n const lastRt = allRt.at(-1);\n if (!lastRt) return;\n if (!uri) return;\n\n if (lastRt.object.uri === uri && lastRt.uniqid === widget.uniqid) {\n if (lastRt.fn === 'check-list-response' || lastRt.fn === 'widget-update') {\n handleReloadWidget();\n }\n }\n }, [allRt, widget.uniqid, uri, onError, dispatch, handleReloadWidget]);\n\n const handleCollabAddEntry = (label: string) => {\n if (!widget.content.arr || !uri) return;\n\n const contentToUpdate = {\n ...widget.content,\n arr: [...widget.content.arr, { title: label, value: false }],\n };\n\n jApi.widget\n .updateWidget<CombinedWidgetContent>({\n uri,\n uniqid: widget.uniqid,\n content: contentToUpdate as CombinedWidgetContent,\n v2: true,\n })\n .then(() => onChange(widget.uniqid, contentToUpdate))\n .catch((err) => onError(err.errorMsg));\n };\n\n const files = useMemo(() => {\n if (!Array.isArray(widgetContent.arr)) return [];\n\n const fs: jFileLittle[] = [];\n widgetContent.arr.forEach((el) => {\n if (el.file) {\n fs.push(el.file);\n }\n });\n\n return fs;\n }, [widgetContent]);\n\n if (mode === 'edit') {\n if (inplace) {\n return (\n <CommentContainer>\n <WidgetCheckListEditor\n token={token}\n uniqid={uniqid}\n content={{\n ...widgetContent,\n arr: widgetContent.arr?.map((w) => ({\n ...w,\n title: Utils.html.htmlDecodeSpecialChars(w.title),\n })),\n }}\n inplace={inplace}\n onChangeContent={onChange}\n onChangeWrapper={onChangeWrapper}\n handleChange={(content) =>\n dispatch(updateWidgetContent<WidgetCheckListContent>(widget.uniqid, content))\n }\n />\n </CommentContainer>\n );\n }\n }\n\n return (\n <RTProvider\n useRT={() => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useWidgetRT(widget.uniqid);\n }}>\n {entries && (\n <JRCFileViewer files={files} openWithOptions={[]}>\n {(open) => {\n return (\n <CSSWidgetCheckListWrapper key={widget.uniqid}>\n <WidgetCheckList\n limit={10}\n initialEntries={entries}\n onFileClick={(entry) => entry.id && open(entry.id)}\n onItemCheckListChange={(index) => handleCheckItem(widget.uniqid, index)}\n />\n {widgetContent.edit && (\n <WidgetInlineInputText\n handleClick={handleCollabAddEntry}\n placeholder={intl.formatMessage({\n id: 'COMMENT_WIDGET_CHECKLIST_Add_New_Task',\n })}\n />\n )}\n {canAdministrate && token && (\n <WidgetFooterView\n uniqid={widget.uniqid}\n name={widget.name}\n collaborationRights={{\n update: !!(widgetContent.edit || canEditCollaboration),\n }}\n mode={mode}\n handleOpenEditor={() => {\n if (!token) {\n setIsPending(true);\n jApi.network\n .token()\n .then((response) => {\n dispatch(\n Widget.slice.actions.setToken({ token: response.result }),\n );\n openEditorPanel(response.result);\n })\n .finally(() => setIsPending(false));\n } else {\n openEditorPanel(token);\n }\n }}\n />\n )}\n {isPending && <WidgetIsPending />}\n </CSSWidgetCheckListWrapper>\n );\n }}\n </JRCFileViewer>\n )}\n </RTProvider>\n );\n};\n","import { WidgetTableColumn, WidgetTableColumnsData } from 'jamespot-user-api';\n\nexport const getVisibleColumns = (tableColumnsData: WidgetTableColumnsData, columns: WidgetTableColumn[]) => {\n const toRet: WidgetTableColumn[] = [];\n tableColumnsData\n .filter((data) => data.isVisible)\n .forEach((data) => {\n const column = columns.find((el) => el.name === data.name);\n if (column) {\n toRet.push(column);\n }\n });\n\n return toRet;\n};\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport jamespot, {\n DatasourceResultSort,\n DatasourceType,\n Format,\n WidgetDatasourceTableContent,\n WidgetDatasourceValues,\n WidgetDisplayMode,\n WidgetsName,\n WidgetTableColumn,\n} from 'jamespot-user-api';\nimport styled from 'styled-components';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { getVisibleColumns } from './utils';\nimport { FitType, useArticleRT } from '../hooks';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch } from '../../../redux/store';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\nconst WidgetTable = commonComponentsRegistry.getLazyComponent('WidgetTable');\nconst Loader = commonComponentsRegistry.getLazyComponent('Loader');\n\nexport const Wrapper = styled.div``;\n\nexport const AbsoluteWrapper = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: ${(props) => props.theme.space.md}px;\n`;\n\nexport const WidgetDatasourceTableWrapper = ({\n uri,\n limit,\n tableHeadColor,\n tableHeadTextColor,\n tableHeadIconColor,\n tableRowColor,\n tableRowTextColor,\n tableColumnsData = [],\n tableBorderRadius,\n tableSizedColumns,\n tableSizedColumnsWidth,\n mode,\n}: WidgetDatasourceTableContent & { uniqid: string; mode: WidgetDisplayMode }) => {\n const dispatch = useAppDispatch();\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [datasourceData, setDatasourceData] = useState<Record<string, WidgetDatasourceValues>[]>([]);\n const [datasourceModel, setDatasourceModel] = useState<WidgetTableColumn[]>([]);\n const [datasourceSort, setDatasourceSort] = useState<DatasourceResultSort>({ order: 'ascending', name: 'unknown' });\n const [datasourceType, setDatasourceType] = useState<DatasourceType | undefined>(undefined);\n const [datasourceIdentifier, setDatasourceIdentifier] = useState<string>('');\n\n const definition = useMemo(() => Widget.definition(WidgetsName.DatasourceTable), []);\n const rtConditions = useMemo<FitType[]>(() => {\n if (datasourceType === 'studio') {\n return [{ type: [datasourceIdentifier] }];\n }\n\n return [];\n }, [datasourceType, datasourceIdentifier]);\n const rtAudience = useMemo<string[]>(() => {\n if (datasourceType === 'doc') {\n return [datasourceIdentifier];\n }\n\n return [];\n }, [datasourceType, datasourceIdentifier]);\n\n const { rtLastObject } = useArticleRT(rtConditions, rtAudience);\n\n const fetchDatasource = useCallback(() => {\n if (!uri) {\n return;\n }\n\n setIsLoading(true);\n jamespot.datasource\n .get(uri, Format.VIEW)\n .then((response) => {\n setDatasourceModel(response.result.model);\n setDatasourceData(response.result.data);\n setDatasourceSort(response.result.sort);\n setDatasourceType(response.result.datasource.datasourceType);\n setDatasourceIdentifier(response.result.datasource.datasourceIdentifier);\n })\n .finally(() => setIsLoading(false));\n }, [uri]);\n\n useEffect(() => {\n if (uri !== undefined && tableColumnsData.length !== 0 && datasourceModel.length === 0) {\n fetchDatasource();\n }\n }, [uri, tableColumnsData, datasourceModel, fetchDatasource]);\n\n useEffect(() => {\n if (!rtLastObject) {\n return;\n }\n\n fetchDatasource();\n }, [rtLastObject, fetchDatasource]);\n\n useEffect(() => {\n if (!uri) {\n setDatasourceModel([]);\n }\n }, [uri]);\n\n useEffect(() => {\n if (mode === 'view' || mode === 'preview') {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n }\n }, [mode, dispatch]);\n\n const columns = useMemo(\n () => getVisibleColumns(tableColumnsData, datasourceModel),\n [tableColumnsData, datasourceModel],\n );\n\n if (tableColumnsData.length === 0 && !isLoading && mode === 'edit') {\n return (\n <>\n <AbsoluteWrapper>\n <img src={`/img/fast-intranet/${WidgetsName.DatasourceTable}.png`} alt=\"\" />\n <FormattedMessage id={definition.label} />\n <JRCButton label=\"GLOBAL_Settings\" />\n </AbsoluteWrapper>\n </>\n );\n }\n\n return isLoading ? (\n <AbsoluteWrapper>\n <Loader />\n </AbsoluteWrapper>\n ) : (\n <>\n {!isLoading && datasourceData.length === 0 && mode !== 'edit' ? (\n <AbsoluteWrapper>\n <img src={`/img/fast-intranet/${WidgetsName.DatasourceTable}.png`} alt=\"\" />\n <FormattedMessage id={'WIDGET_Datasource_No_Results'} />\n </AbsoluteWrapper>\n ) : (\n <WidgetTable\n rows={datasourceData}\n columns={columns}\n limit={limit}\n tableHeadColor={tableHeadColor}\n tableHeadTextColor={tableHeadTextColor}\n tableHeadIconColor={tableHeadIconColor}\n tableRowColor={tableRowColor}\n tableRowTextColor={tableRowTextColor}\n tableBorderRadius={tableBorderRadius}\n tableColumnsData={tableColumnsData}\n tableSizedColumns={tableSizedColumns}\n tableSizedColumnsWidth={tableSizedColumnsWidth}\n tableDefaultSortOrder={datasourceSort.order}\n tableDefaultSortName={datasourceSort.name}\n />\n )}\n </>\n );\n};\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport jamespot, {\n Format,\n WidgetDatasourceValues,\n WidgetDisplayMode,\n WidgetExcelDatasourceTableContent,\n WidgetsName,\n WidgetTableColumn,\n} from 'jamespot-user-api';\nimport styled from 'styled-components';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { getVisibleColumns } from './utils';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch } from '../../../redux/store';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\n\nconst WidgetTable = commonComponentsRegistry.getLazyComponent('WidgetTable');\nconst Loader = commonComponentsRegistry.getLazyComponent('Loader');\n\nexport const Wrapper = styled.div``;\n\nexport const AbsoluteWrapper = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: ${(props) => props.theme.space.md}px;\n`;\n\nexport const WidgetExcelDatasourceTableWrapper = ({\n uri,\n limit,\n tableHeadColor,\n tableHeadTextColor,\n tableHeadIconColor,\n tableRowColor,\n tableRowTextColor,\n tableColumnsData = [],\n tableBorderRadius,\n tableSizedColumns,\n tableSizedColumnsWidth,\n mode,\n}: WidgetExcelDatasourceTableContent & { uniqid: string; mode: WidgetDisplayMode }) => {\n const dispatch = useAppDispatch();\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [datasourceData, setDatasourceData] = useState<Record<string, WidgetDatasourceValues>[]>([]);\n const [datasourceModel, setDatasourceModel] = useState<WidgetTableColumn[]>([]);\n\n const definition = useMemo(() => Widget.definition(WidgetsName.ExcelDatasourceTable), []);\n\n useEffect(() => {\n if (uri !== undefined && tableColumnsData.length !== 0 && datasourceModel.length === 0) {\n setIsLoading(true);\n jamespot.datasource\n .get(uri, Format.VIEW)\n .then((response) => {\n setDatasourceModel(response.result.model);\n setDatasourceData(response.result.data);\n })\n .finally(() => setIsLoading(false));\n }\n }, [uri, tableColumnsData, datasourceModel]);\n\n useEffect(() => {\n if (!uri) {\n setDatasourceModel([]);\n }\n }, [uri]);\n\n useEffect(() => {\n if (mode === 'view' || mode === 'preview') {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n }\n }, [mode, dispatch]);\n\n const columns = useMemo(\n () => getVisibleColumns(tableColumnsData, datasourceModel),\n [tableColumnsData, datasourceModel],\n );\n\n if (tableColumnsData.length === 0 && !isLoading && mode === 'edit') {\n return (\n <>\n <AbsoluteWrapper>\n <img src={`/img/fast-intranet/${WidgetsName.ExcelDatasourceTable}.png`} alt=\"\" />\n <FormattedMessage id={definition.label} />\n <JRCButton label=\"GLOBAL_Settings\" />\n </AbsoluteWrapper>\n </>\n );\n }\n\n return isLoading ? (\n <AbsoluteWrapper>\n <Loader />\n </AbsoluteWrapper>\n ) : (\n <>\n {!isLoading && datasourceData.length === 0 && mode !== 'edit' ? (\n <AbsoluteWrapper>\n <img src={`/img/fast-intranet/${WidgetsName.ExcelDatasourceTable}.png`} alt=\"\" />\n <FormattedMessage id={'WIDGET_Datasource_No_Results'} />\n </AbsoluteWrapper>\n ) : (\n <WidgetTable\n rows={datasourceData}\n columns={columns}\n limit={limit}\n tableHeadColor={tableHeadColor}\n tableHeadTextColor={tableHeadTextColor}\n tableHeadIconColor={tableHeadIconColor}\n tableRowColor={tableRowColor}\n tableRowTextColor={tableRowTextColor}\n tableBorderRadius={tableBorderRadius}\n tableColumnsData={tableColumnsData}\n tableSizedColumns={tableSizedColumns}\n tableSizedColumnsWidth={tableSizedColumnsWidth}\n />\n )}\n </>\n );\n};\n","import React, { useCallback, useMemo } from 'react';\n\nimport jamespot, { WidgetDisplayMode, WidgetPresenceContent } from 'jamespot-user-api';\n\nimport { shallowEqual } from 'react-redux';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nexport const CSSPaddingMd = styled.div`\n padding: ${(props) => props.theme.space.md}px;\n`;\n\nexport const CSSHref = styled.a`\n cursor: pointer;\n color: ${(props) => props.theme.color.secondary};\n`;\n\nexport const CSSHorizontalAlign = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nimport { Toast, Widget } from 'jamespot-front-business';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nexport const WidgetPresenceWrapperClosing = ({\n mode,\n uniqid,\n content,\n}: {\n mode?: WidgetDisplayMode;\n uniqid: string;\n content: WidgetPresenceContent;\n}) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n\n const uri = useAppSelector((state) => Widget.selectors.selectWidgetObjectUri(state, uniqid), shallowEqual);\n\n const widgetObjectRights = useAppSelector(\n (state) => Widget.selectors.selectWidgetObjectRights(state, uniqid),\n shallowEqual,\n );\n\n const canUpdate = useMemo<boolean>(() => !!(widgetObjectRights && widgetObjectRights.update), [widgetObjectRights]);\n\n const handleClosing = useCallback(() => {\n if (mode === 'edit' || !canUpdate || !uri) {\n return;\n }\n\n const contentToUpdate = { ...content, isClosed: true };\n\n jamespot.widget\n .updateWidget({\n uri,\n uniqid,\n content: contentToUpdate,\n v2: true,\n })\n .then(() => dispatch(Widget.slice.actions.updateWidget({ uniqid, content: contentToUpdate })))\n .catch(() => dispatch(Toast.actions.error({ label: 'WIDGET_Presence_Error' })));\n }, [mode, uniqid, canUpdate, uri, content, dispatch]);\n\n return (\n <>\n {canUpdate && !content.isClosed && (\n <CSSPaddingMd>\n <CSSHorizontalAlign>\n <CSSHref onClick={handleClosing}>\n {intl.formatMessage({ id: 'WIDGET_Presence_Closing' })}\n </CSSHref>\n </CSSHorizontalAlign>\n </CSSPaddingMd>\n )}\n </>\n );\n};\n","import jApi, {\n WidgetDisplayMode,\n WidgetPresenceResponse,\n WidgetPresenceResponseUserList,\n WidgetPresenceType,\n} from 'jamespot-user-api';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport { shallowEqual } from 'react-redux';\nimport styled from 'styled-components';\nimport { Toast, updateWidgetContent, Widget } from 'jamespot-front-business';\nimport { useWidgetRT } from '../hooks';\nimport { WidgetFooterView } from './components/WidgetFooterView';\nimport { WidgetPresenceWrapperClosing } from './JRCWidgetPresenceWrapperClosing';\nimport { WidgetIsPending } from './components/WidgetIsPending';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { RTProvider } from '../../RTProvider.component';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst JRCWidgetPresence = commonComponentsRegistry.getLazyComponent('WidgetPresence');\nconst ModalUserList = commonComponentsRegistry.getLazyComponent('ModalUserList');\n\nexport const CSSWidgetPresenceWrapper = styled.div`\n display: flex;\n flex: 1;\n position: relative;\n flex-direction: column;\n`;\n\nexport const CSSWidgetPresenceState = styled.div`\n position: absolute;\n inset: 0;\n background-color: rgba(255, 255, 255, 0.7);\n display: flex;\n flex: 1;\n justify-content: center;\n align-items: center;\n`;\n\nexport const CSSWidgetPresenceIsClosed = styled.div`\n flex: 1;\n display: flex;\n padding: ${(props) => props.theme.space.md}px;\n border: 1px dashed ${(props) => props.theme.color.orange};\n justify-content: center;\n align-items: center;\n border-radius: ${(props) => props.theme.space.sm}px;\n margin: ${(props) => props.theme.space.sm}px;\n`;\n\nexport const JRCWidgetPresenceWrapper = ({\n widget,\n mode,\n}: {\n widget: WidgetPresenceType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n}) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const { limit, limitValue, closing, isClosed } = widget.content;\n const { uniqid } = widget;\n const [response, setResponse] = useState<WidgetPresenceResponse>({\n userValue: -1,\n userAvailableList: [],\n userUnavailableList: [],\n userAvailableTotal: 0,\n userUnavailableTotal: 0,\n });\n const [isPendingResponse, setIsPendingResponse] = useState<boolean>(false);\n const [abortController] = useState<AbortController>(new AbortController());\n const [openUsersModal, setOpenUsersModal] = useState(false);\n const [usersListIndex, setUsersListIndex] = useState<number>();\n const [usersList, setUsersList] = useState<WidgetPresenceResponseUserList>();\n const ref = useRef<AbortController>(abortController);\n\n const uri = useAppSelector((state) => Widget.selectors.selectWidgetObjectUri(state, uniqid), shallowEqual);\n\n const allRt = useAppSelector((state) => Widget.selectors.selectAllWidgetRTObject(state, uniqid), shallowEqual);\n\n const handleClickAvailable = () => (response.userValue === 1 ? handleCancelRespond() : handleRespond(1));\n const handleClickUnavailable = () => (response.userValue === 0 ? handleCancelRespond() : handleRespond(0));\n\n const handleError = useCallback(\n () => dispatch(Toast.actions.error({ label: 'WIDGET_Presence_Error' })),\n [dispatch],\n );\n\n const canRespond = useMemo<boolean>(\n () => !(limit && limitValue && response.userAvailableTotal >= limitValue),\n [limit, limitValue, response.userAvailableTotal],\n );\n\n const lockedRespondHandler = useMemo(() => {\n return (closing && isClosed) || mode === 'edit';\n }, [closing, isClosed, mode]);\n\n const handleCancelRespond = useCallback(() => {\n if (!uri || lockedRespondHandler) return;\n if (!canRespond) {\n dispatch(Toast.actions.error({ label: 'WIDGET_Presence_Limit_Response_Error' }));\n return;\n }\n\n setIsPendingResponse(true);\n jApi.widget\n .presenceCancel({ uri, uniqid })\n .catch(handleError)\n .finally(() => setIsPendingResponse(false));\n }, [dispatch, uniqid, handleError, uri, canRespond, lockedRespondHandler]);\n\n const handleRespond = useCallback(\n (value: 1 | 0) => {\n if (!uri || lockedRespondHandler) return;\n\n setIsPendingResponse(true);\n jApi.widget\n .presenceRespond(\n {\n uri,\n uniqid,\n value,\n },\n ref.current.signal,\n )\n .catch(handleError)\n .finally(() => setIsPendingResponse(false));\n },\n [uri, uniqid, handleError, lockedRespondHandler],\n );\n\n const handleResponse = useCallback(() => {\n if (mode === 'edit' || !uri) return;\n setIsPendingResponse(true);\n jApi.widget\n .presenceGetResponse({ uri, uniqid }, ref.current.signal)\n .then((response) => {\n setResponse(response.result);\n })\n .catch((err) => !err.aborted && handleError())\n .finally(() => setIsPendingResponse(false));\n }, [uri, handleError, uniqid, mode]);\n\n const handleLoadUsersList = (index: number, page?: number) => {\n if (!uri) return;\n jApi.widget\n .presenceGetResponseUserList({ uri, uniqid, index, page, limit: 8 }, ref.current.signal)\n .then((response) => {\n setUsersList({\n ...response.result,\n data: [...response.result.data],\n cnt: response.result.cnt,\n });\n })\n .catch((err) => {\n return !err.aborted && handleError;\n });\n };\n\n const handleReloadWidget = useCallback(() => {\n if (!uri) return;\n setIsPendingResponse(true);\n jApi.widget\n .getWidget<WidgetPresenceType>({ uri, uniqid })\n .then((response) => {\n dispatch(updateWidgetContent(uniqid, response.result));\n })\n .catch((err) => {\n return !err.aborted && handleError;\n })\n .finally(() => setIsPendingResponse(false));\n }, [dispatch, handleError, uri, uniqid]);\n\n useEffect(() => {\n const elm = ref.current;\n return () => {\n elm.abort();\n };\n }, []);\n\n useEffect(() => {\n handleResponse();\n }, [handleResponse]);\n\n useEffect(() => {\n if (!Array.isArray(allRt)) return;\n const lastRt = allRt.at(-1);\n if (!lastRt || !uri) return;\n\n if (lastRt.object.uri === uri && lastRt.uniqid === uniqid) {\n if (lastRt.fn === 'widget-presence-response') {\n handleResponse();\n }\n if (lastRt.fn === 'widget-update') {\n handleReloadWidget();\n }\n }\n }, [allRt, handleResponse, uniqid, uri, handleReloadWidget]);\n\n return (\n <RTProvider\n useRT={() => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useWidgetRT(widget.uniqid);\n }}>\n <CSSWidgetPresenceWrapper>\n <JRCWidgetPresence\n limit={limit}\n limitValue={limitValue}\n userAvailableList={response.userAvailableList}\n userUnavailableList={response.userUnavailableList}\n userValue={response.userValue}\n userAvailableTotal={response?.userAvailableTotal}\n userUnavailableTotal={response?.userUnavailableTotal}\n isClosed={closing && isClosed}\n handleClickAvailable={handleClickAvailable}\n handleClickUnavailable={handleClickUnavailable}\n handleOpenUsersModal={(index) => {\n setUsersList({\n limit: 0,\n page: 0,\n data: [],\n cnt: 0,\n });\n setUsersListIndex(index);\n handleLoadUsersList(index);\n setOpenUsersModal(true);\n }}\n />\n {closing && isClosed && (\n <CSSWidgetPresenceIsClosed>\n {intl.formatMessage({ id: 'WIDGET_Presence_Is_Closed' })}\n </CSSWidgetPresenceIsClosed>\n )}\n {closing && !isClosed && (\n <WidgetPresenceWrapperClosing mode={mode} uniqid={widget.uniqid} content={widget.content} />\n )}\n {mode === 'view' && <WidgetFooterView uniqid={widget.uniqid} name={widget.name} mode={mode} />}\n {isPendingResponse && <WidgetIsPending />}\n <ModalUserList\n open={openUsersModal}\n usersList={usersList}\n title={\n usersListIndex === 1\n ? intl.formatMessage({ id: 'WIDGET_Presence_On' })\n : intl.formatMessage({ id: 'WIDGET_Presence_Off' })\n }\n setOpen={setOpenUsersModal}\n onClose={() => {\n setUsersList({\n limit: 0,\n page: 0,\n data: [],\n cnt: 0,\n });\n }}\n handleLoadUsersList={(page) => {\n handleLoadUsersList(usersListIndex ?? 0, page);\n }}\n />\n </CSSWidgetPresenceWrapper>\n </RTProvider>\n );\n};\n","import { Toast, updateWidgetContent, Widget, WidgetEditor } from 'jamespot-front-business';\nimport jApi, {\n CombinedWidgetContent,\n jFileLittle,\n WidgetDisplayMode,\n WidgetQuickSurveyContent,\n WidgetQuickSurveyResponse,\n WidgetQuickSurveyResponseUserList,\n WidgetQuickSurveyType,\n WidgetsName,\n} from 'jamespot-user-api';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport { shallowEqual } from 'react-redux';\nimport styled from 'styled-components';\nimport { WidgetFooterView } from './components/WidgetFooterView';\nimport { WidgetInlineInputText } from './components/WidgetInlineInputText';\nimport { useWidgetRT } from '../hooks';\nimport { WidgetIsPending } from './components/WidgetIsPending';\nimport { JRCFileViewer } from 'jamespot-react-components';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { RTProvider } from '../../RTProvider.component';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst WidgetQuickSurvey = commonComponentsRegistry.getLazyComponent('WidgetQuickSurvey');\nconst WidgetQuickSurveyEditor = commonComponentsRegistry.getLazyComponent('WidgetQuickSurveyEditor');\nconst ModalUserList = commonComponentsRegistry.getLazyComponent('ModalUserList');\n\nconst WrapperContainer = styled.div<{ withPadding?: boolean }>`\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: 14px;\n ${(props) => props.withPadding && `padding: 0 12px;`}\n padding-top: 16px;\n`;\n\ntype JRCWidgetQuickSurveyWrapperProps = {\n widget: WidgetQuickSurveyType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n};\n\nexport const JRCWidgetQuickSurveyWrapper = ({ widget, inplace, mode }: JRCWidgetQuickSurveyWrapperProps) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const { uniqid, content: widgetContent } = widget;\n const [response, setResponse] = useState<WidgetQuickSurveyResponse>({\n userResponses: [],\n totalRespondent: 0,\n totalResponse: 0,\n userLoggedResponses: [],\n });\n const [openUsersModal, setOpenUsersModal] = useState(false);\n const [isPending, setIsPending] = useState(false);\n const [usersListIndex, setUsersListIndex] = useState<number>();\n const [usersList, setUsersList] = useState<WidgetQuickSurveyResponseUserList>();\n\n const [abortController] = useState<AbortController>(new AbortController());\n const ref = useRef<AbortController>(abortController);\n\n const token = useAppSelector(Widget.selectors.selectToken, shallowEqual);\n\n const uri = useAppSelector((state) => Widget.selectors.selectWidgetObjectUri(state, widget.uniqid), shallowEqual);\n\n const widgetObjectRights = useAppSelector(\n (state) => Widget.selectors.selectWidgetObjectRights(state, uniqid),\n shallowEqual,\n );\n\n const allRt = useAppSelector(\n (state) => Widget.selectors.selectAllWidgetRTObject(state, widget.uniqid),\n shallowEqual,\n );\n\n const onChange = useCallback(\n (uniqid: string, content: WidgetQuickSurveyContent) => {\n dispatch(updateWidgetContent(uniqid, content));\n },\n [dispatch],\n );\n\n const onChangeWrapper = (content: { uniqid: string; title?: string }) => {\n dispatch(Widget.slice.actions.updateWidgetWrapper({ ...content }));\n };\n\n const openEditorPanel = (token: string) => {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n dispatch(Widget.slice.actions.setToken({ token }));\n dispatch(\n WidgetEditor.slice.actions.registerEditor({\n uniqid: widget.uniqid,\n name: WidgetsName.QuickSurvey,\n }),\n );\n };\n\n const handleError = useCallback(\n () => dispatch(Toast.actions.error({ label: 'WIDGET_Presence_Error' })),\n [dispatch],\n );\n\n const handleResponse = useCallback(\n (uniqid: string) => {\n if (mode === 'edit' || !uri) return;\n setIsPending(true);\n jApi.widget\n .quickSurveyGetResponse({ uri, uniqid }, ref.current.signal)\n .then((response) => {\n setResponse(response.result);\n })\n .catch((err) => {\n return !err.aborted && handleError;\n })\n .finally(() => setIsPending(false));\n },\n [handleError, uri, mode],\n );\n\n const handleWidgetGet = useCallback(() => {\n if (!uri) return;\n setIsPending(true);\n jApi.widget\n .getWidget<WidgetQuickSurveyType>({ uri, uniqid }, ref.current.signal)\n .then((response) => {\n onChange(uniqid, response.result.content);\n })\n .catch((err) => {\n return !err.aborted && handleError;\n })\n .finally(() => setIsPending(false));\n }, [uniqid, handleError, uri, onChange]);\n\n const handleRespond = (index: number) => {\n if (mode === 'edit' || !uri) return;\n setIsPending(true);\n jApi.widget\n .quickSurveyRespond({ uri, index, multi: widgetContent.multi ? 1 : 0, uniqid }, ref.current.signal)\n .then(() => {\n handleResponse(widget.uniqid);\n })\n .catch((err) => !err.aborted && handleError)\n .finally(() => setIsPending(false));\n };\n\n const handleCloseSurvey = () => {\n if (!uri) return;\n if (widgetContent.closing) {\n const finalContent = { ...widgetContent, isClosed: true } as CombinedWidgetContent;\n\n jApi.widget\n .updateWidget<WidgetQuickSurveyType>({\n uri,\n uniqid,\n content: finalContent,\n })\n .catch(() => {\n handleError();\n });\n }\n };\n\n const handleProgressBarClick = (index: number) => {\n handleRespond(index);\n };\n\n const handleAddQuickAnswer = (title: string) => {\n if (!uri) return;\n\n const newContent = {\n ...widgetContent,\n arr: [...(widgetContent.arr ?? []), { title }],\n } as CombinedWidgetContent;\n\n jApi.widget\n .quickSurveyAddEnty({ uri, uniqid, label: title })\n .then(() => {\n dispatch(Widget.slice.actions.updateWidget({ uniqid, content: newContent }));\n })\n .catch(handleError);\n };\n\n const handleLoadUsersList = (index: number, page?: number) => {\n if (!uri) return;\n jApi.widget\n .quickSurveyGetResponseUserList({ uri, uniqid, index, page, limit: 8 }, ref.current.signal)\n .then((response) => {\n setUsersList({\n ...response.result,\n data: [...response.result.data],\n cnt: response.result.cnt,\n });\n })\n .catch((err) => {\n return !err.aborted && handleError;\n });\n };\n\n const canUpdate = useMemo(() => widgetObjectRights && widgetObjectRights.update, [widgetObjectRights]);\n\n useEffect(() => {\n handleResponse(widget.uniqid);\n }, [handleResponse, widget.uniqid]);\n\n useEffect(() => {\n if (!Array.isArray(allRt)) return;\n const lastRt = allRt.at(-1);\n if (!lastRt) return;\n if (!uri) return;\n\n if (lastRt.object.uri === uri && lastRt.uniqid === widget.uniqid) {\n if (lastRt.fn === 'widget-quick-survey-response') {\n handleResponse(widget.uniqid);\n }\n if (lastRt.fn === 'widget-update') {\n handleWidgetGet();\n }\n }\n }, [allRt, uri, widget.uniqid, handleWidgetGet, handleResponse]);\n\n const files = useMemo(() => {\n if (!Array.isArray(widgetContent.arr)) return [];\n\n const fs: jFileLittle[] = [];\n widgetContent.arr.forEach((el) => {\n if (el.file) {\n fs.push(el.file);\n }\n });\n\n return fs;\n }, [widgetContent]);\n\n useEffect(() => {\n if (!token && mode === 'edit') {\n jApi.network.token().then((response) => {\n dispatch(Widget.slice.actions.setToken({ token: response.result }));\n });\n }\n }, [mode, token, dispatch]);\n\n if (mode === 'edit') {\n if (inplace) {\n return (\n <WrapperContainer withPadding={true}>\n <WidgetQuickSurveyEditor\n token={token}\n uniqid={uniqid}\n content={widget.content}\n onChangeContent={onChange}\n onChangeWrapper={onChangeWrapper}\n handleChange={(content) => onChange(uniqid, content)}\n inplace={inplace}\n />\n </WrapperContainer>\n );\n }\n }\n\n return (\n <RTProvider\n useRT={() => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useWidgetRT(widget.uniqid);\n }}>\n <WrapperContainer>\n <JRCFileViewer files={files} openWithOptions={[]}>\n {(open) => {\n return (\n <WidgetQuickSurvey\n limit={response.totalResponse ?? 0}\n values={widgetContent.arr ?? []}\n userResponses={response.userResponses}\n userHasAlreadyVoted={response.userLoggedResponses.length > 0}\n canCloseSurvey={widget.content.closing ?? false}\n isClosed={widget.content.isClosed ?? false}\n open={widget.content.open ?? false}\n anonymize={widget.content.anonymize ?? false}\n seeResponseAfter={widget.content.seeResponseAfter ?? false}\n canUpdate={canUpdate}\n handleClickFile={(entry) => entry.id && open(entry.id)}\n handleCloseSurvey={handleCloseSurvey}\n handleProgressBarClick={handleProgressBarClick}\n setOpenUsersModal={(index) => {\n setUsersListIndex(index);\n handleLoadUsersList(index);\n setOpenUsersModal(true);\n }}\n />\n );\n }}\n </JRCFileViewer>\n\n {widgetContent.open && (\n <WidgetInlineInputText\n handleClick={handleAddQuickAnswer}\n placeholder={intl.formatMessage({ id: 'FIELDS_Add_Option' })}\n />\n )}\n {canUpdate && (\n <WidgetFooterView\n uniqid={widget.uniqid}\n name={widget.name}\n collaborationRights={{\n update: !!canUpdate,\n }}\n mode={mode}\n handleOpenEditor={() => {\n if (!token) {\n setIsPending(true);\n jApi.network\n .token()\n .then((response) => {\n dispatch(Widget.slice.actions.setToken({ token: response.result }));\n openEditorPanel(response.result);\n })\n .finally(() => setIsPending(false));\n } else {\n openEditorPanel(token);\n }\n }}\n />\n )}\n {isPending && <WidgetIsPending />}\n <ModalUserList\n open={openUsersModal}\n usersList={usersList}\n title={widgetContent.arr?.[usersListIndex ?? 0]?.title ?? ''}\n setOpen={setOpenUsersModal}\n handleLoadUsersList={(page) => {\n handleLoadUsersList(usersListIndex ?? 0, page);\n }}\n onClose={() => {\n setUsersList({\n limit: 0,\n page: 0,\n data: [],\n cnt: 0,\n });\n }}\n />\n </WrapperContainer>\n </RTProvider>\n );\n};\n","import jApi, {\n ImapConnection,\n OfficeProvider,\n OfficeSetConfigurationPayload,\n ValueOf,\n WidgetDisplayMode,\n WidgetEmailsImapType,\n} from 'jamespot-user-api';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useIntl, FormattedMessage } from 'react-intl';\nimport styled from 'styled-components';\nimport { JRCLoader, useAbortController } from 'jamespot-react-components';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\nimport { useDispatch } from 'react-redux';\nimport { Toast } from 'jamespot-front-business';\n\nconst ModalLayout = commonComponentsRegistry.getLazyComponent('ModalLayout');\nconst ModalContent = commonComponentsRegistry.getLazyComponent('ModalContent');\nconst Button = commonComponentsRegistry.getLazyComponent('Button');\nconst InputText = commonComponentsRegistry.getLazyComponent('InputText');\nconst InputNumber = commonComponentsRegistry.getLazyComponent('InputNumber');\nconst InputSelectExtended = commonComponentsRegistry.getLazyComponent('InputSelectExtended');\nconst InputPassword = commonComponentsRegistry.getLazyComponent('InputPassword');\nconst Typography = commonComponentsRegistry.getLazyComponent('Typography');\n\nexport const UIForm = styled.div<{ isLocked: boolean }>`\n display: flex;\n flex-direction: column;\n opacity: ${(props) => (props.isLocked ? '.4' : '1.0')};\n`;\n\nexport const UIWrapper = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nexport const UIProviderError = styled.div`\n background-color: ${(props) => props.theme.color.orange};\n color: ${(props) => props.theme.color.white};\n padding: ${(props) => props.theme.space.sm}px;\n border-radius: ${(props) => props.theme.space.sm}px;\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nexport const UISection = styled.div`\n margin-bottom: ${(props) => props.theme.space.md}px;\n`;\n\nexport type JRCWidgetEmailsImapProps = {\n widget: WidgetEmailsImapType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n};\n\nexport const officeConfigurationInitialState = {\n username: '',\n password: '',\n hostname: '',\n imapPort: 993,\n imapConnectionSecurity: ImapConnection.NONE,\n imapMailbox: '',\n cardDavAddressBook: '',\n calDavCalendar: '',\n provider: '',\n};\n\nexport const OfficeConfigurationPrompt = () => {\n const intl = useIntl();\n const dispatch = useDispatch();\n const abortController = useAbortController();\n const [isOpen, setIsOpen] = useState<boolean>(false);\n const [isPending, setIsPending] = useState<boolean>(false);\n const {\n control,\n reset,\n setValue,\n getValues,\n watch,\n formState: { isValid },\n } = useForm<OfficeSetConfigurationPayload>({\n defaultValues: officeConfigurationInitialState,\n criteriaMode: 'all',\n });\n\n const refresh = () => window.location.reload();\n const [providerList, setProviderList] = useState<OfficeProvider[]>([]);\n const data = watch();\n\n const imapConnectionSecurityOptions = [\n { label: 'NONE', value: ImapConnection.NONE },\n { label: 'SSL', value: ImapConnection.SSL },\n { label: 'STARTTLS', value: ImapConnection.STARTTLS },\n ];\n\n const fetchConfiguration = useCallback(\n (providers: string[]) => {\n jApi.office.getConfiguration().then(({ result }) => {\n reset({\n ...result,\n provider: !providers.includes(result.provider ?? '') ? providers[0] : result.provider,\n });\n });\n },\n [reset],\n );\n\n const handleSubmit = () => {\n if (isPending) return;\n setIsPending(true);\n jApi.office\n .setConfiguration(data)\n .then(() => refresh())\n .catch((err) => dispatch(Toast.actions.error({ label: err.errorMsg })))\n .finally(() => {\n setIsOpen(false);\n setIsPending(false);\n reset();\n });\n };\n\n useEffect(() => {\n if (!isOpen) return;\n setIsPending(true);\n jApi.office\n .getProviders({ signal: abortController.signal })\n .then(({ result }) => {\n if (!abortController.signal.aborted) {\n setProviderList(result);\n fetchConfiguration(result.map((provider) => provider.id));\n }\n })\n .catch((err) => {\n if (!abortController.signal.aborted) {\n dispatch(Toast.actions.error({ label: err.errorMsg }));\n }\n })\n .finally(() => {\n setIsPending(false);\n });\n }, [isOpen, abortController.signal, dispatch, fetchConfiguration]);\n\n useEffect(() => {\n if (providerList.length === 1) {\n setValue('provider', providerList[0].id);\n }\n }, [providerList, setValue]);\n\n const handleClose = () => setIsOpen(false);\n\n const hasProvider = useMemo(() => providerList.length > 1, [providerList]);\n\n return (\n <>\n <UIWrapper>\n <Button\n label={intl.formatMessage({ id: 'Office_Set_Configuration' })}\n onClick={() => setIsOpen(true)}\n />\n </UIWrapper>\n <ModalLayout open={isOpen} radius=\"small\" closeHandler={handleClose}>\n <ModalContent\n overflow={'scroll'}\n title={intl.formatMessage({ id: 'Office_Set_Configuration' })}\n onClickIconClose={handleClose}>\n {isPending ? (\n <JRCLoader size=\"s\" />\n ) : (\n <>\n {providerList.length === 0 && (\n <UIProviderError>{intl.formatMessage({ id: 'Office_No_Providers' })}</UIProviderError>\n )}\n <UIForm isLocked={providerList.length === 0}>\n {hasProvider && (\n <>\n <UISection>\n <Typography size={'l'}>\n <FormattedMessage id=\"OfficeHook_Conf_Provider\" />\n </Typography>\n <SelectProvider\n label=\"OfficeHook_Conf_Select_Provider\"\n initialValue={{\n label: providerList[0].label,\n value: providerList[0].id,\n }}\n options={providerList.map((el) => {\n return { label: el.label, value: el.id };\n })}\n handleChange={(value) => {\n if (getValues('provider') !== value) {\n reset();\n }\n setValue('provider', value);\n }}\n />\n </UISection>\n </>\n )}\n <UISection>\n <Typography size={'l'}>\n <FormattedMessage id=\"OfficeHook_Settings\" />\n </Typography>\n <InputText\n control={control}\n name={'hostname'}\n width={'400'}\n placeholder={intl.formatMessage({ id: 'OfficeHook_Conf_IMap_Hostname' })}\n rules={{ required: true }}\n />\n <InputText\n control={control}\n name={'username'}\n width={'400'}\n placeholder={intl.formatMessage({ id: 'OfficeHook_Conf_Username' })}\n rules={{ required: true }}\n />\n <InputPassword\n control={control}\n name={'password'}\n width={'400'}\n placeholder={intl.formatMessage({ id: 'OfficeHook_Conf_Password' })}\n rules={{ required: true }}\n />\n </UISection>\n <UISection>\n <Typography size={'l'}>\n <FormattedMessage id=\"OfficeHook_Conf_IMap_Mailbox\" />\n </Typography>\n <InputNumber\n control={control}\n name={'imapPort'}\n width={'400'}\n placeholder={intl.formatMessage({ id: 'OfficeHook_Conf_IMap_Port' })}\n rules={{ required: true }}\n />\n <SelectProvider\n label=\"OfficeHook_Conf_Select_Connection_Security\"\n initialValue={imapConnectionSecurityOptions[0]}\n options={imapConnectionSecurityOptions}\n handleChange={(value) =>\n setValue('imapConnectionSecurity', value as ValueOf<typeof ImapConnection>)\n }\n />\n <InputText\n control={control}\n name={'imapMailbox'}\n width={'400'}\n placeholder={intl.formatMessage({ id: 'OfficeHook_Conf_IMap_Mailbox' })}\n rules={{ required: true }}\n />\n </UISection>\n <UISection>\n <Typography size={'l'}>\n <FormattedMessage id=\"OfficeHook_Conf_CalDav_Calendar\" />\n </Typography>\n <InputText\n control={control}\n name={'calDavCalendar'}\n width={'400'}\n placeholder={intl.formatMessage({ id: 'OfficeHook_Conf_CalDav_Calendar' })}\n rules={{ required: true }}\n />\n </UISection>\n <UISection>\n <Typography size={'l'}>\n <FormattedMessage id=\"OfficeHook_Conf_CardDav_Address_Book\" />\n </Typography>\n <InputText\n control={control}\n name={'cardDavAddressBook'}\n width={'400'}\n placeholder={intl.formatMessage({ id: 'OfficeHook_Conf_CardDav_Address_Book' })}\n rules={{ required: true }}\n />\n </UISection>\n </UIForm>\n <Button\n label={intl.formatMessage({ id: 'OfficeHook_Conf_Prompt_Submit' })}\n loader={isPending}\n disabled={isPending || providerList.length === 0 || !isValid}\n onClick={handleSubmit}\n />\n </>\n )}\n </ModalContent>\n </ModalLayout>\n </>\n );\n};\n\nconst SelectProvider = ({\n label,\n initialValue,\n options,\n handleChange,\n}: {\n label: string;\n initialValue: { label: string; value: string };\n options: { label: string; value: string }[];\n handleChange: (value: string) => void;\n}) => {\n const { control, watch } = useForm<{ provider: { label: string; value: string } }>({\n defaultValues: {\n provider: initialValue,\n },\n criteriaMode: 'all',\n });\n\n useEffect(() => {\n const subscription = watch((data) => {\n if (!data.provider || !data.provider.value) return;\n handleChange(data.provider.value);\n });\n return () => subscription.unsubscribe();\n }, [watch, handleChange]);\n\n return (\n <InputSelectExtended\n label={label}\n name=\"provider\"\n options={options ?? []}\n getValue={(o) => o.value}\n getLabel=\"label\"\n getSearch=\"label\"\n control={control}\n rules={{ required: true }}\n />\n );\n};\n","import jApi from 'jamespot-user-api';\nimport React from 'react';\nimport styled from 'styled-components';\nimport { JRCButtonDropdownOptionProps } from 'jamespot-react-components';\nimport { officeConfigurationInitialState } from '../components/OfficeConfigurationPrompt';\n\nimport { useIntl } from 'react-intl';\nimport { useDispatch } from 'react-redux';\nimport { Widget } from 'jamespot-front-business';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\nimport { WidgetHeader } from '../components/WidgetHeader';\n\nconst ButtonDropdown = commonComponentsRegistry.getLazyComponent('ButtonDropdown');\nconst Tooltip = commonComponentsRegistry.getLazyComponent('Tooltip');\n\nexport const UIDropdown = styled.div`\n margin-right: ${(props) => props.theme.space.sm}px;\n button {\n background: ${(props) => props.theme.color.white};\n }\n`;\n\nexport const WidgetContactCardDavHeader = ({\n uniqid,\n isConfigurationValid = false,\n handleLogout,\n}: {\n uniqid: string;\n isConfigurationValid: boolean;\n handleLogout: () => void;\n}) => {\n const intl = useIntl();\n const dispatch = useDispatch();\n const onLogout = () => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: true }));\n jApi.office.setConfiguration(officeConfigurationInitialState).finally(handleLogout);\n };\n\n const options: JRCButtonDropdownOptionProps[] = [\n { label: intl.formatMessage({ id: 'WIDGET_Prompt_Logout' }), onClick: onLogout },\n ];\n\n return (\n <WidgetHeader\n uniqid={uniqid}\n dropdown={() => {\n return (\n isConfigurationValid && (\n <UIDropdown>\n <Tooltip\n position={'left'}\n description={intl.formatMessage({ id: 'WIDGET_Prompt_Dropdown' })}>\n <ButtonDropdown\n small\n smallOpenDirection=\"left\"\n options={options}\n icon={'icon-cogwheel'}\n label={''}\n color=\"primary\"\n variant=\"outlined\"\n />\n </Tooltip>\n </UIDropdown>\n )\n );\n }}\n />\n );\n};\n","import jApi, {\n DavAddressBookContact,\n WIDGET_LEVEL_1,\n WIDGET_LEVEL_3,\n WidgetContactCardDavType,\n WidgetDisplayMode,\n WidgetWrapperLevel,\n} from 'jamespot-user-api';\nimport { Toast, Widget } from 'jamespot-front-business';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { officeConfigurationInitialState, OfficeConfigurationPrompt } from './components/OfficeConfigurationPrompt';\nimport { WidgetContactCardDavHeader } from './WidgetContactCardDav/WidgetContactCardDavHeader';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { WidgetScroll } from './components/WidgetScroll';\nimport { WidgetStylePadding } from './components/WidgetStylePadding';\nimport { useAppSelector, useAppDispatch } from '../../../redux/store';\n\nconst WidgetContactCardDav = commonComponentsRegistry.getLazyComponent('WidgetContactCardDav');\n\nexport type JRCWidgetContactCardDavProps = {\n widget: WidgetContactCardDavType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n levelFallback?: (level: WidgetWrapperLevel, url: string) => React.ReactNode | undefined;\n};\n\nconst REFRESH_INTERVAL = 4000;\n\nexport const JRCWidgetContactCardDavWrapper = ({ widget, mode, levelFallback }: JRCWidgetContactCardDavProps) => {\n const { uniqid } = widget;\n const dispatch = useAppDispatch();\n const [isConfigurationValid, setIsConfigurationValid] = useState<boolean | undefined>(undefined);\n const [url, setUrl] = useState<string | undefined>(undefined);\n const [doInterval, setDoInterval] = useState<boolean>(false);\n const level = useAppSelector((state) => Widget.selectors.selectWidgetLevel(state, uniqid), shallowEqual);\n const [list, setList] = useState<DavAddressBookContact[]>([]);\n\n const handleLogout = useCallback(\n (err?: any, reload?: boolean) => {\n if (err && err.error === 400) {\n jApi.office.setConfiguration(officeConfigurationInitialState);\n }\n if (reload) {\n window.location.reload();\n return;\n }\n\n setIsConfigurationValid(false);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true, loading: false }));\n },\n [dispatch, uniqid],\n );\n\n const handleLogin = useCallback(\n (isValid: boolean) => {\n setIsConfigurationValid(isValid);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true }));\n },\n [dispatch, uniqid],\n );\n\n const handleLoading = useCallback(\n (loading: boolean) => dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading })),\n [uniqid, dispatch],\n );\n\n const fetchProviderUrls = useCallback(() => {\n jApi.office\n .getProviderBaseUrls()\n .then(({ result }) => {\n setUrl(result.dav_address_book_url);\n })\n .finally(() => handleLoading(false));\n }, [handleLoading]);\n\n const fetchData = useCallback(() => {\n jApi.office\n .davAddressBookGetContacts({ limit: 10 })\n .then(({ result }) => {\n setList(result);\n setDoInterval(true);\n })\n .catch(() => {\n dispatch(Toast.actions.error({ label: 'PLUGIN_Manager_Connection_Error' }));\n setIsConfigurationValid(false);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true, loading: false }));\n })\n .finally(() => handleLoading(false));\n }, [handleLoading, dispatch, uniqid]);\n\n useEffect(() => {\n if (!doInterval) return;\n if (!isConfigurationValid) return;\n if (level !== WIDGET_LEVEL_3) return;\n const interval = setInterval(fetchData, REFRESH_INTERVAL);\n return () => clearInterval(interval);\n }, [isConfigurationValid, fetchData, doInterval, level]);\n\n useEffect(() => {\n handleLoading(true);\n jApi.office\n .isConfigurationValid()\n .then(({ result }) => handleLogin(result))\n .catch(handleLogout)\n .finally(() => handleLoading(false));\n }, [handleLogin, level, fetchProviderUrls, handleLoading, handleLogout]);\n\n useEffect(() => {\n if (!isConfigurationValid) return;\n if (level === WIDGET_LEVEL_1) {\n handleLoading(true);\n fetchProviderUrls();\n return;\n }\n fetchData();\n }, [isConfigurationValid, fetchProviderUrls, handleLoading, fetchData, level]);\n\n if (isConfigurationValid && level && level !== WIDGET_LEVEL_3 && levelFallback) {\n return <>{levelFallback(level, url ?? '')}</>;\n }\n\n return (\n <WidgetScroll\n header={() => {\n return (\n <>\n <WidgetContactCardDavHeader\n uniqid={uniqid}\n isConfigurationValid={isConfigurationValid !== undefined && isConfigurationValid === true}\n handleLogout={() => handleLogout(undefined, true)}\n />\n </>\n );\n }}\n scrollable={() => {\n return (\n <WidgetStylePadding uniqid={uniqid}>\n {isConfigurationValid && <WidgetContactCardDav contactCardList={list} />}\n {isConfigurationValid === undefined && <></>}\n {isConfigurationValid !== undefined && isConfigurationValid === false && mode === 'view' && (\n <OfficeConfigurationPrompt />\n )}\n </WidgetStylePadding>\n );\n }}\n />\n );\n};\n","import jApi from 'jamespot-user-api';\nimport React from 'react';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\nimport { JRCButtonDropdownOptionProps } from 'jamespot-react-components';\nimport { officeConfigurationInitialState } from '../components/OfficeConfigurationPrompt';\n\nimport { useDispatch } from 'react-redux';\nimport { Widget } from 'jamespot-front-business';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\nimport { WidgetHeader } from '../components/WidgetHeader';\n\nconst ButtonDropdown = commonComponentsRegistry.getLazyComponent('ButtonDropdown');\nconst Tooltip = commonComponentsRegistry.getLazyComponent('Tooltip');\n\nexport const UIDropdown = styled.div`\n margin-right: ${(props) => props.theme.space.sm}px;\n button {\n background: ${(props) => props.theme.color.white};\n }\n`;\n\nexport const WidgetCalendarCalDavHeader = ({\n uniqid,\n isConfigurationValid = false,\n handleLogout,\n}: {\n uniqid: string;\n isConfigurationValid: boolean;\n handleLogout: () => void;\n}) => {\n const intl = useIntl();\n const dispatch = useDispatch();\n const onLogout = () => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: true }));\n jApi.office.setConfiguration(officeConfigurationInitialState).finally(handleLogout);\n };\n\n const options: JRCButtonDropdownOptionProps[] = [\n { label: intl.formatMessage({ id: 'WIDGET_Prompt_Logout' }), onClick: onLogout },\n ];\n\n return (\n <WidgetHeader\n uniqid={uniqid}\n dropdown={() => {\n return (\n isConfigurationValid && (\n <UIDropdown>\n <Tooltip\n position={'left'}\n description={intl.formatMessage({ id: 'WIDGET_Prompt_Dropdown' })}>\n <ButtonDropdown\n small\n smallOpenDirection=\"left\"\n options={options}\n icon={'icon-cogwheel'}\n label={''}\n color=\"primary\"\n variant=\"outlined\"\n />\n </Tooltip>\n </UIDropdown>\n )\n );\n }}\n />\n );\n};\n","import { Toast, Widget } from 'jamespot-front-business';\nimport { Utils } from 'jamespot-react-components';\nimport jApi, {\n DavCalendarEvent,\n WIDGET_LEVEL_1,\n WIDGET_LEVEL_3,\n WidgetCalendarCalDavType,\n WidgetDisplayMode,\n WidgetWrapperLevel,\n} from 'jamespot-user-api';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { officeConfigurationInitialState, OfficeConfigurationPrompt } from './components/OfficeConfigurationPrompt';\nimport { WidgetScroll } from './components/WidgetScroll';\nimport { WidgetStylePadding } from './components/WidgetStylePadding';\nimport { WidgetCalendarCalDavHeader } from './WidgetCalendarCalDav/WidgetCalendarCalDavHeader';\n\nconst WidgetCalendarCalDav = commonComponentsRegistry.getLazyComponent('WidgetCalendarCalDav');\n\nexport type JRCWidgetCalendarCalDavWrapperProps = {\n widget: WidgetCalendarCalDavType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n levelFallback?: (level: WidgetWrapperLevel, url: string) => React.ReactNode | undefined;\n};\n\nconst REFRESH_INTERVAL = 60 * 1000;\n\nexport const JRCWidgetCalendarCalDavWrapper = ({\n widget,\n mode,\n levelFallback,\n}: JRCWidgetCalendarCalDavWrapperProps) => {\n const { uniqid } = widget;\n const dispatch = useAppDispatch();\n const [isConfigurationValid, setIsConfigurationValid] = useState<boolean | undefined>(undefined);\n const [doInterval, setDoInterval] = useState<boolean>(false);\n const level = useAppSelector((state) => Widget.selectors.selectWidgetLevel(state, uniqid), shallowEqual);\n\n const [url, setUrl] = useState<string | undefined>(undefined);\n const [list, setList] = useState<DavCalendarEvent[]>([]);\n\n const handleLogout = useCallback(\n (err?: any, reload?: boolean) => {\n if (err && err.error === 400) {\n jApi.office.setConfiguration(officeConfigurationInitialState);\n }\n if (reload) {\n window.location.reload();\n return;\n }\n\n setIsConfigurationValid(false);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true, loading: false }));\n },\n [dispatch, uniqid],\n );\n\n const handleLogin = useCallback(\n (isValid: boolean) => {\n setIsConfigurationValid(isValid);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true }));\n },\n [dispatch, uniqid],\n );\n\n const handleLoading = useCallback(\n (loading: boolean) => dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading })),\n [uniqid, dispatch],\n );\n\n const fetchProviderUrls = useCallback(() => {\n jApi.office\n .getProviderBaseUrls()\n .then(({ result }) => {\n setUrl(result.dav_calendar_url);\n })\n .finally(() => handleLoading(false));\n }, [handleLoading]);\n\n const fetchData = useCallback(() => {\n const now = new Date();\n const nextMonth = Utils.date.addMonth(new Date(now));\n\n jApi.office\n .davCalendarGetEvents({\n limit: 10,\n dateStart: Utils.date.formatDateTime(now),\n dateEnd: Utils.date.formatDateTime(nextMonth),\n })\n .then(({ result }) => {\n setList(result);\n setDoInterval(true);\n })\n .catch(() => {\n dispatch(Toast.actions.error({ label: 'PLUGIN_Manager_Connection_Error' }));\n setIsConfigurationValid(false);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true, loading: false }));\n })\n .finally(() => handleLoading(false));\n }, [handleLoading, dispatch, uniqid]);\n\n useEffect(() => {\n if (!doInterval) return;\n if (!isConfigurationValid) return;\n if (level !== WIDGET_LEVEL_3) return;\n const interval = setInterval(fetchData, REFRESH_INTERVAL);\n return () => clearInterval(interval);\n }, [isConfigurationValid, fetchData, doInterval, level]);\n\n useEffect(() => {\n handleLoading(true);\n jApi.office\n .isConfigurationValid()\n .then(({ result }) => handleLogin(result))\n .catch(handleLogout);\n }, [handleLogout, handleLoading, handleLogin]);\n\n useEffect(() => {\n if (!isConfigurationValid) return;\n if (level === WIDGET_LEVEL_1) {\n handleLoading(true);\n fetchProviderUrls();\n return;\n }\n fetchData();\n }, [isConfigurationValid, fetchProviderUrls, handleLoading, fetchData, level]);\n\n if (isConfigurationValid && level && level !== WIDGET_LEVEL_3 && levelFallback) {\n return <>{levelFallback(level, url ?? '')}</>;\n }\n\n return (\n <WidgetScroll\n header={() => {\n return (\n <>\n <WidgetCalendarCalDavHeader\n uniqid={uniqid}\n isConfigurationValid={isConfigurationValid !== undefined && isConfigurationValid === true}\n handleLogout={() => handleLogout(undefined, true)}\n />\n </>\n );\n }}\n scrollable={() => {\n return (\n <WidgetStylePadding uniqid={uniqid}>\n {isConfigurationValid && <WidgetCalendarCalDav calendarListEvent={list} />}\n {isConfigurationValid === undefined && <></>}\n {isConfigurationValid !== undefined && isConfigurationValid === false && mode === 'view' && (\n <OfficeConfigurationPrompt />\n )}\n </WidgetStylePadding>\n );\n }}\n />\n );\n};\n","import jApi from 'jamespot-user-api';\nimport { Widget } from 'jamespot-front-business';\nimport React from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\nimport { JRCButtonDropdownOptionProps } from 'jamespot-react-components';\nimport { officeConfigurationInitialState } from '../components/OfficeConfigurationPrompt';\nimport { useAppSelector, useAppDispatch } from '../../../../redux/store';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\nimport { WidgetHeader } from '../components/WidgetHeader';\n\nconst ButtonDropdown = commonComponentsRegistry.getLazyComponent('ButtonDropdown');\nconst Tooltip = commonComponentsRegistry.getLazyComponent('Tooltip');\n\nexport const UIDropdown = styled.div`\n margin-right: ${(props) => props.theme.space.sm}px;\n button {\n background: ${(props) => props.theme.color.white};\n }\n`;\n\nexport const UICount = styled.div<{ color: string }>`\n font-size: ${(props) => props.theme.size.sm + 4}px;\n color: ${(props) => props.color};\n`;\n\nexport const WidgetEmailsImapHeader = ({\n uniqid,\n isConfigurationValid = false,\n handleLogout,\n}: {\n uniqid: string;\n isConfigurationValid: boolean;\n handleLogout: () => void;\n}) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n\n const count = useAppSelector((state) => Widget.selectors.selectWidgetChipCount(state, uniqid), shallowEqual);\n\n const onLogout = () => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: true }));\n jApi.office.setConfiguration(officeConfigurationInitialState).finally(handleLogout);\n };\n\n const options: JRCButtonDropdownOptionProps[] = [\n { label: intl.formatMessage({ id: 'WIDGET_Prompt_Logout' }), onClick: onLogout },\n ];\n\n return (\n <WidgetHeader\n uniqid={uniqid}\n dropdown={() => {\n return (\n isConfigurationValid && (\n <UIDropdown>\n <Tooltip\n position={'left'}\n description={intl.formatMessage({ id: 'WIDGET_Prompt_Dropdown' })}>\n <ButtonDropdown\n small\n smallOpenDirection=\"left\"\n options={options}\n icon={'icon-cogwheel'}\n label={''}\n color=\"primary\"\n variant=\"outlined\"\n />\n </Tooltip>\n </UIDropdown>\n )\n );\n }}\n subHeader={(color: string) => {\n return (\n isConfigurationValid &&\n count !== 0 && (\n <UICount color={color}>\n ({intl.formatMessage({ id: 'WIDGET_Email_IMAP_Unread_Emails' }, { count })})\n </UICount>\n )\n );\n }}\n />\n );\n};\n","import jApi, {\n ImapInboxMail,\n WIDGET_LEVEL_1,\n WIDGET_LEVEL_2,\n WIDGET_LEVEL_3,\n WidgetDisplayMode,\n WidgetEmailsImapType,\n WidgetWrapperLevel,\n} from 'jamespot-user-api';\nimport { Toast, Widget } from 'jamespot-front-business';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { WidgetEmailsImapHeader } from './WidgetEmailsImap/WidgetEmailsImapHeader';\nimport { officeConfigurationInitialState, OfficeConfigurationPrompt } from './components/OfficeConfigurationPrompt';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { WidgetScroll } from './components/WidgetScroll';\nimport { WidgetStylePadding } from './components/WidgetStylePadding';\nimport { useAppSelector, useAppDispatch } from '../../../redux/store';\n\nconst WidgetEmailsImap = commonComponentsRegistry.getLazyComponent('WidgetEmailsImap');\n\nconst REFRESH_INTERVAL = 60 * 1000;\n\nexport type JRCWidgetEmailsImapProps = {\n widget: WidgetEmailsImapType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n levelFallback?: (level: WidgetWrapperLevel, url: string) => React.ReactNode | undefined;\n};\n\nexport const JRCWidgetEmailsImapWrapper = ({ widget, mode, levelFallback }: JRCWidgetEmailsImapProps) => {\n const { uniqid } = widget;\n const dispatch = useAppDispatch();\n const [isConfigurationValid, setIsConfigurationValid] = useState<boolean | undefined>(undefined);\n const [doInterval, setDoInterval] = useState<boolean>(false);\n const [list, setList] = useState<ImapInboxMail[]>([]);\n const [url, setUrl] = useState<string | undefined>(undefined);\n const level = useAppSelector((state) => Widget.selectors.selectWidgetLevel(state, widget.uniqid), shallowEqual);\n\n const handleLogout = useCallback(\n (err?: any, reload?: boolean) => {\n if (err && err.error === 400) {\n jApi.office.setConfiguration(officeConfigurationInitialState);\n }\n if (reload) {\n window.location.reload();\n return;\n }\n\n setIsConfigurationValid(false);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true, loading: false }));\n },\n [dispatch, uniqid],\n );\n\n const fetchUnreadEmailsCount = useCallback(() => {\n jApi.office\n .imapInboxGetUnreadEmailsCount()\n .then(({ result }) => {\n dispatch(Widget.slice.actions.setWidgetChipCount({ uniqid, count: result }));\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true }));\n })\n .catch(handleLogout);\n }, [dispatch, uniqid, handleLogout]);\n\n const handleLoading = useCallback(\n (loading: boolean) => dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading })),\n [uniqid, dispatch],\n );\n\n const fetchProviderUrls = useCallback(() => {\n jApi.office\n .getProviderBaseUrls()\n .then(({ result }) => {\n setUrl(result.imap_inbox_url);\n })\n .finally(() => handleLoading(false));\n }, [handleLoading]);\n\n const handleLogin = useCallback(\n (isValid: boolean) => {\n setIsConfigurationValid(isValid);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true }));\n },\n [dispatch, uniqid],\n );\n\n const fetchData = useCallback(() => {\n jApi.office\n .imapInboxGetEmails({ limit: 10 })\n .then(({ result }) => {\n setList(result);\n setDoInterval(true);\n })\n .catch(() => {\n dispatch(Toast.actions.error({ label: 'PLUGIN_Manager_Connection_Error' }));\n setIsConfigurationValid(false);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true, loading: false }));\n })\n .finally(() => handleLoading(false));\n }, [handleLoading, dispatch, uniqid]);\n\n useEffect(() => {\n if (!doInterval) return;\n if (!isConfigurationValid) return;\n if (level === WIDGET_LEVEL_1) return;\n const interval = setInterval(() => {\n if (level === WIDGET_LEVEL_2) {\n fetchUnreadEmailsCount();\n }\n if (level === WIDGET_LEVEL_3) {\n fetchUnreadEmailsCount();\n fetchData();\n }\n }, REFRESH_INTERVAL);\n return () => clearInterval(interval);\n }, [isConfigurationValid, fetchData, doInterval, fetchUnreadEmailsCount, level]);\n\n useEffect(() => {\n jApi.office\n .isConfigurationValid()\n .then(({ result }) => handleLogin(result))\n .catch(handleLogout);\n }, [handleLogin, handleLogout]);\n\n useEffect(() => {\n if (!isConfigurationValid) return;\n if (level === WIDGET_LEVEL_1) {\n handleLoading(true);\n fetchProviderUrls();\n return;\n }\n if (level === WIDGET_LEVEL_2) {\n handleLoading(true);\n fetchUnreadEmailsCount();\n fetchProviderUrls();\n return;\n }\n\n handleLoading(true);\n fetchUnreadEmailsCount();\n fetchData();\n }, [isConfigurationValid, level, fetchProviderUrls, fetchData, handleLoading, fetchUnreadEmailsCount, dispatch]);\n\n if (isConfigurationValid && level && level !== WIDGET_LEVEL_3 && levelFallback) {\n return <>{levelFallback(level, url ?? '')}</>;\n }\n\n return (\n <WidgetScroll\n header={() => {\n return (\n <>\n <WidgetEmailsImapHeader\n uniqid={uniqid}\n isConfigurationValid={isConfigurationValid !== undefined && isConfigurationValid === true}\n handleLogout={() => handleLogout(undefined, true)}\n />\n </>\n );\n }}\n scrollable={() => {\n return (\n <WidgetStylePadding uniqid={uniqid}>\n {isConfigurationValid === undefined && <></>}\n {isConfigurationValid !== undefined && isConfigurationValid === false && mode === 'view' && (\n <OfficeConfigurationPrompt />\n )}\n {isConfigurationValid && <WidgetEmailsImap emailList={list} />}\n </WidgetStylePadding>\n );\n }}\n />\n );\n};\n","import React, { useMemo, CSSProperties } from 'react';\nimport { Widget } from 'jamespot-front-business';\nimport { shallowEqual } from 'react-redux';\nimport styled, { useTheme } from 'styled-components';\nimport { JRCHtml } from 'jamespot-react-components';\nimport { useAppSelector } from '../../../../redux/store';\n\nexport const CSSWidgetTitle = styled.div`\n padding: ${(props) => props.theme.space.md}px;\n border-bottom: 1px solid ${(props) => props.theme.color.grey1};\n`;\n\nexport const WidgetTitle = ({ uniqid }: { uniqid: string }) => {\n const widgetWrapper = useAppSelector((state) => Widget.selectors.selectWidget(state, uniqid), shallowEqual);\n const theme = useTheme();\n const styles = useAppSelector((state) => Widget.selectors.selectWidgetTitleStyle(state, uniqid), shallowEqual);\n\n const initialValues = useMemo(() => {\n return {\n color: styles && styles['color'] ? String(styles['color']) : theme.color.black,\n backgroundColor:\n styles && styles['background-color'] ? String(styles['background-color']) : theme.color.white,\n fontSize: styles && styles['font-size'] ? `${styles['font-size']}px` : '24px',\n fontWeight: styles && styles['font-weight'] ? String(styles['font-weight']) : 'medium',\n textAlign: styles && styles['text-align'] ? String(styles['text-align']) : 'left',\n };\n }, [styles, theme]);\n\n const title = useMemo(() => {\n return widgetWrapper && typeof widgetWrapper.title === 'string' && widgetWrapper.title.length !== 0\n ? widgetWrapper.title\n : undefined;\n }, [widgetWrapper]);\n\n if (!title) return <></>;\n\n return (\n <CSSWidgetTitle\n style={{\n color: initialValues.color,\n backgroundColor: initialValues.backgroundColor,\n fontSize: initialValues.fontSize,\n fontWeight: initialValues.fontWeight,\n textAlign: initialValues.textAlign as CSSProperties['textAlign'],\n }}>\n <JRCHtml as=\"span\" __html={title} />\n </CSSWidgetTitle>\n );\n};\n","import { Widget } from 'jamespot-front-business';\nimport { JRCInputText } from 'jamespot-react-components';\nimport React, { useEffect } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useIntl } from 'react-intl';\nimport { shallowEqual } from 'react-redux';\nimport { useAppDispatch, useAppSelector } from '../../../../redux/store';\n\nexport const WidgetTitleEdit = ({ uniqid }: { uniqid: string }) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const widgetWrapperTitle = useAppSelector(\n (state) => Widget.selectors.selectWidget(state, uniqid)?.title,\n shallowEqual,\n );\n\n const { control, watch } = useForm({\n defaultValues: { widgetTitle: widgetWrapperTitle },\n criteriaMode: 'all',\n });\n\n useEffect(() => {\n const subscription = watch((data) => {\n dispatch(Widget.slice.actions.updateWidgetWrapper({ uniqid, title: data.widgetTitle }));\n });\n return () => subscription.unsubscribe();\n }, [watch, dispatch, uniqid]);\n\n return (\n <JRCInputText\n name={'widgetTitle'}\n control={control}\n placeholder={intl.formatMessage({ id: 'GLOBAL_Title' })}\n width=\"100%\"\n margin=\"0\"\n />\n );\n};\n","import React, { useCallback, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\nimport { WidgetTitleEdit } from './WidgetTitleEdit';\nimport { JRCIconButton } from 'jamespot-react-components';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { WidgetsName } from 'jamespot-user-api';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\nimport { useAppDispatch } from '../../../../redux/store';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\nconst JRCModalLayout = commonComponentsRegistry.getLazyComponent('ModalLayout');\nconst JRCModalContent = commonComponentsRegistry.getLazyComponent('ModalContent');\n\nexport const CSSModalFooter = styled.div`\n padding: ${(props) => props.theme.space.md}px;\n display: flex;\n flex-direction: row-reverse;\n`;\n\nexport const CSSWidgetHeaderEdit = styled.div`\n flex: 1;\n display: flex;\n flex-direction: row;\n gap: ${(props) => props.theme.space.sm}px;\n padding: ${(props) => props.theme.space.sm}px;\n border-bottom: 1px solid ${(props) => props.theme.color.grey1};\n`;\n\nexport const CSSWidgetHeaderEditTitle = styled.div`\n flex: 1;\n display: flex;\n fieldset:first-of-type {\n margin: 0px !important;\n }\n`;\n\nexport const CSSWidgetHeaderEditActions = styled.div`\n display: flex;\n gap: ${(props) => props.theme.space.sm}px;\n`;\n\nexport const WidgetHeaderEdit = ({\n uniqid,\n name,\n handleOpenEditor,\n}: {\n uniqid: string;\n name: WidgetsName;\n handleOpenEditor?: () => void;\n}) => {\n const dispatch = useAppDispatch();\n const intl = useIntl();\n const [isOpen, setIsOpen] = useState<boolean>(false);\n\n const handleOnClick = useCallback(() => {\n dispatch(\n WidgetEditor.slice.actions.registerEditor({\n uniqid,\n name,\n mode: 'edit',\n }),\n );\n }, [uniqid, dispatch, name]);\n\n const handleRemoveWidget = useCallback(() => {\n dispatch(Widget.slice.actions.flushWidget({ uniqid }));\n }, [uniqid, dispatch]);\n\n return (\n <>\n <CSSWidgetHeaderEdit>\n <CSSWidgetHeaderEditTitle>\n <WidgetTitleEdit uniqid={uniqid} />\n </CSSWidgetHeaderEditTitle>\n <CSSWidgetHeaderEditActions>\n <JRCIconButton\n icon=\"icon-pencil\"\n bg={'grey1'}\n bgHover={'grey2'}\n color={'grey5'}\n iconSize={14}\n onClick={handleOpenEditor ?? handleOnClick}\n title={intl.formatMessage({ id: 'BUTTON_Title_Open_Edit_Panel' })}\n />\n <JRCIconButton\n icon=\"icon-trash\"\n bg={'grey1'}\n bgHover={'grey2'}\n color={'grey5'}\n iconSize={14}\n onClick={() => setIsOpen(true)}\n title={intl.formatMessage({ id: 'BUTTON_Title_Open_Remove_Widget' })}\n />\n </CSSWidgetHeaderEditActions>\n </CSSWidgetHeaderEdit>\n {isOpen && (\n <JRCModalLayout enableClickAwayCloseModal={true} open={isOpen} closeHandler={() => setIsOpen(false)}>\n <JRCModalContent\n overflow={'scroll'}\n title={intl.formatMessage({ id: 'WIDGET_Remove_Widget' })}\n onClickIconClose={() => setIsOpen(false)}>\n {intl.formatMessage({ id: 'WIDGET_Delete_Widget_Confirmation' })}\n </JRCModalContent>\n <CSSModalFooter>\n <JRCButton label={intl.formatMessage({ id: 'GLOBAL_Confirm' })} onClick={handleRemoveWidget} />\n </CSSModalFooter>\n </JRCModalLayout>\n )}\n </>\n );\n};\n","import { useAppSelector } from '../../../redux/store';\nimport { Hook } from 'jamespot-front-business';\nimport { LicenseHookListType } from 'jamespot-user-api';\nimport React, { ReactNode } from 'react';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nconst UILicenseRequired = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${(props) => props.theme.color.orange};\n`;\n\nexport const WidgetLicenseWrapper = ({ children, name }: { children: ReactNode; name: keyof LicenseHookListType }) => {\n const hook = useAppSelector((state) => Hook.selectors.selectHook(state, name));\n const intl = useIntl();\n\n if (hook && !hook.hasLicense) {\n return (\n <UILicenseRequired>\n {intl.formatMessage({ id: 'WIDGET_Missing_License' }, { label: 'label' in hook ? hook.label : '' })}\n </UILicenseRequired>\n );\n }\n\n return <>{children}</>;\n};\n","import React, { ReactNode } from 'react';\n\nimport {\n CombinedWidgetType,\n ensureWidgetArticleAttachmentType,\n ensureWidgetArticleButtonType,\n ensureWidgetArticleGalleryType,\n ensureWidgetArticleImageType,\n ensureWidgetArticleSliderType,\n ensureWidgetArticleTextType,\n ensureWidgetArticleTitleType,\n ensureWidgetCalendarCalDavType,\n ensureWidgetCheckListType,\n ensureWidgetContactCardDavType,\n ensureWidgetDatasourceTableType,\n ensureWidgetEmailsImapType,\n ensureWidgetExcelDatasourceTableType,\n ensureWidgetLuccaAbsenceType,\n ensureWidgetPresenceType,\n ensureWidgetQuickSurveyType,\n WidgetDisplayMode,\n WidgetWrapperLevel,\n} from 'jamespot-user-api';\n\nimport styled from 'styled-components';\n\nexport const CSSWidgetWithTitle = styled.div`\n display: flex;\n flex: 1;\n flex-direction: column;\n`;\n\nimport { JRCWidgetArticleAttachmentWrapper } from './wrapper/JRCWidgetArticleAttachmentWrapper';\nimport { JRCWidgetArticleButtonWrapper } from './wrapper/JRCWidgetArticleButtonWrapper';\nimport { JRCWidgetArticleGalleryWrapper } from './wrapper/JRCWidgetArticleGalleryWrapper';\nimport { JRCWidgetLuccaAbsenceWrapper } from './wrapper/JRCWidgetLuccaAbsenceWrapper';\nimport { JRCWidgetArticleImageWrapper } from './wrapper/JRCWidgetArticleImageWrapper';\nimport { JRCWidgetArticleSliderWrapper } from './wrapper/JRCWidgetArticleSliderWrapper';\nimport { JRCWidgetArticleTextWrapper } from './wrapper/JRCWidgetArticleTextWrapper';\nimport { JRCWidgetArticleTitleWrapper } from './wrapper/JRCWidgetArticleTitleWrapper';\nimport { JRCWidgetCheckListWrapper } from './wrapper/JRCWidgetCheckListWrapper';\nimport { WidgetDatasourceTableWrapper } from './wrapper/JRCWidgetDatasourceTableWrapper';\nimport { WidgetExcelDatasourceTableWrapper } from './wrapper/JRCWidgetExcelDatasourceTableWrapper';\nimport { JRCWidgetPresenceWrapper } from './wrapper/JRCWidgetPresenceWrapper';\nimport { JRCWidgetQuickSurveyWrapper } from './wrapper/JRCWidgetQuickSurveyWrapper';\n\nimport { JRCWidgetContactCardDavWrapper } from './wrapper/JRCWidgetContactCardDavWrapper';\nimport { JRCWidgetCalendarCalDavWrapper } from './wrapper/JRCWidgetCalendarCalDavWrapper';\nimport { JRCWidgetEmailsImapWrapper } from './wrapper/JRCWidgetEmailsImapWrapper';\n\nimport { WidgetTitle } from './wrapper/components/WidgetTitle';\n\nimport { WidgetHeaderEdit } from './wrapper/components/WidgetHeaderEdit';\nimport { WidgetLicenseWrapper } from './wrapper/WidgetLicenseWrapper';\n\nexport const DisplayWidget = ({\n widget,\n width,\n inplace = false,\n mode = 'view',\n onWidgetUpdate,\n cannotDisplayComponent,\n levelFallback,\n dataCy,\n}: {\n widget: CombinedWidgetType;\n width?: number | undefined;\n inplace: boolean;\n mode: WidgetDisplayMode;\n onWidgetUpdate?: () => void;\n cannotDisplayComponent?: (widget: string) => ReactNode;\n levelFallback?: (level: WidgetWrapperLevel, url: string) => ReactNode | undefined;\n dataCy?: string;\n}) => {\n const { name } = widget;\n\n if (ensureWidgetArticleButtonType(widget)) {\n return <JRCWidgetArticleButtonWrapper widget={widget} inplace={inplace} mode={mode} />;\n } else if (ensureWidgetArticleGalleryType(widget)) {\n return <JRCWidgetArticleGalleryWrapper widget={widget} inplace={inplace} mode={mode} />;\n } else if (ensureWidgetLuccaAbsenceType(widget)) {\n return (\n <CSSWidgetWithTitle>\n <WidgetLicenseWrapper name={'LuccaAbsenceHook'}>\n <JRCWidgetLuccaAbsenceWrapper uniqid={widget.uniqid} />\n </WidgetLicenseWrapper>\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetArticleAttachmentType(widget)) {\n return <JRCWidgetArticleAttachmentWrapper widget={widget} inplace={inplace} mode={mode} />;\n } else if (ensureWidgetArticleImageType(widget)) {\n return <JRCWidgetArticleImageWrapper widget={widget} inplace={inplace} mode={mode} />;\n } else if (ensureWidgetArticleSliderType(widget)) {\n return <JRCWidgetArticleSliderWrapper widget={widget} inplace={inplace} mode={mode} width={width ?? 800} />;\n } else if (ensureWidgetArticleTitleType(widget)) {\n return <JRCWidgetArticleTitleWrapper widget={widget} inplace={inplace} mode={mode} dataCy={dataCy} />;\n } else if (ensureWidgetArticleTextType(widget)) {\n return <JRCWidgetArticleTextWrapper widget={widget} inplace={inplace} mode={mode} />;\n } else if (ensureWidgetExcelDatasourceTableType(widget)) {\n return (\n <CSSWidgetWithTitle>\n <WidgetTitle uniqid={widget.uniqid} />\n <WidgetExcelDatasourceTableWrapper {...widget.content} uniqid={widget.uniqid} mode={mode} />\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetDatasourceTableType(widget)) {\n return (\n <CSSWidgetWithTitle>\n <WidgetTitle uniqid={widget.uniqid} />\n <WidgetDatasourceTableWrapper {...widget.content} uniqid={widget.uniqid} mode={mode} />\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetCheckListType(widget, widget.name === 'widget-check-list')) {\n return (\n <CSSWidgetWithTitle>\n {mode === 'edit' ? (\n <WidgetHeaderEdit name={widget.name} uniqid={widget.uniqid} />\n ) : (\n <WidgetTitle uniqid={widget.uniqid} />\n )}\n <JRCWidgetCheckListWrapper\n widget={widget}\n inplace={inplace}\n mode={mode}\n onWidgetUpdate={onWidgetUpdate}\n />\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetPresenceType(widget)) {\n return (\n <CSSWidgetWithTitle>\n {mode === 'edit' ? (\n <WidgetHeaderEdit name={widget.name} uniqid={widget.uniqid} />\n ) : (\n <WidgetTitle uniqid={widget.uniqid} />\n )}\n <JRCWidgetPresenceWrapper widget={widget} inplace={inplace} mode={mode} />\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetQuickSurveyType(widget)) {\n return (\n <CSSWidgetWithTitle>\n {mode === 'edit' ? (\n <WidgetHeaderEdit name={widget.name} uniqid={widget.uniqid} />\n ) : (\n <WidgetTitle uniqid={widget.uniqid} />\n )}\n <JRCWidgetQuickSurveyWrapper widget={widget} inplace={inplace} mode={mode} />\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetCalendarCalDavType(widget)) {\n return (\n <CSSWidgetWithTitle>\n <WidgetLicenseWrapper name={'OfficeHook'}>\n <JRCWidgetCalendarCalDavWrapper\n widget={widget}\n inplace={inplace}\n mode={mode}\n levelFallback={levelFallback}\n />\n </WidgetLicenseWrapper>\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetContactCardDavType(widget)) {\n return (\n <CSSWidgetWithTitle>\n <WidgetLicenseWrapper name={'OfficeHook'}>\n <JRCWidgetContactCardDavWrapper\n widget={widget}\n inplace={inplace}\n mode={mode}\n levelFallback={levelFallback}\n />\n </WidgetLicenseWrapper>\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetEmailsImapType(widget)) {\n return (\n <CSSWidgetWithTitle>\n <WidgetLicenseWrapper name={'OfficeHook'}>\n <JRCWidgetEmailsImapWrapper\n widget={widget}\n inplace={inplace}\n mode={mode}\n levelFallback={levelFallback}\n />\n </WidgetLicenseWrapper>\n </CSSWidgetWithTitle>\n );\n } else {\n return cannotDisplayComponent ? <>{cannotDisplayComponent(name)}</> : <>cannot display widget ({name})</>;\n }\n};\n","import styled from 'styled-components';\n\nexport const CSSWidgetLayer = styled.div<{ opacity: number; backgroundColor: string; pointerEvents: string }>`\n position: absolute;\n inset: 0;\n opacity: ${(props) => props.opacity};\n background-color: ${(props) => props.backgroundColor};\n pointer-events: ${(props) => props.pointerEvents};\n`;\n","import React, { ReactElement, useCallback, useEffect, useRef, useState } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { WidgetVector, WidgetDisplayMode, WidgetKeys } from 'jamespot-user-api';\nimport { WidgetEditor, Widget } from 'jamespot-front-business';\n// eslint-disable-next-line import/no-cycle\nimport WidgetWrapperCore from '../WidgetWrapperCore';\nimport { CSSWidgetLayer } from './WidgetLayer.style';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst BETA_JRCDoubleClick = commonComponentsRegistry.getLazyComponent('DoubleClick');\n\n/*\n Widget layering\n*/\n\nexport const WidgetLayer = ({ uniqid, mode }: { uniqid: string; mode: WidgetDisplayMode }) => {\n const layers = useAppSelector((state) => state.widgets.ids[uniqid].widget.layers, shallowEqual);\n return (\n <>\n {layers?.map((layer, index) => {\n if (mode === 'edit') {\n return <Layer uniqid={layer} key={index} mode={'edit'} />;\n }\n\n return <Layer uniqid={layer} key={index} mode={'edit'} />;\n })}\n </>\n );\n};\n\nconst Layer = ({ uniqid, mode }: { uniqid: string; mode: WidgetDisplayMode }) => {\n const layer = useAppSelector((state) => state.widgets.layers[uniqid]);\n if (mode === 'view') {\n return (\n <CSSWidgetLayer opacity={1} backgroundColor={'transparent'} pointerEvents={'none'}>\n {layer.widgets.map((widgetWrapper, index) => {\n return (\n <LayerWidget\n key={index}\n layerId={layer.uniqid}\n uniqid={widgetWrapper.widget.uniqid}\n mode={'view'}\n />\n );\n })}\n </CSSWidgetLayer>\n );\n }\n\n return (\n <CSSWidgetLayer\n opacity={layer.visible ? 1 : 0}\n backgroundColor={layer.visible ? 'rgba(255,255,255,.1)' : 'transparent'}\n pointerEvents={layer.locked ? 'none' : 'all'}>\n {layer.widgets.map((widgetWrapper, index) => {\n return (\n <LayerWidget\n key={index}\n layerId={layer.uniqid}\n uniqid={widgetWrapper.widget.uniqid}\n mode={'edit'}\n />\n );\n })}\n </CSSWidgetLayer>\n );\n};\n\n/*\n Widget from the layer\n*/\nconst LayerWidget = ({ uniqid, layerId, mode }: { uniqid: string; layerId: string; mode: WidgetDisplayMode }) => {\n const dispatch = useAppDispatch();\n const widgetWrapper = useAppSelector((state) => state.widgets.ids[uniqid], shallowEqual);\n const layer = useAppSelector((state) => state.widgets.layers[layerId]);\n\n if (!widgetWrapper) {\n return <></>;\n }\n\n if (!layer) {\n return <></>;\n }\n\n if (!layer.position) {\n return <></>;\n }\n\n const onDoubleTap = (uniqid: string, name: WidgetKeys) => {\n /*\n Open editor\n */\n dispatch(WidgetEditor.slice.actions.registerEditor({ uniqid, name }));\n };\n\n const onMouseUp = (position: WidgetVector) => {\n dispatch(Widget.slice.actions.updateLayer({ uniqid: layerId, props: { position } }));\n };\n\n if (mode === 'view') {\n return (\n <div style={{ position: 'absolute', top: layer.position.y, left: layer.position.x }}>\n <WidgetWrapperCore\n uniqid={uniqid}\n widget={widgetWrapper}\n mode={mode}\n inplace={true}\n context={'article'}\n />\n </div>\n );\n }\n\n return (\n <DraggableHandler\n position={{ x: layer.position.x, y: layer.position.y }}\n onMouseUp={(position: WidgetVector) => {\n if (\n (layer.position && layer.position.x !== position.x) ||\n (layer.position && layer.position.y !== position.y)\n ) {\n onMouseUp(position);\n }\n }}>\n <BETA_JRCDoubleClick\n onDoubleTap={() => onDoubleTap(widgetWrapper.widget.uniqid, widgetWrapper.widget.name)}>\n <WidgetWrapperCore\n uniqid={uniqid}\n widget={widgetWrapper}\n mode={mode}\n inplace={true}\n context={'article'}\n />\n </BETA_JRCDoubleClick>\n </DraggableHandler>\n );\n};\n\nexport type Vector = {\n x: number;\n y: number;\n};\n\n// TODO: COMBINE WITH THE ONE USED ON COLOR PICKER\n// TODO: COMBINE WITH THE ONE USED ON COLOR PICKER\n// TODO: COMBINE WITH THE ONE USED ON COLOR PICKER\nexport const DraggableHandler = ({\n position,\n children,\n onMouseUp,\n}: {\n position: Vector;\n children: ReactElement;\n onMouseUp: (position: Vector) => void;\n}) => {\n const [mouseIsDown, setMouseDown] = useState<boolean>(false);\n const [mouse, setMouse] = useState<Vector>({ x: 0, y: 0 });\n const [start, setStart] = useState<Vector>({ x: 0, y: 0 });\n const [child, setChild] = useState<Vector>({ x: position.x, y: position.y });\n\n const ref = useRef<HTMLDivElement>(null);\n\n const handleMouseDown = useCallback(\n (event: any) => {\n setMouseDown(true);\n if (ref.current) {\n setMouse({ x: event.nativeEvent.clientX, y: event.nativeEvent.clientY });\n setStart({ x: child.x, y: child.y });\n }\n },\n [child.x, child.y],\n );\n\n const handleMouseMove = useCallback(\n (event: any) => {\n if (mouseIsDown && ref.current) {\n const dx = start.x + (event.clientX - mouse.x);\n const dy = start.y + (event.clientY - mouse.y);\n\n setChild({ x: dx, y: dy });\n }\n },\n [mouse.x, mouse.y, mouseIsDown, start.x, start.y],\n );\n\n const handleMouseUp = useCallback(() => {\n setMouseDown(false);\n onMouseUp({ x: child.x, y: child.y });\n }, [child.x, child.y, onMouseUp]);\n\n useEffect(() => {\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [handleMouseMove, handleMouseUp]);\n\n return (\n <div style={{ position: 'absolute', top: child.y, left: child.x }} ref={ref} onMouseDown={handleMouseDown}>\n {children}\n </div>\n );\n};\n","import React from 'react';\nimport { WidgetKeys } from 'jamespot-user-api';\nimport { Widget } from 'jamespot-front-business';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { useAppSelector } from '../../redux/store';\n\nconst JRCLoader = commonComponentsRegistry.getLazyComponent('Loader');\n\n/*\n Widget state\n*/\n\n//TODO: REFACTORING\nexport const WidgetState = ({ uniqid, inplace }: { name: WidgetKeys; uniqid: string; inplace: boolean }) => {\n const state = useAppSelector((state) => Widget.selectors.selectWidgetState(state, uniqid));\n\n if (state?.loading) {\n return (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n backgroundColor: 'rgba(255,255,255,.7)',\n display: 'flex',\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n }}>\n <JRCLoader />\n </div>\n );\n }\n\n if (state?.hover) {\n return (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n backgroundColor: 'rgba(255,255,255,.7)',\n display: 'flex',\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n }}></div>\n );\n }\n\n if (!state?.initialized && inplace) {\n return <></>;\n }\n\n return <></>;\n};\n","import React, { useCallback } from 'react';\n\nimport { useIntl } from 'react-intl';\n\nimport { WidgetKeys } from 'jamespot-user-api';\n\nimport styled from 'styled-components';\nimport { DashedFocusBorder, JRCHtml } from 'jamespot-react-components';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\n\nimport { useAppDispatch } from '../../redux/store';\n\nexport const WrapperEditMode = styled.button`\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n gap: ${(props) => props.theme.space.md}px;\n color: ${(props) => props.theme.color.primary};\n cursor: pointer;\n opacity: 0;\n border: 1px solid ${(props) => props.theme.color.primary};\n &:hover {\n background-color: ${(props) => props.theme.color.grey2};\n opacity: 0.9;\n }\n\n ${DashedFocusBorder()}\n`;\n\nexport const WidgetWrapperCoreEditHover = ({ uniqid, name }: { uniqid: string; name: WidgetKeys }) => {\n const dispatch = useAppDispatch();\n const intl = useIntl();\n\n const registerEditor = useCallback(() => {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n dispatch(\n WidgetEditor.slice.actions.registerEditor({\n uniqid,\n name,\n }),\n );\n }, [dispatch, uniqid, name]);\n const def = Widget.definition(name);\n\n return (\n <WrapperEditMode onClick={registerEditor}>\n <JRCHtml\n __html={`${intl.formatMessage({ id: 'WIDGET_Set_Widget' })} <b>${intl.formatMessage({\n id: def.label,\n })}</b>`}\n />\n </WrapperEditMode>\n );\n};\n","import React, { useMemo } from 'react';\nimport { Widget } from 'jamespot-front-business';\nimport { shallowEqual } from 'react-redux';\nimport { useAppSelector } from '../../../../redux/store';\nimport styled, { useTheme } from 'styled-components';\n\nexport const UIWrapper = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\n/*\n DO NOT USE PADDING HERE (LOOK AT WIDGET STYLE PADDING COMPONENT)\n*/\nconst WidgetStyle = ({\n uniqid,\n onClick,\n children,\n}: {\n uniqid: string;\n onClick: () => void;\n children: React.ReactNode;\n}) => {\n const theme = useTheme();\n const styles = useAppSelector((state) => Widget.selectors.selectWidgetWrapperStyle(state, uniqid), shallowEqual);\n\n const initialValues = useMemo(() => {\n return {\n color: styles && styles['color'] ? String(styles['color']) : theme.color.black,\n backgroundColor:\n styles && styles['background-color'] ? String(styles['background-color']) : theme.color.white,\n borderRadius: styles && styles['border-radius'] ? `${styles['border-radius']}px` : '0px',\n borderColor: styles['border-color'] ? String(styles['border-color']) : theme.color.black,\n borderWidth: styles['border-width'] ? `${styles['border-width']}px` : '0px',\n borderStyle: styles['border-style'] ? String(styles['border-style']) : 'none',\n };\n }, [styles, theme]);\n\n return (\n <UIWrapper\n onClick={onClick}\n style={{\n color: initialValues.color,\n borderColor: initialValues.borderColor,\n borderStyle: initialValues.borderStyle,\n borderRadius: initialValues.borderRadius,\n borderWidth: initialValues.borderWidth,\n backgroundColor: initialValues.backgroundColor,\n overflow: Number(initialValues.borderRadius) > 0 ? 'hidden' : 'initial',\n }}>\n {children}\n </UIWrapper>\n );\n};\n\nexport const WidgetStyleWrapper = WidgetStyle;\n","import { WidgetKeys, WidgetWrapperLevel } from 'jamespot-user-api';\nimport React from 'react';\nimport { Widget } from 'jamespot-front-business';\nimport { shallowEqual } from 'react-redux';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppSelector } from '../../../redux/store';\nimport styled from 'styled-components';\n\nconst WidgetIcon = commonComponentsRegistry.getLazyComponent('WidgetIcon');\n\nexport const CSSIconAbsoluteA = styled.a<{ color: string | undefined }>`\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n color: ${(props) => (props.color ? props.color : props.theme.color.black)};\n transition: background-color 0.4s;\n &:hover {\n background-color: rgba(0, 0, 0, 0.1);\n color: ${(props) => (props.color ? props.color : props.theme.color.black)};\n }\n`;\n\nexport const JRCWidgetIconWrapper = ({\n uniqid,\n name,\n url,\n level,\n}: {\n uniqid: string;\n name: WidgetKeys;\n url: string;\n level: WidgetWrapperLevel;\n}) => {\n const def = Widget.definition(name);\n const count = useAppSelector(\n (state) => (level === 2 ? Widget.selectors.selectWidgetChipCount(state, uniqid) : 0),\n shallowEqual,\n );\n const styles = useAppSelector((state) => Widget.selectors.selectWidgetWrapperStyle(state, uniqid), shallowEqual);\n\n return (\n <CSSIconAbsoluteA\n href={url}\n target=\"_blank\"\n color={String(styles.color) ?? undefined}\n rel=\"noreferrer\"\n aria-label={def.label}>\n <WidgetIcon count={count} img={def.img} label={def.label} maxValue={999} />\n </CSSIconAbsoluteA>\n );\n};\n","import { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { jCommentList, WidgetContext, WidgetDisplayMode, WidgetWrapperProps } from 'jamespot-user-api';\nimport React, { ReactNode, useCallback, useEffect } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { useComponentVisible } from './hooks';\nimport { DisplayWidget } from './Widget';\n\n// eslint-disable-next-line import/no-cycle\nimport { WidgetLayer } from './WidgetLayer/WidgetLayer';\nimport { WidgetState } from './WidgetState';\nimport { WidgetWrapperCoreEditHover } from './WidgetWrapperCoreEditHover';\n\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\nimport { WidgetStyleWrapper } from './wrapper/components/WidgetStyleWrapper';\nimport { JRCWidgetIconWrapper } from './wrapper/JRCWidgetIconWrapper';\ntype WidgetWrapperCoreProps = {\n uniqid: string;\n widgetObject?: Partial<jCommentList>;\n widget: WidgetWrapperProps;\n inplace?: boolean;\n mode: WidgetDisplayMode;\n width?: number | undefined;\n context: WidgetContext;\n onWidgetUpdate?: () => void;\n cannotDisplayComponent?: (widget: string) => ReactNode;\n dataCy?: string;\n};\n\n/*\n This is a widget wrapper\n*/\nexport const WidgetWrapperCore = ({\n uniqid,\n widgetObject,\n widget,\n inplace = true,\n mode,\n width,\n context,\n onWidgetUpdate,\n cannotDisplayComponent,\n dataCy,\n}: WidgetWrapperCoreProps) => {\n const dispatch = useAppDispatch();\n const widgetWrapper = useAppSelector((state) => Widget.selectors.selectWidget(state, uniqid));\n const indexOrder = useAppSelector((state) => state.widgets.editableMap[uniqid], shallowEqual);\n const currentEditableWidgetId = useAppSelector((state) => state.widgets.currentEditableWidgetId, shallowEqual);\n const isActive = useAppSelector((state) => state.widgets.currentEditableWidgetId === uniqid, shallowEqual);\n const { isComponentVisible, setIsComponentVisible } = useComponentVisible(false);\n\n useEffect(() => {\n if (widgetObject) {\n dispatch(Widget.slice.actions.registerWidgetObject({ uniqid, object: widgetObject }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (widget) {\n /*\n Register widget\n */\n dispatch(Widget.slice.actions.registerWidget({ uniqid, widget, context }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (!isComponentVisible) {\n if (uniqid === currentEditableWidgetId) {\n dispatch(Widget.slice.actions.setEditableWidgetId({ uniqid: undefined }));\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isComponentVisible]);\n\n useEffect(() => {\n if (isComponentVisible !== isActive) {\n setIsComponentVisible(isActive);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isActive]);\n\n const registerEditor = useCallback(() => {\n if (widgetWrapper === undefined || mode === 'view') {\n return;\n }\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n /*\n Register editor\n */\n const { widget } = widgetWrapper;\n dispatch(\n WidgetEditor.slice.actions.registerEditor({\n uniqid: widget.uniqid,\n name: widget.name,\n }),\n );\n }, [dispatch, mode, widgetWrapper]);\n\n if (widgetWrapper === undefined) {\n return <>This widget cannot be displayed</>;\n }\n\n if (inplace && mode !== 'view') {\n return (\n <WidgetStyleWrapper\n uniqid={uniqid}\n onClick={() => {\n setIsComponentVisible(true);\n if (indexOrder) {\n dispatch(Widget.slice.actions.setEditableIndex({ index: indexOrder.index }));\n dispatch(Widget.slice.actions.setEditableWidgetId({ uniqid }));\n }\n }}>\n <DisplayWidget\n dataCy={dataCy}\n width={width}\n widget={{\n ...widgetWrapper.widget,\n ...(widgetWrapper.title && {\n title: widgetWrapper.title,\n }),\n }}\n inplace={inplace}\n mode={mode}\n levelFallback={(level, url) => {\n return (\n level <= 2 && (\n <JRCWidgetIconWrapper\n uniqid={widget.widget.uniqid}\n name={widget.widget.name}\n level={level}\n url={url}\n />\n )\n );\n }}\n />\n <WidgetLayer uniqid={uniqid} mode={mode} />\n <WidgetState name={widgetWrapper.widget.name} uniqid={widgetWrapper.widget.uniqid} inplace={inplace} />\n </WidgetStyleWrapper>\n );\n }\n\n return (\n <WidgetStyleWrapper uniqid={uniqid} onClick={registerEditor}>\n <DisplayWidget\n dataCy={dataCy}\n widget={{\n ...widgetWrapper.widget,\n ...(widgetWrapper.title && {\n title: widgetWrapper.title,\n }),\n }}\n inplace={inplace}\n mode={mode}\n width={width}\n onWidgetUpdate={onWidgetUpdate}\n cannotDisplayComponent={cannotDisplayComponent}\n levelFallback={(level, url) => {\n return (\n level <= 2 && (\n <JRCWidgetIconWrapper\n uniqid={widget.widget.uniqid}\n name={widget.widget.name}\n level={level}\n url={url}\n />\n )\n );\n }}\n />\n <WidgetLayer uniqid={uniqid} mode={mode} />\n {mode === 'edit' && <WidgetWrapperCoreEditHover uniqid={uniqid} name={widget.widget.name} />}\n <WidgetState name={widgetWrapper.widget.name} uniqid={widgetWrapper.widget.uniqid} inplace={inplace} />\n </WidgetStyleWrapper>\n );\n};\n\nexport default WidgetWrapperCore;\n","import styled from 'styled-components';\nexport const CSSCommentsBlocWidgetWrapper = styled.div`\n border-radius: ${(props) => props.theme.space.sm}px;\n border: 1px solid ${(props) => props.theme.color.grey1};\n background-color: ${(props) => props.theme.color.white};\n overflow: hidden;\n`;\n","import { Widget } from 'jamespot-front-business';\nimport { WidgetWrapperProps } from 'jamespot-user-api';\nimport React from 'react';\nimport { useIntl } from 'react-intl';\nimport { shallowEqual } from 'react-redux';\nimport { useAppSelector } from '../../redux/store';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport WidgetWrapperCore from '../widgets/WidgetWrapperCore';\nimport { CSSCommentsBlocWidgetWrapper } from './CommentsBloc.styles';\n\nconst JRCMessage = commonComponentsRegistry.getLazyComponent('Message');\n\nexport const CommentsBlocAddCommentWidgetsWrapper = ({ widgets }: { widgets: WidgetWrapperProps[] }) => {\n const intl = useIntl();\n const flushedWidgets = useAppSelector(Widget.selectors.selectFlushedWidgets, shallowEqual);\n\n return (\n <>\n {widgets\n .filter((el) => !flushedWidgets.includes(el.widget.uniqid))\n .map(\n (widget) =>\n widget &&\n widget.widget && (\n <CSSCommentsBlocWidgetWrapper key={widget.widget.uniqid}>\n <WidgetWrapperCore\n uniqid={widget.widget.uniqid}\n widget={widget}\n inplace\n mode={'edit'}\n cannotDisplayComponent={(widget) => (\n <JRCMessage\n variant={'info'}\n message={intl.formatMessage({ id: 'WIDGET_Cannot_Display' }, { widget })}\n />\n )}\n context={'comment'}\n />\n </CSSCommentsBlocWidgetWrapper>\n ),\n )}\n </>\n );\n};\n","import { Widget } from 'jamespot-front-business';\nimport { jCommentList, WidgetDisplayMode, WidgetWrapperProps } from 'jamespot-user-api';\nimport React from 'react';\nimport { useIntl } from 'react-intl';\nimport { shallowEqual } from 'react-redux';\nimport { useAppSelector } from '../../redux/store';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport WidgetWrapperCore from '../widgets/WidgetWrapperCore';\nimport { CSSCommentsBlocWidgetWrapper } from './CommentsBloc.styles';\n\nconst JRCMessage = commonComponentsRegistry.getLazyComponent('Message');\n\nexport const CommentsBlocCommentWidgetsWrapper = (props: {\n comment: jCommentList;\n widgets: WidgetWrapperProps[];\n mode: WidgetDisplayMode;\n inplace: boolean;\n handleWidgetUpdate: () => void;\n handleWidgetRemove: () => void;\n}) => {\n const intl = useIntl();\n const { widgets, comment, inplace, mode, handleWidgetUpdate } = props;\n const flushedWidgets = useAppSelector(Widget.selectors.selectFlushedWidgets, shallowEqual);\n\n return (\n <>\n {widgets\n .filter((el) => !flushedWidgets.includes(el.widget.uniqid))\n .map(\n (widget) =>\n widget && (\n <CSSCommentsBlocWidgetWrapper key={widget.widget.uniqid}>\n <WidgetWrapperCore\n uniqid={widget.widget.uniqid}\n widgetObject={comment}\n widget={widget}\n inplace={inplace}\n mode={mode}\n onWidgetUpdate={handleWidgetUpdate}\n cannotDisplayComponent={(widget) => {\n return (\n <JRCMessage\n variant={'info'}\n message={intl.formatMessage(\n { id: 'WIDGET_Cannot_Display' },\n { widget },\n )}\n />\n );\n }}\n context={'comment'}\n />\n </CSSCommentsBlocWidgetWrapper>\n ),\n )}\n </>\n );\n};\n","import {\n Application,\n Comment,\n Hook,\n Model,\n Platform,\n TinyMCE,\n Toast,\n UserCurrent,\n Widget,\n} from 'jamespot-front-business';\nimport { DriveOrFilebank } from 'jamespot-react-components';\nimport jApi, { AddCommentParams, jCommentList, UpdateCommentParams, WidgetWrapperProps } from 'jamespot-user-api';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport styled, { useTheme } from 'styled-components';\nimport useCommentRT from '../hooks/useCommentRT';\nimport useCommentsLikeRT from '../hooks/useCommentsLikeRT';\nimport { EditorsPanel } from './widgets/components/WidgetEditorPanel';\nimport { WidgetList } from './widgets/WidgetList/WidgetList';\n\nimport { useMarkdownModal } from '../hooks/useMarkdownModal';\nimport { useAppDispatch, useAppSelector } from '../redux/store';\nimport { commonComponentsRegistry } from '../registry/CommonRegistry';\nimport { getTinyMCEMentionsQueries } from '../utils/tinymce';\nimport { AddReportModal, AddReportModalProps } from './comments/AddReportModal';\nimport { CommentsBlocAddCommentWidgetsWrapper } from './comments/CommentsBlocAddCommentWidgetsWrapper';\nimport { CommentsBlocCommentWidgetsWrapper } from './comments/CommentsBlocCommentWidgetsWrapper';\nimport { MarkdownModal } from './tinymce/extension/MarkdownModal';\n\nconst JRCCommentsBloc = commonComponentsRegistry.getLazyComponent('JRCCommentsBloc');\n\nexport type CommentsBlocProps = {\n articleId: number;\n articleUri: string;\n variant?: 'modal' | 'inline';\n canComment: boolean;\n commentType?: 'comment' | 'commentResponse';\n socialQuestion?: {\n isResolved: boolean;\n responseId?: number;\n canSelectResponse: boolean;\n };\n};\n\nconst CommentsBlocWrapper = styled.div`\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n width: 100%;\n margin-top: 10px;\n`;\n\nexport const CommentsBloc = ({\n articleId,\n variant = 'inline',\n canComment,\n commentType = 'comment',\n socialQuestion,\n articleUri,\n}: CommentsBlocProps) => {\n const intl = useIntl();\n const theme = useTheme();\n const dispatch = useAppDispatch();\n\n const [token, setToken] = useState<string>();\n const [loading, setLoading] = useState(false);\n const [widgets, setWidgets] = useState<WidgetWrapperProps[]>([]);\n\n const [tokenLoading, setTokenLoading] = useState(false);\n\n const currentUser = useAppSelector(UserCurrent.selectors.get);\n const widgetIds = useAppSelector(Widget.selectors.selectWidgets);\n const tinyMCECommonOptions = useAppSelector(TinyMCE.selectors.selectTinyMCECommonOptions);\n const tinyMCEExtendedOptions = useAppSelector(TinyMCE.selectors.selectTinyMCEExtendedOptions);\n const models = useAppSelector(Model.selectors.selectAll);\n const platformConfig = useAppSelector(Platform.selectors.selectPlatformConfig);\n const commentsList = useAppSelector((state) => Comment.selectors.commentList(state, articleId));\n const driveHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'DriveHook'));\n const fileBank = useAppSelector((state) => Application.selectors.selectById(state, 'FileBankHook'));\n const widgetHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'WidgetHook'));\n const [socialQuestionOptions, setSocialQuestionOptions] = useState(socialQuestion);\n const [reportProps, setReportProps] = useState<Omit<AddReportModalProps, 'onClose'> | null>(null);\n const {\n open,\n onInsert,\n close: closeMarkdownModal,\n ext: extMarkdown,\n isActive: isMarkdownActive,\n } = useMarkdownModal();\n\n useCommentRT(articleId);\n\n useCommentsLikeRT(\n commentsList.map((c) => c.id),\n articleId,\n );\n\n const onError = useCallback(\n (message?: string) => {\n dispatch(Toast.actions.error({ label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\n },\n [dispatch, intl],\n );\n\n const onCommentUpdate = async (args: UpdateCommentParams) => {\n const commentToUpdate: jCommentList | undefined = commentsList.find((item) => item.id === args.idComment);\n if (!commentToUpdate) return;\n return jApi.article\n .updateComment({\n idComment: args.idComment,\n description: args.description ?? commentToUpdate.description ?? undefined,\n token: args.token,\n widgets: args.widgets,\n })\n .then(() => {\n dispatch(Comment.actions.fetchComments({ idArticle: articleId }));\n fetchToken();\n })\n .catch((e) => {\n onError(e.errorMsg);\n });\n };\n\n const onCommentDelete = async (idComment: number) => {\n dispatch(Comment.actions.deleteComment({ idComment, idArticle: articleId }));\n };\n\n const onWidgetUpdate = () => {\n dispatch(Comment.actions.fetchComments({ idArticle: articleId }));\n fetchToken();\n };\n\n const fetchToken = useCallback(() => {\n if (!token && !tokenLoading) {\n setTokenLoading(true);\n jApi.network\n .token()\n .then((res) => {\n setToken(res.result);\n setTokenLoading(false);\n\n // set comment token to our widget slice to be able to upload image inside our widgets\n dispatch(Widget.slice.actions.setToken({ token: res.result }));\n })\n .catch((e) => {\n onError(e.errorMsg);\n });\n }\n }, [onError, token, tokenLoading, dispatch]);\n\n const onComment = useCallback(\n async (params: Pick<AddCommentParams, 'content' | 'alertAuthor' | 'sendAlert'>) => {\n if (token) {\n setLoading(true);\n const finalWidget: WidgetWrapperProps[] = Object.keys(widgetIds)\n .map((id) => {\n if (widgets?.some((w) => w.widget.uniqid === id)) {\n return widgetIds[id];\n }\n return null;\n })\n .filter((w): w is WidgetWrapperProps => w !== null);\n\n try {\n // TODO : passer par le store pour avoir une réactivité directe après ajout (confirmée ensuite par retour RT)\n // -> état intermédiaire PENDING à gérer.\n await jApi.article\n .addComment({\n ...params,\n widgets: finalWidget,\n token,\n idArticle: articleId,\n type: commentType,\n })\n .then(() => {\n setWidgets([]);\n });\n fetchToken();\n } catch (e: any) {\n onError(e.errorMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n }\n },\n [articleId, commentType, fetchToken, onError, token, widgetIds, widgets],\n );\n\n useEffect(() => {\n fetchToken();\n }, [fetchToken]);\n\n useEffect(() => {\n dispatch(Comment.actions.fetchComments({ idArticle: articleId }));\n }, [articleId, dispatch]);\n\n useEffect(() => {\n if (!commentsList) {\n return;\n }\n commentsList.forEach((comment) => {\n comment._widgets?.forEach((widget) => {\n dispatch(Widget.slice.actions.registerWidgetObject({ uniqid: widget.widget.uniqid, object: comment }));\n dispatch(\n Widget.slice.actions.registerWidgetObjectRights({\n uniqid: widget.widget.uniqid,\n rights: comment._right,\n }),\n );\n });\n });\n }, [commentsList, dispatch]);\n\n return (\n <>\n {tinyMCECommonOptions && tinyMCEExtendedOptions && (\n <>\n <CommentsBlocWrapper>\n <JRCCommentsBloc\n canComment={canComment}\n loading={loading}\n token={token}\n comments={commentsList}\n onComment={onComment}\n onCommentUpdate={onCommentUpdate}\n onCommentDelete={onCommentDelete}\n isWidgetActive={!!(widgetHook?.isActive && widgetHook?.autorize?.includes('comment'))}\n canCreateWidget={\n !!(\n widgetHook?.isActive &&\n widgetHook?.create &&\n widgetHook?.autorize?.includes('comment')\n )\n }\n widgetListComponent={\n <WidgetList\n mode={'comment'}\n namespace={'comment'}\n onChange={(widget) => {\n setWidgets([widget]); // COMMENT DO NOT SUPPORT MULTI WIDGET\n dispatch(\n Widget.slice.actions.registerWidget({\n uniqid: widget.widget.uniqid,\n widget: widget,\n context: 'comment',\n }),\n );\n setToken(undefined);\n fetchToken();\n }}\n view={'edit'}\n />\n }\n newWidgetsWrapperComponent={<CommentsBlocAddCommentWidgetsWrapper widgets={widgets} />}\n existingWidgetsWrapperComponent={(comment, widgets, mode, inplace = true) => (\n <CommentsBlocCommentWidgetsWrapper\n comment={comment}\n widgets={widgets}\n mode={mode}\n inplace={inplace}\n handleWidgetUpdate={onWidgetUpdate}\n handleWidgetRemove={fetchToken}\n />\n )}\n currentUser={currentUser}\n tinyMCEConfig={{\n commonOptions: {\n ...tinyMCECommonOptions,\n toolbar: tinyMCEExtendedOptions.commentsToolbar,\n },\n mentionsQueries: getTinyMCEMentionsQueries(models, theme, onError),\n }}\n onError={onError}\n highlightFields={platformConfig.userHighlightFields}\n userAccountStatus={platformConfig.userAccountStatus}\n userModel={models.find((m) => m.type === 'user')}\n onGetHashError={(message?: string) =>\n dispatch(\n Toast.actions.error({\n label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }),\n }),\n )\n }\n activeDrives={\n [\n ...(fileBank && driveHook ? ['fileBank'] : []),\n ...Hook.utils.buildDrivesArrayFromObject(driveHook?.drives),\n ] as DriveOrFilebank[]\n }\n variant={variant}\n handlers={{\n drive: jApi.drive,\n filebank: jApi.filebank,\n file: jApi.file,\n user: jApi.user,\n global: jApi.global,\n questionAnswer: jApi.questionAnswer,\n }}\n socialQuestion={\n socialQuestionOptions\n ? {\n ...socialQuestionOptions,\n onSelectResponse: (responseId: number) => {\n setSocialQuestionOptions({\n ...socialQuestionOptions,\n responseId,\n isResolved: true,\n });\n },\n onUnselectResponse: () => {\n setSocialQuestionOptions({\n ...socialQuestionOptions,\n responseId: undefined,\n isResolved: false,\n });\n },\n }\n : undefined\n }\n articleId={articleId}\n additionalExtensions={[extMarkdown]}\n onReport={(commentUri) => setReportProps({ articleId, commentUri, articleUri })}\n />\n <EditorsPanel />\n </CommentsBlocWrapper>\n </>\n )}\n {isMarkdownActive && <MarkdownModal onInsert={onInsert} open={open} close={closeMarkdownModal} />}\n {reportProps && <AddReportModal onClose={() => setReportProps(null)} {...reportProps} />}\n </>\n );\n};\n","import { useEffect, useMemo } from 'react';\nimport { Comment } from 'jamespot-front-business';\nimport socket from '../utils/socket';\nimport { useAppDispatch } from '../redux/store';\n\nconst useCommentsLikeRT = (idComments: number[] | undefined, idArticle: number) => {\n const dispatch = useAppDispatch();\n const reactSocket = useMemo(() => socket, []);\n const rtHandlers = useMemo(\n () => Comment.getCommentsLikeRTHandlers(dispatch, idComments, idArticle),\n [dispatch, idComments, idArticle],\n );\n\n useEffect(() => {\n rtHandlers.forEach((handler) => {\n reactSocket.onMessage(handler.namespace, handler.function, handler.handler);\n });\n return () => {\n rtHandlers.forEach((handler) => {\n reactSocket.offMessage(handler.namespace, handler.function, handler.handler);\n });\n };\n }, [rtHandlers, reactSocket]);\n};\n\nexport default useCommentsLikeRT;\n","import React from 'react';\n\n// FIXME move to j-react-components + display error if dev mode\nexport const Empty = () => <></>;\n","import React, { Suspense } from 'react';\nimport { Outlet } from 'react-router-dom';\nimport { commonComponentsRegistry } from '../registry/CommonRegistry';\n\nconst Container = commonComponentsRegistry.getLazyComponent('Container');\n\nexport const FullPageLayout = () => {\n return (\n <Suspense fallback={<></>}>\n <Container backgroundColor={'white'} mode={'fluid'} flexDirection={'column'}>\n <Outlet />\n </Container>\n </Suspense>\n );\n};\n","import { JTinyMCEExtensionsBuilders } from 'jamespot-react-components';\nimport { JIACapabilities } from 'jamespot-user-api';\nimport { useCallback, useMemo, useState } from 'react';\nimport { useIntl } from 'react-intl';\n\nexport type JiaTextEnhanceQuery = {\n resolve: (value: string | PromiseLike<string>) => void;\n reject: (reason?: any) => void;\n capability: JIACapabilities;\n text: string;\n};\n\nexport const useAI = () => {\n const [query, setQuery] = useState<JiaTextEnhanceQuery | undefined>();\n const intl = useIntl();\n\n const isActive = useMemo(() => {\n return (\n J.hooks?.MagicWandHook?.isActive &&\n J.hooks?.MagicWandHook?.menuItems &&\n J.hooks.MagicWandHook.menuItems.length\n );\n }, []);\n\n const PrepareAndSetQuery = useCallback((query: JiaTextEnhanceQuery) => {\n const internalResolve = (value: string | PromiseLike<string>) => {\n query.resolve(value);\n setQuery(undefined);\n };\n const internalReject = (value: any) => {\n query.reject(value);\n setQuery(undefined);\n };\n setQuery({\n ...query,\n reject: internalReject,\n resolve: internalResolve,\n });\n }, []);\n\n const fetch = useCallback(\n (text: string, capability: JIACapabilities) => {\n return new Promise<string>((resolve, reject) => {\n PrepareAndSetQuery({\n reject,\n resolve,\n text,\n capability,\n });\n });\n },\n [PrepareAndSetQuery],\n );\n\n const AICapabilities = useMemo(() => {\n return {\n develop: (text: string) => fetch(text, 'develop'),\n summarize: (text: string) => fetch(text, 'summarize'),\n tldr: (text: string) => fetch(text, 'tldr'),\n en: (text: string) => fetch(text, 'en'),\n es: (text: string) => fetch(text, 'es'),\n formal: (text: string) => fetch(text, 'formal'),\n funny: (text: string) => fetch(text, 'funny'),\n };\n }, [fetch]);\n\n const ext = useMemo(() => JTinyMCEExtensionsBuilders.jia(AICapabilities, intl), [intl, AICapabilities]);\n\n return { query, ext, isActive } as const;\n};\n","import { Model, Toast } from 'jamespot-front-business';\nimport React, { useCallback, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport { useTheme } from 'styled-components';\nimport { JRCInputTinyMCEProps } from 'jamespot-react-components';\nimport { FieldValues } from 'react-hook-form';\nimport { AIModal } from './extension/AIModal';\nimport { useMarkdownModal } from '../../hooks/useMarkdownModal';\nimport { MarkdownModal } from './extension/MarkdownModal';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { tinymceCommonOptions } from '../../initTinymce';\nimport { getTinyMCEMentionsQueries } from '../../utils/tinymce';\nimport { useAI } from '../../hooks/useAI';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\n\nconst JRCInputTinyMCE = commonComponentsRegistry.getLazyComponent('InputTinyMCE');\n\nexport type JRCInputTinyMCEWithExtProps<T extends FieldValues> = Omit<\n JRCInputTinyMCEProps<T>,\n 'commonOptions' | 'mentionsQueries' | 'additionalExtensions'\n>;\n\nexport const JRCInputTinyMCEWithExt = <T extends FieldValues = FieldValues>(props: JRCInputTinyMCEWithExtProps<T>) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const theme = useTheme();\n const models = useAppSelector(Model.selectors.selectAll);\n const { query, ext: extAI, isActive: isAIActive } = useAI();\n const {\n open,\n onInsert,\n close: closeMarkdownModal,\n ext: extMarkdown,\n isActive: isMarkdownActive,\n } = useMarkdownModal();\n\n const extArray = useMemo(() => {\n return [...(isMarkdownActive ? [extMarkdown] : []), ...(isAIActive ? [extAI] : [])];\n }, [extAI, extMarkdown, isAIActive, isMarkdownActive]);\n\n const onMentionsQueryError = useCallback(\n (message?: string) => {\n dispatch(Toast.actions.error({ label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\n },\n [dispatch, intl],\n );\n\n const tinyMentionsQueries = useMemo(() => {\n return getTinyMCEMentionsQueries(models, theme, onMentionsQueryError);\n }, [models, onMentionsQueryError, theme]);\n\n const commonOptions = useMemo(() => tinymceCommonOptions, []);\n\n return (\n <>\n {commonOptions && (\n <JRCInputTinyMCE\n commonOptions={commonOptions}\n additionalExtensions={extArray}\n mentionsQueries={tinyMentionsQueries}\n {...props}\n />\n )}\n {isAIActive && <AIModal query={query} />}\n {isMarkdownActive && <MarkdownModal onInsert={onInsert} open={open} close={closeMarkdownModal} />}\n </>\n );\n};\n","import { Model, Toast } from 'jamespot-front-business';\nimport React, { useCallback, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport { useTheme } from 'styled-components';\nimport { JRCInputTinyMCERawProps } from 'jamespot-react-components';\nimport { AIModal } from './extension/AIModal';\nimport { MarkdownModal } from './extension/MarkdownModal';\nimport { useMarkdownModal } from '../../hooks/useMarkdownModal';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { tinymceCommonOptions } from '../../initTinymce';\nimport { getTinyMCEMentionsQueries } from '../../utils/tinymce';\nimport { useAI } from '../../hooks/useAI';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\n\nconst JRCInputTinyMCERaw = commonComponentsRegistry.getLazyComponent('InputTinyMCERaw');\n\nexport type JRCInputTinyMCEWithExtProps = Omit<\n JRCInputTinyMCERawProps,\n 'commonOptions' | 'mentionsQueries' | 'additionalExtensions'\n>;\n\nexport const JRCInputTinyMCEWithExtRaw = (props: JRCInputTinyMCEWithExtProps) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const theme = useTheme();\n const models = useAppSelector(Model.selectors.selectAll);\n const { query, ext: extAI, isActive: isAIActive } = useAI();\n const {\n open,\n onInsert,\n close: closeMarkdownModal,\n ext: extMarkdown,\n isActive: isMarkdownActive,\n } = useMarkdownModal();\n\n const extArray = useMemo(() => {\n return [...(isMarkdownActive ? [extMarkdown] : []), ...(isAIActive ? [extAI] : [])];\n }, [extAI, extMarkdown, isAIActive, isMarkdownActive]);\n\n const onMentionsQueryError = useCallback(\n (message?: string) => {\n dispatch(Toast.actions.error({ label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\n },\n [dispatch, intl],\n );\n\n const tinyMentionsQueries = useMemo(() => {\n return getTinyMCEMentionsQueries(models, theme, onMentionsQueryError);\n }, [models, onMentionsQueryError, theme]);\n\n const commonOptions = useMemo(() => tinymceCommonOptions, []);\n\n return (\n <>\n {commonOptions && (\n <JRCInputTinyMCERaw\n commonOptions={commonOptions}\n additionalExtensions={extArray}\n mentionsQueries={tinyMentionsQueries}\n {...props}\n />\n )}\n {isAIActive && <AIModal query={query} />}\n {isMarkdownActive && <MarkdownModal onInsert={onInsert} open={open} close={closeMarkdownModal} />}\n </>\n );\n};\n","import React from 'react';\r\nimport { FormattedMessage, useIntl } from 'react-intl';\r\nimport { Control } from 'react-hook-form';\r\nimport jamespot from 'jamespot-user-api';\r\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\r\n\r\nconst JRCInputAudience = commonComponentsRegistry.getLazyComponent('InputAudience');\r\nconst JRCMessage = commonComponentsRegistry.getLazyComponent('Message');\r\nconst JRCModal = commonComponentsRegistry.getLazyComponent('Modal');\r\n\r\nexport type ModalAudienceProps = {\r\n open: boolean;\r\n closeHandler: () => void;\r\n title?: string;\r\n control: Control<any>;\r\n warningMessage?: string;\r\n onSubmit: () => void;\r\n name?: string;\r\n};\r\n\r\nexport const ModalAudience = ({\r\n open,\r\n closeHandler,\r\n title,\r\n control,\r\n warningMessage,\r\n onSubmit,\r\n name = 'publishTo',\r\n}: ModalAudienceProps) => {\r\n const intl = useIntl();\r\n return (\r\n <JRCModal\r\n open={open}\r\n closeHandler={closeHandler}\r\n title={title ?? intl.formatMessage({ id: 'GLOBAL_Audience' })}\r\n buttons={[\r\n {\r\n children: <FormattedMessage id=\"GLOBAL_Cancel\" />,\r\n color: 'cancel',\r\n clickHandler: () => closeHandler(),\r\n },\r\n {\r\n children: <FormattedMessage id=\"GLOBAL_Continue\" />,\r\n color: 'danger',\r\n clickHandler: () => {\r\n closeHandler();\r\n onSubmit();\r\n },\r\n },\r\n ]}>\r\n <JRCMessage\r\n variant={'warning'}\r\n message={warningMessage ?? intl.formatMessage({ id: 'FORM_Audience_Empty' })}\r\n />\r\n <JRCInputAudience\r\n asyncPromise={(inputValue: string) => jamespot.audience.autocomplete(inputValue)}\r\n searchable={true}\r\n control={control}\r\n multiple={true}\r\n placeholder={intl.formatMessage({ id: 'GLOBAL_Audience' })}\r\n name={name}\r\n />\r\n </JRCModal>\r\n );\r\n};\r\n","import React, { Suspense, useEffect, useMemo, useState } from 'react';\nimport { Outlet, matchPath, useLocation } from 'react-router-dom';\nimport { useIntl } from 'react-intl';\nimport { commonComponentsRegistry } from '../registry/CommonRegistry';\nimport { TwoColLayoutProps } from './types';\n\nconst Container = commonComponentsRegistry.getLazyComponent('Container');\nconst AppColumn = commonComponentsRegistry.getLazyComponent('AppColumn');\nconst MainColumn = commonComponentsRegistry.getLazyComponent('MainColumn');\n\nexport function TwoColLayout({\n extensionRoute,\n routes,\n description,\n mode = 'center',\n mainColumnProps,\n}: TwoColLayoutProps) {\n const intl = useIntl();\n const { pathname } = useLocation();\n\n const ROUTES_ARRAY = useMemo(() => Object.values(routes), [routes]);\n const [activeTab, setActiveTab] = useState(ROUTES_ARRAY?.[0]?.key);\n\n const tabs = ROUTES_ARRAY.map((tab) => ({\n ...tab,\n label: intl.formatMessage({ id: tab.label }),\n href: tab.absolutePath ? tab.path : `/ng/rr/${extensionRoute}/${tab.path}`,\n group: tab.group ? intl.formatMessage({ id: tab.group }) : undefined,\n }));\n\n useEffect(() => {\n const activeRoute = ROUTES_ARRAY.find((route) => {\n if (`/ng/rr/${extensionRoute}/${route.path}` === pathname) {\n return true;\n }\n\n return route.paths?.reduce<boolean>((previousValue: boolean, currentValue: string) => {\n const pattern = `/ng/rr/${extensionRoute}/${currentValue}`;\n const isMatch = matchPath(pattern, pathname) !== null;\n return previousValue || isMatch;\n }, false);\n });\n if (activeRoute) setActiveTab(activeRoute.key);\n }, [pathname, ROUTES_ARRAY, extensionRoute]);\n\n return (\n <Suspense fallback={<></>}>\n <Container mode={mode}>\n <AppColumn mode={mode} description={description} tabs={tabs} activeTab={activeTab || ''} />\n <MainColumn mode={mode} flex={true} {...mainColumnProps}>\n <Outlet />\n </MainColumn>\n </Container>\n </Suspense>\n );\n}\n"],"names":["JRCIcon","getLazyComponent","Avatar","props","theme","useTheme","networkPublic","selectors","selectNetworkPublic","uri","name","size","color","primary","variant","JRCAvatar","JRCFlexBox","JRCModalContent","JRCModalLayout","JRCStyledHref","JRCTooltip","JRCTypography","AudienceWrapper","AvatarLink","white","lavender","overlap","Audience","audience","limit","intl","useIntl","isModalOpen","setModalOpen","useState","splice","map","item","index","href","_url","target","key","id","description","undefined","title","position","alt","timestamp","dateModified","Utils","date","strToTimestamp","focusable","length","onClick","closeHandler","enableClickAwayCloseModal","open","maxHeight","formatMessage","overflow","onClickIconClose","i","y","gap","space","l","type","JRCLoader","TextWrapper","md","loadingResponse","response","loading","error","AIModal","query","setResponse","sendAIRequest","useCallback","textEnhancement","text","capacity","capability","then","errorMsg","textResponse","result","catch","_err","useEffect","trim","zIndex","tinyMCEModal","reject","buttons","children","clickHandler","resolve","isFull","align","StretchContainer","css","Container","stretch","Form","FormElm","forwardRef","ref","onSubmit","dataCy","FieldsetWrapper","DisplayForm","onInit","formRef","useRef","configuration","defaultValues","useDisplay","fields","forceMandatory","isInit","setIsInit","useForm","criteriaMode","handleSubmit","control","reset","formFn","formatValuesForSubmit","values","toRet","Object","keys","forEach","k","widget","find","c","v","join","useImperativeHandle","current","scrollTo","getFormattedValues","getValues","Input","conf","readOnly","extraInputs","ModalForm","Loader","Icon","Typography","Ellipsis","StyledHref","ContentPreview","grey2","grey0","sm","ContentWrapper","AddReportModal","onClose","articleId","articleUri","commentUri","dispatch","setOpen","article","setArticle","comment","setComment","contentLoading","setContentLoading","submitLoading","setSubmitLoading","abortController","Promise","all","res","get","idArticle","format","signal","getComments","closeModal","submit","createReport","actions","success","label","e","submitForm","FormattedMessage","_user","CSSEditorPortal","isActive","CSSEditorHeader","CSSEditorAction","CSSEditorLabel","CSSEditorMask","EDITOR_WIDTH","CSSEditor","CSSEditorContent","CSSEditorTab","CSSEditorIsBusy","CSSEditorIsLocked","CSSEditorMenu","CSSEditorMenuButton","DashedFocusBorder","JRCButton","grey1","EditorPopup","uniqid","editor","state","selectEditor","popup","view","style","flex","display","flexDirection","backgroundColor","marginTop","slice","flushEditorPopup","WidgetArticleTitleEditor","WidgetArticleTextEditor","WidgetArticleGalleryEditor","WidgetArticleAttachmentEditor","WidgetArticleSliderEditor","WidgetArticleImageEditor","WidgetButtonEditor","WidgetCheckListEditor","WidgetQuickSurveyEditor","WidgetDatasourceTableEditor","WidgetExcelDatasourceTableEditor","WidgetPresenceEditor","WidgetLuccaAbsenceEditor","WidgetEmailsImapEditor","WidgetContactCardDavEditor","WidgetCalendarCalDavEditor","Editor","token","selectToken","widgetWrapper","selectWidget","shallowEqual","onSaveCallback","onSave","handleHookIsActive","selectHook","getState","content","updateWidget","flushEditor","onStateChange","states","setWidgetState","onOpen","registerEditorPopup","ensureWidgetArticleButtonType","onChange","ensureWidgetArticleGalleryType","ensureWidgetArticleAttachmentType","ensureWidgetLuccaAbsenceType","ensureWidgetArticleImageType","ensureWidgetArticleSliderType","slides","loop","useDots","ensureWidgetArticleTitleType","ensureWidgetArticleTextType","ensureWidgetPresenceType","ensureWidgetCheckListType","arr","w","html","htmlDecodeSpecialChars","onChangeContent","onChangeWrapper","updateWidgetWrapper","handleChange","ensureWidgetQuickSurveyType","ensureWidgetExcelDatasourceTableType","hook","handlers","jamespot","datasource","network","filebank","wedoc","handleStart","busy","handleCatch","err","handleFinally","override","onError","ensureWidgetEmailsImapType","ensureWidgetContactCardDavType","ensureWidgetCalendarCalDavType","ensureWidgetDatasourceTableType","application","EditorPosition","setEditorPosition","InputColorRaw","Label","Fieldset","EditorInputColor","initialValue","palettes","colors","secondary","headerColor","orange","green","navy","overseas","JRCInputNumber","EditorInputNumber","watch","value","subscription","data","unsubscribe","width","placeholder","InputSelectExtended","EditorInputSelect","options","required","optionFromInitialValue","useMemo","el","select","getValue","o","getLabel","getSearch","rules","hideDeleteIcon","JRCInputText","EditorTabWrapper","wrapper","widgetContext","selectWidgetContext","styles","selectWidgetTitleStyle","replace","initialValues","String","black","fontSize","fontWeight","textAlign","setWidgetTitleStyle","colorValue","backgroundColorValue","fontSizeValue","fontWeightValue","textAlignValue","EditorIsBusy","isBusy","selectWidgetState","EditorIsLocked","locked","EditorSave","mode","selectWidgetObjectUri","v2","EditorTabWidgetSelection","selectWidgetWrapperStyle","padding","borderRadius","borderColor","borderWidth","borderStyle","setWidgetWrapperStyle","paddingValue","borderRadiusValue","borderStyleValue","borderColorValue","borderWidthValue","EditorTabDisplayLevel","def","definition","level","selectWidgetLevel","Number","filter","Array","isArray","displayLevel","includes","OVERRIDE_SAVE","Tooltip","EditorWrapper","enableWidgetLevel","tabs","enable","panel","useWrapper","icon","useSelection","useEditor","defaultTab","currentTab","setCurrentTab","setTimeout","className","tab","inset","opacity","CSSEditorPortalWrapper","CSSEditorPortalPopupWrapper","CSSEditorPortalRow","CSSEditorPortalFreeSpace","EditorsPortal","flush","flushAllEditor","window","addEventListener","removeEventListener","editors","selectEditors","JRCThemeProvider","EditorsPanel","portalDiv","document","getElementById","portal","parent","createElement","appendChild","createPortalElement","createPortal","CSSSquareWidgetWrapper","CSSSquareWidget","available","CSSWidgetButton","height","CSSWrapWidgetWrapper","column","CSSWrapTitle","CSSWrapWidget","parentIsColumn","full","Flex","direction","JRCIconButton","WidgetList","namespace","isOpen","widgets","WidgetsName","ArticleTitle","ArticleButton","CheckList","Presence","QuickSurvey","ArticleText","ArticleImage","ArticleSlider","ArticleAttachment","getBuilderWidgets","args","portalId","factory","src","img","minWidth","WidgetModeArticle","WidgetModeComment","calcHeight","Math","ceil","bg","bgHover","iconSize","useMarkdownModal","setEditor","onInsert","execCommand","close","ext","JTinyMCEExtensionsBuilders","markdown","ed","JRCInputFileAdvancedRaw","CSSHidden","WidgetUploader","initialFiles","initialClick","multiple","accept","onUploadStart","onUploadEnd","onUploadSuccess","uploadRef","total","setTotal","files","setFiles","click","totalFile","prevTotal","fileResponse","prevFiles","WidgetAttachment","JRCWidgetEmptyInplace","FileViewer","CSSWrapper","JRCWidgetArticleAttachmentWrapper","inplace","message","mounted","empty","weDoc","selectById","option","file","getAccessHash","Error","hash","idFile","getWedocFilePath","wedocWindowOpen","openWithOptions","condition","f","mimetype","resolveFilePath","url","JRCWidgetButton","CSSButtonWrapper","CSSPointer","clickable","JRCWidgetArticleButtonWrapper","buttonSize","registerEditor","JRCWidgetArticleGallery","CSSImagePointer","JRCWidgetArticleGalleryWrapper","maxWidth","UIWrapper","WidgetStylePadding","UIFlex","UIScrollWrapper","UIScroll","WidgetScroll","header","scrollable","footer","CSSWidgetTitle","UITitle","WidgetIntranetTitle","UIHeaderWrapper","backroundColor","UIHeader","UIHeaderFlex","grey4","xs","WidgetHeader","dropdown","subHeader","styleValues","UIOverlay","WidgetLuccaAbsence","JRCWidgetLuccaAbsenceWrapper","list","setList","setError","isLoading","setIsLoading","today","Date","getFullYear","getMonth","toString","padStart","getDate","getAbsence","aborted","finally","WidgetImage","CSSImageWrapperHover","mockFileLittle","mainType","dateCreation","str","parse","isNaN","getTime","JRCWidgetArticleImageWrapper","useFilter","setUri","formatImgUrl","now","from","path","JRCWidgetSlider","Wrapper","JRCWidgetArticleSliderWrapper","dynamicWidth","setDynamicWidth","fileViewerFiles","slide","handleResize","offsetWidth","isEditable","handleEditor","startAt","onClickSlide","InputTextareaRaw","Modal","MarkdownModal","setMarkdown","doClose","disabled","async","WidgetArticleText","CSSTextWrapper","JRCWidgetArticleTextWrapper","tinyMCECommonOptions","selectTinyMCECommonOptions","models","selectAll","closeMarkdownModal","extMarkdown","isMarkdownActive","tinyMentionsQueries","autoFocus","commonOptions","mentionsQueries","additionalExtensions","WidgetArticleTitle","ToolWrapper","Tool","JRCWidgetArticleTitleWrapper","heading","Toolbar","sizeValue","Footer","WidgetRemove","setIsOpen","removeWidget","flushWidget","WidgetFooterView","collaborationRights","handleOpenEditor","widgetObject","selectWidgetObject","widgetObjectRights","selectWidgetObjectRights","canUpdate","update","canDelete","delete","handleOnClick","ensureWidgetObjectHasMinimumProperties","WidgetInlineInputText","handleClick","setLabel","WidgetIsPending","WidgetCheckList","CommentContainer","border","CSSWidgetCheckListWrapper","JRCWidgetCheckListWrapper","onWidgetUpdate","widgetContent","setToken","tokenLoading","setTokenLoading","entries","setEntries","isPending","setIsPending","tokenFromStore","allRt","selectAllWidgetRTObject","canEditCollaboration","canAdministrate","administrate","fetchToken","handleReloadWidget","getWidget","openEditorPanel","finalEntries","checked","links","user","lastRt","at","object","fn","handleCollabAddEntry","contentToUpdate","fs","push","useRT","JRCFileViewer","initialEntries","onFileClick","entry","onItemCheckListChange","checkListRespond","handleCheckItem","edit","getVisibleColumns","tableColumnsData","columns","isVisible","WidgetTable","AbsoluteWrapper","WidgetDatasourceTableWrapper","tableHeadColor","tableHeadTextColor","tableHeadIconColor","tableRowColor","tableRowTextColor","tableBorderRadius","tableSizedColumns","tableSizedColumnsWidth","datasourceData","setDatasourceData","datasourceModel","setDatasourceModel","datasourceSort","setDatasourceSort","order","datasourceType","setDatasourceType","datasourceIdentifier","setDatasourceIdentifier","DatasourceTable","rtConditions","rtAudience","rtLastObject","fetchDatasource","Format","VIEW","model","sort","rows","tableDefaultSortOrder","tableDefaultSortName","WidgetExcelDatasourceTableWrapper","ExcelDatasourceTable","CSSPaddingMd","CSSHref","CSSHorizontalAlign","WidgetPresenceWrapperClosing","handleClosing","isClosed","JRCWidgetPresence","ModalUserList","CSSWidgetPresenceWrapper","CSSWidgetPresenceIsClosed","JRCWidgetPresenceWrapper","limitValue","closing","userValue","userAvailableList","userUnavailableList","userAvailableTotal","userUnavailableTotal","isPendingResponse","setIsPendingResponse","AbortController","openUsersModal","setOpenUsersModal","usersListIndex","setUsersListIndex","usersList","setUsersList","handleError","canRespond","lockedRespondHandler","handleCancelRespond","presenceCancel","handleRespond","presenceRespond","handleResponse","presenceGetResponse","handleLoadUsersList","page","presenceGetResponseUserList","cnt","elm","abort","handleClickAvailable","handleClickUnavailable","handleOpenUsersModal","WidgetQuickSurvey","WrapperContainer","withPadding","JRCWidgetQuickSurveyWrapper","userResponses","totalRespondent","totalResponse","userLoggedResponses","quickSurveyGetResponse","handleWidgetGet","handleCloseSurvey","finalContent","handleProgressBarClick","quickSurveyRespond","multi","quickSurveyGetResponseUserList","userHasAlreadyVoted","canCloseSurvey","anonymize","seeResponseAfter","handleClickFile","newContent","quickSurveyAddEnty","ModalLayout","ModalContent","InputText","InputNumber","InputPassword","UIForm","isLocked","UIProviderError","UISection","officeConfigurationInitialState","username","password","hostname","imapPort","imapConnectionSecurity","ImapConnection","NONE","imapMailbox","cardDavAddressBook","calDavCalendar","provider","OfficeConfigurationPrompt","useDispatch","useAbortController","setValue","formState","isValid","providerList","setProviderList","imapConnectionSecurityOptions","SSL","STARTTLS","fetchConfiguration","providers","getConfiguration","getProviders","handleClose","hasProvider","radius","SelectProvider","loader","setConfiguration","location","reload","ButtonDropdown","UIDropdown","WidgetContactCardDavHeader","isConfigurationValid","handleLogout","small","smallOpenDirection","WidgetContactCardDav","JRCWidgetContactCardDavWrapper","levelFallback","setIsConfigurationValid","setUrl","doInterval","setDoInterval","initialized","handleLogin","handleLoading","fetchProviderUrls","getProviderBaseUrls","dav_address_book_url","fetchData","davAddressBookGetContacts","WIDGET_LEVEL_3","interval","setInterval","clearInterval","WIDGET_LEVEL_1","contactCardList","WidgetCalendarCalDavHeader","WidgetCalendarCalDav","JRCWidgetCalendarCalDavWrapper","dav_calendar_url","nextMonth","addMonth","davCalendarGetEvents","dateStart","formatDateTime","dateEnd","calendarListEvent","WidgetEmailsImapHeader","count","selectWidgetChipCount","WidgetEmailsImap","JRCWidgetEmailsImapWrapper","fetchUnreadEmailsCount","imapInboxGetUnreadEmailsCount","setWidgetChipCount","imap_inbox_url","imapInboxGetEmails","WIDGET_LEVEL_2","emailList","WidgetTitle","JRCHtml","as","__html","WidgetTitleEdit","widgetWrapperTitle","widgetTitle","margin","CSSModalFooter","CSSWidgetHeaderEdit","CSSWidgetHeaderEditTitle","CSSWidgetHeaderEditActions","WidgetHeaderEdit","handleRemoveWidget","UILicenseRequired","WidgetLicenseWrapper","hasLicense","CSSWidgetWithTitle","DisplayWidget","cannotDisplayComponent","CSSWidgetLayer","pointerEvents","BETA_JRCDoubleClick","WidgetLayer","layers","ids","layer","Layer","LayerWidget","layerId","visible","top","left","x","context","DraggableHandler","onMouseUp","updateLayer","onDoubleTap","mouseIsDown","setMouseDown","mouse","setMouse","start","setStart","child","setChild","handleMouseDown","event","nativeEvent","clientX","clientY","handleMouseMove","dx","dy","handleMouseUp","onMouseDown","WidgetState","justifyContent","alignItems","hover","WrapperEditMode","WidgetWrapperCoreEditHover","WidgetStyleWrapper","WidgetIcon","CSSIconAbsoluteA","JRCWidgetIconWrapper","rel","maxValue","WidgetWrapperCore","indexOrder","editableMap","currentEditableWidgetId","isComponentVisible","setIsComponentVisible","registerWidgetObject","registerWidget","setEditableWidgetId","setEditableIndex","CSSCommentsBlocWidgetWrapper","JRCMessage","CommentsBlocAddCommentWidgetsWrapper","flushedWidgets","selectFlushedWidgets","CommentsBlocCommentWidgetsWrapper","handleWidgetUpdate","JRCCommentsBloc","CommentsBlocWrapper","CommentsBloc","canComment","commentType","socialQuestion","setLoading","setWidgets","currentUser","widgetIds","selectWidgets","tinyMCEExtendedOptions","selectTinyMCEExtendedOptions","platformConfig","selectPlatformConfig","commentsList","commentList","driveHook","fileBank","widgetHook","socialQuestionOptions","setSocialQuestionOptions","reportProps","setReportProps","useCommentRT","idComments","reactSocket","socket","rtHandlers","getCommentsLikeRTHandlers","handler","onMessage","function","offMessage","fetchComments","onComment","params","finalWidget","some","addComment","_widgets","registerWidgetObjectRights","rights","_right","comments","onCommentUpdate","commentToUpdate","idComment","updateComment","onCommentDelete","deleteComment","isWidgetActive","autorize","canCreateWidget","create","widgetListComponent","newWidgetsWrapperComponent","existingWidgetsWrapperComponent","handleWidgetRemove","tinyMCEConfig","toolbar","commentsToolbar","highlightFields","userHighlightFields","userAccountStatus","userModel","m","onGetHashError","activeDrives","utils","buildDrivesArrayFromObject","drives","drive","global","questionAnswer","onSelectResponse","responseId","isResolved","onUnselectResponse","onReport","Empty","FullPageLayout","Suspense","fallback","Outlet","useAI","setQuery","J","hooks","MagicWandHook","menuItems","PrepareAndSetQuery","fetch","AICapabilities","develop","summarize","tldr","en","es","formal","funny","jia","JRCInputTinyMCE","JRCInputTinyMCEWithExt","extAI","isAIActive","extArray","onMentionsQueryError","JRCInputTinyMCERaw","JRCInputTinyMCEWithExtRaw","JRCInputAudience","JRCModal","ModalAudience","warningMessage","asyncPromise","inputValue","autocomplete","searchable","AppColumn","MainColumn","TwoColLayout","extensionRoute","routes","mainColumnProps","pathname","useLocation","ROUTES_ARRAY","activeTab","setActiveTab","absolutePath","group","activeRoute","route","paths","reduce","previousValue","currentValue","pattern","isMatch","matchPath"],"sourceRoot":""}
1
+ {"version":3,"file":"199.bc3204b76b0e00d98781.chunk.js","mappings":"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","sources":["webpack://ReactCore/./src/components/Avatar.tsx","webpack://ReactCore/./src/components/Audience.tsx","webpack://ReactCore/./src/components/tinymce/extension/AIModal.tsx","webpack://ReactCore/./src/displayer/DisplayForm.component.tsx","webpack://ReactCore/./src/components/comments/AddReportModal.tsx","webpack://ReactCore/./src/components/editors/const.ts","webpack://ReactCore/./src/components/editors/style.tsx","webpack://ReactCore/./src/components/editors/EditorPopup.tsx","webpack://ReactCore/./src/components/editors/Editor.tsx","webpack://ReactCore/./src/components/editors/EditorPosition.tsx","webpack://ReactCore/./src/components/editors/components/EditorInputColor.tsx","webpack://ReactCore/./src/components/editors/components/EditorInputNumber.tsx","webpack://ReactCore/./src/components/editors/components/EditorInputSelect.tsx","webpack://ReactCore/./src/components/editors/EditorTabWrapper.tsx","webpack://ReactCore/./src/components/editors/states/EditorIsBusy.tsx","webpack://ReactCore/./src/components/editors/states/EditorIsLocked.tsx","webpack://ReactCore/./src/components/editors/components/EditorSave.tsx","webpack://ReactCore/./src/components/editors/EditorTabWidgetSelection.tsx","webpack://ReactCore/./src/components/editors/EditorTabDisplayLevel.tsx","webpack://ReactCore/./src/components/editors/EditorWrapper.tsx","webpack://ReactCore/./src/components/editors/EditorsPortal.tsx","webpack://ReactCore/./src/components/widgets/components/WidgetEditorPanel.tsx","webpack://ReactCore/./src/components/widgets/WidgetList/WidgetList.style.tsx","webpack://ReactCore/./src/components/widgets/WidgetList/WidgetList.tsx","webpack://ReactCore/./src/components/widgets/namespace.ts","webpack://ReactCore/./src/hooks/useMarkdownModal.ts","webpack://ReactCore/./src/components/widgets/components/WidgetUploader.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetArticleAttachmentWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetArticleButtonWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetArticleGalleryWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetStylePadding.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetScroll.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetIntranetTitle.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetHeader.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetLuccaAbsenceWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetArticleImageWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetArticleSliderWrapper.tsx","webpack://ReactCore/./src/components/tinymce/extension/MarkdownModal.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetArticleTextWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetArticleTitleWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetRemove.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetFooterView.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetInlineInputText.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetIsPending.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetCheckListWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/utils.ts","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetDatasourceTableWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetExcelDatasourceTableWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetPresenceWrapperClosing.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetPresenceWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetQuickSurveyWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/OfficeConfigurationPrompt.tsx","webpack://ReactCore/./src/components/widgets/wrapper/WidgetContactCardDav/WidgetContactCardDavHeader.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetContactCardDavWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/WidgetCalendarCalDav/WidgetCalendarCalDavHeader.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetCalendarCalDavWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/WidgetEmailsImap/WidgetEmailsImapHeader.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetEmailsImapWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetTitle.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetTitleEdit.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetHeaderEdit.tsx","webpack://ReactCore/./src/components/widgets/wrapper/WidgetLicenseWrapper.tsx","webpack://ReactCore/./src/components/widgets/Widget.tsx","webpack://ReactCore/./src/components/widgets/WidgetLayer/WidgetLayer.style.tsx","webpack://ReactCore/./src/components/widgets/WidgetLayer/WidgetLayer.tsx","webpack://ReactCore/./src/components/widgets/WidgetState.tsx","webpack://ReactCore/./src/components/widgets/WidgetWrapperCoreEditHover.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetStyleWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetIconWrapper.tsx","webpack://ReactCore/./src/components/widgets/WidgetWrapperCore.tsx","webpack://ReactCore/./src/components/comments/CommentsBloc.styles.ts","webpack://ReactCore/./src/components/comments/CommentsBlocAddCommentWidgetsWrapper.tsx","webpack://ReactCore/./src/components/comments/CommentsBlocCommentWidgetsWrapper.tsx","webpack://ReactCore/./src/components/CommentsBloc.tsx","webpack://ReactCore/./src/hooks/useCommentsLikeRT.ts","webpack://ReactCore/./src/components/Empty.tsx","webpack://ReactCore/./src/components/FullPageLayout.tsx","webpack://ReactCore/./src/hooks/useAI.ts","webpack://ReactCore/./src/components/tinymce/JRCInputTinyMCEWithExt.tsx","webpack://ReactCore/./src/components/tinymce/JRCInputTinyMCEWithExtRaw.tsx","webpack://ReactCore/./src/components/modals/ModalAudience.tsx","webpack://ReactCore/./src/components/TwoColLayout.tsx"],"sourcesContent":["import { JRCAvatar, JRCAvatarProps } from 'jamespot-react-components';\r\nimport { Network } from 'jamespot-front-business';\r\nimport React from 'react';\r\nimport { useTheme } from 'styled-components';\r\nimport { commonComponentsRegistry } from '../registry/CommonRegistry';\r\nimport { useAppSelector } from '../redux/store';\r\n\r\nconst JRCIcon = commonComponentsRegistry.getLazyComponent('Icon');\r\n\r\nconst BASE_MULTIPLE = 8;\r\n\r\nexport const Avatar = (props: JRCAvatarProps) => {\r\n const theme = useTheme();\r\n const networkPublic = useAppSelector(Network.selectors.selectNetworkPublic);\r\n\r\n if (props.uri === networkPublic?.uri) {\r\n return (\r\n <JRCIcon\r\n name={'icon-fs-wall'}\r\n size={(props.size ?? 3) * BASE_MULTIPLE}\r\n color={theme.color.primary}\r\n variant={'circle'}\r\n />\r\n );\r\n }\r\n\r\n return <JRCAvatar {...props} />;\r\n};\r\n","import React, { useState } from 'react';\nimport styled, { useTheme } from 'styled-components';\nimport { useIntl } from 'react-intl';\nimport { Utils } from 'jamespot-react-components';\nimport { Avatar } from './Avatar';\nimport { jObjectLittle } from 'jamespot-user-api';\nimport { commonComponentsRegistry } from '../registry/CommonRegistry';\n\nconst JRCFlexBox = commonComponentsRegistry.getLazyComponent('FlexBox');\nconst JRCModalContent = commonComponentsRegistry.getLazyComponent('ModalContent');\nconst JRCModalLayout = commonComponentsRegistry.getLazyComponent('ModalLayout');\nconst JRCStyledHref = commonComponentsRegistry.getLazyComponent('StyledHref');\nconst JRCTooltip = commonComponentsRegistry.getLazyComponent('Tooltip');\nconst JRCTypography = commonComponentsRegistry.getLazyComponent('Typography');\n\nexport type AudienceProps<T extends jObjectLittle> = {\n audience: T[];\n limit?: number;\n};\n\nconst LIMIT = 2;\n\nconst AudienceWrapper = styled.div`\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-bottom: 24px;\n`;\n\nexport const AvatarLink = styled.a<{ overlap?: boolean }>`\n display: flex;\n justify-content: center;\n align-items: center;\n position: relative;\n width: 40px;\n height: 40px;\n border-radius: 40px;\n overflow: hidden;\n color: ${(props) => props.theme.color.white};\n background-color: ${(props) => props.theme.color.lavender};\n border: 4px solid ${(props) => props.theme.color.white};\n margin-left: ${(props) => (props.overlap ? '-18px' : '0')};\n cursor: pointer;\n`;\n\nexport const Audience = <T extends jObjectLittle>({ audience, limit = LIMIT }: AudienceProps<T>) => {\n const intl = useIntl();\n const theme = useTheme();\n const [isModalOpen, setModalOpen] = useState(false);\n\n return (\n <>\n <JRCFlexBox>\n {[...audience].splice(0, limit).map((item, index) => (\n <AvatarLink overlap={index !== 0} href={item._url} target={'_blank'} key={item.id}>\n <JRCTooltip description={item.title === undefined ? ' ' : item.title} position=\"left\">\n <Avatar\n uri={item.uri}\n size={4}\n variant=\"circle\"\n alt=\"image\"\n timestamp={item.dateModified ? Utils.date.strToTimestamp(item.dateModified) : undefined}\n focusable\n />\n </JRCTooltip>\n </AvatarLink>\n ))}\n {audience.length > limit && (\n <AvatarLink onClick={() => setModalOpen(true)} overlap={true}>\n +{audience.length - limit}\n </AvatarLink>\n )}\n </JRCFlexBox>\n {audience.length > limit && (\n <JRCModalLayout\n closeHandler={() => setModalOpen(false)}\n enableClickAwayCloseModal\n open={isModalOpen}\n variant={'fixed-height'}\n maxHeight={'800px'}>\n <JRCModalContent\n title={intl.formatMessage({ id: 'GLOBAL_Audience' })}\n overflow={'scroll'}\n onClickIconClose={() => setModalOpen(false)}>\n <AudienceWrapper>\n {audience.map((item, i) => (\n <JRCFlexBox key={`audience-${i}`} y={'center'} gap={theme.space.l}>\n <Avatar size={5} uri={`${item.type}/${item.id}`} />\n <JRCStyledHref href={`${item.type}/${item.id}`}>\n <JRCTypography>{item.title}</JRCTypography>\n </JRCStyledHref>\n </JRCFlexBox>\n ))}\n </AudienceWrapper>\n </JRCModalContent>\n </JRCModalLayout>\n )}\n </>\n );\n};\n","import jamespot from 'jamespot-user-api';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport styled, { useTheme } from 'styled-components';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { JiaTextEnhanceQuery } from '../../../hooks/useAI';\n\nconst JRCLoader = commonComponentsRegistry.getLazyComponent('Loader');\nconst JRCModalContent = commonComponentsRegistry.getLazyComponent('ModalContent');\nconst JRCModalLayout = commonComponentsRegistry.getLazyComponent('ModalLayout');\nconst JRCTypography = commonComponentsRegistry.getLazyComponent('Typography');\n\nconst TextWrapper = styled.div`\n padding: ${(props) => props.theme.space.md}px;\n`;\n\nexport type AIModalProps = {\n query: JiaTextEnhanceQuery | undefined;\n};\n\ntype ResponseType = {\n response: string | undefined;\n loading: boolean;\n error: string | undefined;\n};\n\nconst loadingResponse: ResponseType = {\n response: undefined,\n loading: true,\n error: undefined,\n};\n\nexport const AIModal = ({ query }: AIModalProps) => {\n const intl = useIntl();\n const [response, setResponse] = useState<ResponseType>(loadingResponse);\n const theme = useTheme();\n\n const sendAIRequest = useCallback(\n (query: JiaTextEnhanceQuery) => {\n setResponse(loadingResponse);\n jamespot.jia\n .textEnhancement({ text: query.text, capacity: query.capability })\n .then((response) => {\n if (response.error) {\n setResponse({\n error: `${intl.formatMessage({ id: 'JIA_ERROR_AI_CALL' })}${\n response.errorMsg && ': ' + response.errorMsg\n }`,\n loading: false,\n response: undefined,\n });\n return;\n }\n const textResponse = response.result.text;\n setResponse({\n error: undefined,\n loading: false,\n response: textResponse,\n });\n })\n .catch((_err) => {\n setResponse({\n error: intl.formatMessage({ id: 'JIA_ERROR_AI_CALL' }),\n loading: false,\n response: undefined,\n });\n });\n },\n [intl],\n );\n\n useEffect(() => {\n if (query && query.text.trim().length > 0) {\n sendAIRequest(query);\n }\n }, [query, sendAIRequest]);\n\n return (\n <JRCModalLayout\n zIndex={theme.zIndex.tinyMCEModal}\n open={!!query}\n closeHandler={() => {\n query?.reject();\n }}>\n <JRCModalContent\n overflow=\"scroll\"\n buttons={[\n {\n children: intl.formatMessage({ id: 'GLOBAL_Try_Again' }),\n clickHandler: () => {\n query && sendAIRequest(query);\n },\n },\n {\n children: intl.formatMessage({ id: 'GLOBAL_Validation' }),\n clickHandler: () => response.response && query?.resolve(response.response),\n },\n {\n children: intl.formatMessage({ id: 'GLOBAL_Cancel' }),\n clickHandler: () => query?.reject(),\n },\n ]}\n isFull>\n <TextWrapper>\n {response.loading && (\n <>\n <JRCLoader />\n <JRCTypography align=\"center\">\n {intl.formatMessage({ id: 'JIA_WAITING_WARNIG' })}\n </JRCTypography>\n </>\n )}\n {!response.loading && response.error && <p>{response.error}</p>}\n {!response.loading && response.response && <p>{response.response}</p>}\n </TextWrapper>\n </JRCModalContent>\n </JRCModalLayout>\n );\n};\n","import { DisplayFormFieldsConfig, DisplayFormRef } from './types';\nimport { useForm, Control, FieldValues } from 'react-hook-form';\nimport { useDisplayForm } from './useDisplay';\nimport styled, { css } from 'styled-components';\nimport React, {\n FormEventHandler,\n ForwardedRef,\n forwardRef,\n ReactNode,\n Ref,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { AudienceAutocomplete } from 'jamespot-user-api';\n\nconst StretchContainer = css`\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n`;\n\nconst Container = styled.div<{ stretch?: boolean }>`\n ${({ stretch }) => stretch && StretchContainer}\n`;\n\nconst Form = styled.form<{ stretch?: boolean }>`\n ${({ stretch }) => stretch && StretchContainer}\n`;\n\nconst FormElement = (\n props: {\n stretch?: boolean;\n onSubmit?: FormEventHandler<HTMLFormElement>;\n children: ReactNode;\n dataCy?: string;\n },\n ref: ForwardedRef<HTMLFormElement | HTMLDivElement>,\n) => {\n return props.onSubmit ? (\n <Form\n stretch={props.stretch}\n onSubmit={props.onSubmit}\n ref={ref as Ref<HTMLFormElement>}\n data-cy={props.dataCy}>\n {props.children}\n </Form>\n ) : (\n <Container stretch={props.stretch} ref={ref as Ref<HTMLDivElement>} data-cy={props.dataCy}>\n {props.children}\n </Container>\n );\n};\nconst FormElm = forwardRef(FormElement);\n\nconst FieldsetWrapper = styled.div<{ stretch?: boolean }>`\n ${(props) =>\n props.stretch &&\n `\n flex: 1;\n`}\n`;\n\ntype FormFn<TFieldValues extends FieldValues> = Omit<\n ReturnType<typeof useForm<TFieldValues>>,\n 'handleSubmit' | 'control' | 'reset'\n>;\n\nexport type DisplayFormProps<TFieldValues extends FieldValues> = {\n type: string;\n fields: DisplayFormFieldsConfig<TFieldValues>;\n extraInputs?: (control: Control<TFieldValues>) => ReactNode;\n defaultValues?: any;\n onSubmit?: any;\n buttons?: ReactNode;\n readOnly?: boolean;\n dataCy?: string;\n stretch?: boolean;\n children?: ReactNode;\n forceMandatory?: boolean;\n onInit?: (formFn: FormFn<TFieldValues>) => void;\n};\n\n/****\n * The jamespot model depend on the platform\n * For example a user can have the size attribute only for a given platform\n * The model specifics of a platform are stored in J.model\n *\n * This component display an array of attributes only if this attribute is activated on the platform\n */\nconst _DisplayForm = <TFieldValues extends FieldValues>(\n { onInit, ...props }: DisplayFormProps<TFieldValues>,\n ref: ForwardedRef<DisplayFormRef>,\n) => {\n const formRef = useRef<HTMLFormElement | HTMLDivElement>(null);\n\n const [configuration, defaultValues] = useDisplayForm(props.fields, props.type, props.forceMandatory);\n const [isInit, setIsInit] = useState(false);\n\n const { handleSubmit, control, reset, ...formFn } = useForm({\n defaultValues: {\n ...defaultValues,\n ...props.defaultValues,\n },\n criteriaMode: 'all',\n });\n\n useEffect(() => {\n if (onInit && !isInit) {\n onInit(formFn);\n setIsInit(true);\n }\n }, [onInit, formFn, isInit]);\n\n const formatValuesForSubmit = useCallback(\n (values: any) => {\n const toRet: any = {};\n Object.keys(values).forEach((k) => {\n const widget = configuration.find((c) => c.name === k)?.widget;\n switch (widget?.type) {\n case 'audience':\n toRet[k] = values[k].map((v: AudienceAutocomplete) => v.uri).join(',');\n break;\n case 'taxonomy':\n toRet[k] = values[k].map((v: any) => v.title).join(',');\n break;\n case 'toggle':\n toRet[k] = values[k] ? '1' : '0';\n break;\n default:\n toRet[k] = values[k];\n break;\n }\n });\n return toRet;\n },\n [configuration],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n ...formFn,\n handleSubmit,\n control,\n reset: () => {\n // in case the form is scrollable\n formRef?.current?.scrollTo(0, 0);\n // reset react-hook-form form\n reset();\n },\n getFormattedValues: () => {\n return formatValuesForSubmit(formFn.getValues());\n },\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n return (\n <FormElm\n dataCy={props.dataCy}\n stretch={props.stretch}\n onSubmit={props.onSubmit ? handleSubmit(props.onSubmit) : undefined}\n ref={formRef}>\n <FieldsetWrapper stretch={props.stretch}>\n {configuration.map(({ Input, ...conf }) => (\n <Input\n key={conf.name}\n control={control}\n {...conf}\n dataCy={`${props.dataCy}-${conf.name}`}\n readOnly={props.readOnly}\n />\n ))}\n {props.extraInputs && props.extraInputs(control)}\n </FieldsetWrapper>\n {props.buttons}\n </FormElm>\n );\n};\n\nexport const DisplayForm = forwardRef<DisplayFormRef>(_DisplayForm as any) as <TFieldValues extends FieldValues>(\n props: DisplayFormProps<TFieldValues> & {\n ref?: ForwardedRef<DisplayFormRef>;\n },\n) => ReturnType<typeof _DisplayForm>;\n","import { FormattedMessage, useIntl } from 'react-intl';\r\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\r\nimport jApi, { jArticleList, jCommentList } from 'jamespot-user-api';\r\nimport styled from 'styled-components';\r\nimport { Toast } from 'jamespot-front-business';\r\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\r\nimport { DisplayForm } from '../../displayer/DisplayForm.component';\r\nimport { useAppDispatch } from '../../redux/store';\r\nimport { DisplayFormRef } from '../../displayer/types';\r\nimport { useAbortController } from '../../hooks';\r\n\r\nconst ModalForm = commonComponentsRegistry.getLazyComponent('ModalForm');\r\nconst Loader = commonComponentsRegistry.getLazyComponent('Loader');\r\nconst Icon = commonComponentsRegistry.getLazyComponent('Icon');\r\nconst Typography = commonComponentsRegistry.getLazyComponent('Typography');\r\nconst Ellipsis = commonComponentsRegistry.getLazyComponent('Ellipsis');\r\nconst StyledHref = commonComponentsRegistry.getLazyComponent('StyledHref');\r\n\r\nconst Container = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n gap: ${({ theme }) => theme.space.md}px;\r\n`;\r\n\r\nconst ContentPreview = styled.div`\r\n display: flex;\r\n gap: ${({ theme }) => theme.space.md}px;\r\n align-items: center;\r\n border: 1px solid ${({ theme }) => theme.color.grey2};\r\n background-color: ${({ theme }) => theme.color.grey0};\r\n border-radius: ${({ theme }) => theme.size.sm}px;\r\n padding: ${({ theme }) => theme.space.md}px;\r\n`;\r\n\r\nconst ContentWrapper = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n gap: ${({ theme }) => theme.space.sm}px;\r\n`;\r\n\r\nexport type AddReportModalProps = {\r\n onClose: () => void;\r\n articleId: number;\r\n articleUri: string;\r\n commentUri: string;\r\n};\r\n\r\nexport const AddReportModal = ({ onClose, articleId, articleUri, commentUri }: AddReportModalProps) => {\r\n const intl = useIntl();\r\n const formRef = useRef<DisplayFormRef>(null);\r\n const dispatch = useAppDispatch();\r\n const [open, setOpen] = React.useState(true);\r\n const [article, setArticle] = useState<jArticleList>();\r\n const [comment, setComment] = useState<jCommentList>();\r\n const [contentLoading, setContentLoading] = useState(true);\r\n const [submitLoading, setSubmitLoading] = useState(false);\r\n const abortController = useAbortController();\r\n\r\n useEffect(() => {\r\n Promise.all([\r\n (async () => {\r\n const res = await jApi.article.get<jArticleList>(\r\n { idArticle: articleId, format: 'raw-list' },\r\n { signal: abortController.signal },\r\n );\r\n setArticle(res.result);\r\n })(),\r\n (async () => {\r\n if (commentUri) {\r\n const res = await jApi.article.getComments<jCommentList>(\r\n { idArticle: articleId },\r\n {\r\n format: 'raw-list',\r\n signal: abortController.signal,\r\n },\r\n );\r\n setComment(res.result.find((c) => c.uri === commentUri));\r\n }\r\n })(),\r\n ]).then(() => {\r\n setContentLoading(false);\r\n });\r\n }, [abortController, articleId, commentUri]);\r\n\r\n const closeModal = useCallback(() => {\r\n setOpen(false);\r\n onClose();\r\n }, [onClose]);\r\n\r\n const submit = useCallback(\r\n (description?: string) => {\r\n if (!description?.trim()) {\r\n dispatch(\r\n Toast.actions.error({ label: intl.formatMessage({ id: 'CRPT_Report_Description_Required' }) }),\r\n );\r\n } else {\r\n setSubmitLoading(true);\r\n jApi.contentReport\r\n .createReport({\r\n uri: commentUri || articleUri,\r\n description: description,\r\n })\r\n .then(() => {\r\n dispatch(Toast.actions.success({ label: intl.formatMessage({ id: 'CRPT_Report_Sent' }) }));\r\n closeModal();\r\n })\r\n .catch((e) => {\r\n Toast.actions.error({ label: e.errorMsg ?? 'GLOBAL_Error' });\r\n setSubmitLoading(false);\r\n });\r\n }\r\n },\r\n [articleUri, closeModal, commentUri, dispatch, intl],\r\n );\r\n\r\n const submitForm = useCallback(\r\n ({ description }: { description: string }) => {\r\n submit(description);\r\n },\r\n [submit],\r\n );\r\n\r\n return (\r\n <ModalForm\r\n title={intl.formatMessage({ id: 'CRPT_Add_Report' })}\r\n open={open}\r\n closeHandler={closeModal}\r\n onSubmit={async () => submit(formRef.current?.getValues().description)}\r\n enableClickAwayCloseModal\r\n maxHeight={'520px'}\r\n buttons={[\r\n {\r\n children: <FormattedMessage id=\"GLOBAL_Cancel\" />,\r\n color: 'cancel',\r\n clickHandler: closeModal,\r\n },\r\n {\r\n children: <FormattedMessage id=\"GLOBAL_Send\" />,\r\n clickHandler: () => submit(formRef.current?.getValues().description),\r\n color: 'valid',\r\n loading: submitLoading,\r\n },\r\n ]}>\r\n {contentLoading ? (\r\n <Loader size={'l'} />\r\n ) : (\r\n <Container>\r\n <ContentPreview>\r\n <Icon name={commentUri ? 'icon-comment' : 'icon-file'} size={50} variant={'square'} />\r\n <ContentWrapper>\r\n <Typography variant={commentUri ? 'h3' : 'h2'}>\r\n <Ellipsis label={article?.title} length={40} />\r\n </Typography>\r\n {comment && (\r\n <Typography>\r\n {intl.formatMessage({ id: 'CRPT_Comment_Of' })}{' '}\r\n <StyledHref href={comment?._user._url}>{comment?._user.title}</StyledHref>\r\n </Typography>\r\n )}\r\n </ContentWrapper>\r\n </ContentPreview>\r\n <DisplayForm ref={formRef} fields={['description']} type=\"contentReport\" onSubmit={submitForm} />\r\n </Container>\r\n )}\r\n </ModalForm>\r\n );\r\n};\r\n","export const EDITOR_TOP = 90;\nexport const EDITOR_WIDTH = 440;\nexport const EDITOR_MENU_WIDTH = 50;\nexport const EDITOR_CONTENT_WIDTH = EDITOR_WIDTH - EDITOR_MENU_WIDTH;\n","import styled from 'styled-components';\nimport { EDITOR_MENU_WIDTH, EDITOR_WIDTH } from './const';\nimport { DashedFocusBorder } from 'jamespot-react-components';\n\nconst INPUT_HEIGHT = 50;\nconst RADIUS = 8;\n\nexport const CSSEditorComponentWrapper = styled.div`\n margin-bottom: 24px;\n`;\n\nexport const CSSEditorComponentLabel = styled.div`\n margin-bottom: 4px;\n`;\n\nexport const CSSEditorPortal = styled.div<{ isActive: boolean }>`\n position: absolute;\n background-color: ${(props) => (props.isActive ? 'rgba(0,0,0,.1)' : 'transparent')};\n inset: 0;\n pointer-events: ${(props) => (props.isActive ? 'all' : 'none')};\n flex: 1;\n display: flex;\n overflow: hidden;\n`;\n\nexport const CSSEditorHeader = styled.div`\n flex-direction: row;\n display: flex;\n min-height: 60px;\n border-bottom: 1px solid ${(props) => props.theme.color.grey2};\n`;\n\nexport const CSSEditorAction = styled.div`\n width: 60px;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport const CSSEditorLabel = styled.div`\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\n// This is a mask to hide top shadow. EDITOR_WIDTH + 20 is used to keep the left shadow\nexport const CSSEditorMask = styled.div`\n position: relative;\n overflow: hidden;\n top: 0px;\n width: ${EDITOR_WIDTH + 20}px;\n`;\n\nexport const CSSEditor = styled.div<{ position: 'left' | 'right' }>`\n position: absolute;\n top: 0;\n ${(props) => (props.position === 'left' ? 'left: 0px;' : '')}\n ${(props) => (props.position === 'right' ? 'right: -1000px;' : '')}\n width: ${EDITOR_WIDTH}px;\n bottom: 00px;\n display: flex;\n background-color: ${(props) => props.theme.color.white};\n flex-direction: row;\n transition: all 0.4s;\n box-shadow: -4px 0px 20px 0px #00000017;\n\n &.animate {\n right: 0px;\n }\n`;\n\nexport const CSSEditorContent = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 12px;\n overflow: auto;\n margin-bottom: 12px;\n position: relative;\n`;\n\nexport const CSSEditorTab = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n`;\n\nexport const CSSEditorIsBusy = styled.div`\n position: absolute;\n inset: 0;\n background-color: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport const CSSEditorIsLocked = styled.div`\n position: absolute;\n inset: 0;\n background-color: ${(props) => props.theme.color.white};\n padding: ${(props) => props.theme.space.md}px;\n`;\n\nexport const CSSEditorMenu = styled.div`\n width: ${EDITOR_MENU_WIDTH}px;\n padding-top: 60px;\n display: flex;\n flex-direction: column;\n border-right: 1px solid ${(props) => props.theme.color.grey2};\n`;\n\nexport const CSSEditorMenuButton = styled.button<{ isActive?: boolean }>`\n border-radius: 4px;\n cursor: pointer;\n height: 42px;\n margin: 4px;\n width: 42px;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: ${(props) => (props.isActive ? props.theme.color.grey2 : props.theme.color.white)};\n\n ${DashedFocusBorder()}\n\n &:hover {\n background-color: ${(props) => props.theme.color.grey2};\n }\n`;\n\nexport const CSSInputWrapper = styled.div`\n display: flex;\n border: 1px solid ${(props) => props.theme.color.grey1};\n border-radius: ${RADIUS}px;\n margin-bottom: 24px;\n input {\n width: 100%;\n border: 0;\n height: ${INPUT_HEIGHT}px;\n margin: 0;\n }\n`;\n\nexport const CSSEditorWidget = styled.div`\n display: flex;\n flex-direction: row;\n padding: 12px;\n background-color: ${(props) => props.theme.color.grey0};\n border-radius: 8px;\n margin-bottom: 4px;\n`;\n\nexport const CSSEditorWidgetLabel = styled.div`\n display: flex;\n flex: 1;\n align-items: center;\n`;\n\nexport const CSSEditorWidgetOption = styled.div`\n width: 40px;\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nexport const CSSEditorLayer = styled.div`\n flex-direction: row;\n display: flex;\n align-items: center;\n`;\n\nexport const CSSEditorLayerTitle = styled.div`\n flex: 1;\n display: flex;\n align-items: center;\n`;\n","import React from 'react';\nimport { CSSEditorAction, CSSEditorHeader, CSSEditorLabel, CSSEditorMenuButton } from './style';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { WidgetEditor } from 'jamespot-front-business';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\nconst JRCIcon = commonComponentsRegistry.getLazyComponent('Icon');\n\n/*\n Editor popup (center part)\n*/\nexport const EditorPopup = ({ uniqid }: { uniqid: string }) => {\n const dispatch = useAppDispatch();\n const editor = useAppSelector((state) => WidgetEditor.selectors.selectEditor(state, uniqid));\n\n const onClick = () => {\n dispatch(WidgetEditor.slice.actions.flushEditorPopup({ uniqid }));\n };\n\n const onSave = () => {\n dispatch(WidgetEditor.slice.actions.flushEditorPopup({ uniqid }));\n };\n\n if (editor && editor.popup && editor.view) {\n return (\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', backgroundColor: 'white', marginTop: 90 }}>\n <CSSEditorHeader>\n <CSSEditorAction />\n <CSSEditorLabel>Popup</CSSEditorLabel>\n <CSSEditorAction>\n <CSSEditorMenuButton onClick={onClick}>\n <JRCIcon name=\"icon-times\" color=\"grey2\" size={26.75} />\n </CSSEditorMenuButton>\n </CSSEditorAction>\n </CSSEditorHeader>\n <div style={{ flex: 1, display: 'flex' }}>{editor.view}</div>\n <CSSEditorHeader>\n <JRCButton onClick={onSave}>Save</JRCButton>\n </CSSEditorHeader>\n </div>\n );\n }\n\n return <></>;\n};\n","import { Hook, Toast, updateWidgetContent, Widget, WidgetEditor } from 'jamespot-front-business';\nimport jamespot, {\n CombinedWidgetContent,\n ensureWidgetArticleAttachmentType,\n ensureWidgetArticleButtonType,\n ensureWidgetArticleGalleryType,\n ensureWidgetArticleImageType,\n ensureWidgetArticleSliderType,\n ensureWidgetArticleTextType,\n ensureWidgetArticleTitleType,\n ensureWidgetCalendarCalDavType,\n ensureWidgetCheckListType,\n ensureWidgetContactCardDavType,\n ensureWidgetDatasourceTableType,\n ensureWidgetEmailsImapType,\n ensureWidgetExcelDatasourceTableType,\n ensureWidgetLuccaAbsenceType,\n ensureWidgetPresenceType,\n ensureWidgetQuickSurveyType,\n HookListType,\n WidgetArticleAttachmentContent,\n WidgetArticleButtonContent,\n WidgetArticleGalleryContent,\n WidgetArticleImageContent,\n WidgetArticleSliderContent,\n WidgetArticleTextContent,\n WidgetArticleTitleContent,\n WidgetCheckListContent,\n WidgetDatasourceTableContent,\n WidgetPresenceContent,\n WidgetQuickSurveyContent,\n WidgetStateProps,\n} from 'jamespot-user-api';\nimport React, { ReactElement } from 'react';\n\nimport { shallowEqual } from 'react-redux';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { Utils } from 'jamespot-react-components';\nimport { store } from '../../redux/initStore';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\n\nconst WidgetArticleTitleEditor = commonComponentsRegistry.getLazyComponent('WidgetArticleTitleEditor');\nconst WidgetArticleTextEditor = commonComponentsRegistry.getLazyComponent('WidgetArticleTextEditor');\nconst WidgetArticleGalleryEditor = commonComponentsRegistry.getLazyComponent('WidgetArticleGalleryEditor');\nconst WidgetArticleAttachmentEditor = commonComponentsRegistry.getLazyComponent('WidgetArticleAttachmentEditor');\nconst WidgetArticleSliderEditor = commonComponentsRegistry.getLazyComponent('WidgetArticleSliderEditor');\n\nconst WidgetArticleImageEditor = commonComponentsRegistry.getLazyComponent('WidgetArticleImageEditor');\nconst WidgetButtonEditor = commonComponentsRegistry.getLazyComponent('WidgetButtonEditor');\nconst WidgetCheckListEditor = commonComponentsRegistry.getLazyComponent('WidgetCheckListEditor');\nconst WidgetQuickSurveyEditor = commonComponentsRegistry.getLazyComponent('WidgetQuickSurveyEditor');\n\nconst WidgetDatasourceTableEditor = commonComponentsRegistry.getLazyComponent('WidgetDatasourceTableEditor');\nconst WidgetExcelDatasourceTableEditor = commonComponentsRegistry.getLazyComponent('WidgetExcelDatasourceTableEditor');\n\nconst WidgetPresenceEditor = commonComponentsRegistry.getLazyComponent('WidgetPresenceEditor');\n\nconst WidgetLuccaAbsenceEditor = commonComponentsRegistry.getLazyComponent('WidgetLuccaAbsenceEditor');\n\nconst WidgetEmailsImapEditor = commonComponentsRegistry.getLazyComponent('WidgetEmailsImapEditor');\nconst WidgetContactCardDavEditor = commonComponentsRegistry.getLazyComponent('WidgetContactCardDavEditor');\nconst WidgetCalendarCalDavEditor = commonComponentsRegistry.getLazyComponent('WidgetCalendarCalDavEditor');\n\n/*\n Editor Factory\n*/\nexport const Editor = ({ uniqid }: { uniqid: string }) => {\n const dispatch = useAppDispatch();\n const token = useAppSelector(Widget.selectors.selectToken);\n const widgetWrapper = useAppSelector((state) => Widget.selectors.selectWidget(state, uniqid), shallowEqual);\n\n const onSaveCallback = useAppSelector(\n (state) => WidgetEditor.selectors.selectEditor(state, uniqid)?.onSave,\n shallowEqual,\n );\n\n const handleHookIsActive = (name: keyof HookListType) => {\n return Hook.selectors.selectHook(store.getState(), name)?.isActive;\n };\n\n const onSave = (content: Partial<CombinedWidgetContent>) => {\n /*\n Update widget & Flush editor\n */\n if (widgetWrapper) {\n dispatch(Widget.slice.actions.updateWidget({ uniqid, content }));\n }\n\n dispatch(WidgetEditor.slice.actions.flushEditor({ uniqid }));\n\n if (onSaveCallback) {\n onSaveCallback(content);\n }\n };\n\n const onStateChange = (states: WidgetStateProps, id?: string) => {\n /*\n Set widget state (busy, loading, initialized)\n */\n if (id !== undefined) {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid: id, ...states }));\n } else {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, ...states }));\n }\n };\n\n const onOpen = (view: ReactElement) => {\n /*\n Register popup (central)\n */\n dispatch(WidgetEditor.slice.actions.registerEditorPopup({ uniqid, view }));\n };\n\n const widget = widgetWrapper?.widget;\n\n if (!widget) return null;\n\n if (ensureWidgetArticleButtonType(widget)) {\n return (\n <WidgetButtonEditor\n {...widget.content}\n onChange={(content) => {\n dispatch(updateWidgetContent<WidgetArticleButtonContent>(uniqid, content, false));\n }}\n onSave={() => onSave({})}\n />\n );\n } else if (ensureWidgetArticleGalleryType(widget)) {\n return (\n <WidgetArticleGalleryEditor\n token={token}\n content={widget.content}\n onChange={(content) =>\n dispatch(updateWidgetContent<WidgetArticleGalleryContent>(uniqid, content, false))\n }\n onSave={onSave}\n onStateChange={onStateChange}\n />\n );\n } else if (ensureWidgetArticleAttachmentType(widget)) {\n return (\n <WidgetArticleAttachmentEditor\n token={token}\n content={widget.content}\n onChange={(content) => {\n dispatch(updateWidgetContent<WidgetArticleAttachmentContent>(uniqid, content, false));\n }}\n onSave={onSave}\n onStateChange={onStateChange}\n onOpen={onOpen}\n />\n );\n } else if (ensureWidgetLuccaAbsenceType(widget)) {\n return <WidgetLuccaAbsenceEditor />;\n } else if (ensureWidgetArticleImageType(widget)) {\n return (\n <WidgetArticleImageEditor\n content={widget.content}\n token={token}\n onChange={(content) => {\n dispatch(updateWidgetContent<WidgetArticleImageContent>(uniqid, content, false));\n }}\n onSave={onSave}\n onStateChange={onStateChange}\n />\n );\n } else if (ensureWidgetArticleSliderType(widget)) {\n return token !== undefined ? (\n <WidgetArticleSliderEditor\n slides={widget.content.slides ?? []}\n loop={widget.content.loop ?? false}\n useDots={widget.content.useDots ?? true}\n onChange={(content) => {\n dispatch(updateWidgetContent<WidgetArticleSliderContent>(uniqid, content, false));\n }}\n token={token}\n onSave={onSave}\n />\n ) : (\n <>Token is mandatory</>\n );\n } else if (ensureWidgetArticleTitleType(widget)) {\n return (\n <WidgetArticleTitleEditor\n onChange={(content) => {\n dispatch(updateWidgetContent<WidgetArticleTitleContent>(uniqid, content, false));\n }}\n onSave={onSave}\n content={widget.content}\n onOpen={onOpen}\n />\n );\n } else if (ensureWidgetArticleTextType(widget)) {\n return (\n <WidgetArticleTextEditor\n onChange={(content) => {\n dispatch(updateWidgetContent<WidgetArticleTextContent>(uniqid, content, false));\n }}\n onSave={onSave}\n content={widget.content}\n />\n );\n } else if (ensureWidgetPresenceType(widget)) {\n return (\n <WidgetPresenceEditor\n onChange={(content) => {\n dispatch(updateWidgetContent<WidgetPresenceContent>(uniqid, content, false));\n }}\n onSave={onSave}\n onStateChange={onStateChange}\n {...widget.content}\n />\n );\n } else if (ensureWidgetCheckListType(widget)) {\n return (\n <WidgetCheckListEditor\n token={token}\n uniqid={widget.uniqid}\n content={{\n ...widget.content,\n arr: widget.content.arr?.map((w) => ({\n ...w,\n title: Utils.html.htmlDecodeSpecialChars(w.title),\n })),\n }}\n onChangeContent={(uniqid, content) => {\n dispatch(updateWidgetContent(uniqid, content, false));\n }}\n onChangeWrapper={(content) => {\n dispatch(\n Widget.slice.actions.updateWidgetWrapper({\n ...content,\n title: Utils.html.htmlDecodeSpecialChars(content.title),\n }),\n );\n }}\n handleChange={(content) =>\n dispatch(updateWidgetContent<WidgetCheckListContent>(uniqid, content, false))\n }\n />\n );\n } else if (ensureWidgetQuickSurveyType(widget)) {\n return (\n <WidgetQuickSurveyEditor\n token={token}\n uniqid={widget.uniqid}\n content={widget.content}\n onChangeContent={(uniqid, content) => {\n dispatch(updateWidgetContent<WidgetQuickSurveyContent>(uniqid, content, false));\n }}\n onChangeWrapper={(content) => {\n dispatch(Widget.slice.actions.updateWidgetWrapper({ ...content }));\n }}\n handleChange={(content) =>\n dispatch(updateWidgetContent<WidgetQuickSurveyContent>(uniqid, content, false))\n }\n />\n );\n } else if (ensureWidgetExcelDatasourceTableType(widget)) {\n return (\n <WidgetExcelDatasourceTableEditor\n {...widget.content}\n uri={widget.content.uri}\n limit={widget.content.limit ?? 20}\n hook={{ isActive: handleHookIsActive }}\n handlers={{\n jamespot: {\n datasource: jamespot.datasource,\n network: jamespot.network,\n filebank: jamespot.filebank,\n wedoc: jamespot.wedoc,\n },\n handleStart: () => onStateChange({ busy: true }),\n handleCatch: (err) => dispatch(Toast.actions.error({ label: err.errorMsg })),\n handleFinally: () => onStateChange({ busy: false }),\n }}\n onSave={onSave}\n onChange={(content, override) =>\n dispatch(updateWidgetContent<WidgetDatasourceTableContent>(uniqid, content, override ?? false))\n }\n onStateChange={onStateChange}\n onError={(label) => dispatch(Toast.actions.error({ label }))}\n />\n );\n } else if (ensureWidgetEmailsImapType(widget)) {\n return <WidgetEmailsImapEditor />;\n } else if (ensureWidgetContactCardDavType(widget)) {\n return <WidgetContactCardDavEditor />;\n } else if (ensureWidgetCalendarCalDavType(widget)) {\n return <WidgetCalendarCalDavEditor />;\n } else if (ensureWidgetDatasourceTableType(widget)) {\n return (\n <WidgetDatasourceTableEditor\n {...widget.content}\n uri={widget.content.uri}\n limit={widget.content.limit ?? 20}\n hook={{ isActive: handleHookIsActive }}\n handlers={{\n jamespot: {\n datasource: jamespot.datasource,\n network: jamespot.network,\n application: jamespot.application,\n filebank: jamespot.filebank,\n },\n handleStart: () => onStateChange({ busy: true }),\n handleCatch: (err) => dispatch(Toast.actions.error({ label: err.errorMsg })),\n handleFinally: () => onStateChange({ busy: false }),\n }}\n onSave={onSave}\n onChange={(content, override) =>\n dispatch(updateWidgetContent<WidgetDatasourceTableContent>(uniqid, content, override ?? false))\n }\n onStateChange={onStateChange}\n onError={(label) => {\n dispatch(Toast.actions.error({ label }));\n }}\n />\n );\n } else {\n return <>cannot display editor</>;\n }\n};\n","import React from 'react';\nimport { CSSEditorAction, CSSEditorMenuButton } from './style';\nimport { WidgetEditor } from 'jamespot-front-business';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { useAppDispatch } from '../../redux/store';\n\nconst Icon = commonComponentsRegistry.getLazyComponent('Icon');\n\nimport { useTheme } from 'styled-components';\n\nexport const EditorPosition = ({ uniqid, position }: { uniqid: string; position: 'left' | 'right' }) => {\n const dispatch = useAppDispatch();\n const theme = useTheme();\n const onClick = () => {\n dispatch(\n WidgetEditor.slice.actions.setEditorPosition({ uniqid, position: position === 'left' ? 'right' : 'left' }),\n );\n };\n\n return (\n <CSSEditorAction>\n <CSSEditorMenuButton onClick={onClick}>\n <Icon\n name={position === 'left' ? 'icon-angle-right' : 'icon-angle-left'}\n color={theme.color.lavender}\n size={26.75}\n />\n </CSSEditorMenuButton>\n </CSSEditorAction>\n );\n};\n","import React from 'react';\n\nimport styled, { useTheme } from 'styled-components';\nimport { useIntl, FormattedMessage } from 'react-intl';\n\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\n\nconst InputColorRaw = commonComponentsRegistry.getLazyComponent('InputColorRaw');\n\nexport const Label = styled.label`\n margin-left: 2px;\n margin-right: 2px;\n margin-bottom: 8px;\n font-size: 14px;\n width: 100%;\n min-height: 20px;\n`;\n\nexport const Fieldset = styled.fieldset`\n margin: 12px 0px !important;\n width: 100% !important;\n`;\n\nexport const EditorInputColor = ({\n label,\n initialValue,\n handleChange,\n}: {\n label: string;\n initialValue?: string;\n handleChange: (color: string) => void;\n}) => {\n const theme = useTheme();\n const intl = useIntl();\n\n const palettes = [\n {\n name: intl.formatMessage({ id: 'GLOBAL_Platform_Color' }),\n colors: [\n theme.color.primary,\n theme.color.secondary,\n theme.color.headerColor,\n theme.color.lavender,\n theme.color.orange,\n theme.color.green,\n theme.color.navy,\n theme.color.overseas,\n ],\n },\n ];\n\n return (\n <Fieldset>\n <Label>\n <FormattedMessage id={label} />\n </Label>\n <InputColorRaw\n palettes={palettes}\n label={label}\n initialValue={initialValue ?? theme.color.primary}\n name={`background-color`}\n onChange={handleChange}\n />\n </Fieldset>\n );\n};\n","import React from 'react';\n\nimport { useForm } from 'react-hook-form';\nimport { useIntl } from 'react-intl';\n\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\n\nconst JRCInputNumber = commonComponentsRegistry.getLazyComponent('InputNumber');\n\nexport const EditorInputNumber = ({\n label,\n initialValue,\n handleChange,\n}: {\n label: string;\n initialValue?: string;\n handleChange: (value: string) => void;\n}) => {\n const intl = useIntl();\n\n const { control, watch } = useForm({\n defaultValues: { value: initialValue ?? '0' },\n criteriaMode: 'all',\n });\n\n React.useEffect(() => {\n const subscription = watch((data) => {\n handleChange(data.value ?? '');\n });\n return () => subscription.unsubscribe();\n }, [watch, handleChange]);\n\n return (\n <JRCInputNumber\n label={label}\n name={'value'}\n width=\"100%\"\n control={control}\n placeholder={intl.formatMessage({ id: label })}\n />\n );\n};\n","import React, { useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\n\nexport type EditorSelectOption = { label: string; value: string };\nexport type EditorSelectOptions = EditorSelectOption[];\n\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\n\nconst InputSelectExtended = commonComponentsRegistry.getLazyComponent('InputSelectExtended');\n\nexport const EditorInputSelect = ({\n label,\n options = [],\n initialValue,\n required = false,\n handleChange,\n}: {\n label: string;\n options: { label: string; value: string }[];\n initialValue?: string;\n required: boolean;\n handleChange: (value: string) => void;\n}) => {\n const optionFromInitialValue = useMemo(() => {\n if (initialValue && options.find((el) => el.value === initialValue)) {\n return options.find((el) => el.value === initialValue);\n }\n\n return options[0];\n }, [initialValue, options]);\n\n const { control, watch } = useForm({\n defaultValues: { select: optionFromInitialValue },\n criteriaMode: 'all',\n });\n\n React.useEffect(() => {\n const subscription = watch((data: any) => {\n handleChange(data.select.value);\n });\n return () => subscription.unsubscribe();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [watch, handleChange]);\n\n return (\n <InputSelectExtended\n options={options}\n label={label}\n getValue={(o) => o.value}\n getLabel=\"label\"\n getSearch=\"label\"\n rules={{ required }}\n hideDeleteIcon={true}\n required={required}\n control={control}\n name={'select'}\n />\n );\n};\n","import { Widget } from 'jamespot-front-business';\nimport React, { useCallback, useEffect, useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useIntl } from 'react-intl';\n\nimport { EditorInputColor } from './components/EditorInputColor';\nimport { EditorInputNumber } from './components/EditorInputNumber';\nimport { EditorInputSelect } from './components/EditorInputSelect';\n\nimport { shallowEqual } from 'react-redux';\nimport { useTheme } from 'styled-components';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\n\nconst JRCInputText = commonComponentsRegistry.getLazyComponent('InputText');\n\n/*\n Editor tab wrapper (this is all the properties available on a widget wrapper)\n*/\nexport const EditorTabWrapper = ({ uniqid }: { uniqid: string }) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const wrapper = useAppSelector((state) => Widget.selectors.selectWidget(state, uniqid));\n const widgetContext = useAppSelector((state) => Widget.selectors.selectWidgetContext(state, uniqid), shallowEqual);\n const theme = useTheme();\n\n const styles = useAppSelector((state) => Widget.selectors.selectWidgetTitleStyle(state, uniqid), shallowEqual);\n\n const { control, watch } = useForm({\n defaultValues: { text: wrapper?.title.replace(/&amp;/g, '&') ?? '' },\n criteriaMode: 'all',\n });\n\n useEffect(() => {\n const subscription = watch((data: any) => {\n dispatch(Widget.slice.actions.updateWidgetWrapper({ uniqid, title: data.text }));\n });\n return () => subscription.unsubscribe();\n }, [watch, uniqid, dispatch]);\n\n const initialValues = useMemo(() => {\n return {\n color: styles && styles['color'] ? String(styles['color']) : theme.color.black,\n backgroundColor: styles && styles['background-color'] ? String(styles['background-color']) : 'transparent',\n fontSize: styles && styles['font-size'] ? String(styles['font-size']) : '24',\n fontWeight: styles && styles['font-weight'] ? String(styles['font-weight']) : 'medium',\n textAlign: styles && styles['text-align'] ? String(styles['text-align']) : 'left',\n };\n }, [styles, theme]);\n\n const handleChange = useCallback(\n (name: string, value: string | number) => {\n dispatch(\n Widget.slice.actions.setWidgetTitleStyle({\n uniqid,\n styles: { [name]: value },\n }),\n );\n },\n [dispatch, uniqid],\n );\n\n return wrapper ? (\n <>\n <JRCInputText\n name={'text'}\n label={'WIDGET_Title'}\n width=\"100%\"\n control={control}\n placeholder={intl.formatMessage({ id: 'WIDGET_Title' })}\n />\n {widgetContext !== 'comment' && (\n <>\n <EditorInputColor\n label=\"STYLE_Text_Color\"\n initialValue={initialValues.color}\n handleChange={(colorValue) => handleChange('color', colorValue)}\n />\n <EditorInputColor\n label=\"STYLE_Background_Color\"\n initialValue={initialValues.backgroundColor}\n handleChange={(backgroundColorValue) => handleChange('background-color', backgroundColorValue)}\n />\n <EditorInputNumber\n label={'STYLE_Text_Size'}\n initialValue={initialValues.fontSize}\n handleChange={(fontSizeValue) => handleChange('font-size', fontSizeValue)}\n />\n <EditorInputSelect\n label={'STYLE_Font_Weight'}\n initialValue={initialValues.fontWeight}\n options={[\n { label: intl.formatMessage({ id: 'STYLE_Font_Weight_Normal' }), value: 'normal' },\n { label: intl.formatMessage({ id: 'STYLE_Font_Weight_Medium' }), value: 'medium' },\n { label: intl.formatMessage({ id: 'STYLE_Font_Weight_Bold' }), value: 'bold' },\n ]}\n required={false}\n handleChange={(fontWeightValue) => handleChange('font-weight', fontWeightValue)}\n />\n <EditorInputSelect\n label={'STYLE_Text_Align'}\n initialValue={initialValues.textAlign}\n options={[\n { label: intl.formatMessage({ id: 'STYLE_Text_Align_Left' }), value: 'left' },\n { label: intl.formatMessage({ id: 'STYLE_Text_Align_Center' }), value: 'center' },\n { label: intl.formatMessage({ id: 'STYLE_Text_Align_Justify' }), value: 'justify' },\n { label: intl.formatMessage({ id: 'STYLE_Text_Align_Right' }), value: 'right' },\n ]}\n required={false}\n handleChange={(textAlignValue) => handleChange('text-align', textAlignValue)}\n />\n </>\n )}\n </>\n ) : (\n <></>\n );\n};\n","import React from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { CSSEditorIsBusy } from '../style';\nimport { Widget } from 'jamespot-front-business';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppSelector } from '../../../redux/store';\n\nconst Loader = commonComponentsRegistry.getLazyComponent('Loader');\n\nexport const EditorIsBusy = ({ uniqid }: { uniqid: string }) => {\n const isBusy = useAppSelector((state) => Widget.selectors.selectWidgetState(state, uniqid), shallowEqual)?.busy;\n return (\n <>\n {isBusy && (\n <CSSEditorIsBusy>\n <Loader size={'l'} />\n </CSSEditorIsBusy>\n )}\n </>\n );\n};\n","import React from 'react';\n\nimport { useIntl } from 'react-intl';\nimport { CSSEditorIsLocked } from '../style';\nimport { shallowEqual } from 'react-redux';\nimport { Widget } from 'jamespot-front-business';\nimport { useAppSelector } from '../../../redux/store';\n\nexport const EditorIsLocked = ({ uniqid }: { uniqid: string }) => {\n const intl = useIntl();\n const isLocked = useAppSelector((state) => Widget.selectors.selectWidgetState(state, uniqid), shallowEqual)?.locked;\n return isLocked ? (\n <CSSEditorIsLocked>{intl.formatMessage({ id: 'INTRANET_Panel_Change_Off' })}</CSSEditorIsLocked>\n ) : (\n <></>\n );\n};\n","import React from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { Toast, Widget, WidgetEditor } from 'jamespot-front-business';\nimport jApi, { CombinedWidgetContent, WidgetDisplayMode } from 'jamespot-user-api';\nimport { useIntl } from 'react-intl';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\n\nexport const EditorSave = ({ uniqid, mode }: { uniqid: string; mode: WidgetDisplayMode }) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const wrapper = useAppSelector((state) => Widget.selectors.selectWidget(state, uniqid), shallowEqual);\n const uri = useAppSelector((state) => Widget.selectors.selectWidgetObjectUri(state, uniqid), shallowEqual);\n\n const handleClick = () => {\n dispatch(WidgetEditor.slice.actions.flushEditor({ uniqid }));\n const content = wrapper && wrapper.widget && wrapper.widget.content;\n if (!uri || !wrapper || !content) return;\n if (mode == 'view') {\n jApi.widget\n .updateWidget<CombinedWidgetContent>({\n uri,\n uniqid: uniqid,\n title: wrapper.title,\n content: content as CombinedWidgetContent,\n v2: true,\n })\n .catch((e: any) => {\n dispatch(\n Toast.actions.error({\n label: e.errorMsg ?? intl.formatMessage({ id: 'GLOBAL_Error' }),\n }),\n );\n });\n }\n\n if (mode === 'edit') {\n dispatch(Widget.slice.actions.updateWidget({ uniqid, content: content as CombinedWidgetContent }));\n }\n };\n\n return (\n <JRCButton color=\"valid\" onClick={handleClick}>\n {intl.formatMessage({ id: 'GLOBAL_Save' })}\n </JRCButton>\n );\n};\n","import React, { useCallback, useMemo } from 'react';\n\nimport { useIntl } from 'react-intl';\n\nimport { useTheme } from 'styled-components';\n\nimport { shallowEqual } from 'react-redux';\nimport { Widget } from 'jamespot-front-business';\nimport { EditorInputNumber } from './components/EditorInputNumber';\nimport { EditorInputSelect } from './components/EditorInputSelect';\nimport { EditorInputColor } from './components/EditorInputColor';\n\nimport { useAppSelector, useAppDispatch } from '../../redux/store';\n\nexport const EditorTabWidgetSelection = ({ uniqid }: { uniqid: string }) => {\n const theme = useTheme();\n const dispatch = useAppDispatch();\n const intl = useIntl();\n\n const styles = useAppSelector((state) => Widget.selectors.selectWidgetWrapperStyle(state, uniqid), shallowEqual);\n\n const initialValues = useMemo(() => {\n return {\n color: styles && styles['color'] ? String(styles['color']) : theme.color.black,\n backgroundColor:\n styles && styles['background-color'] ? String(styles['background-color']) : theme.color.white,\n padding: styles && styles['padding'] ? String(styles['padding']) : '0',\n borderRadius: styles && styles['border-radius'] ? String(styles['border-radius']) : '0',\n borderColor: styles['border-color'] ? String(styles['border-color']) : theme.color.black,\n borderWidth: styles['border-width'] ? String(styles['border-width']) : '0',\n borderStyle: styles['border-style'] ? String(styles['border-style']) : 'none',\n };\n }, [styles, theme]);\n\n const handleChange = useCallback(\n (name: string, value: string) => {\n dispatch(\n Widget.slice.actions.setWidgetWrapperStyle({\n uniqid,\n styles: { [name]: value },\n }),\n );\n },\n [uniqid, dispatch],\n );\n\n return (\n <>\n <EditorInputColor\n label={'STYLE_Background_Color'}\n initialValue={initialValues.backgroundColor}\n handleChange={(backgroundColorValue) => handleChange('background-color', backgroundColorValue)}\n />\n <EditorInputColor\n label={'STYLE_Text_Color'}\n initialValue={initialValues.color}\n handleChange={(color) => handleChange('color', color)}\n />\n <hr />\n <EditorInputNumber\n label={'STYLE_Padding'}\n initialValue={initialValues.padding}\n handleChange={(paddingValue) => handleChange('padding', String(paddingValue))}\n />\n <EditorInputNumber\n label={'STYLE_Radius'}\n initialValue={initialValues.borderRadius}\n handleChange={(borderRadiusValue) => handleChange('border-radius', String(borderRadiusValue))}\n />\n <EditorInputSelect\n label={'STYLE_Border_Style'}\n initialValue={initialValues.borderStyle}\n options={[\n { label: intl.formatMessage({ id: 'STYLE_Border_Style_None' }), value: 'none' },\n { label: intl.formatMessage({ id: 'STYLE_Border_Style_Solid' }), value: 'solid' },\n { label: intl.formatMessage({ id: 'STYLE_Border_Style_Dashed' }), value: 'dashed' },\n { label: intl.formatMessage({ id: 'STYLE_Border_Style_Dotted' }), value: 'dotted' },\n ]}\n required={false}\n handleChange={(borderStyleValue) => {\n handleChange('border-style', borderStyleValue);\n borderStyleValue !== 'none' && handleChange('border-color', theme.color.black);\n borderStyleValue !== 'none' && handleChange('border-width', '1');\n }}\n />\n {typeof initialValues.borderStyle === 'string' && initialValues.borderStyle !== 'none' && (\n <EditorInputColor\n label={'STYLE_Border_Color'}\n initialValue={initialValues.borderColor}\n handleChange={(borderColorValue) => handleChange('border-color', borderColorValue)}\n />\n )}\n {typeof initialValues.borderStyle === 'string' && initialValues.borderStyle !== 'none' && (\n <EditorInputNumber\n label={'STYLE_Border_Width'}\n initialValue={initialValues.borderWidth}\n handleChange={(borderWidthValue) => handleChange('border-width', borderWidthValue)}\n />\n )}\n </>\n );\n};\n","import React, { useCallback } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { WidgetEditor, Widget } from 'jamespot-front-business';\nimport { useIntl } from 'react-intl';\n\nimport { EditorInputSelect } from './components/EditorInputSelect';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\n\n/**\n *\n * level 1 : Icon only (iOS like)\n * level 2 : Icon + Notification cell (iOS like)\n * level 3 : Default display\n * Level 4 : ???\n *\n */\nexport const EditorTabDisplayLevel = ({ uniqid }: { uniqid: string }) => {\n const dispatch = useAppDispatch();\n const intl = useIntl();\n const editor = useAppSelector((state) => WidgetEditor.selectors.selectEditor(state, uniqid), shallowEqual);\n const def = Widget.definition(editor?.name);\n const level = useAppSelector((state) => Widget.selectors.selectWidgetLevel(state, uniqid), shallowEqual);\n\n const handleChange = useCallback(\n (level: string) => {\n dispatch(Widget.slice.actions.updateWidgetWrapper({ uniqid, level: Number(level) as 1 | 2 | 3 | 4 }));\n },\n [uniqid, dispatch],\n );\n\n return (\n <EditorInputSelect\n handleChange={handleChange}\n required={true}\n label={'WIDGET_Display_Level_Select'}\n initialValue={level ? String(level) : '3'}\n options={[\n { label: intl.formatMessage({ id: 'WIDGET_Display_Level_1' }), value: '1' },\n { label: intl.formatMessage({ id: 'WIDGET_Display_Level_2' }), value: '2' },\n { label: intl.formatMessage({ id: 'WIDGET_Display_Level_3' }), value: '3' },\n { label: intl.formatMessage({ id: 'WIDGET_Display_Level_4' }), value: '4' },\n ].filter((el) =>\n Array.isArray(def.displayLevel) ? def.displayLevel.includes(Number(el.value) as 1 | 2 | 3 | 4) : [],\n )}\n />\n );\n};\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { Editor } from './Editor';\nimport {\n CSSEditor,\n CSSEditorAction,\n CSSEditorContent,\n CSSEditorTab,\n CSSEditorHeader,\n CSSEditorLabel,\n CSSEditorMask,\n CSSEditorMenu,\n CSSEditorMenuButton,\n} from './style';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { useIntl } from 'react-intl';\nimport { EDITOR_CONTENT_WIDTH } from './const';\nimport { EditorPosition } from './EditorPosition';\nimport { EditorTabWrapper } from './EditorTabWrapper';\nimport { EditorIsBusy } from './states/EditorIsBusy';\nimport { EditorIsLocked } from './states/EditorIsLocked';\n\nimport { EditorSave } from './components/EditorSave';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\nimport { useTheme } from 'styled-components';\nimport { EditorTabWidgetSelection } from './EditorTabWidgetSelection';\nimport { EditorTabDisplayLevel } from './EditorTabDisplayLevel';\n\nconst OVERRIDE_SAVE = [\n 'widget-presence',\n 'widget-quick-survey',\n 'widget-check-list',\n 'widget-emails-imap',\n 'widget-contact-cardDav',\n 'widget-calendar-calDav',\n];\n\nconst Icon = commonComponentsRegistry.getLazyComponent('Icon');\nconst Tooltip = commonComponentsRegistry.getLazyComponent('Tooltip');\n\ntype EditorTabs = 'widget-settings' | 'widget-title' | 'widget-selection' | 'widget-level';\ntype EditorTab = {\n name: EditorTabs;\n label: string;\n icon: string;\n enable: boolean;\n};\n\n/*\n Editor wrapper (right part)\n*/\nexport const EditorWrapper = ({ uniqid, position }: { uniqid: string; position: 'left' | 'right' }) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const theme = useTheme();\n const ref = useRef<HTMLDivElement>(null);\n const editor = useAppSelector((state) => WidgetEditor.selectors.selectEditor(state, uniqid), shallowEqual);\n\n const def = Widget.definition(editor?.name);\n\n const enableWidgetLevel = useMemo<boolean>(() => {\n return def.displayLevel !== undefined && Array.isArray(def.displayLevel) && def.displayLevel.length !== 0;\n }, [def]);\n const tabs: EditorTab[] = useMemo(() => {\n return [\n {\n name: 'widget-title',\n label: intl.formatMessage({ id: 'PANEL_Title' }),\n enable: def.panel.useWrapper,\n icon: 'icon-font',\n },\n {\n name: 'widget-selection',\n label: intl.formatMessage({ id: 'PANEL_Widget_Selection' }),\n enable: def.panel.useSelection,\n icon: 'icon-sliders',\n },\n {\n name: 'widget-settings',\n label: intl.formatMessage({ id: 'PANEL_Widget_Settings' }),\n enable: def.panel.useEditor,\n icon: 'icon-pen',\n },\n {\n name: 'widget-level',\n label: intl.formatMessage({ id: 'PANEL_Widget_Level' }),\n enable: enableWidgetLevel,\n icon: 'icon-edit',\n },\n ];\n }, [def, intl, enableWidgetLevel]);\n\n const defaultTab = useMemo<EditorTab | undefined>(() => {\n if (def.panel.useEditor) {\n return tabs.find((el) => el.name === 'widget-settings');\n }\n\n return tabs.filter((el) => el.enable)[0];\n }, [def, tabs]);\n\n const [currentTab, setCurrentTab] = useState<EditorTab | undefined>(defaultTab);\n\n const onClose = () => {\n dispatch(WidgetEditor.slice.actions.flushEditor({ uniqid }));\n };\n\n useEffect(() => {\n setTimeout(() => {\n if (ref && ref.current) {\n ref.current.className = ref.current.className + ' animate';\n }\n }, 0);\n }, []);\n\n return editor ? (\n <CSSEditorMask>\n <CSSEditor ref={ref} position={position}>\n <CSSEditorMenu>\n {tabs\n .filter((tab) => tab.enable)\n .map((tab) => {\n return (\n <CSSEditorMenuButton\n key={tab.name}\n isActive={currentTab && currentTab.name === tab.name}\n onClick={() => setCurrentTab(tab)}>\n <Tooltip position={'left'} description={tab.label}>\n <Icon\n name={tab.icon}\n color={\n currentTab && currentTab.name === tab.name\n ? theme.color.white\n : theme.color.lavender\n }\n />\n </Tooltip>\n </CSSEditorMenuButton>\n );\n })}\n </CSSEditorMenu>\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', width: `${EDITOR_CONTENT_WIDTH}px` }}>\n <CSSEditorHeader>\n <EditorPosition uniqid={uniqid} position={editor.position} />\n <CSSEditorLabel>\n <h3>{currentTab ? currentTab.label : intl.formatMessage({ id: def.label })}</h3>\n </CSSEditorLabel>\n <CSSEditorAction>\n <CSSEditorMenuButton onClick={onClose}>\n <Icon name=\"icon-times\" color={theme.color.lavender} size={26.75} />\n </CSSEditorMenuButton>\n </CSSEditorAction>\n </CSSEditorHeader>\n <CSSEditorContent>\n <CSSEditorTab>\n {currentTab && currentTab.name === 'widget-settings' && def.panel.useEditor && (\n <Editor uniqid={editor.uniqid} />\n )}\n {currentTab && currentTab.name === 'widget-title' && def.panel.useWrapper && (\n <EditorTabWrapper uniqid={editor.uniqid} />\n )}\n {currentTab && currentTab.name === 'widget-selection' && (\n <EditorTabWidgetSelection uniqid={uniqid} />\n )}\n {currentTab && currentTab.name === 'widget-level' && enableWidgetLevel && (\n <EditorTabDisplayLevel uniqid={uniqid} />\n )}\n </CSSEditorTab>\n <EditorIsBusy uniqid={uniqid} />\n <EditorIsLocked uniqid={uniqid} />\n {OVERRIDE_SAVE.includes(editor.name) && <EditorSave uniqid={uniqid} mode={editor.mode} />}\n </CSSEditorContent>\n </div>\n </CSSEditor>\n {editor?.popup ? (\n <div style={{ position: 'absolute', inset: 0, backgroundColor: '#000', opacity: '.7' }}></div>\n ) : (\n <></>\n )}\n </CSSEditorMask>\n ) : (\n <></>\n );\n};\n","import React, { useEffect } from 'react';\n\nimport { shallowEqual } from 'react-redux';\n\nimport { EDITOR_TOP, EDITOR_WIDTH } from './const';\nimport { EditorPopup } from './EditorPopup';\nimport { EditorWrapper } from './EditorWrapper';\nimport { CSSEditorPortal } from './style';\nimport { WidgetEditor } from 'jamespot-front-business';\n\nimport styled from 'styled-components';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\n\nexport const CSSEditorPortalWrapper = styled.div`\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 1;\n`;\n\nexport const CSSEditorPortalPopupWrapper = styled.div<{ isActive: boolean }>`\n flex: 1;\n display: flex;\n margin-top: ${EDITOR_TOP}px;\n pointer-events: ${(props) => (props.isActive ? 'all' : 'none')};\n`;\n\nexport const CSSEditorPortalRow = styled.div`\n flex: 1;\n display: flex;\n flex-direction: row;\n pointer-events: none;\n`;\n\nexport const CSSEditorPortalFreeSpace = styled.div`\n width: ${EDITOR_WIDTH}px;\n pointer-events: none;\n`;\n\n/*\n Editors wrapper (template)\n*/\nexport const EditorsPortal = () => {\n const dispatch = useAppDispatch();\n useEffect(() => {\n const flush = () => {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n };\n\n window.addEventListener('NGWidgetEditorFlushAll', flush);\n return () => {\n window.removeEventListener('NGWidgetEditorFlushAll', flush);\n };\n }, [dispatch]);\n\n const editors = useAppSelector(WidgetEditor.selectors.selectEditors, shallowEqual);\n\n return (\n <CSSEditorPortalWrapper className=\"editor-portal-wrapper\">\n {editors.map((editor) => {\n return (\n <CSSEditorPortal isActive={false} key={editor.uniqid}>\n <CSSEditorPortalRow>\n {editor.position === 'left' ? (\n <>\n <EditorWrapper uniqid={editor.uniqid} position={editor.position}></EditorWrapper>\n <CSSEditorPortalPopupWrapper isActive={editor.popup !== undefined}>\n <EditorPopup uniqid={editor.uniqid} />\n </CSSEditorPortalPopupWrapper>\n <CSSEditorPortalFreeSpace />\n </>\n ) : (\n <>\n <CSSEditorPortalFreeSpace />\n <CSSEditorPortalPopupWrapper isActive={editor.popup !== undefined}>\n <EditorPopup uniqid={editor.uniqid} />\n </CSSEditorPortalPopupWrapper>\n <EditorWrapper uniqid={editor.uniqid} position={editor.position}></EditorWrapper>\n </>\n )}\n </CSSEditorPortalRow>\n </CSSEditorPortal>\n );\n })}\n </CSSEditorPortalWrapper>\n );\n};\n","import React, { useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { v4 as uuidv4 } from 'uuid';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { EditorsPortal } from '../../editors/EditorsPortal';\n\nconst JRCThemeProvider = commonComponentsRegistry.getLazyComponent('ThemeProvider');\n\nconst createPortalElement = (parent: HTMLElement): HTMLDivElement => {\n let portal = document.getElementById('react-portals') as HTMLDivElement;\n\n if (!portal) {\n portal = document.createElement('div');\n portal.id = uuidv4();\n parent.appendChild(portal);\n }\n\n return portal;\n};\nexport const EditorsPanel = () => {\n const portalDiv = document.getElementById('react-portals');\n const portal = useMemo(() => portalDiv && createPortalElement(portalDiv), [portalDiv]);\n\n if (!portal) {\n return null;\n }\n return createPortal(\n <JRCThemeProvider>\n <EditorsPortal />\n </JRCThemeProvider>,\n portal,\n );\n};\n","import { DashedFocusBorder } from 'jamespot-react-components';\nimport styled from 'styled-components';\n\nexport const CSSSquareWidgetWrapper = styled.div`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 10px;\n justify-content: center;\n`;\n\nexport const CSSSquareWidget = styled.div<{ available: boolean }>`\n border: 1px solid ${(props) => props.theme.color.grey2};\n border-radius: 8px;\n cursor: pointer;\n padding: 12px;\n position: relative;\n opacity: ${(props) => (props.available ? '1' : '.4')};\n pointer-events: ${(props) => (props.available ? 'all' : 'none')};\n\n .show-on-hover {\n position: absolute;\n inset: 0;\n border-radius: 8px;\n justify-content: center;\n align-items: center;\n display: flex;\n opacity: 0;\n background-color: #ffffffe6;\n }\n\n &:hover {\n .show-on-hover {\n opacity: 1;\n }\n }\n`;\n\nexport const CSSWidgetButton = styled.div<{ open: boolean; height: number }>`\n border: 2px solid ${(props) => props.theme.color.primary};\n height: ${(props) => (props.open ? props.height : '54')}px;\n border-radius: 8px;\n display: flex;\n justify-content: top;\n flex-direction: column;\n transition: height 0.4s;\n overflow: hidden;\n flex-direction: column;\n`;\n\nexport const CSSWrapWidgetWrapper = styled.div<{ column?: boolean }>`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: center;\n gap: 10px;\n ${(props) => props.column && `flex-direction: column;`}\n`;\n\nexport const CSSWrapTitle = styled.div`\n min-height: 50px;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n color: ${(props) => props.theme.color.primary};\n &:hover {\n background-color: ${(props) => props.theme.color.grey0};\n }\n`;\n\nexport const CSSWrapWidget = styled.button<{ open: boolean; index: number; full?: boolean; parentIsColumn?: boolean }>`\n display: flex;\n align-items: center;\n padding: ${(props) => (props.parentIsColumn ? '36px 16px' : '0 10px')};\n gap: 10px;\n width: 40%;\n border: 1px solid ${(props) => props.theme.color.grey1};\n border-radius: 8px;\n transition: opacity 0.4s ease ${(props) => props.index * 40}ms;\n opacity: ${(props) => (props.open ? 1 : 0)};\n img {\n width: 40px;\n }\n ${(props) => props.full && `flex: 1; width: 100%;`}\n ${(props) => props.parentIsColumn && `flex-basis: 72px;`}\n ${(props) => !props.parentIsColumn && `height: 72px;`}\n &:hover {\n background-color: ${(props) => props.theme.color.grey0};\n }\n\n ${DashedFocusBorder()}\n`;\n\nexport const Flex = styled.div<{ direction: 'row' | 'column'; gap?: number }>`\n display: flex;\n flex-direction: ${(props) => (props.direction === 'row' ? 'row' : 'column')};\n align-items: ${(props) => (props.direction === 'row' ? 'center' : 'flex-start')};\n justify-content: ${(props) => (props.direction === 'row' ? 'flex-start' : 'center')};\n flex: 1;\n ${(props) => props.gap && `gap:${props.gap}px`}\n`;\n","import React, { useMemo, useState } from 'react';\nimport { FormattedMessage, useIntl } from 'react-intl';\nimport { WidgetDefinitionProps, WidgetKeys, WidgetWrapperProps } from 'jamespot-user-api';\nimport { Widget } from 'jamespot-front-business';\nimport { JRCModalLayoutProps } from 'jamespot-react-components';\nimport { getBuilderWidgets } from '../namespace';\nimport {\n CSSSquareWidget,\n CSSSquareWidgetWrapper,\n CSSWidgetButton,\n CSSWrapTitle,\n CSSWrapWidget,\n CSSWrapWidgetWrapper,\n Flex,\n} from './WidgetList.style';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\nconst JRCModalLayout = commonComponentsRegistry.getLazyComponent('ModalLayout');\nconst JRCModalContent = commonComponentsRegistry.getLazyComponent('ModalContent');\nconst JRCTooltip = commonComponentsRegistry.getLazyComponent('Tooltip');\nconst JRCIconButton = commonComponentsRegistry.getLazyComponent('IconButton');\n\ntype WidgetListMode = 'button' | 'list' | 'gallery' | 'custom' | 'article' | 'comment';\n\n/*\n Widget Builder\n*/\nexport const WidgetList = ({\n mode,\n view,\n children,\n namespace = 'default',\n onChange,\n}: {\n mode?: WidgetListMode;\n view?: string;\n children?: any;\n namespace?: string;\n onChange: (widget: WidgetWrapperProps) => void;\n}) => {\n const [isOpen, setOpen] = useState<boolean>(false);\n const widgets = getBuilderWidgets(namespace);\n const intl = useIntl();\n\n const args: JRCModalLayoutProps = {\n open: isOpen,\n portalId: 'react-modal',\n variant: 'full-height',\n closeHandler: () => setOpen(false),\n };\n\n const onClick = (name: WidgetKeys) => {\n onChange(Widget.factory(name));\n setOpen(false);\n };\n return (\n <>\n <JRCModalLayout {...args}>\n <JRCModalContent\n onClickIconClose={args.closeHandler}\n buttons={\n mode === 'comment'\n ? [\n {\n children: <FormattedMessage id=\"GLOBAL_Close\" />,\n color: 'cancel',\n clickHandler: () => setOpen(false),\n },\n ]\n : undefined\n }\n title={intl.formatMessage({ id: 'WIDGET_Builder' })}>\n {mode === 'comment' ? (\n <CSSWrapWidgetWrapper column>\n {widgets.map((widget, index) => (\n <CSSWrapWidget\n key={widget.name}\n open={true}\n full\n parentIsColumn\n index={index}\n onClick={() => onClick(widget.name)}>\n <Flex direction={'row'} gap={12}>\n <img src={widget.img} />\n <Flex direction={'column'}>\n <h3>{intl.formatMessage({ id: widget.label })}</h3>\n <p>{intl.formatMessage({ id: widget.description })}</p>\n </Flex>\n </Flex>\n </CSSWrapWidget>\n ))}\n </CSSWrapWidgetWrapper>\n ) : (\n <CSSSquareWidgetWrapper>\n {widgets.map((widget, index: number) => {\n return (\n <CSSSquareWidget\n key={index}\n onClick={() => onClick(widget.name)}\n available={widget.available}>\n <img src={widget.img} />\n <div className=\"show-on-hover\">{intl.formatMessage({ id: widget.label })}</div>\n </CSSSquareWidget>\n );\n })}\n </CSSSquareWidgetWrapper>\n )}\n </JRCModalContent>\n </JRCModalLayout>\n {mode === 'custom' && children ? <div onClick={() => setOpen(true)}>{children}</div> : <></>}\n {mode === 'button' && view === 'edit' ? (\n <JRCButton onClick={() => setOpen(true)} variant={'outlined'} minWidth={'100%'}>\n {intl.formatMessage({ id: 'WIDGET_Add_Widget' })}\n </JRCButton>\n ) : (\n <></>\n )}\n {mode === 'gallery' && view === 'edit' ? (\n <CSSSquareWidgetWrapper>\n {widgets.map((widget, index: number) => {\n return (\n <CSSSquareWidget\n key={index}\n onClick={() => onClick(widget.name)}\n available={widget.available}>\n <img src={widget.img} />\n <div className=\"show-on-hover\">{intl.formatMessage({ id: widget.label })}</div>\n </CSSSquareWidget>\n );\n })}\n </CSSSquareWidgetWrapper>\n ) : (\n <></>\n )}\n {mode === 'article' && view === 'edit' ? <WidgetModeArticle widgets={widgets} onClick={onClick} /> : <></>}\n {mode === 'comment' && view === 'edit' ? (\n <WidgetModeComment\n onClick={() => {\n setOpen(true);\n }}\n />\n ) : (\n <></>\n )}\n </>\n );\n};\n\nconst HEIGHT_CLOSED = 50;\nconst HEIGHT = 80;\nconst MARGIN_BOTTOM = 10;\n\nconst WidgetModeArticle = ({\n widgets,\n onClick,\n}: {\n widgets: WidgetDefinitionProps[];\n onClick: (name: WidgetKeys) => void;\n}) => {\n const [open, isOpen] = useState(false);\n const intl = useIntl();\n\n const calcHeight = useMemo(() => {\n return Math.ceil(widgets.length / 2) * HEIGHT + HEIGHT_CLOSED + MARGIN_BOTTOM;\n }, [widgets]);\n\n return (\n <>\n <CSSWidgetButton open={open} height={calcHeight}>\n <CSSWrapTitle onClick={() => isOpen(!open)}>\n {intl.formatMessage({ id: 'WIDGET_Add_Widget' })}\n </CSSWrapTitle>\n <CSSWrapWidgetWrapper>\n {widgets.map((widget, index) => {\n return (\n <CSSWrapWidget\n key={widget.name}\n open={open}\n index={index}\n onClick={() => onClick(widget.name)}>\n <img src={widget.img} />\n {intl.formatMessage({ id: widget.label })}\n </CSSWrapWidget>\n );\n })}\n </CSSWrapWidgetWrapper>\n </CSSWidgetButton>\n </>\n );\n};\n\nconst WidgetModeComment = ({ onClick }: { onClick: () => void }) => {\n const intl = useIntl();\n return (\n <>\n <JRCTooltip description={intl.formatMessage({ id: 'COMMENT_Add_Widget' })}>\n <JRCIconButton\n bg={'grey1'}\n bgHover={'grey2'}\n color={'grey5'}\n iconSize={22}\n onClick={() => {\n onClick();\n }}\n icon={'icon-fs-puzzle'}\n />\n </JRCTooltip>\n </>\n );\n};\n","import { Widget } from 'jamespot-front-business';\nimport { WidgetDefinitionProps, WidgetsName } from 'jamespot-user-api';\n\nexport function getBuilderWidgets(namespace: string): WidgetDefinitionProps[] {\n switch (namespace) {\n case 'widget-article-image':\n return [Widget.definition(WidgetsName.ArticleTitle), Widget.definition(WidgetsName.ArticleButton)];\n case 'comment':\n return [\n Widget.definition(WidgetsName.CheckList),\n Widget.definition(WidgetsName.Presence),\n Widget.definition(WidgetsName.QuickSurvey),\n ];\n default:\n return [\n Widget.definition(WidgetsName.ArticleTitle),\n Widget.definition(WidgetsName.ArticleText),\n Widget.definition(WidgetsName.ArticleImage),\n Widget.definition(WidgetsName.ArticleButton),\n Widget.definition(WidgetsName.ArticleSlider),\n Widget.definition(WidgetsName.ArticleAttachment),\n Widget.definition(WidgetsName.Presence),\n ];\n }\n}\n","import { useMemo, useState } from 'react';\r\nimport { Editor, JTinyMCEExtensionsBuilders } from 'jamespot-react-components';\r\nimport { useIntl } from 'react-intl';\r\n\r\nexport const useMarkdownModal = (): {\r\n open: boolean;\r\n onInsert: (v: string) => void;\r\n close: () => void;\r\n ext: ReturnType<typeof JTinyMCEExtensionsBuilders.markdown>;\r\n isActive?: boolean;\r\n} => {\r\n const intl = useIntl();\r\n const [open, setOpen] = useState(false);\r\n const [editor, setEditor] = useState<Editor>();\r\n const ext = useMemo(\r\n () =>\r\n JTinyMCEExtensionsBuilders.markdown((ed) => {\r\n setEditor(ed);\r\n setOpen(true);\r\n }, intl),\r\n [intl],\r\n );\r\n return {\r\n open,\r\n onInsert: (v: string) => {\r\n editor?.execCommand('InsertHTML', false, v);\r\n },\r\n close: () => setOpen(false),\r\n ext,\r\n isActive: true,\r\n };\r\n};\r\n","import React, { ReactNode, useEffect, useRef, useState } from 'react';\nimport { jFileLittle } from 'jamespot-user-api';\nimport { Widget } from 'jamespot-front-business';\nimport styled from 'styled-components';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppSelector } from '../../../redux/store';\n\nconst JRCInputFileAdvancedRaw = commonComponentsRegistry.getLazyComponent('InputFileAdvancedRaw');\n\nexport const CSSHidden = styled.div`\n width: 0;\n height: 0;\n overflow: hidden;\n`;\n\ntype InplaceUploaderProps = {\n children: ReactNode;\n initialFiles: jFileLittle[];\n initialClick?: boolean;\n multiple: boolean;\n accept: string;\n onUploadStart: () => void;\n onUploadEnd: () => void;\n onUploadSuccess: (files: jFileLittle[]) => void;\n};\n\nexport const WidgetUploader = ({\n children,\n initialFiles,\n initialClick,\n multiple,\n accept,\n onUploadStart,\n onUploadEnd,\n onUploadSuccess,\n}: InplaceUploaderProps) => {\n const uploadRef = useRef<HTMLInputElement>(null);\n const token = useAppSelector(Widget.selectors.selectToken);\n const [total, setTotal] = useState<number>(0);\n const [files, setFiles] = useState<jFileLittle[]>(initialFiles);\n\n useEffect(() => {\n if (initialClick) {\n uploadRef.current?.click();\n }\n }, [initialClick]);\n\n useEffect(() => {\n if (initialFiles.length !== files.length) {\n setFiles(initialFiles);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialFiles]);\n\n useEffect(() => {\n onUploadSuccess(files);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [files]);\n\n useEffect(() => {\n if (total === 0) {\n onUploadEnd();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [total]);\n\n return (\n <>\n <div\n onClick={() => {\n if (initialClick) {\n uploadRef.current?.click();\n }\n }}>\n {children}\n </div>\n <CSSHidden>\n <JRCInputFileAdvancedRaw\n ref={uploadRef}\n id=\"widget-upload-file\"\n name=\"editorFiles\"\n content={''}\n accept={accept as any}\n multiple={multiple}\n token={token}\n onUploadStart={(totalFile) => {\n if (totalFile !== undefined) {\n setTotal((prevTotal) => prevTotal + totalFile);\n }\n if (typeof onUploadStart === 'function' && totalFile !== 0) {\n onUploadStart();\n }\n }}\n onUploadSuccess={(fileResponse) => {\n if (fileResponse === undefined) {\n return;\n }\n setTotal((prevTotal) => (prevTotal !== undefined ? prevTotal - 1 : 0));\n setFiles((prevFiles) => (multiple ? [...prevFiles, fileResponse] : [fileResponse]));\n }}\n />\n </CSSHidden>\n </>\n );\n};\n","import React, { useEffect } from 'react';\nimport styled from 'styled-components';\nimport { shallowEqual } from 'react-redux';\nimport { useIntl } from 'react-intl';\nimport jamespot, {\n jFileLittle,\n WidgetArticleAttachmentType,\n WidgetDisplayMode,\n WidgetArticleAttachmentContent,\n resolveFilePath,\n} from 'jamespot-user-api';\nimport { Application, Toast, Widget, updateWidgetContent } from 'jamespot-front-business';\nimport { JRCFileViewerOpenWithOptionsType } from 'jamespot-react-components';\nimport { WidgetUploader } from '../components/WidgetUploader';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst WidgetAttachment = commonComponentsRegistry.getLazyComponent('WidgetAttachment');\nconst JRCWidgetEmptyInplace = commonComponentsRegistry.getLazyComponent('WidgetEmptyInplace');\nconst FileViewer = commonComponentsRegistry.getLazyComponent('FileViewer');\n\n// DUPLICATE FROM WEDOC\nexport const wedocWindowOpen = (idFile: number, hash: string, target?: '_blank') => {\n window.open(getWedocFilePath(idFile, hash), target);\n};\n\n// DUPLICATE FROM WEDOC\nexport function getWedocFilePath(idFile: number, hash: string) {\n return `/ng/rr/file/${idFile}/${hash}`;\n}\n\nexport const CSSWrapper = styled.div`\n flex: 1;\n`;\n\nexport const JRCWidgetArticleAttachmentWrapper = ({\n widget,\n inplace,\n mode,\n}: {\n widget: WidgetArticleAttachmentType;\n inplace?: boolean;\n mode?: WidgetDisplayMode;\n}) => {\n const intl = useIntl();\n const { uniqid } = widget;\n const { files } = widget.content;\n const dispatch = useAppDispatch();\n const isActive = useAppSelector((state) => Widget.selectors.isActive(state, uniqid), shallowEqual);\n\n const onError = (message?: string) => {\n dispatch(Toast.actions.error({ label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\n };\n\n useEffect(() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, mounted: true }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n dispatch(\n Widget.slice.actions.setWidgetState({\n uniqid,\n empty: !files || files.length === 0,\n }),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [files]);\n\n const weDoc = useAppSelector((state) => Application.selectors.selectById(state, 'WeDocHook'));\n\n const onClick = (file: jFileLittle | undefined) => {\n if (!file) {\n return;\n }\n jamespot.object\n .getAccessHash(`fileArticle/${file.id}`)\n .then((response) => {\n if (response.result === '') {\n throw new Error('result empty');\n }\n const hash = response.result;\n wedocWindowOpen(file.id, hash);\n })\n .catch(() => {\n dispatch(Toast.actions.error({ label: 'WIDGET_Open_Failed' }, 6000));\n });\n };\n\n const option = [\n {\n label: intl.formatMessage({ id: 'WIDGET_Open_With_Wedoc' }),\n onClick: onClick,\n },\n ];\n\n const openWithOptions: JRCFileViewerOpenWithOptionsType = weDoc\n ? [\n {\n condition: (f) =>\n [\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n ].includes(f.mimetype),\n options: option,\n },\n ]\n : [];\n\n return files !== undefined ? (\n <CSSWrapper>\n {mode !== 'view' ? (\n <WidgetAttachment files={files} onClick={() => undefined} onError={onError} />\n ) : (\n <FileViewer files={files} openWithOptions={openWithOptions}>\n {(open) => {\n return (\n <WidgetAttachment\n files={files.map((f) => ({\n ...f,\n uri: resolveFilePath(f),\n }))}\n onClick={(idFile) => open(idFile)}\n onError={onError}\n />\n );\n }}\n </FileViewer>\n )}\n {inplace && mode !== 'view' && (\n <WidgetUploader\n initialFiles={files}\n initialClick={isActive}\n multiple={true}\n accept={'*'}\n onUploadSuccess={(files) => {\n if (Array.isArray(files)) {\n dispatch(\n updateWidgetContent<WidgetArticleAttachmentContent>(uniqid, {\n files: files.map((f) => ({\n ...f,\n uri: resolveFilePath(f) ?? '',\n })),\n }),\n );\n }\n }}\n onUploadStart={() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: true }));\n }}\n onUploadEnd={() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: false }));\n }}>\n {mode === 'edit' ? (\n <JRCWidgetEmptyInplace\n label={'WIDGET_Article_Attachment_Empty_Label'}\n description={'WIDGET_Article_Attachment_Empty_Description'}\n url={'widget-article-image-placeholder.png'}\n onClick={() => undefined}\n />\n ) : (\n <></>\n )}\n </WidgetUploader>\n )}\n </CSSWrapper>\n ) : (\n <></>\n );\n};\n","import React, { useEffect } from 'react';\nimport styled from 'styled-components';\nimport { WidgetArticleButtonType, WidgetDisplayMode } from 'jamespot-user-api';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch } from '../../../redux/store';\n\nconst JRCWidgetButton = commonComponentsRegistry.getLazyComponent('WidgetButton');\n\nconst CSSButtonWrapper = styled.div`\n display: flex;\n flex: 1;\n justify-content: center;\n align-items: center;\n`;\n\nconst CSSPointer = styled.div<{ clickable: boolean }>`\n pointer-events: ${(props) => (props.clickable ? 'all' : 'none')};\n cursor: pointer;\n display: flex;\n flex: 1;\n justify-content: center;\n align-items: center;\n`;\n\nexport const JRCWidgetArticleButtonWrapper = ({\n widget,\n mode,\n}: {\n widget: WidgetArticleButtonType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n}) => {\n const dispatch = useAppDispatch();\n const { uniqid } = widget;\n const { text, url, target, color, backgroundColor, buttonSize, borderRadius, variant } = widget.content;\n\n useEffect(() => {\n dispatch(\n Widget.slice.actions.setWidgetState({\n uniqid,\n empty: !text || text.length === 0,\n }),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [text]);\n\n return (\n <CSSButtonWrapper\n onClick={() => {\n if (mode === 'edit') {\n dispatch(WidgetEditor.slice.actions.registerEditor({ uniqid, name: widget.name }));\n }\n }}>\n <CSSPointer clickable={mode !== 'edit'}>\n <JRCWidgetButton\n text={text}\n url={url}\n target={target}\n color={color}\n backgroundColor={backgroundColor}\n buttonSize={buttonSize}\n borderRadius={borderRadius}\n variant={variant}\n />\n </CSSPointer>\n </CSSButtonWrapper>\n );\n};\n","import React, { useEffect } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport styled from 'styled-components';\nimport { WidgetArticleGalleryContent, WidgetArticleGalleryType, WidgetDisplayMode } from 'jamespot-user-api';\nimport { Widget, updateWidgetContent } from 'jamespot-front-business';\nimport { WidgetUploader } from '../components/WidgetUploader';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst JRCWidgetArticleGallery = commonComponentsRegistry.getLazyComponent('WidgetArticleGallery');\nconst JRCWidgetEmptyInplace = commonComponentsRegistry.getLazyComponent('WidgetEmptyInplace');\nconst FileViewer = commonComponentsRegistry.getLazyComponent('FileViewer');\n\nconst CSSImagePointer = styled.button`\n cursor: pointer;\n`;\n\nexport const JRCWidgetArticleGalleryWrapper = ({\n widget,\n inplace,\n mode,\n}: {\n widget: WidgetArticleGalleryType;\n inplace?: boolean;\n mode?: WidgetDisplayMode;\n}) => {\n const { uniqid } = widget;\n const { files } = widget.content;\n const dispatch = useAppDispatch();\n const isActive = useAppSelector((state) => Widget.selectors.isActive(state, uniqid), shallowEqual);\n\n useEffect(() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, mounted: true }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return files !== undefined ? (\n <>\n {mode === 'edit' ? (\n <JRCWidgetArticleGallery\n files={files}\n maxWidth={800}\n gap={widget.content.gap ?? '10'}\n column={widget.content.column ?? '3'}\n onClick={() => undefined}\n />\n ) : (\n <FileViewer files={files} openWithOptions={[]}>\n {(open) => {\n return (\n <CSSImagePointer>\n <JRCWidgetArticleGallery\n files={files}\n maxWidth={600}\n gap={widget.content.gap ?? '10'}\n column={widget.content.column ?? '3'}\n onClick={(idFile) => open(idFile)}\n />\n </CSSImagePointer>\n );\n }}\n </FileViewer>\n )}\n {inplace && mode === 'edit' ? (\n <WidgetUploader\n initialFiles={files}\n initialClick={isActive}\n accept={'image/png, image/jpeg, image/jpg'}\n multiple={true}\n onUploadSuccess={(files) => {\n if (Array.isArray(files)) {\n dispatch(updateWidgetContent<WidgetArticleGalleryContent>(uniqid, { files }));\n }\n }}\n onUploadStart={() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: true }));\n }}\n onUploadEnd={() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: false }));\n }}>\n <JRCWidgetEmptyInplace\n label={'WIDGET_Article_Gallery_Empty_Label'}\n description={'WIDGET_Article_Gallery_Empty_Description'}\n url={'widget-article-image-placeholder.png'}\n onClick={() => undefined}\n />\n </WidgetUploader>\n ) : (\n <></>\n )}\n </>\n ) : (\n <></>\n );\n};\n","import React, { useMemo } from 'react';\nimport { Widget } from 'jamespot-front-business';\n\nimport { shallowEqual } from 'react-redux';\nimport { useAppSelector } from '../../../../redux/store';\nimport styled from 'styled-components';\n\nexport const UIWrapper = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\nexport const WidgetStylePadding = ({ uniqid, children }: { uniqid: string; children: React.ReactNode }) => {\n const styles = useAppSelector((state) => Widget.selectors.selectWidgetWrapperStyle(state, uniqid), shallowEqual);\n\n const initialValues = useMemo(() => {\n return {\n padding: styles && styles['padding'] ? `${styles['padding']}px` : '0px',\n };\n }, [styles]);\n\n return <UIWrapper style={{ padding: initialValues.padding }}>{children}</UIWrapper>;\n};\n","import React from 'react';\nimport styled from 'styled-components';\n\nexport const UIFlex = styled.div`\n flex-direction: column;\n display: flex;\n flex: 1;\n`;\n\nexport const UIScrollWrapper = styled.div`\n position: relative;\n display: flex;\n flex: 1;\n`;\n\nexport const UIScroll = styled.div`\n overflow: auto;\n position: absolute;\n inset: 0;\n`;\n\n// TODO: BETTER NAMING ?\nexport const WidgetScroll = ({\n header,\n scrollable,\n footer,\n}: {\n header?: () => React.ReactNode;\n scrollable?: () => React.ReactNode;\n footer?: () => React.ReactNode;\n}) => {\n return (\n <UIFlex>\n {header && header()}\n <UIScrollWrapper>\n <UIScroll>{scrollable && scrollable()}</UIScroll>\n </UIScrollWrapper>\n {footer && footer()}\n </UIFlex>\n );\n};\n","import React from 'react';\n\nimport { Widget } from 'jamespot-front-business';\n\nimport { shallowEqual } from 'react-redux';\nimport { useAppSelector } from '../../../../redux/store';\nimport styled from 'styled-components';\n\nexport const CSSWidgetTitle = styled.div`\n padding: ${(props) => props.theme.space.md}px;\n padding-right: 0px;\n`;\n\nexport const UITitle = styled.div<{ fontSize: string; fontWeight: string; textAlign: string; color: string }>`\n text-align: ${(props) => props.textAlign};\n font-size: ${(props) => props.fontSize}px;\n font-weight: ${(props) => props.fontWeight};\n color: ${(props) => props.color};\n`;\n\nexport const WidgetIntranetTitle = ({\n uniqid,\n textAlign = 'left',\n fontSize = '16',\n fontWeight = 'medium',\n color,\n}: {\n uniqid: string;\n textAlign: string;\n fontSize: string;\n fontWeight: string;\n color: string;\n}) => {\n const widgetWrapper = useAppSelector((state) => Widget.selectors.selectWidget(state, uniqid), shallowEqual);\n return (\n <>\n {widgetWrapper && typeof widgetWrapper.title === 'string' && widgetWrapper.title.length !== 0 && (\n <CSSWidgetTitle>\n <UITitle textAlign={textAlign} fontSize={fontSize} fontWeight={fontWeight} color={color}>\n {widgetWrapper.title}\n </UITitle>\n </CSSWidgetTitle>\n )}\n </>\n );\n};\n","import { Widget } from 'jamespot-front-business';\nimport React, { useMemo } from 'react';\nimport { shallowEqual } from 'react-redux';\n\nimport styled, { useTheme } from 'styled-components';\nimport { useAppSelector } from '../../../../redux/store';\nimport { WidgetIntranetTitle } from './WidgetIntranetTitle';\n\nexport const UIHeaderWrapper = styled.div<{ backroundColor: string }>`\n background-color: ${(props) => props.backroundColor};\n`;\n\nexport const UIHeader = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n`;\n\nexport const UICount = styled.div`\n padding: ${(props) => props.theme.space.sm}px ${(props) => props.theme.space.md}px;\n color: ${(props) => props.theme.color.grey4};\n`;\n\nexport const UIHeaderFlex = styled.div`\n flex: 1;\n display: flex;\n flex-direction: row;\n gap: ${(props) => props.theme.space.xs}px;\n align-items: center;\n`;\n\nexport const WidgetHeader = ({\n uniqid,\n dropdown,\n subHeader,\n}: {\n uniqid: string;\n dropdown?: () => React.ReactNode;\n subHeader?: (color: string) => React.ReactNode;\n}) => {\n const theme = useTheme();\n const styles = useAppSelector((state) => Widget.selectors.selectWidgetTitleStyle(state, uniqid), shallowEqual);\n\n const styleValues = useMemo(() => {\n return {\n color: styles && styles['color'] ? String(styles['color']) : theme.color.black,\n backgroundColor: styles && styles['background-color'] ? String(styles['background-color']) : 'transparent',\n fontSize: styles && styles['font-size'] ? String(styles['font-size']) : '16',\n fontWeight: styles && styles['font-weight'] ? String(styles['font-weight']) : 'medium',\n textAlign: styles && styles['text-align'] ? String(styles['text-align']) : 'left',\n };\n }, [styles, theme]);\n\n return (\n <UIHeaderWrapper backroundColor={styleValues.backgroundColor}>\n <UIHeader>\n <UIHeaderFlex>\n <WidgetIntranetTitle\n uniqid={uniqid}\n fontWeight={styleValues.fontWeight}\n fontSize={styleValues.fontSize}\n textAlign={styleValues.textAlign}\n color={styleValues.color}\n />\n {subHeader && subHeader(styleValues.color)}\n </UIHeaderFlex>\n {dropdown && dropdown()}\n </UIHeader>\n </UIHeaderWrapper>\n );\n};\n","import React, { useEffect, useMemo, useState } from 'react';\n\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport jamespot, { WidgetLuccaAbsenceUser } from 'jamespot-user-api';\nimport { JRCLoader } from 'jamespot-react-components';\nimport { FormattedMessage } from 'react-intl';\n\nimport styled from 'styled-components';\nimport { WidgetStylePadding } from './components/WidgetStylePadding';\nimport { WidgetScroll } from './components/WidgetScroll';\nimport { WidgetHeader } from './components/WidgetHeader';\nimport { useAbortController } from '../../../hooks';\n\nexport const UIOverlay = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nconst WidgetLuccaAbsence = commonComponentsRegistry.getLazyComponent('WidgetLuccaAbsence');\n\nexport const JRCWidgetLuccaAbsenceWrapper = ({ uniqid }: { uniqid: string }) => {\n const [list, setList] = useState<WidgetLuccaAbsenceUser[]>([]);\n const [error, setError] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n\n const abortController = useAbortController();\n\n const today = useMemo(() => {\n return (\n new Date().getFullYear() +\n '-' +\n (new Date().getMonth() + 1).toString().padStart(2, '0') +\n '-' +\n new Date().getDate().toString().padStart(2, '0') +\n ' 00:00:00'\n );\n }, []);\n\n useEffect(() => {\n jamespot.lucca\n .getAbsence({ date: today }, { signal: abortController.signal })\n .then(({ result }) => setList(result))\n .catch(() => {\n if (!abortController.signal.aborted) {\n setError(true);\n }\n })\n .finally(() => setIsLoading(false));\n }, [today, abortController.signal]);\n\n if (isLoading) {\n return (\n <UIOverlay>\n <JRCLoader size={'m'} />\n </UIOverlay>\n );\n }\n\n if (error) {\n return (\n <UIOverlay>\n <FormattedMessage id={'WIDGET_Lucca_Absence_Url_Error'} />\n </UIOverlay>\n );\n }\n\n return (\n <WidgetScroll\n header={() => {\n return <WidgetHeader uniqid={uniqid} />;\n }}\n scrollable={() => {\n return (\n <WidgetStylePadding uniqid={uniqid}>\n <WidgetLuccaAbsence list={list} />\n </WidgetStylePadding>\n );\n }}\n />\n );\n};\n","import React, { useEffect, useState } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport {\n WidgetArticleImageContent,\n WidgetArticleImageType,\n WidgetDisplayMode,\n formatImgUrl,\n jFileLittle,\n} from 'jamespot-user-api';\nimport { useIntl } from 'react-intl';\nimport { Widget, updateWidgetContent } from 'jamespot-front-business';\nimport { WidgetUploader } from '../components/WidgetUploader';\n\nconst WidgetImage = commonComponentsRegistry.getLazyComponent('WidgetImage');\nconst FileViewer = commonComponentsRegistry.getLazyComponent('FileViewer');\nconst JRCWidgetEmptyInplace = commonComponentsRegistry.getLazyComponent('WidgetEmptyInplace');\n\nimport styled from 'styled-components';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst CSSImageWrapperHover = styled.div`\n position: absolute;\n inset: 0;\n background-color: rgba(0, 0, 0, 0.4);\n pointer-events: none;\n display: flex;\n justify-content: center;\n align-items: center;\n opacity: 0;\n color: ${(props) => props.theme.color.white};\n &:hover {\n opacity: 1;\n }\n`;\n\nconst CSSImagePointer = styled.button`\n cursor: pointer;\n`;\n\nconst mockFileLittle: jFileLittle = {\n id: 0,\n type: '',\n title: '',\n uri: '',\n mimetype: 'application/octet-stream',\n mainType: '',\n dateCreation: '',\n dateModified: '',\n _url: '',\n size: 10,\n};\n\nexport const strToTimestamp = (str: string): undefined | number => {\n if (str) {\n const timestamp = Date.parse(str);\n if (!isNaN(timestamp)) {\n return new Date(timestamp).getTime() / 1000;\n }\n }\n return;\n};\n\nexport const JRCWidgetArticleImageWrapper = ({\n widget,\n width,\n inplace,\n mode,\n}: {\n widget: WidgetArticleImageType;\n inplace?: boolean;\n mode?: WidgetDisplayMode;\n width?: number;\n}) => {\n const { uniqid } = widget;\n const { file, useFilter } = widget.content;\n const dispatch = useAppDispatch();\n const isActive = useAppSelector((state) => Widget.selectors.isActive(state, uniqid), shallowEqual);\n const [uri, setUri] = useState<string | undefined>(undefined);\n const intl = useIntl();\n\n useEffect(() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, mounted: true }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, empty: !file }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [file]);\n\n useEffect(() => {\n if (file) {\n setUri(\n formatImgUrl({\n timestamp: file.dateModified ? strToTimestamp(file.dateModified) : Date.now(),\n from: 'imagecache',\n size: 'fitx1200',\n uri: file.uri,\n }),\n );\n }\n }, [file]);\n\n return (\n <>\n {mode !== 'edit' && (\n <FileViewer\n files={[\n {\n ...mockFileLittle,\n ...file,\n path: uri,\n mimetype: 'image/png',\n },\n ]}\n openWithOptions={[]}>\n {(open) => {\n return (\n <CSSImagePointer onClick={() => open(file?.id ?? 0)}>\n <WidgetImage maxWidth={width ?? 600} uri={uri} useFilter={useFilter ?? false} />\n </CSSImagePointer>\n );\n }}\n </FileViewer>\n )}\n\n {mode === 'edit' && (\n <>\n {uri !== undefined && (\n <WidgetImage maxWidth={width ?? 600} uri={uri} useFilter={useFilter ?? false} />\n )}\n {inplace && (\n <WidgetUploader\n initialFiles={[]}\n initialClick={isActive}\n accept={'image/png, image/jpeg, image/jpg'}\n multiple={false}\n onUploadSuccess={(files) => {\n if (Array.isArray(files) && files[0] !== undefined) {\n dispatch(\n updateWidgetContent<WidgetArticleImageContent>(uniqid, { file: files[0] }),\n );\n }\n }}\n onUploadStart={() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: true }));\n }}\n onUploadEnd={() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: false }));\n }}>\n {file !== undefined ? (\n <CSSImageWrapperHover>\n {intl.formatMessage({ id: 'ARTICLE_Widget_Image_Change' })}\n </CSSImageWrapperHover>\n ) : (\n <JRCWidgetEmptyInplace\n label={'WIDGET_Article_Image_Empty_Label'}\n description={'WIDGET_Article_Image_Empty_Description'}\n url={'widget-article-image-placeholder.png'}\n onClick={() => undefined}\n />\n )}\n </WidgetUploader>\n )}\n </>\n )}\n </>\n );\n};\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { WidgetArticleSliderType, WidgetDisplayMode, formatImgUrl, jFileLittle } from 'jamespot-user-api';\nimport styled from 'styled-components';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { shallowEqual } from 'react-redux';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst FileViewer = commonComponentsRegistry.getLazyComponent('FileViewer');\nconst JRCWidgetEmptyInplace = commonComponentsRegistry.getLazyComponent('WidgetEmptyInplace');\nconst JRCWidgetSlider = commonComponentsRegistry.getLazyComponent('WidgetSlider');\n\nconst Wrapper = styled.div<{ maxWidth: number }>`\n flex: 1;\n display: flex;\n flex-direction: row;\n min-height: 60px;\n align-items: center;\n width: ${(props) => props.maxWidth}px;\n`;\n\nconst mockFileLittle: jFileLittle = {\n id: 0,\n type: '',\n title: '',\n uri: '',\n mimetype: 'application/octet-stream',\n mainType: '',\n dateCreation: '',\n dateModified: '',\n _url: '',\n size: 10,\n};\n\nexport const strToTimestamp = (str: string): undefined | number => {\n if (str) {\n const timestamp = Date.parse(str);\n if (!isNaN(timestamp)) {\n return new Date(timestamp).getTime() / 1000;\n }\n }\n return;\n};\n\nexport const JRCWidgetArticleSliderWrapper = ({\n widget,\n mode,\n width,\n}: {\n widget: WidgetArticleSliderType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n width?: number;\n}) => {\n const { uniqid } = widget;\n const dispatch = useAppDispatch();\n const isActive = useAppSelector((state) => Widget.selectors.isActive(state, uniqid), shallowEqual);\n const maxWidth = width ?? 600;\n const [dynamicWidth, setDynamicWidth] = useState<number | undefined>(undefined);\n const ref = useRef<HTMLDivElement>(null);\n const fileViewerFiles = useMemo(\n () =>\n widget.content.slides\n ? [\n ...widget.content.slides.map((slide, index) => {\n return {\n ...mockFileLittle,\n id: slide.file ? slide.file.id : index,\n mimetype: slide.file ? slide.file.mimetype : mockFileLittle.mimetype,\n path:\n slide.file && slide.file.uri\n ? formatImgUrl({\n size: 'fitx1200',\n uri: slide.file.uri,\n from: 'imagecache',\n timestamp:\n slide.file && slide.file.dateModified\n ? strToTimestamp(slide.file.dateModified)\n : Date.now(),\n })\n : '',\n };\n }),\n ]\n : [],\n [widget.content.slides],\n );\n\n const slides = useMemo(\n () =>\n widget.content.slides !== undefined\n ? [\n ...widget.content.slides.map((slide) => {\n if (slide.file) {\n return {\n ...slide,\n uri: formatImgUrl({\n timestamp: slide.file.dateModified\n ? strToTimestamp(slide.file.dateModified)\n : Date.now(),\n size: `fitx${dynamicWidth && dynamicWidth < maxWidth ? dynamicWidth : maxWidth}`,\n from: 'imagecache',\n uri: slide.file.uri,\n }),\n };\n } else {\n return {\n ...slide,\n uri: '',\n };\n }\n }),\n ]\n : [],\n [widget.content.slides, dynamicWidth, maxWidth],\n );\n\n useEffect(() => {\n if (isActive && mode === 'edit') {\n dispatch(WidgetEditor.slice.actions.registerEditor({ uniqid, name: widget.name }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isActive]);\n\n useEffect(() => {\n const handleResize = () => {\n if (ref.current) {\n setDynamicWidth(ref.current ? ref.current.offsetWidth : maxWidth);\n }\n };\n window.addEventListener('resize', handleResize);\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ref]);\n\n useEffect(() => {\n setDynamicWidth(ref.current ? ref.current.offsetWidth : maxWidth);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ref]);\n\n useEffect(() => {\n dispatch(\n Widget.slice.actions.setWidgetState({\n uniqid,\n empty: !widget.content.slides || widget.content.slides.length === 0,\n }),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [widget.content.slides]);\n\n const isEditable = useMemo(\n () => mode === 'edit' && Array.isArray(widget.content.slides) && widget.content.slides.length === 0,\n [widget.content.slides, mode],\n );\n\n const handleEditor = useCallback(() => {\n dispatch(\n WidgetEditor.slice.actions.registerEditor({\n uniqid: widget.uniqid,\n name: widget.name,\n }),\n );\n }, [dispatch, widget.uniqid, widget.name]);\n\n /** small hack to catch the real width of the div */\n if (dynamicWidth === undefined) {\n return <div ref={ref} style={{ width: '100%' }}></div>;\n }\n\n return (\n <Wrapper maxWidth={dynamicWidth && dynamicWidth < maxWidth ? dynamicWidth : maxWidth}>\n <FileViewer files={fileViewerFiles} openWithOptions={[]}>\n {(open) => {\n return (\n <JRCWidgetSlider\n slides={slides}\n maxWidth={dynamicWidth && dynamicWidth < maxWidth ? dynamicWidth : maxWidth}\n useDots={widget.content.useDots ?? true}\n loop={widget.content.loop ?? false}\n startAt={0}\n onClickSlide={(index) => {\n if (mode !== 'edit') {\n if (widget.content.slides) {\n const slide = widget.content.slides[index];\n if (slide && slide.file) {\n open(slide.file.id);\n }\n }\n } else {\n dispatch(WidgetEditor.slice.actions.registerEditor({ uniqid, name: widget.name }));\n }\n }}\n />\n );\n }}\n </FileViewer>\n {isEditable ? (\n <JRCWidgetEmptyInplace\n label={'WIDGET_Article_Slider_Empty_Label'}\n description={'WIDGET_Article_Slider_Empty_Description'}\n url={'widget-article-image-placeholder.png'}\n onClick={handleEditor}\n />\n ) : (\n <></>\n )}\n </Wrapper>\n );\n};\n","import React, { useCallback, useState } from 'react';\r\nimport { FormattedMessage, useIntl } from 'react-intl';\r\nimport { marked } from 'marked';\r\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\r\n\r\nconst InputTextareaRaw = commonComponentsRegistry.getLazyComponent('InputTextareaRaw');\r\nconst Modal = commonComponentsRegistry.getLazyComponent('Modal');\r\n\r\nexport type MarkdownModalProps = {\r\n onInsert: (html: string) => void;\r\n open: boolean;\r\n close: () => void;\r\n};\r\n\r\nexport const MarkdownModal = ({ onInsert, open, close }: MarkdownModalProps) => {\r\n const intl = useIntl();\r\n const [markdown, setMarkdown] = useState('');\r\n\r\n const doClose = useCallback(() => {\r\n setMarkdown('');\r\n close();\r\n }, [close]);\r\n\r\n return (\r\n <Modal\r\n title={intl.formatMessage({ id: 'TINY_MCE_Insert_Markdown' })}\r\n open={open}\r\n closeHandler={doClose}\r\n enableClickAwayCloseModal\r\n buttons={[\r\n {\r\n children: <FormattedMessage id=\"GLOBAL_Cancel\" />,\r\n color: 'cancel',\r\n clickHandler: doClose,\r\n },\r\n {\r\n children: <FormattedMessage id=\"GLOBAL_Insert\" />,\r\n color: 'valid',\r\n disabled: !markdown,\r\n clickHandler: () => {\r\n onInsert(marked.parse(markdown, { async: false }).replace(/<br>/g, '<br><br>'));\r\n doClose();\r\n },\r\n },\r\n ]}>\r\n <InputTextareaRaw value={markdown} onChange={(e) => setMarkdown(e.target.value)} height={'400px'} />\r\n </Modal>\r\n );\r\n};\r\n","import { Model, TinyMCE, Toast, Widget, updateWidgetContent } from 'jamespot-front-business';\nimport { WidgetArticleTextContent, WidgetArticleTextType, WidgetDisplayMode } from 'jamespot-user-api';\nimport React, { useCallback, useEffect, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport { shallowEqual } from 'react-redux';\nimport styled, { useTheme } from 'styled-components';\n\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { getTinyMCEMentionsQueries } from '../../../utils/tinymce';\nimport { useMarkdownModal } from '../../../hooks/useMarkdownModal';\nimport { MarkdownModal } from '../../tinymce/extension/MarkdownModal';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst WidgetArticleText = commonComponentsRegistry.getLazyComponent('WidgetArticleText');\n\nconst CSSTextWrapper = styled.div`\n width: 100%;\n cursor: text;\n\n p {\n word-wrap: break-word;\n }\n\n a {\n word-wrap: break-word;\n }\n`;\n\nexport const JRCWidgetArticleTextWrapper = ({\n widget,\n mode,\n}: {\n widget: WidgetArticleTextType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n}) => {\n const { uniqid } = widget;\n const theme = useTheme();\n const { text } = widget.content;\n const dispatch = useAppDispatch();\n const isActive = useAppSelector((state) => Widget.selectors.isActive(state, uniqid), shallowEqual);\n const isBusy = useAppSelector((state) => Widget.selectors.selectWidgetState(state, uniqid)?.busy);\n const token = useAppSelector(Widget.selectors.selectToken);\n const tinyMCECommonOptions = useAppSelector(TinyMCE.selectors.selectTinyMCECommonOptions);\n const models = useAppSelector(Model.selectors.selectAll);\n\n const intl = useIntl();\n\n const {\n open,\n onInsert,\n close: closeMarkdownModal,\n ext: extMarkdown,\n isActive: isMarkdownActive,\n } = useMarkdownModal();\n\n const onError = useCallback(\n (message?: string) => {\n dispatch(Toast.actions.error({ label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\n },\n [dispatch, intl],\n );\n\n useEffect(() => {\n dispatch(\n Widget.slice.actions.setWidgetState({\n uniqid,\n empty: !text || text.length === 0,\n }),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [text]);\n\n const tinyMentionsQueries = useMemo(() => {\n return getTinyMCEMentionsQueries(models, theme, onError);\n }, [models, onError, theme]);\n\n // small hack to hide and redraw tinymce to avoid initialization issue\n if (isBusy) {\n return <></>;\n }\n return (\n <CSSTextWrapper>\n <WidgetArticleText\n autoFocus={isActive}\n text={text ?? ''}\n token={mode === 'edit' && token !== undefined ? token : ''}\n tinyMCECommonOptions={\n mode === 'edit' && tinyMCECommonOptions\n ? {\n commonOptions: tinyMCECommonOptions,\n mentionsQueries: tinyMentionsQueries,\n }\n : undefined\n }\n mode={mode}\n onChange={(text) => {\n dispatch(updateWidgetContent<WidgetArticleTextContent>(uniqid, { text }));\n }}\n additionalExtensions={[extMarkdown]}\n />\n {isMarkdownActive && <MarkdownModal onInsert={onInsert} open={open} close={closeMarkdownModal} />}\n </CSSTextWrapper>\n );\n};\n","import React, { useEffect } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { WidgetArticleTitleContent, WidgetArticleTitleType, WidgetDisplayMode } from 'jamespot-user-api';\nimport { Widget, updateWidgetContent } from 'jamespot-front-business';\nimport styled from 'styled-components';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst WidgetArticleTitle = commonComponentsRegistry.getLazyComponent('WidgetArticleTitle');\n\nconst CSSTextWrapper = styled.div`\n flex: 1;\n display: flex;\n flex-direction: row;\n align-items: center;\n cursor: text;\n`;\n\nconst ToolWrapper = styled.div`\n display: flex;\n flex-direction: row;\n border-radius: 8px;\n overflow: hidden;\n margin: 4px;\n border: 1px solid ${(props) => props.theme.color.grey1};\n`;\n\nconst Tool = styled.button<{ isActive: boolean }>`\n display: flex;\n width: 40px;\n height: 40px;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n opacity: ${(props) => (props.isActive ? '1.0' : '.8')};\n background-color: ${(props) => (props.isActive ? props.theme.color.grey1 : props.theme.color.white)};\n &:hover {\n background-color: ${(props) => props.theme.color.grey1};\n }\n`;\n\nexport const JRCWidgetArticleTitleWrapper = ({\n widget,\n inplace,\n mode,\n dataCy,\n}: {\n widget: WidgetArticleTitleType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n dataCy?: string;\n}) => {\n const { uniqid } = widget;\n const { text, color, heading } = widget.content;\n const dispatch = useAppDispatch();\n const isActive = useAppSelector((state) => Widget.selectors.isActive(state, uniqid), shallowEqual);\n\n useEffect(() => {\n dispatch(\n Widget.slice.actions.setWidgetState({\n uniqid,\n empty: !text || text.length === 0,\n }),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [text]);\n\n return (\n <CSSTextWrapper>\n <WidgetArticleTitle\n dataCy={dataCy}\n text={text}\n color={color}\n heading={heading}\n autoFocus={isActive}\n inplace={inplace}\n mode={mode}\n onChange={(text) => {\n dispatch(updateWidgetContent<WidgetArticleTitleContent>(uniqid, { text }));\n }}\n />\n {isActive && mode === 'edit' ? (\n <Toolbar\n heading={heading}\n onClick={(heading) => {\n dispatch(updateWidgetContent<WidgetArticleTitleContent>(uniqid, { heading }));\n }}\n />\n ) : (\n <></>\n )}\n </CSSTextWrapper>\n );\n};\n\nexport const Toolbar = ({ heading = 'h1', onClick }: { heading?: string; onClick: (size: string) => void }) => {\n const sizes: string[] = ['h1', 'h2', 'h3', 'h4'];\n return (\n <ToolWrapper>\n {sizes.map((sizeValue, index: number) => (\n <Tool key={index} isActive={heading === sizeValue} onClick={() => onClick(sizeValue)}>\n {sizeValue}\n </Tool>\n ))}\n </ToolWrapper>\n );\n};\n","import React, { useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport jamespot from 'jamespot-user-api';\nimport styled from 'styled-components';\nimport { Toast, Widget } from 'jamespot-front-business';\nimport { JRCIconButton } from 'jamespot-react-components';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\nimport { useAppDispatch } from '../../../../redux/store';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\nconst JRCModalLayout = commonComponentsRegistry.getLazyComponent('ModalLayout');\nconst JRCModalContent = commonComponentsRegistry.getLazyComponent('ModalContent');\n\nexport const Button = styled.button`\n padding: ${(props) => props.theme.space.md}px;\n`;\n\nexport const Footer = styled.div`\n padding: ${(props) => props.theme.space.md}px;\n display: flex;\n flex-direction: row-reverse;\n`;\n\nexport const WidgetRemove = ({ id, type, uniqid }: { id: number; type: string; uniqid: string }) => {\n const dispatch = useAppDispatch();\n const intl = useIntl();\n const [isOpen, setIsOpen] = useState<boolean>(false);\n\n const handleRemove = () => {\n jamespot.widget\n .removeWidget({ id, type, uniqid })\n .then(() => {\n dispatch(Widget.slice.actions.flushWidget({ uniqid }));\n })\n .catch(() => dispatch(Toast.actions.error({ label: 'WIDGET_Presence_Error' })));\n };\n\n return (\n <>\n <JRCIconButton iconSize={14} onClick={() => setIsOpen(true)} icon=\"icon-trash\" />\n {isOpen && (\n <JRCModalLayout enableClickAwayCloseModal={true} open={isOpen} closeHandler={() => setIsOpen(false)}>\n <JRCModalContent\n overflow={'scroll'}\n title={intl.formatMessage({ id: 'WIDGET_Remove_Widget' })}\n onClickIconClose={() => setIsOpen(false)}>\n {intl.formatMessage({ id: 'WIDGET_Delete_Widget_Confirmation' })}\n </JRCModalContent>\n <Footer>\n <JRCButton label={intl.formatMessage({ id: 'GLOBAL_Confirm' })} onClick={handleRemove} />\n </Footer>\n </JRCModalLayout>\n )}\n </>\n );\n};\n","import React, { useCallback, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport { WidgetsName, ensureWidgetObjectHasMinimumProperties, Rights, WidgetDisplayMode } from 'jamespot-user-api';\n\nimport { shallowEqual } from 'react-redux';\n\nimport styled from 'styled-components';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { WidgetRemove } from './WidgetRemove';\nimport { useAppDispatch, useAppSelector } from '../../../../redux/store';\n\nexport const Footer = styled.div`\n display: flex;\n flex: 1;\n flex-direction: row;\n border-top: 1px solid ${(props) => props.theme.color.grey1};\n`;\n\nexport const Button = styled.button`\n display: flex;\n flex: 1;\n justify-content: center;\n align-items: center;\n background-color: ${(props) => props.theme.color.white};\n &:hover {\n background-color: ${(props) => props.theme.color.grey0};\n }\n`;\n\nexport const WidgetFooterView = ({\n name,\n uniqid,\n mode,\n collaborationRights,\n handleOpenEditor,\n}: {\n name: WidgetsName;\n uniqid: string;\n mode?: WidgetDisplayMode;\n collaborationRights?: Pick<Rights, 'update'>;\n handleOpenEditor?: () => void;\n}) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const widgetObject = useAppSelector((state) => Widget.selectors.selectWidgetObject(state, uniqid), shallowEqual);\n const widgetObjectRights = useAppSelector(\n (state) => Widget.selectors.selectWidgetObjectRights(state, uniqid),\n shallowEqual,\n );\n\n const canUpdate = useMemo(\n () =>\n (widgetObject && widgetObjectRights && widgetObjectRights.update) ||\n (collaborationRights && collaborationRights.update),\n [widgetObject, widgetObjectRights, collaborationRights],\n );\n\n const canDelete = useMemo(\n () => widgetObject && widgetObjectRights && widgetObjectRights.delete,\n [widgetObject, widgetObjectRights],\n );\n\n const handleOnClick = useCallback(() => {\n dispatch(\n WidgetEditor.slice.actions.registerEditor({\n uniqid,\n name,\n mode,\n }),\n );\n }, [uniqid, dispatch, name, mode]);\n\n return canUpdate && ensureWidgetObjectHasMinimumProperties(widgetObject) ? (\n <Footer>\n <Button onClick={handleOpenEditor ?? handleOnClick}>\n {intl.formatMessage({ id: 'WIDGET_Set_Widget' })}\n </Button>\n {canDelete && <WidgetRemove id={widgetObject.id} type={widgetObject.type} uniqid={uniqid} />}\n </Footer>\n ) : (\n <></>\n );\n};\n","import { JRCButton, JRCInputText } from 'jamespot-react-components';\nimport React, { useState, useEffect } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\nimport { useAppDispatch } from '../../../../redux/store';\n\nexport const CSSWrapper = styled.div`\n padding: ${(props) => props.theme.space.md}px;\n display: flex;\n flex-direction: row;\n fieldset {\n margin: 0.2rem !important;\n }\n`;\n\nexport const WidgetInlineInputText = ({\n placeholder,\n handleClick,\n}: {\n placeholder: string;\n handleClick: (label: string) => void;\n}) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const [label, setLabel] = useState<string>('');\n\n const { control, watch, reset } = useForm({\n defaultValues: { label },\n criteriaMode: 'all',\n });\n\n useEffect(() => {\n const subscription = watch((data) => {\n setLabel(data.label ?? '');\n });\n return () => subscription.unsubscribe();\n }, [watch, dispatch]);\n\n return (\n <CSSWrapper>\n <JRCInputText name={'label'} control={control} placeholder={placeholder} width=\"100%\" />\n <JRCButton\n label={intl.formatMessage({ id: 'GLOBAL_Confirm' })}\n disabled={!label.length}\n onClick={() => {\n handleClick(label);\n setLabel('');\n reset();\n }}\n />\n </CSSWrapper>\n );\n};\n","import React from 'react';\n\nimport styled from 'styled-components';\n\nimport { JRCLoader } from 'jamespot-react-components';\n\nexport const Wrapper = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: rgba(255, 255, 255, 0.4);\n`;\n\nexport const WidgetIsPending = () => {\n return (\n <Wrapper>\n <JRCLoader size={'m'} />\n </Wrapper>\n );\n};\n","import { Toast, updateWidgetContent, Widget, WidgetEditor } from 'jamespot-front-business';\nimport { JRCFileViewer, JRCWidgetCheckListEntries, Utils } from 'jamespot-react-components';\nimport jApi, {\n CombinedWidgetContent,\n ensureWidgetCheckListType,\n jFileLittle,\n WidgetCheckListContent,\n WidgetCheckListType,\n WidgetDisplayMode,\n WidgetsName,\n} from 'jamespot-user-api';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport { shallowEqual } from 'react-redux';\nimport styled from 'styled-components';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { RTProvider } from '../../RTProvider.component';\nimport { useWidgetRT } from '../hooks';\nimport { WidgetFooterView } from './components/WidgetFooterView';\nimport { WidgetInlineInputText } from './components/WidgetInlineInputText';\nimport { WidgetIsPending } from './components/WidgetIsPending';\n\nconst WidgetCheckList = commonComponentsRegistry.getLazyComponent('WidgetCheckList');\nconst WidgetCheckListEditor = commonComponentsRegistry.getLazyComponent('WidgetCheckListEditor');\n\nexport const CSSRowLinkWrapper = styled.div<{ border?: boolean }>`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n border: ${(props) => (props.border ? `1px solid ${props.theme.color.grey2}` : 'none')};\n min-height: 24px;\n border-radius: 4px;\n padding: 4px 8px;\n`;\n\nconst CommentContainer = styled.div`\n width: 100%;\n display: flex;\n gap: 14px;\n padding: 16px;\n`;\n\nexport const CSSWidgetCheckListWrapper = styled.div`\n position: relative;\n`;\n\ntype JRCWidgetCheckListWrapperProps = {\n widget: WidgetCheckListType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n onWidgetUpdate?: () => void;\n};\n\nexport const JRCWidgetCheckListWrapper = ({\n widget,\n inplace,\n mode,\n onWidgetUpdate,\n}: JRCWidgetCheckListWrapperProps) => {\n const intl = useIntl();\n const { uniqid, content: widgetContent } = widget;\n const dispatch = useAppDispatch();\n const [token, setToken] = useState<string>();\n const [tokenLoading, setTokenLoading] = useState(false);\n\n const [entries, setEntries] = useState<JRCWidgetCheckListEntries | undefined>();\n const [isPending, setIsPending] = useState(false);\n\n const tokenFromStore = useAppSelector(Widget.selectors.selectToken, shallowEqual);\n\n const uri = useAppSelector((state) => Widget.selectors.selectWidgetObjectUri(state, widget.uniqid), shallowEqual);\n\n const widgetObjectRights = useAppSelector(\n (state) => Widget.selectors.selectWidgetObjectRights(state, uniqid),\n shallowEqual,\n );\n\n const allRt = useAppSelector(\n (state) => Widget.selectors.selectAllWidgetRTObject(state, widget.uniqid),\n shallowEqual,\n );\n\n const canEditCollaboration = useMemo(() => {\n return widgetObjectRights && widgetObjectRights.update;\n }, [widgetObjectRights]);\n\n const canAdministrate = useMemo(() => {\n return widgetObjectRights && widgetObjectRights.administrate;\n }, [widgetObjectRights]);\n\n const onError = useCallback(\n (message?: string) => {\n dispatch(Toast.actions.error({ label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\n },\n [dispatch, intl],\n );\n\n const fetchToken = useCallback(() => {\n if (!token && !tokenLoading) {\n setTokenLoading(true);\n jApi.network\n .token()\n .then((res) => {\n setToken(res.result);\n setTokenLoading(false);\n\n // set comment token to our widget slice to be able to upload image inside our widgets\n dispatch(Widget.slice.actions.setToken({ token: res.result }));\n })\n .catch((e) => {\n onError(e.errorMsg);\n });\n }\n }, [onError, token, tokenLoading, dispatch]);\n\n if (!tokenFromStore) {\n fetchToken();\n } else if (!token) {\n setToken(tokenFromStore);\n }\n\n const onChange = useCallback(\n (uniqid: string, content: WidgetCheckListContent) => {\n dispatch(updateWidgetContent(uniqid, content));\n },\n [dispatch],\n );\n\n const onChangeWrapper = (content: { uniqid: string; title?: string }) => {\n dispatch(Widget.slice.actions.updateWidgetWrapper({ ...content }));\n };\n\n const handleCheckItem = (id: string, index: number) => {\n if (!uri) return;\n if (isPending) return;\n setIsPending(true);\n jApi.widget\n .checkListRespond({\n uri,\n uniqid: id,\n index: index,\n })\n .then(() => {\n if (onWidgetUpdate) onWidgetUpdate();\n })\n .catch((err) => {\n onError(err.message);\n setIsPending(false);\n });\n };\n\n const handleReloadWidget = useCallback(() => {\n if (!uri) return;\n setIsPending(true);\n jApi.widget\n .getWidget<WidgetCheckListType>({ uri, uniqid })\n .then((response) => {\n if (ensureWidgetCheckListType(response.result)) {\n onChange(uniqid, response.result.content);\n }\n })\n .catch((err) => {\n return !err.aborted && onError;\n })\n .finally(() => setIsPending(false));\n }, [uniqid, onError, uri, onChange]);\n\n const openEditorPanel = (token: string) => {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n dispatch(Widget.slice.actions.setToken({ token }));\n dispatch(\n WidgetEditor.slice.actions.registerEditor({\n uniqid: widget.uniqid,\n name: WidgetsName.CheckList,\n mode,\n }),\n );\n };\n\n useEffect(() => {\n if (!token && mode === 'edit') {\n jApi.network.token().then((response) => {\n dispatch(Widget.slice.actions.setToken({ token: response.result }));\n });\n }\n }, [mode, token, dispatch]);\n\n useEffect(() => {\n const finalEntries: JRCWidgetCheckListEntries | undefined = widget.content.arr?.map((item) => ({\n text: item.title ?? '',\n file: item.file ?? undefined,\n checked: item.value ?? false,\n ...(item.links && {\n links: item.links,\n }),\n ...(item.user && { user: item.user ?? undefined }),\n ...(item.id && { id: item.id, mimetype: 'image/png' }),\n }));\n\n setEntries(finalEntries);\n }, [widget.content.arr, widgetContent]);\n\n useEffect(() => {\n if (!Array.isArray(allRt)) return;\n const lastRt = allRt.at(-1);\n if (!lastRt) return;\n if (!uri) return;\n\n if (lastRt.object.uri === uri && lastRt.uniqid === widget.uniqid) {\n if (lastRt.fn === 'check-list-response' || lastRt.fn === 'widget-update') {\n handleReloadWidget();\n }\n }\n }, [allRt, widget.uniqid, uri, onError, dispatch, handleReloadWidget]);\n\n const handleCollabAddEntry = (label: string) => {\n if (!widget.content.arr || !uri) return;\n\n const contentToUpdate = {\n ...widget.content,\n arr: [...widget.content.arr, { title: label, value: false }],\n };\n\n jApi.widget\n .updateWidget<CombinedWidgetContent>({\n uri,\n uniqid: widget.uniqid,\n content: contentToUpdate as CombinedWidgetContent,\n v2: true,\n })\n .then(() => onChange(widget.uniqid, contentToUpdate))\n .catch((err) => onError(err.errorMsg));\n };\n\n const files = useMemo(() => {\n if (!Array.isArray(widgetContent.arr)) return [];\n\n const fs: jFileLittle[] = [];\n widgetContent.arr.forEach((el) => {\n if (el.file) {\n fs.push(el.file);\n }\n });\n\n return fs;\n }, [widgetContent]);\n\n if (mode === 'edit') {\n if (inplace) {\n return (\n <CommentContainer>\n <WidgetCheckListEditor\n token={token}\n uniqid={uniqid}\n content={{\n ...widgetContent,\n arr: widgetContent.arr?.map((w) => ({\n ...w,\n title: Utils.html.htmlDecodeSpecialChars(w.title),\n })),\n }}\n inplace={inplace}\n onChangeContent={onChange}\n onChangeWrapper={onChangeWrapper}\n handleChange={(content) =>\n dispatch(updateWidgetContent<WidgetCheckListContent>(widget.uniqid, content))\n }\n />\n </CommentContainer>\n );\n }\n }\n\n return (\n <RTProvider\n useRT={() => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useWidgetRT(widget.uniqid);\n }}>\n {entries && (\n <JRCFileViewer files={files} openWithOptions={[]}>\n {(open) => {\n return (\n <CSSWidgetCheckListWrapper key={widget.uniqid}>\n <WidgetCheckList\n limit={10}\n initialEntries={entries}\n onFileClick={(entry) => entry.id && open(entry.id)}\n onItemCheckListChange={(index) => handleCheckItem(widget.uniqid, index)}\n />\n {widgetContent.edit && (\n <WidgetInlineInputText\n handleClick={handleCollabAddEntry}\n placeholder={intl.formatMessage({\n id: 'COMMENT_WIDGET_CHECKLIST_Add_New_Task',\n })}\n />\n )}\n {canAdministrate && token && (\n <WidgetFooterView\n uniqid={widget.uniqid}\n name={widget.name}\n collaborationRights={{\n update: !!(widgetContent.edit || canEditCollaboration),\n }}\n mode={mode}\n handleOpenEditor={() => {\n if (!token) {\n setIsPending(true);\n jApi.network\n .token()\n .then((response) => {\n dispatch(\n Widget.slice.actions.setToken({ token: response.result }),\n );\n openEditorPanel(response.result);\n })\n .finally(() => setIsPending(false));\n } else {\n openEditorPanel(token);\n }\n }}\n />\n )}\n {isPending && <WidgetIsPending />}\n </CSSWidgetCheckListWrapper>\n );\n }}\n </JRCFileViewer>\n )}\n </RTProvider>\n );\n};\n","import { WidgetTableColumn, WidgetTableColumnsData } from 'jamespot-user-api';\n\nexport const getVisibleColumns = (tableColumnsData: WidgetTableColumnsData, columns: WidgetTableColumn[]) => {\n const toRet: WidgetTableColumn[] = [];\n tableColumnsData\n .filter((data) => data.isVisible)\n .forEach((data) => {\n const column = columns.find((el) => el.name === data.name);\n if (column) {\n toRet.push(column);\n }\n });\n\n return toRet;\n};\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport jamespot, {\n DatasourceResultSort,\n DatasourceType,\n Format,\n WidgetDatasourceTableContent,\n WidgetDatasourceValues,\n WidgetDisplayMode,\n WidgetsName,\n WidgetTableColumn,\n} from 'jamespot-user-api';\nimport styled from 'styled-components';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { getVisibleColumns } from './utils';\nimport { FitType, useArticleRT } from '../hooks';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch } from '../../../redux/store';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\nconst WidgetTable = commonComponentsRegistry.getLazyComponent('WidgetTable');\nconst Loader = commonComponentsRegistry.getLazyComponent('Loader');\n\nexport const Wrapper = styled.div``;\n\nexport const AbsoluteWrapper = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: ${(props) => props.theme.space.md}px;\n`;\n\nexport const WidgetDatasourceTableWrapper = ({\n uri,\n limit,\n tableHeadColor,\n tableHeadTextColor,\n tableHeadIconColor,\n tableRowColor,\n tableRowTextColor,\n tableColumnsData = [],\n tableBorderRadius,\n tableSizedColumns,\n tableSizedColumnsWidth,\n mode,\n}: WidgetDatasourceTableContent & { uniqid: string; mode: WidgetDisplayMode }) => {\n const dispatch = useAppDispatch();\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [datasourceData, setDatasourceData] = useState<Record<string, WidgetDatasourceValues>[]>([]);\n const [datasourceModel, setDatasourceModel] = useState<WidgetTableColumn[]>([]);\n const [datasourceSort, setDatasourceSort] = useState<DatasourceResultSort>({ order: 'ascending', name: 'unknown' });\n const [datasourceType, setDatasourceType] = useState<DatasourceType | undefined>(undefined);\n const [datasourceIdentifier, setDatasourceIdentifier] = useState<string>('');\n\n const definition = useMemo(() => Widget.definition(WidgetsName.DatasourceTable), []);\n const rtConditions = useMemo<FitType[]>(() => {\n if (datasourceType === 'studio') {\n return [{ type: [datasourceIdentifier] }];\n }\n\n return [];\n }, [datasourceType, datasourceIdentifier]);\n const rtAudience = useMemo<string[]>(() => {\n if (datasourceType === 'doc') {\n return [datasourceIdentifier];\n }\n\n return [];\n }, [datasourceType, datasourceIdentifier]);\n\n const { rtLastObject } = useArticleRT(rtConditions, rtAudience);\n\n const fetchDatasource = useCallback(() => {\n if (!uri) {\n return;\n }\n\n setIsLoading(true);\n jamespot.datasource\n .get(uri, Format.VIEW)\n .then((response) => {\n setDatasourceModel(response.result.model);\n setDatasourceData(response.result.data);\n setDatasourceSort(response.result.sort);\n setDatasourceType(response.result.datasource.datasourceType);\n setDatasourceIdentifier(response.result.datasource.datasourceIdentifier);\n })\n .finally(() => setIsLoading(false));\n }, [uri]);\n\n useEffect(() => {\n if (uri !== undefined && tableColumnsData.length !== 0 && datasourceModel.length === 0) {\n fetchDatasource();\n }\n }, [uri, tableColumnsData, datasourceModel, fetchDatasource]);\n\n useEffect(() => {\n if (!rtLastObject) {\n return;\n }\n\n fetchDatasource();\n }, [rtLastObject, fetchDatasource]);\n\n useEffect(() => {\n if (!uri) {\n setDatasourceModel([]);\n }\n }, [uri]);\n\n useEffect(() => {\n if (mode === 'view' || mode === 'preview') {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n }\n }, [mode, dispatch]);\n\n const columns = useMemo(\n () => getVisibleColumns(tableColumnsData, datasourceModel),\n [tableColumnsData, datasourceModel],\n );\n\n if (tableColumnsData.length === 0 && !isLoading && mode === 'edit') {\n return (\n <>\n <AbsoluteWrapper>\n <img src={`/img/fast-intranet/${WidgetsName.DatasourceTable}.png`} alt=\"\" />\n <FormattedMessage id={definition.label} />\n <JRCButton label=\"GLOBAL_Settings\" />\n </AbsoluteWrapper>\n </>\n );\n }\n\n return isLoading ? (\n <AbsoluteWrapper>\n <Loader />\n </AbsoluteWrapper>\n ) : (\n <>\n {!isLoading && datasourceData.length === 0 && mode !== 'edit' ? (\n <AbsoluteWrapper>\n <img src={`/img/fast-intranet/${WidgetsName.DatasourceTable}.png`} alt=\"\" />\n <FormattedMessage id={'WIDGET_Datasource_No_Results'} />\n </AbsoluteWrapper>\n ) : (\n <WidgetTable\n rows={datasourceData}\n columns={columns}\n limit={limit}\n tableHeadColor={tableHeadColor}\n tableHeadTextColor={tableHeadTextColor}\n tableHeadIconColor={tableHeadIconColor}\n tableRowColor={tableRowColor}\n tableRowTextColor={tableRowTextColor}\n tableBorderRadius={tableBorderRadius}\n tableColumnsData={tableColumnsData}\n tableSizedColumns={tableSizedColumns}\n tableSizedColumnsWidth={tableSizedColumnsWidth}\n tableDefaultSortOrder={datasourceSort.order}\n tableDefaultSortName={datasourceSort.name}\n />\n )}\n </>\n );\n};\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport jamespot, {\n Format,\n WidgetDatasourceValues,\n WidgetDisplayMode,\n WidgetExcelDatasourceTableContent,\n WidgetsName,\n WidgetTableColumn,\n} from 'jamespot-user-api';\nimport styled from 'styled-components';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { getVisibleColumns } from './utils';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch } from '../../../redux/store';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\n\nconst WidgetTable = commonComponentsRegistry.getLazyComponent('WidgetTable');\nconst Loader = commonComponentsRegistry.getLazyComponent('Loader');\n\nexport const Wrapper = styled.div``;\n\nexport const AbsoluteWrapper = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: ${(props) => props.theme.space.md}px;\n`;\n\nexport const WidgetExcelDatasourceTableWrapper = ({\n uri,\n limit,\n tableHeadColor,\n tableHeadTextColor,\n tableHeadIconColor,\n tableRowColor,\n tableRowTextColor,\n tableColumnsData = [],\n tableBorderRadius,\n tableSizedColumns,\n tableSizedColumnsWidth,\n mode,\n}: WidgetExcelDatasourceTableContent & { uniqid: string; mode: WidgetDisplayMode }) => {\n const dispatch = useAppDispatch();\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [datasourceData, setDatasourceData] = useState<Record<string, WidgetDatasourceValues>[]>([]);\n const [datasourceModel, setDatasourceModel] = useState<WidgetTableColumn[]>([]);\n\n const definition = useMemo(() => Widget.definition(WidgetsName.ExcelDatasourceTable), []);\n\n useEffect(() => {\n if (uri !== undefined && tableColumnsData.length !== 0 && datasourceModel.length === 0) {\n setIsLoading(true);\n jamespot.datasource\n .get(uri, Format.VIEW)\n .then((response) => {\n setDatasourceModel(response.result.model);\n setDatasourceData(response.result.data);\n })\n .finally(() => setIsLoading(false));\n }\n }, [uri, tableColumnsData, datasourceModel]);\n\n useEffect(() => {\n if (!uri) {\n setDatasourceModel([]);\n }\n }, [uri]);\n\n useEffect(() => {\n if (mode === 'view' || mode === 'preview') {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n }\n }, [mode, dispatch]);\n\n const columns = useMemo(\n () => getVisibleColumns(tableColumnsData, datasourceModel),\n [tableColumnsData, datasourceModel],\n );\n\n if (tableColumnsData.length === 0 && !isLoading && mode === 'edit') {\n return (\n <>\n <AbsoluteWrapper>\n <img src={`/img/fast-intranet/${WidgetsName.ExcelDatasourceTable}.png`} alt=\"\" />\n <FormattedMessage id={definition.label} />\n <JRCButton label=\"GLOBAL_Settings\" />\n </AbsoluteWrapper>\n </>\n );\n }\n\n return isLoading ? (\n <AbsoluteWrapper>\n <Loader />\n </AbsoluteWrapper>\n ) : (\n <>\n {!isLoading && datasourceData.length === 0 && mode !== 'edit' ? (\n <AbsoluteWrapper>\n <img src={`/img/fast-intranet/${WidgetsName.ExcelDatasourceTable}.png`} alt=\"\" />\n <FormattedMessage id={'WIDGET_Datasource_No_Results'} />\n </AbsoluteWrapper>\n ) : (\n <WidgetTable\n rows={datasourceData}\n columns={columns}\n limit={limit}\n tableHeadColor={tableHeadColor}\n tableHeadTextColor={tableHeadTextColor}\n tableHeadIconColor={tableHeadIconColor}\n tableRowColor={tableRowColor}\n tableRowTextColor={tableRowTextColor}\n tableBorderRadius={tableBorderRadius}\n tableColumnsData={tableColumnsData}\n tableSizedColumns={tableSizedColumns}\n tableSizedColumnsWidth={tableSizedColumnsWidth}\n />\n )}\n </>\n );\n};\n","import React, { useCallback, useMemo } from 'react';\n\nimport jamespot, { WidgetDisplayMode, WidgetPresenceContent } from 'jamespot-user-api';\n\nimport { shallowEqual } from 'react-redux';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nexport const CSSPaddingMd = styled.div`\n padding: ${(props) => props.theme.space.md}px;\n`;\n\nexport const CSSHref = styled.a`\n cursor: pointer;\n color: ${(props) => props.theme.color.secondary};\n`;\n\nexport const CSSHorizontalAlign = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nimport { Toast, Widget } from 'jamespot-front-business';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nexport const WidgetPresenceWrapperClosing = ({\n mode,\n uniqid,\n content,\n}: {\n mode?: WidgetDisplayMode;\n uniqid: string;\n content: WidgetPresenceContent;\n}) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n\n const uri = useAppSelector((state) => Widget.selectors.selectWidgetObjectUri(state, uniqid), shallowEqual);\n\n const widgetObjectRights = useAppSelector(\n (state) => Widget.selectors.selectWidgetObjectRights(state, uniqid),\n shallowEqual,\n );\n\n const canUpdate = useMemo<boolean>(() => !!(widgetObjectRights && widgetObjectRights.update), [widgetObjectRights]);\n\n const handleClosing = useCallback(() => {\n if (mode === 'edit' || !canUpdate || !uri) {\n return;\n }\n\n const contentToUpdate = { ...content, isClosed: true };\n\n jamespot.widget\n .updateWidget({\n uri,\n uniqid,\n content: contentToUpdate,\n v2: true,\n })\n .then(() => dispatch(Widget.slice.actions.updateWidget({ uniqid, content: contentToUpdate })))\n .catch(() => dispatch(Toast.actions.error({ label: 'WIDGET_Presence_Error' })));\n }, [mode, uniqid, canUpdate, uri, content, dispatch]);\n\n return (\n <>\n {canUpdate && !content.isClosed && (\n <CSSPaddingMd>\n <CSSHorizontalAlign>\n <CSSHref onClick={handleClosing}>\n {intl.formatMessage({ id: 'WIDGET_Presence_Closing' })}\n </CSSHref>\n </CSSHorizontalAlign>\n </CSSPaddingMd>\n )}\n </>\n );\n};\n","import jApi, {\n WidgetDisplayMode,\n WidgetPresenceResponse,\n WidgetPresenceResponseUserList,\n WidgetPresenceType,\n} from 'jamespot-user-api';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport { shallowEqual } from 'react-redux';\nimport styled from 'styled-components';\nimport { Toast, updateWidgetContent, Widget } from 'jamespot-front-business';\nimport { useWidgetRT } from '../hooks';\nimport { WidgetFooterView } from './components/WidgetFooterView';\nimport { WidgetPresenceWrapperClosing } from './JRCWidgetPresenceWrapperClosing';\nimport { WidgetIsPending } from './components/WidgetIsPending';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { RTProvider } from '../../RTProvider.component';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst JRCWidgetPresence = commonComponentsRegistry.getLazyComponent('WidgetPresence');\nconst ModalUserList = commonComponentsRegistry.getLazyComponent('ModalUserList');\n\nexport const CSSWidgetPresenceWrapper = styled.div`\n display: flex;\n flex: 1;\n position: relative;\n flex-direction: column;\n`;\n\nexport const CSSWidgetPresenceState = styled.div`\n position: absolute;\n inset: 0;\n background-color: rgba(255, 255, 255, 0.7);\n display: flex;\n flex: 1;\n justify-content: center;\n align-items: center;\n`;\n\nexport const CSSWidgetPresenceIsClosed = styled.div`\n flex: 1;\n display: flex;\n padding: ${(props) => props.theme.space.md}px;\n border: 1px dashed ${(props) => props.theme.color.orange};\n justify-content: center;\n align-items: center;\n border-radius: ${(props) => props.theme.space.sm}px;\n margin: ${(props) => props.theme.space.sm}px;\n`;\n\nexport const JRCWidgetPresenceWrapper = ({\n widget,\n mode,\n}: {\n widget: WidgetPresenceType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n}) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const { limit, limitValue, closing, isClosed } = widget.content;\n const { uniqid } = widget;\n const [response, setResponse] = useState<WidgetPresenceResponse>({\n userValue: -1,\n userAvailableList: [],\n userUnavailableList: [],\n userAvailableTotal: 0,\n userUnavailableTotal: 0,\n });\n const [isPendingResponse, setIsPendingResponse] = useState<boolean>(false);\n const [abortController] = useState<AbortController>(new AbortController());\n const [openUsersModal, setOpenUsersModal] = useState(false);\n const [usersListIndex, setUsersListIndex] = useState<number>();\n const [usersList, setUsersList] = useState<WidgetPresenceResponseUserList>();\n const ref = useRef<AbortController>(abortController);\n\n const uri = useAppSelector((state) => Widget.selectors.selectWidgetObjectUri(state, uniqid), shallowEqual);\n\n const allRt = useAppSelector((state) => Widget.selectors.selectAllWidgetRTObject(state, uniqid), shallowEqual);\n\n const handleClickAvailable = () => (response.userValue === 1 ? handleCancelRespond() : handleRespond(1));\n const handleClickUnavailable = () => (response.userValue === 0 ? handleCancelRespond() : handleRespond(0));\n\n const handleError = useCallback(\n () => dispatch(Toast.actions.error({ label: 'WIDGET_Presence_Error' })),\n [dispatch],\n );\n\n const canRespond = useMemo<boolean>(\n () => !(limit && limitValue && response.userAvailableTotal >= limitValue),\n [limit, limitValue, response.userAvailableTotal],\n );\n\n const lockedRespondHandler = useMemo(() => {\n return (closing && isClosed) || mode === 'edit';\n }, [closing, isClosed, mode]);\n\n const handleCancelRespond = useCallback(() => {\n if (!uri || lockedRespondHandler) return;\n if (!canRespond) {\n dispatch(Toast.actions.error({ label: 'WIDGET_Presence_Limit_Response_Error' }));\n return;\n }\n\n setIsPendingResponse(true);\n jApi.widget\n .presenceCancel({ uri, uniqid })\n .catch(handleError)\n .finally(() => setIsPendingResponse(false));\n }, [dispatch, uniqid, handleError, uri, canRespond, lockedRespondHandler]);\n\n const handleRespond = useCallback(\n (value: 1 | 0) => {\n if (!uri || lockedRespondHandler) return;\n\n setIsPendingResponse(true);\n jApi.widget\n .presenceRespond(\n {\n uri,\n uniqid,\n value,\n },\n ref.current.signal,\n )\n .catch(handleError)\n .finally(() => setIsPendingResponse(false));\n },\n [uri, uniqid, handleError, lockedRespondHandler],\n );\n\n const handleResponse = useCallback(() => {\n if (mode === 'edit' || !uri) return;\n setIsPendingResponse(true);\n jApi.widget\n .presenceGetResponse({ uri, uniqid }, ref.current.signal)\n .then((response) => {\n setResponse(response.result);\n })\n .catch((err) => !err.aborted && handleError())\n .finally(() => setIsPendingResponse(false));\n }, [uri, handleError, uniqid, mode]);\n\n const handleLoadUsersList = (index: number, page?: number) => {\n if (!uri) return;\n jApi.widget\n .presenceGetResponseUserList({ uri, uniqid, index, page, limit: 8 }, ref.current.signal)\n .then((response) => {\n setUsersList({\n ...response.result,\n data: [...response.result.data],\n cnt: response.result.cnt,\n });\n })\n .catch((err) => {\n return !err.aborted && handleError;\n });\n };\n\n const handleReloadWidget = useCallback(() => {\n if (!uri) return;\n setIsPendingResponse(true);\n jApi.widget\n .getWidget<WidgetPresenceType>({ uri, uniqid })\n .then((response) => {\n dispatch(updateWidgetContent(uniqid, response.result));\n })\n .catch((err) => {\n return !err.aborted && handleError;\n })\n .finally(() => setIsPendingResponse(false));\n }, [dispatch, handleError, uri, uniqid]);\n\n useEffect(() => {\n const elm = ref.current;\n return () => {\n elm.abort();\n };\n }, []);\n\n useEffect(() => {\n handleResponse();\n }, [handleResponse]);\n\n useEffect(() => {\n if (!Array.isArray(allRt)) return;\n const lastRt = allRt.at(-1);\n if (!lastRt || !uri) return;\n\n if (lastRt.object.uri === uri && lastRt.uniqid === uniqid) {\n if (lastRt.fn === 'widget-presence-response') {\n handleResponse();\n }\n if (lastRt.fn === 'widget-update') {\n handleReloadWidget();\n }\n }\n }, [allRt, handleResponse, uniqid, uri, handleReloadWidget]);\n\n return (\n <RTProvider\n useRT={() => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useWidgetRT(widget.uniqid);\n }}>\n <CSSWidgetPresenceWrapper>\n <JRCWidgetPresence\n limit={limit}\n limitValue={limitValue}\n userAvailableList={response.userAvailableList}\n userUnavailableList={response.userUnavailableList}\n userValue={response.userValue}\n userAvailableTotal={response?.userAvailableTotal}\n userUnavailableTotal={response?.userUnavailableTotal}\n isClosed={closing && isClosed}\n handleClickAvailable={handleClickAvailable}\n handleClickUnavailable={handleClickUnavailable}\n handleOpenUsersModal={(index) => {\n setUsersList({\n limit: 0,\n page: 0,\n data: [],\n cnt: 0,\n });\n setUsersListIndex(index);\n handleLoadUsersList(index);\n setOpenUsersModal(true);\n }}\n />\n {closing && isClosed && (\n <CSSWidgetPresenceIsClosed>\n {intl.formatMessage({ id: 'WIDGET_Presence_Is_Closed' })}\n </CSSWidgetPresenceIsClosed>\n )}\n {closing && !isClosed && (\n <WidgetPresenceWrapperClosing mode={mode} uniqid={widget.uniqid} content={widget.content} />\n )}\n {mode === 'view' && <WidgetFooterView uniqid={widget.uniqid} name={widget.name} mode={mode} />}\n {isPendingResponse && <WidgetIsPending />}\n <ModalUserList\n open={openUsersModal}\n usersList={usersList}\n title={\n usersListIndex === 1\n ? intl.formatMessage({ id: 'WIDGET_Presence_On' })\n : intl.formatMessage({ id: 'WIDGET_Presence_Off' })\n }\n setOpen={setOpenUsersModal}\n onClose={() => {\n setUsersList({\n limit: 0,\n page: 0,\n data: [],\n cnt: 0,\n });\n }}\n handleLoadUsersList={(page) => {\n handleLoadUsersList(usersListIndex ?? 0, page);\n }}\n />\n </CSSWidgetPresenceWrapper>\n </RTProvider>\n );\n};\n","import { Toast, updateWidgetContent, Widget, WidgetEditor } from 'jamespot-front-business';\nimport jApi, {\n CombinedWidgetContent,\n jFileLittle,\n WidgetDisplayMode,\n WidgetQuickSurveyContent,\n WidgetQuickSurveyResponse,\n WidgetQuickSurveyResponseUserList,\n WidgetQuickSurveyType,\n WidgetsName,\n} from 'jamespot-user-api';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport { shallowEqual } from 'react-redux';\nimport styled from 'styled-components';\nimport { WidgetFooterView } from './components/WidgetFooterView';\nimport { WidgetInlineInputText } from './components/WidgetInlineInputText';\nimport { useWidgetRT } from '../hooks';\nimport { WidgetIsPending } from './components/WidgetIsPending';\nimport { JRCFileViewer } from 'jamespot-react-components';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { RTProvider } from '../../RTProvider.component';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst WidgetQuickSurvey = commonComponentsRegistry.getLazyComponent('WidgetQuickSurvey');\nconst WidgetQuickSurveyEditor = commonComponentsRegistry.getLazyComponent('WidgetQuickSurveyEditor');\nconst ModalUserList = commonComponentsRegistry.getLazyComponent('ModalUserList');\n\nconst WrapperContainer = styled.div<{ withPadding?: boolean }>`\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: 14px;\n ${(props) => props.withPadding && `padding: 0 12px;`}\n padding-top: 16px;\n`;\n\ntype JRCWidgetQuickSurveyWrapperProps = {\n widget: WidgetQuickSurveyType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n};\n\nexport const JRCWidgetQuickSurveyWrapper = ({ widget, inplace, mode }: JRCWidgetQuickSurveyWrapperProps) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const { uniqid, content: widgetContent } = widget;\n const [response, setResponse] = useState<WidgetQuickSurveyResponse>({\n userResponses: [],\n totalRespondent: 0,\n totalResponse: 0,\n userLoggedResponses: [],\n });\n const [openUsersModal, setOpenUsersModal] = useState(false);\n const [isPending, setIsPending] = useState(false);\n const [usersListIndex, setUsersListIndex] = useState<number>();\n const [usersList, setUsersList] = useState<WidgetQuickSurveyResponseUserList>();\n\n const [abortController] = useState<AbortController>(new AbortController());\n const ref = useRef<AbortController>(abortController);\n\n const token = useAppSelector(Widget.selectors.selectToken, shallowEqual);\n\n const uri = useAppSelector((state) => Widget.selectors.selectWidgetObjectUri(state, widget.uniqid), shallowEqual);\n\n const widgetObjectRights = useAppSelector(\n (state) => Widget.selectors.selectWidgetObjectRights(state, uniqid),\n shallowEqual,\n );\n\n const allRt = useAppSelector(\n (state) => Widget.selectors.selectAllWidgetRTObject(state, widget.uniqid),\n shallowEqual,\n );\n\n const onChange = useCallback(\n (uniqid: string, content: WidgetQuickSurveyContent) => {\n dispatch(updateWidgetContent(uniqid, content));\n },\n [dispatch],\n );\n\n const onChangeWrapper = (content: { uniqid: string; title?: string }) => {\n dispatch(Widget.slice.actions.updateWidgetWrapper({ ...content }));\n };\n\n const openEditorPanel = (token: string) => {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n dispatch(Widget.slice.actions.setToken({ token }));\n dispatch(\n WidgetEditor.slice.actions.registerEditor({\n uniqid: widget.uniqid,\n name: WidgetsName.QuickSurvey,\n }),\n );\n };\n\n const handleError = useCallback(\n () => dispatch(Toast.actions.error({ label: 'WIDGET_Presence_Error' })),\n [dispatch],\n );\n\n const handleResponse = useCallback(\n (uniqid: string) => {\n if (mode === 'edit' || !uri) return;\n setIsPending(true);\n jApi.widget\n .quickSurveyGetResponse({ uri, uniqid }, ref.current.signal)\n .then((response) => {\n setResponse(response.result);\n })\n .catch((err) => {\n return !err.aborted && handleError;\n })\n .finally(() => setIsPending(false));\n },\n [handleError, uri, mode],\n );\n\n const handleWidgetGet = useCallback(() => {\n if (!uri) return;\n setIsPending(true);\n jApi.widget\n .getWidget<WidgetQuickSurveyType>({ uri, uniqid }, ref.current.signal)\n .then((response) => {\n onChange(uniqid, response.result.content);\n })\n .catch((err) => {\n return !err.aborted && handleError;\n })\n .finally(() => setIsPending(false));\n }, [uniqid, handleError, uri, onChange]);\n\n const handleRespond = (index: number) => {\n if (mode === 'edit' || !uri) return;\n setIsPending(true);\n jApi.widget\n .quickSurveyRespond({ uri, index, multi: widgetContent.multi ? 1 : 0, uniqid }, ref.current.signal)\n .then(() => {\n handleResponse(widget.uniqid);\n })\n .catch((err) => !err.aborted && handleError)\n .finally(() => setIsPending(false));\n };\n\n const handleCloseSurvey = () => {\n if (!uri) return;\n if (widgetContent.closing) {\n const finalContent = { ...widgetContent, isClosed: true } as CombinedWidgetContent;\n\n jApi.widget\n .updateWidget<WidgetQuickSurveyType>({\n uri,\n uniqid,\n content: finalContent,\n })\n .catch(() => {\n handleError();\n });\n }\n };\n\n const handleProgressBarClick = (index: number) => {\n handleRespond(index);\n };\n\n const handleAddQuickAnswer = (title: string) => {\n if (!uri) return;\n\n const newContent = {\n ...widgetContent,\n arr: [...(widgetContent.arr ?? []), { title }],\n } as CombinedWidgetContent;\n\n jApi.widget\n .quickSurveyAddEnty({ uri, uniqid, label: title })\n .then(() => {\n dispatch(Widget.slice.actions.updateWidget({ uniqid, content: newContent }));\n })\n .catch(handleError);\n };\n\n const handleLoadUsersList = (index: number, page?: number) => {\n if (!uri) return;\n jApi.widget\n .quickSurveyGetResponseUserList({ uri, uniqid, index, page, limit: 8 }, ref.current.signal)\n .then((response) => {\n setUsersList({\n ...response.result,\n data: [...response.result.data],\n cnt: response.result.cnt,\n });\n })\n .catch((err) => {\n return !err.aborted && handleError;\n });\n };\n\n const canUpdate = useMemo(() => widgetObjectRights && widgetObjectRights.update, [widgetObjectRights]);\n\n useEffect(() => {\n handleResponse(widget.uniqid);\n }, [handleResponse, widget.uniqid]);\n\n useEffect(() => {\n if (!Array.isArray(allRt)) return;\n const lastRt = allRt.at(-1);\n if (!lastRt) return;\n if (!uri) return;\n\n if (lastRt.object.uri === uri && lastRt.uniqid === widget.uniqid) {\n if (lastRt.fn === 'widget-quick-survey-response') {\n handleResponse(widget.uniqid);\n }\n if (lastRt.fn === 'widget-update') {\n handleWidgetGet();\n }\n }\n }, [allRt, uri, widget.uniqid, handleWidgetGet, handleResponse]);\n\n const files = useMemo(() => {\n if (!Array.isArray(widgetContent.arr)) return [];\n\n const fs: jFileLittle[] = [];\n widgetContent.arr.forEach((el) => {\n if (el.file) {\n fs.push(el.file);\n }\n });\n\n return fs;\n }, [widgetContent]);\n\n useEffect(() => {\n if (!token && mode === 'edit') {\n jApi.network.token().then((response) => {\n dispatch(Widget.slice.actions.setToken({ token: response.result }));\n });\n }\n }, [mode, token, dispatch]);\n\n if (mode === 'edit') {\n if (inplace) {\n return (\n <WrapperContainer withPadding={true}>\n <WidgetQuickSurveyEditor\n token={token}\n uniqid={uniqid}\n content={widget.content}\n onChangeContent={onChange}\n onChangeWrapper={onChangeWrapper}\n handleChange={(content) => onChange(uniqid, content)}\n inplace={inplace}\n />\n </WrapperContainer>\n );\n }\n }\n\n return (\n <RTProvider\n useRT={() => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useWidgetRT(widget.uniqid);\n }}>\n <WrapperContainer>\n <JRCFileViewer files={files} openWithOptions={[]}>\n {(open) => {\n return (\n <WidgetQuickSurvey\n limit={response.totalResponse ?? 0}\n values={widgetContent.arr ?? []}\n userResponses={response.userResponses}\n userHasAlreadyVoted={response.userLoggedResponses.length > 0}\n canCloseSurvey={widget.content.closing ?? false}\n isClosed={widget.content.isClosed ?? false}\n open={widget.content.open ?? false}\n anonymize={widget.content.anonymize ?? false}\n seeResponseAfter={widget.content.seeResponseAfter ?? false}\n canUpdate={canUpdate}\n handleClickFile={(entry) => entry.id && open(entry.id)}\n handleCloseSurvey={handleCloseSurvey}\n handleProgressBarClick={handleProgressBarClick}\n setOpenUsersModal={(index) => {\n setUsersListIndex(index);\n handleLoadUsersList(index);\n setOpenUsersModal(true);\n }}\n />\n );\n }}\n </JRCFileViewer>\n\n {widgetContent.open && (\n <WidgetInlineInputText\n handleClick={handleAddQuickAnswer}\n placeholder={intl.formatMessage({ id: 'FIELDS_Add_Option' })}\n />\n )}\n {canUpdate && (\n <WidgetFooterView\n uniqid={widget.uniqid}\n name={widget.name}\n collaborationRights={{\n update: !!canUpdate,\n }}\n mode={mode}\n handleOpenEditor={() => {\n if (!token) {\n setIsPending(true);\n jApi.network\n .token()\n .then((response) => {\n dispatch(Widget.slice.actions.setToken({ token: response.result }));\n openEditorPanel(response.result);\n })\n .finally(() => setIsPending(false));\n } else {\n openEditorPanel(token);\n }\n }}\n />\n )}\n {isPending && <WidgetIsPending />}\n <ModalUserList\n open={openUsersModal}\n usersList={usersList}\n title={widgetContent.arr?.[usersListIndex ?? 0]?.title ?? ''}\n setOpen={setOpenUsersModal}\n handleLoadUsersList={(page) => {\n handleLoadUsersList(usersListIndex ?? 0, page);\n }}\n onClose={() => {\n setUsersList({\n limit: 0,\n page: 0,\n data: [],\n cnt: 0,\n });\n }}\n />\n </WrapperContainer>\n </RTProvider>\n );\n};\n","import jApi, {\n ImapConnection,\n OfficeProvider,\n OfficeSetConfigurationPayload,\n ValueOf,\n WidgetDisplayMode,\n WidgetEmailsImapType,\n} from 'jamespot-user-api';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useIntl, FormattedMessage } from 'react-intl';\nimport styled from 'styled-components';\nimport { JRCLoader, useAbortController } from 'jamespot-react-components';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\nimport { useDispatch } from 'react-redux';\nimport { Toast } from 'jamespot-front-business';\n\nconst ModalLayout = commonComponentsRegistry.getLazyComponent('ModalLayout');\nconst ModalContent = commonComponentsRegistry.getLazyComponent('ModalContent');\nconst Button = commonComponentsRegistry.getLazyComponent('Button');\nconst InputText = commonComponentsRegistry.getLazyComponent('InputText');\nconst InputNumber = commonComponentsRegistry.getLazyComponent('InputNumber');\nconst InputSelectExtended = commonComponentsRegistry.getLazyComponent('InputSelectExtended');\nconst InputPassword = commonComponentsRegistry.getLazyComponent('InputPassword');\nconst Typography = commonComponentsRegistry.getLazyComponent('Typography');\n\nexport const UIForm = styled.div<{ isLocked: boolean }>`\n display: flex;\n flex-direction: column;\n opacity: ${(props) => (props.isLocked ? '.4' : '1.0')};\n`;\n\nexport const UIWrapper = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nexport const UIProviderError = styled.div`\n background-color: ${(props) => props.theme.color.orange};\n color: ${(props) => props.theme.color.white};\n padding: ${(props) => props.theme.space.sm}px;\n border-radius: ${(props) => props.theme.space.sm}px;\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nexport const UISection = styled.div`\n margin-bottom: ${(props) => props.theme.space.md}px;\n`;\n\nexport type JRCWidgetEmailsImapProps = {\n widget: WidgetEmailsImapType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n};\n\nexport const officeConfigurationInitialState = {\n username: '',\n password: '',\n hostname: '',\n imapPort: 993,\n imapConnectionSecurity: ImapConnection.NONE,\n imapMailbox: '',\n cardDavAddressBook: '',\n calDavCalendar: '',\n provider: '',\n};\n\nexport const OfficeConfigurationPrompt = () => {\n const intl = useIntl();\n const dispatch = useDispatch();\n const abortController = useAbortController();\n const [isOpen, setIsOpen] = useState<boolean>(false);\n const [isPending, setIsPending] = useState<boolean>(false);\n const {\n control,\n reset,\n setValue,\n getValues,\n watch,\n formState: { isValid },\n } = useForm<OfficeSetConfigurationPayload>({\n defaultValues: officeConfigurationInitialState,\n criteriaMode: 'all',\n });\n\n const refresh = () => window.location.reload();\n const [providerList, setProviderList] = useState<OfficeProvider[]>([]);\n const data = watch();\n\n const imapConnectionSecurityOptions = [\n { label: 'NONE', value: ImapConnection.NONE },\n { label: 'SSL', value: ImapConnection.SSL },\n { label: 'STARTTLS', value: ImapConnection.STARTTLS },\n ];\n\n const fetchConfiguration = useCallback(\n (providers: string[]) => {\n jApi.office.getConfiguration().then(({ result }) => {\n reset({\n ...result,\n provider: !providers.includes(result.provider ?? '') ? providers[0] : result.provider,\n });\n });\n },\n [reset],\n );\n\n const handleSubmit = () => {\n if (isPending) return;\n setIsPending(true);\n jApi.office\n .setConfiguration(data)\n .then(() => refresh())\n .catch((err) => dispatch(Toast.actions.error({ label: err.errorMsg })))\n .finally(() => {\n setIsOpen(false);\n setIsPending(false);\n reset();\n });\n };\n\n useEffect(() => {\n if (!isOpen) return;\n setIsPending(true);\n jApi.office\n .getProviders({ signal: abortController.signal })\n .then(({ result }) => {\n if (!abortController.signal.aborted) {\n setProviderList(result);\n fetchConfiguration(result.map((provider) => provider.id));\n }\n })\n .catch((err) => {\n if (!abortController.signal.aborted) {\n dispatch(Toast.actions.error({ label: err.errorMsg }));\n }\n })\n .finally(() => {\n setIsPending(false);\n });\n }, [isOpen, abortController.signal, dispatch, fetchConfiguration]);\n\n useEffect(() => {\n if (providerList.length === 1) {\n setValue('provider', providerList[0].id);\n }\n }, [providerList, setValue]);\n\n const handleClose = () => setIsOpen(false);\n\n const hasProvider = useMemo(() => providerList.length > 1, [providerList]);\n\n return (\n <>\n <UIWrapper>\n <Button\n label={intl.formatMessage({ id: 'Office_Set_Configuration' })}\n onClick={() => setIsOpen(true)}\n />\n </UIWrapper>\n <ModalLayout open={isOpen} radius=\"small\" closeHandler={handleClose}>\n <ModalContent\n overflow={'scroll'}\n title={intl.formatMessage({ id: 'Office_Set_Configuration' })}\n onClickIconClose={handleClose}>\n {isPending ? (\n <JRCLoader size=\"s\" />\n ) : (\n <>\n {providerList.length === 0 && (\n <UIProviderError>{intl.formatMessage({ id: 'Office_No_Providers' })}</UIProviderError>\n )}\n <UIForm isLocked={providerList.length === 0}>\n {hasProvider && (\n <>\n <UISection>\n <Typography size={'l'}>\n <FormattedMessage id=\"OfficeHook_Conf_Provider\" />\n </Typography>\n <SelectProvider\n label=\"OfficeHook_Conf_Select_Provider\"\n initialValue={{\n label: providerList[0].label,\n value: providerList[0].id,\n }}\n options={providerList.map((el) => {\n return { label: el.label, value: el.id };\n })}\n handleChange={(value) => {\n if (getValues('provider') !== value) {\n reset();\n }\n setValue('provider', value);\n }}\n />\n </UISection>\n </>\n )}\n <UISection>\n <Typography size={'l'}>\n <FormattedMessage id=\"OfficeHook_Settings\" />\n </Typography>\n <InputText\n control={control}\n name={'hostname'}\n width={'400'}\n placeholder={intl.formatMessage({ id: 'OfficeHook_Conf_IMap_Hostname' })}\n rules={{ required: true }}\n />\n <InputText\n control={control}\n name={'username'}\n width={'400'}\n placeholder={intl.formatMessage({ id: 'OfficeHook_Conf_Username' })}\n rules={{ required: true }}\n />\n <InputPassword\n control={control}\n name={'password'}\n width={'400'}\n placeholder={intl.formatMessage({ id: 'OfficeHook_Conf_Password' })}\n rules={{ required: true }}\n />\n </UISection>\n <UISection>\n <Typography size={'l'}>\n <FormattedMessage id=\"OfficeHook_Conf_IMap_Mailbox\" />\n </Typography>\n <InputNumber\n control={control}\n name={'imapPort'}\n width={'400'}\n placeholder={intl.formatMessage({ id: 'OfficeHook_Conf_IMap_Port' })}\n rules={{ required: true }}\n />\n <SelectProvider\n label=\"OfficeHook_Conf_Select_Connection_Security\"\n initialValue={imapConnectionSecurityOptions[0]}\n options={imapConnectionSecurityOptions}\n handleChange={(value) =>\n setValue('imapConnectionSecurity', value as ValueOf<typeof ImapConnection>)\n }\n />\n <InputText\n control={control}\n name={'imapMailbox'}\n width={'400'}\n placeholder={intl.formatMessage({ id: 'OfficeHook_Conf_IMap_Mailbox' })}\n rules={{ required: true }}\n />\n </UISection>\n <UISection>\n <Typography size={'l'}>\n <FormattedMessage id=\"OfficeHook_Conf_CalDav_Calendar\" />\n </Typography>\n <InputText\n control={control}\n name={'calDavCalendar'}\n width={'400'}\n placeholder={intl.formatMessage({ id: 'OfficeHook_Conf_CalDav_Calendar' })}\n rules={{ required: true }}\n />\n </UISection>\n <UISection>\n <Typography size={'l'}>\n <FormattedMessage id=\"OfficeHook_Conf_CardDav_Address_Book\" />\n </Typography>\n <InputText\n control={control}\n name={'cardDavAddressBook'}\n width={'400'}\n placeholder={intl.formatMessage({ id: 'OfficeHook_Conf_CardDav_Address_Book' })}\n rules={{ required: true }}\n />\n </UISection>\n </UIForm>\n <Button\n label={intl.formatMessage({ id: 'OfficeHook_Conf_Prompt_Submit' })}\n loader={isPending}\n disabled={isPending || providerList.length === 0 || !isValid}\n onClick={handleSubmit}\n />\n </>\n )}\n </ModalContent>\n </ModalLayout>\n </>\n );\n};\n\nconst SelectProvider = ({\n label,\n initialValue,\n options,\n handleChange,\n}: {\n label: string;\n initialValue: { label: string; value: string };\n options: { label: string; value: string }[];\n handleChange: (value: string) => void;\n}) => {\n const { control, watch } = useForm<{ provider: { label: string; value: string } }>({\n defaultValues: {\n provider: initialValue,\n },\n criteriaMode: 'all',\n });\n\n useEffect(() => {\n const subscription = watch((data) => {\n if (!data.provider || !data.provider.value) return;\n handleChange(data.provider.value);\n });\n return () => subscription.unsubscribe();\n }, [watch, handleChange]);\n\n return (\n <InputSelectExtended\n label={label}\n name=\"provider\"\n options={options ?? []}\n getValue={(o) => o.value}\n getLabel=\"label\"\n getSearch=\"label\"\n control={control}\n rules={{ required: true }}\n />\n );\n};\n","import jApi from 'jamespot-user-api';\nimport React from 'react';\nimport styled from 'styled-components';\nimport { JRCButtonDropdownOptionProps } from 'jamespot-react-components';\nimport { officeConfigurationInitialState } from '../components/OfficeConfigurationPrompt';\n\nimport { useIntl } from 'react-intl';\nimport { useDispatch } from 'react-redux';\nimport { Widget } from 'jamespot-front-business';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\nimport { WidgetHeader } from '../components/WidgetHeader';\n\nconst ButtonDropdown = commonComponentsRegistry.getLazyComponent('ButtonDropdown');\nconst Tooltip = commonComponentsRegistry.getLazyComponent('Tooltip');\n\nexport const UIDropdown = styled.div`\n margin-right: ${(props) => props.theme.space.sm}px;\n button {\n background: ${(props) => props.theme.color.white};\n }\n`;\n\nexport const WidgetContactCardDavHeader = ({\n uniqid,\n isConfigurationValid = false,\n handleLogout,\n}: {\n uniqid: string;\n isConfigurationValid: boolean;\n handleLogout: () => void;\n}) => {\n const intl = useIntl();\n const dispatch = useDispatch();\n const onLogout = () => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: true }));\n jApi.office.setConfiguration(officeConfigurationInitialState).finally(handleLogout);\n };\n\n const options: JRCButtonDropdownOptionProps[] = [\n { label: intl.formatMessage({ id: 'WIDGET_Prompt_Logout' }), onClick: onLogout },\n ];\n\n return (\n <WidgetHeader\n uniqid={uniqid}\n dropdown={() => {\n return (\n isConfigurationValid && (\n <UIDropdown>\n <Tooltip\n position={'left'}\n description={intl.formatMessage({ id: 'WIDGET_Prompt_Dropdown' })}>\n <ButtonDropdown\n small\n smallOpenDirection=\"left\"\n options={options}\n icon={'icon-cogwheel'}\n label={''}\n color=\"primary\"\n variant=\"outlined\"\n />\n </Tooltip>\n </UIDropdown>\n )\n );\n }}\n />\n );\n};\n","import jApi, {\n DavAddressBookContact,\n WIDGET_LEVEL_1,\n WIDGET_LEVEL_3,\n WidgetContactCardDavType,\n WidgetDisplayMode,\n WidgetWrapperLevel,\n} from 'jamespot-user-api';\nimport { Toast, Widget } from 'jamespot-front-business';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { officeConfigurationInitialState, OfficeConfigurationPrompt } from './components/OfficeConfigurationPrompt';\nimport { WidgetContactCardDavHeader } from './WidgetContactCardDav/WidgetContactCardDavHeader';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { WidgetScroll } from './components/WidgetScroll';\nimport { WidgetStylePadding } from './components/WidgetStylePadding';\nimport { useAppSelector, useAppDispatch } from '../../../redux/store';\n\nconst WidgetContactCardDav = commonComponentsRegistry.getLazyComponent('WidgetContactCardDav');\n\nexport type JRCWidgetContactCardDavProps = {\n widget: WidgetContactCardDavType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n levelFallback?: (level: WidgetWrapperLevel, url: string) => React.ReactNode | undefined;\n};\n\nconst REFRESH_INTERVAL = 4000;\n\nexport const JRCWidgetContactCardDavWrapper = ({ widget, mode, levelFallback }: JRCWidgetContactCardDavProps) => {\n const { uniqid } = widget;\n const dispatch = useAppDispatch();\n const [isConfigurationValid, setIsConfigurationValid] = useState<boolean | undefined>(undefined);\n const [url, setUrl] = useState<string | undefined>(undefined);\n const [doInterval, setDoInterval] = useState<boolean>(false);\n const level = useAppSelector((state) => Widget.selectors.selectWidgetLevel(state, uniqid), shallowEqual);\n const [list, setList] = useState<DavAddressBookContact[]>([]);\n\n const handleLogout = useCallback(\n (err?: any, reload?: boolean) => {\n if (err && err.error === 400) {\n jApi.office.setConfiguration(officeConfigurationInitialState);\n }\n if (reload) {\n window.location.reload();\n return;\n }\n\n setIsConfigurationValid(false);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true, loading: false }));\n },\n [dispatch, uniqid],\n );\n\n const handleLogin = useCallback(\n (isValid: boolean) => {\n setIsConfigurationValid(isValid);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true }));\n },\n [dispatch, uniqid],\n );\n\n const handleLoading = useCallback(\n (loading: boolean) => dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading })),\n [uniqid, dispatch],\n );\n\n const fetchProviderUrls = useCallback(() => {\n jApi.office\n .getProviderBaseUrls()\n .then(({ result }) => {\n setUrl(result.dav_address_book_url);\n })\n .finally(() => handleLoading(false));\n }, [handleLoading]);\n\n const fetchData = useCallback(() => {\n jApi.office\n .davAddressBookGetContacts({ limit: 10 })\n .then(({ result }) => {\n setList(result);\n setDoInterval(true);\n })\n .catch(() => {\n dispatch(Toast.actions.error({ label: 'PLUGIN_Manager_Connection_Error' }));\n setIsConfigurationValid(false);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true, loading: false }));\n })\n .finally(() => handleLoading(false));\n }, [handleLoading, dispatch, uniqid]);\n\n useEffect(() => {\n if (!doInterval) return;\n if (!isConfigurationValid) return;\n if (level !== WIDGET_LEVEL_3) return;\n const interval = setInterval(fetchData, REFRESH_INTERVAL);\n return () => clearInterval(interval);\n }, [isConfigurationValid, fetchData, doInterval, level]);\n\n useEffect(() => {\n handleLoading(true);\n jApi.office\n .isConfigurationValid()\n .then(({ result }) => handleLogin(result))\n .catch(handleLogout)\n .finally(() => handleLoading(false));\n }, [handleLogin, level, fetchProviderUrls, handleLoading, handleLogout]);\n\n useEffect(() => {\n if (!isConfigurationValid) return;\n if (level === WIDGET_LEVEL_1) {\n handleLoading(true);\n fetchProviderUrls();\n return;\n }\n fetchData();\n }, [isConfigurationValid, fetchProviderUrls, handleLoading, fetchData, level]);\n\n if (isConfigurationValid && level && level !== WIDGET_LEVEL_3 && levelFallback) {\n return <>{levelFallback(level, url ?? '')}</>;\n }\n\n return (\n <WidgetScroll\n header={() => {\n return (\n <>\n <WidgetContactCardDavHeader\n uniqid={uniqid}\n isConfigurationValid={isConfigurationValid !== undefined && isConfigurationValid === true}\n handleLogout={() => handleLogout(undefined, true)}\n />\n </>\n );\n }}\n scrollable={() => {\n return (\n <WidgetStylePadding uniqid={uniqid}>\n {isConfigurationValid && <WidgetContactCardDav contactCardList={list} />}\n {isConfigurationValid === undefined && <></>}\n {isConfigurationValid !== undefined && isConfigurationValid === false && mode === 'view' && (\n <OfficeConfigurationPrompt />\n )}\n </WidgetStylePadding>\n );\n }}\n />\n );\n};\n","import jApi from 'jamespot-user-api';\nimport React from 'react';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\nimport { JRCButtonDropdownOptionProps } from 'jamespot-react-components';\nimport { officeConfigurationInitialState } from '../components/OfficeConfigurationPrompt';\n\nimport { useDispatch } from 'react-redux';\nimport { Widget } from 'jamespot-front-business';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\nimport { WidgetHeader } from '../components/WidgetHeader';\n\nconst ButtonDropdown = commonComponentsRegistry.getLazyComponent('ButtonDropdown');\nconst Tooltip = commonComponentsRegistry.getLazyComponent('Tooltip');\n\nexport const UIDropdown = styled.div`\n margin-right: ${(props) => props.theme.space.sm}px;\n button {\n background: ${(props) => props.theme.color.white};\n }\n`;\n\nexport const WidgetCalendarCalDavHeader = ({\n uniqid,\n isConfigurationValid = false,\n handleLogout,\n}: {\n uniqid: string;\n isConfigurationValid: boolean;\n handleLogout: () => void;\n}) => {\n const intl = useIntl();\n const dispatch = useDispatch();\n const onLogout = () => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: true }));\n jApi.office.setConfiguration(officeConfigurationInitialState).finally(handleLogout);\n };\n\n const options: JRCButtonDropdownOptionProps[] = [\n { label: intl.formatMessage({ id: 'WIDGET_Prompt_Logout' }), onClick: onLogout },\n ];\n\n return (\n <WidgetHeader\n uniqid={uniqid}\n dropdown={() => {\n return (\n isConfigurationValid && (\n <UIDropdown>\n <Tooltip\n position={'left'}\n description={intl.formatMessage({ id: 'WIDGET_Prompt_Dropdown' })}>\n <ButtonDropdown\n small\n smallOpenDirection=\"left\"\n options={options}\n icon={'icon-cogwheel'}\n label={''}\n color=\"primary\"\n variant=\"outlined\"\n />\n </Tooltip>\n </UIDropdown>\n )\n );\n }}\n />\n );\n};\n","import { Toast, Widget } from 'jamespot-front-business';\nimport { Utils } from 'jamespot-react-components';\nimport jApi, {\n DavCalendarEvent,\n WIDGET_LEVEL_1,\n WIDGET_LEVEL_3,\n WidgetCalendarCalDavType,\n WidgetDisplayMode,\n WidgetWrapperLevel,\n} from 'jamespot-user-api';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { officeConfigurationInitialState, OfficeConfigurationPrompt } from './components/OfficeConfigurationPrompt';\nimport { WidgetScroll } from './components/WidgetScroll';\nimport { WidgetStylePadding } from './components/WidgetStylePadding';\nimport { WidgetCalendarCalDavHeader } from './WidgetCalendarCalDav/WidgetCalendarCalDavHeader';\n\nconst WidgetCalendarCalDav = commonComponentsRegistry.getLazyComponent('WidgetCalendarCalDav');\n\nexport type JRCWidgetCalendarCalDavWrapperProps = {\n widget: WidgetCalendarCalDavType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n levelFallback?: (level: WidgetWrapperLevel, url: string) => React.ReactNode | undefined;\n};\n\nconst REFRESH_INTERVAL = 60 * 1000;\n\nexport const JRCWidgetCalendarCalDavWrapper = ({\n widget,\n mode,\n levelFallback,\n}: JRCWidgetCalendarCalDavWrapperProps) => {\n const { uniqid } = widget;\n const dispatch = useAppDispatch();\n const [isConfigurationValid, setIsConfigurationValid] = useState<boolean | undefined>(undefined);\n const [doInterval, setDoInterval] = useState<boolean>(false);\n const level = useAppSelector((state) => Widget.selectors.selectWidgetLevel(state, uniqid), shallowEqual);\n\n const [url, setUrl] = useState<string | undefined>(undefined);\n const [list, setList] = useState<DavCalendarEvent[]>([]);\n\n const handleLogout = useCallback(\n (err?: any, reload?: boolean) => {\n if (err && err.error === 400) {\n jApi.office.setConfiguration(officeConfigurationInitialState);\n }\n if (reload) {\n window.location.reload();\n return;\n }\n\n setIsConfigurationValid(false);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true, loading: false }));\n },\n [dispatch, uniqid],\n );\n\n const handleLogin = useCallback(\n (isValid: boolean) => {\n setIsConfigurationValid(isValid);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true }));\n },\n [dispatch, uniqid],\n );\n\n const handleLoading = useCallback(\n (loading: boolean) => dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading })),\n [uniqid, dispatch],\n );\n\n const fetchProviderUrls = useCallback(() => {\n jApi.office\n .getProviderBaseUrls()\n .then(({ result }) => {\n setUrl(result.dav_calendar_url);\n })\n .finally(() => handleLoading(false));\n }, [handleLoading]);\n\n const fetchData = useCallback(() => {\n const now = new Date();\n const nextMonth = Utils.date.addMonth(new Date(now));\n\n jApi.office\n .davCalendarGetEvents({\n limit: 10,\n dateStart: Utils.date.formatDateTime(now),\n dateEnd: Utils.date.formatDateTime(nextMonth),\n })\n .then(({ result }) => {\n setList(result);\n setDoInterval(true);\n })\n .catch(() => {\n dispatch(Toast.actions.error({ label: 'PLUGIN_Manager_Connection_Error' }));\n setIsConfigurationValid(false);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true, loading: false }));\n })\n .finally(() => handleLoading(false));\n }, [handleLoading, dispatch, uniqid]);\n\n useEffect(() => {\n if (!doInterval) return;\n if (!isConfigurationValid) return;\n if (level !== WIDGET_LEVEL_3) return;\n const interval = setInterval(fetchData, REFRESH_INTERVAL);\n return () => clearInterval(interval);\n }, [isConfigurationValid, fetchData, doInterval, level]);\n\n useEffect(() => {\n handleLoading(true);\n jApi.office\n .isConfigurationValid()\n .then(({ result }) => handleLogin(result))\n .catch(handleLogout);\n }, [handleLogout, handleLoading, handleLogin]);\n\n useEffect(() => {\n if (!isConfigurationValid) return;\n if (level === WIDGET_LEVEL_1) {\n handleLoading(true);\n fetchProviderUrls();\n return;\n }\n fetchData();\n }, [isConfigurationValid, fetchProviderUrls, handleLoading, fetchData, level]);\n\n if (isConfigurationValid && level && level !== WIDGET_LEVEL_3 && levelFallback) {\n return <>{levelFallback(level, url ?? '')}</>;\n }\n\n return (\n <WidgetScroll\n header={() => {\n return (\n <>\n <WidgetCalendarCalDavHeader\n uniqid={uniqid}\n isConfigurationValid={isConfigurationValid !== undefined && isConfigurationValid === true}\n handleLogout={() => handleLogout(undefined, true)}\n />\n </>\n );\n }}\n scrollable={() => {\n return (\n <WidgetStylePadding uniqid={uniqid}>\n {isConfigurationValid && <WidgetCalendarCalDav calendarListEvent={list} />}\n {isConfigurationValid === undefined && <></>}\n {isConfigurationValid !== undefined && isConfigurationValid === false && mode === 'view' && (\n <OfficeConfigurationPrompt />\n )}\n </WidgetStylePadding>\n );\n }}\n />\n );\n};\n","import jApi from 'jamespot-user-api';\nimport { Widget } from 'jamespot-front-business';\nimport React from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\nimport { JRCButtonDropdownOptionProps } from 'jamespot-react-components';\nimport { officeConfigurationInitialState } from '../components/OfficeConfigurationPrompt';\nimport { useAppSelector, useAppDispatch } from '../../../../redux/store';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\nimport { WidgetHeader } from '../components/WidgetHeader';\n\nconst ButtonDropdown = commonComponentsRegistry.getLazyComponent('ButtonDropdown');\nconst Tooltip = commonComponentsRegistry.getLazyComponent('Tooltip');\n\nexport const UIDropdown = styled.div`\n margin-right: ${(props) => props.theme.space.sm}px;\n button {\n background: ${(props) => props.theme.color.white};\n }\n`;\n\nexport const UICount = styled.div<{ color: string }>`\n font-size: ${(props) => props.theme.size.sm + 4}px;\n color: ${(props) => props.color};\n`;\n\nexport const WidgetEmailsImapHeader = ({\n uniqid,\n isConfigurationValid = false,\n handleLogout,\n}: {\n uniqid: string;\n isConfigurationValid: boolean;\n handleLogout: () => void;\n}) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n\n const count = useAppSelector((state) => Widget.selectors.selectWidgetChipCount(state, uniqid), shallowEqual);\n\n const onLogout = () => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: true }));\n jApi.office.setConfiguration(officeConfigurationInitialState).finally(handleLogout);\n };\n\n const options: JRCButtonDropdownOptionProps[] = [\n { label: intl.formatMessage({ id: 'WIDGET_Prompt_Logout' }), onClick: onLogout },\n ];\n\n return (\n <WidgetHeader\n uniqid={uniqid}\n dropdown={() => {\n return (\n isConfigurationValid && (\n <UIDropdown>\n <Tooltip\n position={'left'}\n description={intl.formatMessage({ id: 'WIDGET_Prompt_Dropdown' })}>\n <ButtonDropdown\n small\n smallOpenDirection=\"left\"\n options={options}\n icon={'icon-cogwheel'}\n label={''}\n color=\"primary\"\n variant=\"outlined\"\n />\n </Tooltip>\n </UIDropdown>\n )\n );\n }}\n subHeader={(color: string) => {\n return (\n isConfigurationValid &&\n count !== 0 && (\n <UICount color={color}>\n ({intl.formatMessage({ id: 'WIDGET_Email_IMAP_Unread_Emails' }, { count })})\n </UICount>\n )\n );\n }}\n />\n );\n};\n","import jApi, {\n ImapInboxMail,\n WIDGET_LEVEL_1,\n WIDGET_LEVEL_2,\n WIDGET_LEVEL_3,\n WidgetDisplayMode,\n WidgetEmailsImapType,\n WidgetWrapperLevel,\n} from 'jamespot-user-api';\nimport { Toast, Widget } from 'jamespot-front-business';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { WidgetEmailsImapHeader } from './WidgetEmailsImap/WidgetEmailsImapHeader';\nimport { officeConfigurationInitialState, OfficeConfigurationPrompt } from './components/OfficeConfigurationPrompt';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { WidgetScroll } from './components/WidgetScroll';\nimport { WidgetStylePadding } from './components/WidgetStylePadding';\nimport { useAppSelector, useAppDispatch } from '../../../redux/store';\n\nconst WidgetEmailsImap = commonComponentsRegistry.getLazyComponent('WidgetEmailsImap');\n\nconst REFRESH_INTERVAL = 60 * 1000;\n\nexport type JRCWidgetEmailsImapProps = {\n widget: WidgetEmailsImapType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n levelFallback?: (level: WidgetWrapperLevel, url: string) => React.ReactNode | undefined;\n};\n\nexport const JRCWidgetEmailsImapWrapper = ({ widget, mode, levelFallback }: JRCWidgetEmailsImapProps) => {\n const { uniqid } = widget;\n const dispatch = useAppDispatch();\n const [isConfigurationValid, setIsConfigurationValid] = useState<boolean | undefined>(undefined);\n const [doInterval, setDoInterval] = useState<boolean>(false);\n const [list, setList] = useState<ImapInboxMail[]>([]);\n const [url, setUrl] = useState<string | undefined>(undefined);\n const level = useAppSelector((state) => Widget.selectors.selectWidgetLevel(state, widget.uniqid), shallowEqual);\n\n const handleLogout = useCallback(\n (err?: any, reload?: boolean) => {\n if (err && err.error === 400) {\n jApi.office.setConfiguration(officeConfigurationInitialState);\n }\n if (reload) {\n window.location.reload();\n return;\n }\n\n setIsConfigurationValid(false);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true, loading: false }));\n },\n [dispatch, uniqid],\n );\n\n const fetchUnreadEmailsCount = useCallback(() => {\n jApi.office\n .imapInboxGetUnreadEmailsCount()\n .then(({ result }) => {\n dispatch(Widget.slice.actions.setWidgetChipCount({ uniqid, count: result }));\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true }));\n })\n .catch(handleLogout);\n }, [dispatch, uniqid, handleLogout]);\n\n const handleLoading = useCallback(\n (loading: boolean) => dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading })),\n [uniqid, dispatch],\n );\n\n const fetchProviderUrls = useCallback(() => {\n jApi.office\n .getProviderBaseUrls()\n .then(({ result }) => {\n setUrl(result.imap_inbox_url);\n })\n .finally(() => handleLoading(false));\n }, [handleLoading]);\n\n const handleLogin = useCallback(\n (isValid: boolean) => {\n setIsConfigurationValid(isValid);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true }));\n },\n [dispatch, uniqid],\n );\n\n const fetchData = useCallback(() => {\n jApi.office\n .imapInboxGetEmails({ limit: 10 })\n .then(({ result }) => {\n setList(result);\n setDoInterval(true);\n })\n .catch(() => {\n dispatch(Toast.actions.error({ label: 'PLUGIN_Manager_Connection_Error' }));\n setIsConfigurationValid(false);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true, loading: false }));\n })\n .finally(() => handleLoading(false));\n }, [handleLoading, dispatch, uniqid]);\n\n useEffect(() => {\n if (!doInterval) return;\n if (!isConfigurationValid) return;\n if (level === WIDGET_LEVEL_1) return;\n const interval = setInterval(() => {\n if (level === WIDGET_LEVEL_2) {\n fetchUnreadEmailsCount();\n }\n if (level === WIDGET_LEVEL_3) {\n fetchUnreadEmailsCount();\n fetchData();\n }\n }, REFRESH_INTERVAL);\n return () => clearInterval(interval);\n }, [isConfigurationValid, fetchData, doInterval, fetchUnreadEmailsCount, level]);\n\n useEffect(() => {\n jApi.office\n .isConfigurationValid()\n .then(({ result }) => handleLogin(result))\n .catch(handleLogout);\n }, [handleLogin, handleLogout]);\n\n useEffect(() => {\n if (!isConfigurationValid) return;\n if (level === WIDGET_LEVEL_1) {\n handleLoading(true);\n fetchProviderUrls();\n return;\n }\n if (level === WIDGET_LEVEL_2) {\n handleLoading(true);\n fetchUnreadEmailsCount();\n fetchProviderUrls();\n return;\n }\n\n handleLoading(true);\n fetchUnreadEmailsCount();\n fetchData();\n }, [isConfigurationValid, level, fetchProviderUrls, fetchData, handleLoading, fetchUnreadEmailsCount, dispatch]);\n\n if (isConfigurationValid && level && level !== WIDGET_LEVEL_3 && levelFallback) {\n return <>{levelFallback(level, url ?? '')}</>;\n }\n\n return (\n <WidgetScroll\n header={() => {\n return (\n <>\n <WidgetEmailsImapHeader\n uniqid={uniqid}\n isConfigurationValid={isConfigurationValid !== undefined && isConfigurationValid === true}\n handleLogout={() => handleLogout(undefined, true)}\n />\n </>\n );\n }}\n scrollable={() => {\n return (\n <WidgetStylePadding uniqid={uniqid}>\n {isConfigurationValid === undefined && <></>}\n {isConfigurationValid !== undefined && isConfigurationValid === false && mode === 'view' && (\n <OfficeConfigurationPrompt />\n )}\n {isConfigurationValid && <WidgetEmailsImap emailList={list} />}\n </WidgetStylePadding>\n );\n }}\n />\n );\n};\n","import React, { useMemo, CSSProperties } from 'react';\nimport { Widget } from 'jamespot-front-business';\nimport { shallowEqual } from 'react-redux';\nimport styled, { useTheme } from 'styled-components';\nimport { JRCHtml } from 'jamespot-react-components';\nimport { useAppSelector } from '../../../../redux/store';\n\nexport const CSSWidgetTitle = styled.div`\n padding: ${(props) => props.theme.space.md}px;\n border-bottom: 1px solid ${(props) => props.theme.color.grey1};\n`;\n\nexport const WidgetTitle = ({ uniqid }: { uniqid: string }) => {\n const widgetWrapper = useAppSelector((state) => Widget.selectors.selectWidget(state, uniqid), shallowEqual);\n const theme = useTheme();\n const styles = useAppSelector((state) => Widget.selectors.selectWidgetTitleStyle(state, uniqid), shallowEqual);\n\n const initialValues = useMemo(() => {\n return {\n color: styles && styles['color'] ? String(styles['color']) : theme.color.black,\n backgroundColor:\n styles && styles['background-color'] ? String(styles['background-color']) : theme.color.white,\n fontSize: styles && styles['font-size'] ? `${styles['font-size']}px` : '24px',\n fontWeight: styles && styles['font-weight'] ? String(styles['font-weight']) : 'medium',\n textAlign: styles && styles['text-align'] ? String(styles['text-align']) : 'left',\n };\n }, [styles, theme]);\n\n const title = useMemo(() => {\n return widgetWrapper && typeof widgetWrapper.title === 'string' && widgetWrapper.title.length !== 0\n ? widgetWrapper.title\n : undefined;\n }, [widgetWrapper]);\n\n if (!title) return <></>;\n\n return (\n <CSSWidgetTitle\n style={{\n color: initialValues.color,\n backgroundColor: initialValues.backgroundColor,\n fontSize: initialValues.fontSize,\n fontWeight: initialValues.fontWeight,\n textAlign: initialValues.textAlign as CSSProperties['textAlign'],\n }}>\n <JRCHtml as=\"span\" __html={title} />\n </CSSWidgetTitle>\n );\n};\n","import { Widget } from 'jamespot-front-business';\nimport { JRCInputText } from 'jamespot-react-components';\nimport React, { useEffect } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useIntl } from 'react-intl';\nimport { shallowEqual } from 'react-redux';\nimport { useAppDispatch, useAppSelector } from '../../../../redux/store';\n\nexport const WidgetTitleEdit = ({ uniqid }: { uniqid: string }) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const widgetWrapperTitle = useAppSelector(\n (state) => Widget.selectors.selectWidget(state, uniqid)?.title,\n shallowEqual,\n );\n\n const { control, watch } = useForm({\n defaultValues: { widgetTitle: widgetWrapperTitle },\n criteriaMode: 'all',\n });\n\n useEffect(() => {\n const subscription = watch((data) => {\n dispatch(Widget.slice.actions.updateWidgetWrapper({ uniqid, title: data.widgetTitle }));\n });\n return () => subscription.unsubscribe();\n }, [watch, dispatch, uniqid]);\n\n return (\n <JRCInputText\n name={'widgetTitle'}\n control={control}\n placeholder={intl.formatMessage({ id: 'GLOBAL_Title' })}\n width=\"100%\"\n margin=\"0\"\n />\n );\n};\n","import React, { useCallback, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\nimport { WidgetTitleEdit } from './WidgetTitleEdit';\nimport { JRCIconButton } from 'jamespot-react-components';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { WidgetsName } from 'jamespot-user-api';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\nimport { useAppDispatch } from '../../../../redux/store';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\nconst JRCModalLayout = commonComponentsRegistry.getLazyComponent('ModalLayout');\nconst JRCModalContent = commonComponentsRegistry.getLazyComponent('ModalContent');\n\nexport const CSSModalFooter = styled.div`\n padding: ${(props) => props.theme.space.md}px;\n display: flex;\n flex-direction: row-reverse;\n`;\n\nexport const CSSWidgetHeaderEdit = styled.div`\n flex: 1;\n display: flex;\n flex-direction: row;\n gap: ${(props) => props.theme.space.sm}px;\n padding: ${(props) => props.theme.space.sm}px;\n border-bottom: 1px solid ${(props) => props.theme.color.grey1};\n`;\n\nexport const CSSWidgetHeaderEditTitle = styled.div`\n flex: 1;\n display: flex;\n fieldset:first-of-type {\n margin: 0px !important;\n }\n`;\n\nexport const CSSWidgetHeaderEditActions = styled.div`\n display: flex;\n gap: ${(props) => props.theme.space.sm}px;\n`;\n\nexport const WidgetHeaderEdit = ({\n uniqid,\n name,\n handleOpenEditor,\n}: {\n uniqid: string;\n name: WidgetsName;\n handleOpenEditor?: () => void;\n}) => {\n const dispatch = useAppDispatch();\n const intl = useIntl();\n const [isOpen, setIsOpen] = useState<boolean>(false);\n\n const handleOnClick = useCallback(() => {\n dispatch(\n WidgetEditor.slice.actions.registerEditor({\n uniqid,\n name,\n mode: 'edit',\n }),\n );\n }, [uniqid, dispatch, name]);\n\n const handleRemoveWidget = useCallback(() => {\n dispatch(Widget.slice.actions.flushWidget({ uniqid }));\n }, [uniqid, dispatch]);\n\n return (\n <>\n <CSSWidgetHeaderEdit>\n <CSSWidgetHeaderEditTitle>\n <WidgetTitleEdit uniqid={uniqid} />\n </CSSWidgetHeaderEditTitle>\n <CSSWidgetHeaderEditActions>\n <JRCIconButton\n icon=\"icon-pencil\"\n bg={'grey1'}\n bgHover={'grey2'}\n color={'grey5'}\n iconSize={14}\n onClick={handleOpenEditor ?? handleOnClick}\n title={intl.formatMessage({ id: 'BUTTON_Title_Open_Edit_Panel' })}\n />\n <JRCIconButton\n icon=\"icon-trash\"\n bg={'grey1'}\n bgHover={'grey2'}\n color={'grey5'}\n iconSize={14}\n onClick={() => setIsOpen(true)}\n title={intl.formatMessage({ id: 'BUTTON_Title_Open_Remove_Widget' })}\n />\n </CSSWidgetHeaderEditActions>\n </CSSWidgetHeaderEdit>\n {isOpen && (\n <JRCModalLayout enableClickAwayCloseModal={true} open={isOpen} closeHandler={() => setIsOpen(false)}>\n <JRCModalContent\n overflow={'scroll'}\n title={intl.formatMessage({ id: 'WIDGET_Remove_Widget' })}\n onClickIconClose={() => setIsOpen(false)}>\n {intl.formatMessage({ id: 'WIDGET_Delete_Widget_Confirmation' })}\n </JRCModalContent>\n <CSSModalFooter>\n <JRCButton label={intl.formatMessage({ id: 'GLOBAL_Confirm' })} onClick={handleRemoveWidget} />\n </CSSModalFooter>\n </JRCModalLayout>\n )}\n </>\n );\n};\n","import { useAppSelector } from '../../../redux/store';\nimport { Hook } from 'jamespot-front-business';\nimport { LicenseHookListType } from 'jamespot-user-api';\nimport React, { ReactNode } from 'react';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nconst UILicenseRequired = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${(props) => props.theme.color.orange};\n`;\n\nexport const WidgetLicenseWrapper = ({ children, name }: { children: ReactNode; name: keyof LicenseHookListType }) => {\n const hook = useAppSelector((state) => Hook.selectors.selectHook(state, name));\n const intl = useIntl();\n\n if (hook && !hook.hasLicense) {\n return (\n <UILicenseRequired>\n {intl.formatMessage({ id: 'WIDGET_Missing_License' }, { label: 'label' in hook ? hook.label : '' })}\n </UILicenseRequired>\n );\n }\n\n return <>{children}</>;\n};\n","import React, { ReactNode } from 'react';\n\nimport {\n CombinedWidgetType,\n ensureWidgetArticleAttachmentType,\n ensureWidgetArticleButtonType,\n ensureWidgetArticleGalleryType,\n ensureWidgetArticleImageType,\n ensureWidgetArticleSliderType,\n ensureWidgetArticleTextType,\n ensureWidgetArticleTitleType,\n ensureWidgetCalendarCalDavType,\n ensureWidgetCheckListType,\n ensureWidgetContactCardDavType,\n ensureWidgetDatasourceTableType,\n ensureWidgetEmailsImapType,\n ensureWidgetExcelDatasourceTableType,\n ensureWidgetLuccaAbsenceType,\n ensureWidgetPresenceType,\n ensureWidgetQuickSurveyType,\n WidgetDisplayMode,\n WidgetWrapperLevel,\n} from 'jamespot-user-api';\n\nimport styled from 'styled-components';\n\nexport const CSSWidgetWithTitle = styled.div`\n display: flex;\n flex: 1;\n flex-direction: column;\n`;\n\nimport { JRCWidgetArticleAttachmentWrapper } from './wrapper/JRCWidgetArticleAttachmentWrapper';\nimport { JRCWidgetArticleButtonWrapper } from './wrapper/JRCWidgetArticleButtonWrapper';\nimport { JRCWidgetArticleGalleryWrapper } from './wrapper/JRCWidgetArticleGalleryWrapper';\nimport { JRCWidgetLuccaAbsenceWrapper } from './wrapper/JRCWidgetLuccaAbsenceWrapper';\nimport { JRCWidgetArticleImageWrapper } from './wrapper/JRCWidgetArticleImageWrapper';\nimport { JRCWidgetArticleSliderWrapper } from './wrapper/JRCWidgetArticleSliderWrapper';\nimport { JRCWidgetArticleTextWrapper } from './wrapper/JRCWidgetArticleTextWrapper';\nimport { JRCWidgetArticleTitleWrapper } from './wrapper/JRCWidgetArticleTitleWrapper';\nimport { JRCWidgetCheckListWrapper } from './wrapper/JRCWidgetCheckListWrapper';\nimport { WidgetDatasourceTableWrapper } from './wrapper/JRCWidgetDatasourceTableWrapper';\nimport { WidgetExcelDatasourceTableWrapper } from './wrapper/JRCWidgetExcelDatasourceTableWrapper';\nimport { JRCWidgetPresenceWrapper } from './wrapper/JRCWidgetPresenceWrapper';\nimport { JRCWidgetQuickSurveyWrapper } from './wrapper/JRCWidgetQuickSurveyWrapper';\n\nimport { JRCWidgetContactCardDavWrapper } from './wrapper/JRCWidgetContactCardDavWrapper';\nimport { JRCWidgetCalendarCalDavWrapper } from './wrapper/JRCWidgetCalendarCalDavWrapper';\nimport { JRCWidgetEmailsImapWrapper } from './wrapper/JRCWidgetEmailsImapWrapper';\n\nimport { WidgetTitle } from './wrapper/components/WidgetTitle';\n\nimport { WidgetHeaderEdit } from './wrapper/components/WidgetHeaderEdit';\nimport { WidgetLicenseWrapper } from './wrapper/WidgetLicenseWrapper';\n\nexport const DisplayWidget = ({\n widget,\n width,\n inplace = false,\n mode = 'view',\n onWidgetUpdate,\n cannotDisplayComponent,\n levelFallback,\n dataCy,\n}: {\n widget: CombinedWidgetType;\n width?: number | undefined;\n inplace: boolean;\n mode: WidgetDisplayMode;\n onWidgetUpdate?: () => void;\n cannotDisplayComponent?: (widget: string) => ReactNode;\n levelFallback?: (level: WidgetWrapperLevel, url: string) => ReactNode | undefined;\n dataCy?: string;\n}) => {\n const { name } = widget;\n\n if (ensureWidgetArticleButtonType(widget)) {\n return <JRCWidgetArticleButtonWrapper widget={widget} inplace={inplace} mode={mode} />;\n } else if (ensureWidgetArticleGalleryType(widget)) {\n return <JRCWidgetArticleGalleryWrapper widget={widget} inplace={inplace} mode={mode} />;\n } else if (ensureWidgetLuccaAbsenceType(widget)) {\n return (\n <CSSWidgetWithTitle>\n <WidgetLicenseWrapper name={'LuccaAbsenceHook'}>\n <JRCWidgetLuccaAbsenceWrapper uniqid={widget.uniqid} />\n </WidgetLicenseWrapper>\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetArticleAttachmentType(widget)) {\n return <JRCWidgetArticleAttachmentWrapper widget={widget} inplace={inplace} mode={mode} />;\n } else if (ensureWidgetArticleImageType(widget)) {\n return <JRCWidgetArticleImageWrapper widget={widget} inplace={inplace} mode={mode} />;\n } else if (ensureWidgetArticleSliderType(widget)) {\n return <JRCWidgetArticleSliderWrapper widget={widget} inplace={inplace} mode={mode} width={width ?? 800} />;\n } else if (ensureWidgetArticleTitleType(widget)) {\n return <JRCWidgetArticleTitleWrapper widget={widget} inplace={inplace} mode={mode} dataCy={dataCy} />;\n } else if (ensureWidgetArticleTextType(widget)) {\n return <JRCWidgetArticleTextWrapper widget={widget} inplace={inplace} mode={mode} />;\n } else if (ensureWidgetExcelDatasourceTableType(widget)) {\n return (\n <CSSWidgetWithTitle>\n <WidgetTitle uniqid={widget.uniqid} />\n <WidgetExcelDatasourceTableWrapper {...widget.content} uniqid={widget.uniqid} mode={mode} />\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetDatasourceTableType(widget)) {\n return (\n <CSSWidgetWithTitle>\n <WidgetTitle uniqid={widget.uniqid} />\n <WidgetDatasourceTableWrapper {...widget.content} uniqid={widget.uniqid} mode={mode} />\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetCheckListType(widget, widget.name === 'widget-check-list')) {\n return (\n <CSSWidgetWithTitle>\n {mode === 'edit' ? (\n <WidgetHeaderEdit name={widget.name} uniqid={widget.uniqid} />\n ) : (\n <WidgetTitle uniqid={widget.uniqid} />\n )}\n <JRCWidgetCheckListWrapper\n widget={widget}\n inplace={inplace}\n mode={mode}\n onWidgetUpdate={onWidgetUpdate}\n />\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetPresenceType(widget)) {\n return (\n <CSSWidgetWithTitle>\n {mode === 'edit' ? (\n <WidgetHeaderEdit name={widget.name} uniqid={widget.uniqid} />\n ) : (\n <WidgetTitle uniqid={widget.uniqid} />\n )}\n <JRCWidgetPresenceWrapper widget={widget} inplace={inplace} mode={mode} />\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetQuickSurveyType(widget)) {\n return (\n <CSSWidgetWithTitle>\n {mode === 'edit' ? (\n <WidgetHeaderEdit name={widget.name} uniqid={widget.uniqid} />\n ) : (\n <WidgetTitle uniqid={widget.uniqid} />\n )}\n <JRCWidgetQuickSurveyWrapper widget={widget} inplace={inplace} mode={mode} />\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetCalendarCalDavType(widget)) {\n return (\n <CSSWidgetWithTitle>\n <WidgetLicenseWrapper name={'OfficeHook'}>\n <JRCWidgetCalendarCalDavWrapper\n widget={widget}\n inplace={inplace}\n mode={mode}\n levelFallback={levelFallback}\n />\n </WidgetLicenseWrapper>\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetContactCardDavType(widget)) {\n return (\n <CSSWidgetWithTitle>\n <WidgetLicenseWrapper name={'OfficeHook'}>\n <JRCWidgetContactCardDavWrapper\n widget={widget}\n inplace={inplace}\n mode={mode}\n levelFallback={levelFallback}\n />\n </WidgetLicenseWrapper>\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetEmailsImapType(widget)) {\n return (\n <CSSWidgetWithTitle>\n <WidgetLicenseWrapper name={'OfficeHook'}>\n <JRCWidgetEmailsImapWrapper\n widget={widget}\n inplace={inplace}\n mode={mode}\n levelFallback={levelFallback}\n />\n </WidgetLicenseWrapper>\n </CSSWidgetWithTitle>\n );\n } else {\n return cannotDisplayComponent ? <>{cannotDisplayComponent(name)}</> : <>cannot display widget ({name})</>;\n }\n};\n","import styled from 'styled-components';\n\nexport const CSSWidgetLayer = styled.div<{ opacity: number; backgroundColor: string; pointerEvents: string }>`\n position: absolute;\n inset: 0;\n opacity: ${(props) => props.opacity};\n background-color: ${(props) => props.backgroundColor};\n pointer-events: ${(props) => props.pointerEvents};\n`;\n","import React, { ReactElement, useCallback, useEffect, useRef, useState } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { WidgetVector, WidgetDisplayMode, WidgetKeys } from 'jamespot-user-api';\nimport { WidgetEditor, Widget } from 'jamespot-front-business';\n// eslint-disable-next-line import/no-cycle\nimport WidgetWrapperCore from '../WidgetWrapperCore';\nimport { CSSWidgetLayer } from './WidgetLayer.style';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst BETA_JRCDoubleClick = commonComponentsRegistry.getLazyComponent('DoubleClick');\n\n/*\n Widget layering\n*/\n\nexport const WidgetLayer = ({ uniqid, mode }: { uniqid: string; mode: WidgetDisplayMode }) => {\n const layers = useAppSelector((state) => state.widgets.ids[uniqid].widget.layers, shallowEqual);\n return (\n <>\n {layers?.map((layer, index) => {\n if (mode === 'edit') {\n return <Layer uniqid={layer} key={index} mode={'edit'} />;\n }\n\n return <Layer uniqid={layer} key={index} mode={'edit'} />;\n })}\n </>\n );\n};\n\nconst Layer = ({ uniqid, mode }: { uniqid: string; mode: WidgetDisplayMode }) => {\n const layer = useAppSelector((state) => state.widgets.layers[uniqid]);\n if (mode === 'view') {\n return (\n <CSSWidgetLayer opacity={1} backgroundColor={'transparent'} pointerEvents={'none'}>\n {layer.widgets.map((widgetWrapper, index) => {\n return (\n <LayerWidget\n key={index}\n layerId={layer.uniqid}\n uniqid={widgetWrapper.widget.uniqid}\n mode={'view'}\n />\n );\n })}\n </CSSWidgetLayer>\n );\n }\n\n return (\n <CSSWidgetLayer\n opacity={layer.visible ? 1 : 0}\n backgroundColor={layer.visible ? 'rgba(255,255,255,.1)' : 'transparent'}\n pointerEvents={layer.locked ? 'none' : 'all'}>\n {layer.widgets.map((widgetWrapper, index) => {\n return (\n <LayerWidget\n key={index}\n layerId={layer.uniqid}\n uniqid={widgetWrapper.widget.uniqid}\n mode={'edit'}\n />\n );\n })}\n </CSSWidgetLayer>\n );\n};\n\n/*\n Widget from the layer\n*/\nconst LayerWidget = ({ uniqid, layerId, mode }: { uniqid: string; layerId: string; mode: WidgetDisplayMode }) => {\n const dispatch = useAppDispatch();\n const widgetWrapper = useAppSelector((state) => state.widgets.ids[uniqid], shallowEqual);\n const layer = useAppSelector((state) => state.widgets.layers[layerId]);\n\n if (!widgetWrapper) {\n return <></>;\n }\n\n if (!layer) {\n return <></>;\n }\n\n if (!layer.position) {\n return <></>;\n }\n\n const onDoubleTap = (uniqid: string, name: WidgetKeys) => {\n /*\n Open editor\n */\n dispatch(WidgetEditor.slice.actions.registerEditor({ uniqid, name }));\n };\n\n const onMouseUp = (position: WidgetVector) => {\n dispatch(Widget.slice.actions.updateLayer({ uniqid: layerId, props: { position } }));\n };\n\n if (mode === 'view') {\n return (\n <div style={{ position: 'absolute', top: layer.position.y, left: layer.position.x }}>\n <WidgetWrapperCore\n uniqid={uniqid}\n widget={widgetWrapper}\n mode={mode}\n inplace={true}\n context={'article'}\n />\n </div>\n );\n }\n\n return (\n <DraggableHandler\n position={{ x: layer.position.x, y: layer.position.y }}\n onMouseUp={(position: WidgetVector) => {\n if (\n (layer.position && layer.position.x !== position.x) ||\n (layer.position && layer.position.y !== position.y)\n ) {\n onMouseUp(position);\n }\n }}>\n <BETA_JRCDoubleClick\n onDoubleTap={() => onDoubleTap(widgetWrapper.widget.uniqid, widgetWrapper.widget.name)}>\n <WidgetWrapperCore\n uniqid={uniqid}\n widget={widgetWrapper}\n mode={mode}\n inplace={true}\n context={'article'}\n />\n </BETA_JRCDoubleClick>\n </DraggableHandler>\n );\n};\n\nexport type Vector = {\n x: number;\n y: number;\n};\n\n// TODO: COMBINE WITH THE ONE USED ON COLOR PICKER\n// TODO: COMBINE WITH THE ONE USED ON COLOR PICKER\n// TODO: COMBINE WITH THE ONE USED ON COLOR PICKER\nexport const DraggableHandler = ({\n position,\n children,\n onMouseUp,\n}: {\n position: Vector;\n children: ReactElement;\n onMouseUp: (position: Vector) => void;\n}) => {\n const [mouseIsDown, setMouseDown] = useState<boolean>(false);\n const [mouse, setMouse] = useState<Vector>({ x: 0, y: 0 });\n const [start, setStart] = useState<Vector>({ x: 0, y: 0 });\n const [child, setChild] = useState<Vector>({ x: position.x, y: position.y });\n\n const ref = useRef<HTMLDivElement>(null);\n\n const handleMouseDown = useCallback(\n (event: any) => {\n setMouseDown(true);\n if (ref.current) {\n setMouse({ x: event.nativeEvent.clientX, y: event.nativeEvent.clientY });\n setStart({ x: child.x, y: child.y });\n }\n },\n [child.x, child.y],\n );\n\n const handleMouseMove = useCallback(\n (event: any) => {\n if (mouseIsDown && ref.current) {\n const dx = start.x + (event.clientX - mouse.x);\n const dy = start.y + (event.clientY - mouse.y);\n\n setChild({ x: dx, y: dy });\n }\n },\n [mouse.x, mouse.y, mouseIsDown, start.x, start.y],\n );\n\n const handleMouseUp = useCallback(() => {\n setMouseDown(false);\n onMouseUp({ x: child.x, y: child.y });\n }, [child.x, child.y, onMouseUp]);\n\n useEffect(() => {\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [handleMouseMove, handleMouseUp]);\n\n return (\n <div style={{ position: 'absolute', top: child.y, left: child.x }} ref={ref} onMouseDown={handleMouseDown}>\n {children}\n </div>\n );\n};\n","import React from 'react';\nimport { WidgetKeys } from 'jamespot-user-api';\nimport { Widget } from 'jamespot-front-business';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { useAppSelector } from '../../redux/store';\n\nconst JRCLoader = commonComponentsRegistry.getLazyComponent('Loader');\n\n/*\n Widget state\n*/\n\n//TODO: REFACTORING\nexport const WidgetState = ({ uniqid, inplace }: { name: WidgetKeys; uniqid: string; inplace: boolean }) => {\n const state = useAppSelector((state) => Widget.selectors.selectWidgetState(state, uniqid));\n\n if (state?.loading) {\n return (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n backgroundColor: 'rgba(255,255,255,.7)',\n display: 'flex',\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n }}>\n <JRCLoader />\n </div>\n );\n }\n\n if (state?.hover) {\n return (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n backgroundColor: 'rgba(255,255,255,.7)',\n display: 'flex',\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n }}></div>\n );\n }\n\n if (!state?.initialized && inplace) {\n return <></>;\n }\n\n return <></>;\n};\n","import React, { useCallback } from 'react';\n\nimport { useIntl } from 'react-intl';\n\nimport { WidgetKeys } from 'jamespot-user-api';\n\nimport styled from 'styled-components';\nimport { DashedFocusBorder, JRCHtml } from 'jamespot-react-components';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\n\nimport { useAppDispatch } from '../../redux/store';\n\nexport const WrapperEditMode = styled.button`\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n gap: ${(props) => props.theme.space.md}px;\n color: ${(props) => props.theme.color.primary};\n cursor: pointer;\n opacity: 0;\n border: 1px solid ${(props) => props.theme.color.primary};\n &:hover {\n background-color: ${(props) => props.theme.color.grey2};\n opacity: 0.9;\n }\n\n ${DashedFocusBorder()}\n`;\n\nexport const WidgetWrapperCoreEditHover = ({ uniqid, name }: { uniqid: string; name: WidgetKeys }) => {\n const dispatch = useAppDispatch();\n const intl = useIntl();\n\n const registerEditor = useCallback(() => {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n dispatch(\n WidgetEditor.slice.actions.registerEditor({\n uniqid,\n name,\n }),\n );\n }, [dispatch, uniqid, name]);\n const def = Widget.definition(name);\n\n return (\n <WrapperEditMode onClick={registerEditor}>\n <JRCHtml\n __html={`${intl.formatMessage({ id: 'WIDGET_Set_Widget' })} <b>${intl.formatMessage({\n id: def.label,\n })}</b>`}\n />\n </WrapperEditMode>\n );\n};\n","import React, { useMemo } from 'react';\nimport { Widget } from 'jamespot-front-business';\nimport { shallowEqual } from 'react-redux';\nimport { useAppSelector } from '../../../../redux/store';\nimport styled, { useTheme } from 'styled-components';\n\nexport const UIWrapper = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\n/*\n DO NOT USE PADDING HERE (LOOK AT WIDGET STYLE PADDING COMPONENT)\n*/\nconst WidgetStyle = ({\n uniqid,\n onClick,\n children,\n}: {\n uniqid: string;\n onClick: () => void;\n children: React.ReactNode;\n}) => {\n const theme = useTheme();\n const styles = useAppSelector((state) => Widget.selectors.selectWidgetWrapperStyle(state, uniqid), shallowEqual);\n\n const initialValues = useMemo(() => {\n return {\n color: styles && styles['color'] ? String(styles['color']) : theme.color.black,\n backgroundColor:\n styles && styles['background-color'] ? String(styles['background-color']) : theme.color.white,\n borderRadius: styles && styles['border-radius'] ? `${styles['border-radius']}px` : '0px',\n borderColor: styles['border-color'] ? String(styles['border-color']) : theme.color.black,\n borderWidth: styles['border-width'] ? `${styles['border-width']}px` : '0px',\n borderStyle: styles['border-style'] ? String(styles['border-style']) : 'none',\n };\n }, [styles, theme]);\n\n return (\n <UIWrapper\n onClick={onClick}\n style={{\n color: initialValues.color,\n borderColor: initialValues.borderColor,\n borderStyle: initialValues.borderStyle,\n borderRadius: initialValues.borderRadius,\n borderWidth: initialValues.borderWidth,\n backgroundColor: initialValues.backgroundColor,\n overflow: Number(initialValues.borderRadius) > 0 ? 'hidden' : 'initial',\n }}>\n {children}\n </UIWrapper>\n );\n};\n\nexport const WidgetStyleWrapper = WidgetStyle;\n","import { WidgetKeys, WidgetWrapperLevel } from 'jamespot-user-api';\nimport React from 'react';\nimport { Widget } from 'jamespot-front-business';\nimport { shallowEqual } from 'react-redux';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppSelector } from '../../../redux/store';\nimport styled from 'styled-components';\n\nconst WidgetIcon = commonComponentsRegistry.getLazyComponent('WidgetIcon');\n\nexport const CSSIconAbsoluteA = styled.a<{ color: string | undefined }>`\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n color: ${(props) => (props.color ? props.color : props.theme.color.black)};\n transition: background-color 0.4s;\n &:hover {\n background-color: rgba(0, 0, 0, 0.1);\n color: ${(props) => (props.color ? props.color : props.theme.color.black)};\n }\n`;\n\nexport const JRCWidgetIconWrapper = ({\n uniqid,\n name,\n url,\n level,\n}: {\n uniqid: string;\n name: WidgetKeys;\n url: string;\n level: WidgetWrapperLevel;\n}) => {\n const def = Widget.definition(name);\n const count = useAppSelector(\n (state) => (level === 2 ? Widget.selectors.selectWidgetChipCount(state, uniqid) : 0),\n shallowEqual,\n );\n const styles = useAppSelector((state) => Widget.selectors.selectWidgetWrapperStyle(state, uniqid), shallowEqual);\n\n return (\n <CSSIconAbsoluteA\n href={url}\n target=\"_blank\"\n color={String(styles.color) ?? undefined}\n rel=\"noreferrer\"\n aria-label={def.label}>\n <WidgetIcon count={count} img={def.img} label={def.label} maxValue={999} />\n </CSSIconAbsoluteA>\n );\n};\n","import { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { jCommentList, WidgetContext, WidgetDisplayMode, WidgetWrapperProps } from 'jamespot-user-api';\nimport React, { ReactNode, useCallback, useEffect } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { useComponentVisible } from './hooks';\nimport { DisplayWidget } from './Widget';\n\n// eslint-disable-next-line import/no-cycle\nimport { WidgetLayer } from './WidgetLayer/WidgetLayer';\nimport { WidgetState } from './WidgetState';\nimport { WidgetWrapperCoreEditHover } from './WidgetWrapperCoreEditHover';\n\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\nimport { WidgetStyleWrapper } from './wrapper/components/WidgetStyleWrapper';\nimport { JRCWidgetIconWrapper } from './wrapper/JRCWidgetIconWrapper';\ntype WidgetWrapperCoreProps = {\n uniqid: string;\n widgetObject?: Partial<jCommentList>;\n widget: WidgetWrapperProps;\n inplace?: boolean;\n mode: WidgetDisplayMode;\n width?: number | undefined;\n context: WidgetContext;\n onWidgetUpdate?: () => void;\n cannotDisplayComponent?: (widget: string) => ReactNode;\n dataCy?: string;\n};\n\n/*\n This is a widget wrapper\n*/\nexport const WidgetWrapperCore = ({\n uniqid,\n widgetObject,\n widget,\n inplace = true,\n mode,\n width,\n context,\n onWidgetUpdate,\n cannotDisplayComponent,\n dataCy,\n}: WidgetWrapperCoreProps) => {\n const dispatch = useAppDispatch();\n const widgetWrapper = useAppSelector((state) => Widget.selectors.selectWidget(state, uniqid));\n const indexOrder = useAppSelector((state) => state.widgets.editableMap[uniqid], shallowEqual);\n const currentEditableWidgetId = useAppSelector((state) => state.widgets.currentEditableWidgetId, shallowEqual);\n const isActive = useAppSelector((state) => state.widgets.currentEditableWidgetId === uniqid, shallowEqual);\n const { isComponentVisible, setIsComponentVisible } = useComponentVisible(false);\n\n useEffect(() => {\n if (widgetObject) {\n dispatch(Widget.slice.actions.registerWidgetObject({ uniqid, object: widgetObject }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (widget) {\n /*\n Register widget\n */\n dispatch(Widget.slice.actions.registerWidget({ uniqid, widget, context }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (!isComponentVisible) {\n if (uniqid === currentEditableWidgetId) {\n dispatch(Widget.slice.actions.setEditableWidgetId({ uniqid: undefined }));\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isComponentVisible]);\n\n useEffect(() => {\n if (isComponentVisible !== isActive) {\n setIsComponentVisible(isActive);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isActive]);\n\n const registerEditor = useCallback(() => {\n if (widgetWrapper === undefined || mode === 'view') {\n return;\n }\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n /*\n Register editor\n */\n const { widget } = widgetWrapper;\n dispatch(\n WidgetEditor.slice.actions.registerEditor({\n uniqid: widget.uniqid,\n name: widget.name,\n }),\n );\n }, [dispatch, mode, widgetWrapper]);\n\n if (widgetWrapper === undefined) {\n return <>This widget cannot be displayed</>;\n }\n\n if (inplace && mode !== 'view') {\n return (\n <WidgetStyleWrapper\n uniqid={uniqid}\n onClick={() => {\n setIsComponentVisible(true);\n if (indexOrder) {\n dispatch(Widget.slice.actions.setEditableIndex({ index: indexOrder.index }));\n dispatch(Widget.slice.actions.setEditableWidgetId({ uniqid }));\n }\n }}>\n <DisplayWidget\n dataCy={dataCy}\n width={width}\n widget={{\n ...widgetWrapper.widget,\n ...(widgetWrapper.title && {\n title: widgetWrapper.title,\n }),\n }}\n inplace={inplace}\n mode={mode}\n levelFallback={(level, url) => {\n return (\n level <= 2 && (\n <JRCWidgetIconWrapper\n uniqid={widget.widget.uniqid}\n name={widget.widget.name}\n level={level}\n url={url}\n />\n )\n );\n }}\n />\n <WidgetLayer uniqid={uniqid} mode={mode} />\n <WidgetState name={widgetWrapper.widget.name} uniqid={widgetWrapper.widget.uniqid} inplace={inplace} />\n </WidgetStyleWrapper>\n );\n }\n\n return (\n <WidgetStyleWrapper uniqid={uniqid} onClick={registerEditor}>\n <DisplayWidget\n dataCy={dataCy}\n widget={{\n ...widgetWrapper.widget,\n ...(widgetWrapper.title && {\n title: widgetWrapper.title,\n }),\n }}\n inplace={inplace}\n mode={mode}\n width={width}\n onWidgetUpdate={onWidgetUpdate}\n cannotDisplayComponent={cannotDisplayComponent}\n levelFallback={(level, url) => {\n return (\n level <= 2 && (\n <JRCWidgetIconWrapper\n uniqid={widget.widget.uniqid}\n name={widget.widget.name}\n level={level}\n url={url}\n />\n )\n );\n }}\n />\n <WidgetLayer uniqid={uniqid} mode={mode} />\n {mode === 'edit' && <WidgetWrapperCoreEditHover uniqid={uniqid} name={widget.widget.name} />}\n <WidgetState name={widgetWrapper.widget.name} uniqid={widgetWrapper.widget.uniqid} inplace={inplace} />\n </WidgetStyleWrapper>\n );\n};\n\nexport default WidgetWrapperCore;\n","import styled from 'styled-components';\nexport const CSSCommentsBlocWidgetWrapper = styled.div`\n border-radius: ${(props) => props.theme.space.sm}px;\n border: 1px solid ${(props) => props.theme.color.grey1};\n background-color: ${(props) => props.theme.color.white};\n overflow: hidden;\n`;\n","import { Widget } from 'jamespot-front-business';\nimport { WidgetWrapperProps } from 'jamespot-user-api';\nimport React from 'react';\nimport { useIntl } from 'react-intl';\nimport { shallowEqual } from 'react-redux';\nimport { useAppSelector } from '../../redux/store';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport WidgetWrapperCore from '../widgets/WidgetWrapperCore';\nimport { CSSCommentsBlocWidgetWrapper } from './CommentsBloc.styles';\n\nconst JRCMessage = commonComponentsRegistry.getLazyComponent('Message');\n\nexport const CommentsBlocAddCommentWidgetsWrapper = ({ widgets }: { widgets: WidgetWrapperProps[] }) => {\n const intl = useIntl();\n const flushedWidgets = useAppSelector(Widget.selectors.selectFlushedWidgets, shallowEqual);\n\n return (\n <>\n {widgets\n .filter((el) => !flushedWidgets.includes(el.widget.uniqid))\n .map(\n (widget) =>\n widget &&\n widget.widget && (\n <CSSCommentsBlocWidgetWrapper key={widget.widget.uniqid}>\n <WidgetWrapperCore\n uniqid={widget.widget.uniqid}\n widget={widget}\n inplace\n mode={'edit'}\n cannotDisplayComponent={(widget) => (\n <JRCMessage\n variant={'info'}\n message={intl.formatMessage({ id: 'WIDGET_Cannot_Display' }, { widget })}\n />\n )}\n context={'comment'}\n />\n </CSSCommentsBlocWidgetWrapper>\n ),\n )}\n </>\n );\n};\n","import { Widget } from 'jamespot-front-business';\nimport { jCommentList, WidgetDisplayMode, WidgetWrapperProps } from 'jamespot-user-api';\nimport React from 'react';\nimport { useIntl } from 'react-intl';\nimport { shallowEqual } from 'react-redux';\nimport { useAppSelector } from '../../redux/store';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport WidgetWrapperCore from '../widgets/WidgetWrapperCore';\nimport { CSSCommentsBlocWidgetWrapper } from './CommentsBloc.styles';\n\nconst JRCMessage = commonComponentsRegistry.getLazyComponent('Message');\n\nexport const CommentsBlocCommentWidgetsWrapper = (props: {\n comment: jCommentList;\n widgets: WidgetWrapperProps[];\n mode: WidgetDisplayMode;\n inplace: boolean;\n handleWidgetUpdate: () => void;\n handleWidgetRemove: () => void;\n}) => {\n const intl = useIntl();\n const { widgets, comment, inplace, mode, handleWidgetUpdate } = props;\n const flushedWidgets = useAppSelector(Widget.selectors.selectFlushedWidgets, shallowEqual);\n\n return (\n <>\n {widgets\n .filter((el) => !flushedWidgets.includes(el.widget.uniqid))\n .map(\n (widget) =>\n widget && (\n <CSSCommentsBlocWidgetWrapper key={widget.widget.uniqid}>\n <WidgetWrapperCore\n uniqid={widget.widget.uniqid}\n widgetObject={comment}\n widget={widget}\n inplace={inplace}\n mode={mode}\n onWidgetUpdate={handleWidgetUpdate}\n cannotDisplayComponent={(widget) => {\n return (\n <JRCMessage\n variant={'info'}\n message={intl.formatMessage(\n { id: 'WIDGET_Cannot_Display' },\n { widget },\n )}\n />\n );\n }}\n context={'comment'}\n />\n </CSSCommentsBlocWidgetWrapper>\n ),\n )}\n </>\n );\n};\n","import {\n Application,\n Comment,\n Hook,\n Model,\n Platform,\n TinyMCE,\n Toast,\n UserCurrent,\n Widget,\n} from 'jamespot-front-business';\nimport { DriveOrFilebank } from 'jamespot-react-components';\nimport jApi, { AddCommentParams, jCommentList, UpdateCommentParams, WidgetWrapperProps } from 'jamespot-user-api';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport styled, { useTheme } from 'styled-components';\nimport useCommentRT from '../hooks/useCommentRT';\nimport useCommentsLikeRT from '../hooks/useCommentsLikeRT';\nimport { EditorsPanel } from './widgets/components/WidgetEditorPanel';\nimport { WidgetList } from './widgets/WidgetList/WidgetList';\n\nimport { useMarkdownModal } from '../hooks/useMarkdownModal';\nimport { useAppDispatch, useAppSelector } from '../redux/store';\nimport { commonComponentsRegistry } from '../registry/CommonRegistry';\nimport { getTinyMCEMentionsQueries } from '../utils/tinymce';\nimport { AddReportModal, AddReportModalProps } from './comments/AddReportModal';\nimport { CommentsBlocAddCommentWidgetsWrapper } from './comments/CommentsBlocAddCommentWidgetsWrapper';\nimport { CommentsBlocCommentWidgetsWrapper } from './comments/CommentsBlocCommentWidgetsWrapper';\nimport { MarkdownModal } from './tinymce/extension/MarkdownModal';\n\nconst JRCCommentsBloc = commonComponentsRegistry.getLazyComponent('JRCCommentsBloc');\n\nexport type CommentsBlocProps = {\n articleId: number;\n articleUri: string;\n variant?: 'modal' | 'inline';\n canComment: boolean;\n commentType?: 'comment' | 'commentResponse';\n socialQuestion?: {\n isResolved: boolean;\n responseId?: number;\n canSelectResponse: boolean;\n };\n};\n\nconst CommentsBlocWrapper = styled.div`\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n width: 100%;\n margin-top: 10px;\n`;\n\nexport const CommentsBloc = ({\n articleId,\n variant = 'inline',\n canComment,\n commentType = 'comment',\n socialQuestion,\n articleUri,\n}: CommentsBlocProps) => {\n const intl = useIntl();\n const theme = useTheme();\n const dispatch = useAppDispatch();\n\n const [token, setToken] = useState<string>();\n const [loading, setLoading] = useState(false);\n const [widgets, setWidgets] = useState<WidgetWrapperProps[]>([]);\n\n const [tokenLoading, setTokenLoading] = useState(false);\n\n const currentUser = useAppSelector(UserCurrent.selectors.get);\n const widgetIds = useAppSelector(Widget.selectors.selectWidgets);\n const tinyMCECommonOptions = useAppSelector(TinyMCE.selectors.selectTinyMCECommonOptions);\n const tinyMCEExtendedOptions = useAppSelector(TinyMCE.selectors.selectTinyMCEExtendedOptions);\n const models = useAppSelector(Model.selectors.selectAll);\n const platformConfig = useAppSelector(Platform.selectors.selectPlatformConfig);\n const commentsList = useAppSelector((state) => Comment.selectors.commentList(state, articleId));\n const driveHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'DriveHook'));\n const fileBank = useAppSelector((state) => Application.selectors.selectById(state, 'FileBankHook'));\n const widgetHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'WidgetHook'));\n const [socialQuestionOptions, setSocialQuestionOptions] = useState(socialQuestion);\n const [reportProps, setReportProps] = useState<Omit<AddReportModalProps, 'onClose'> | null>(null);\n const {\n open,\n onInsert,\n close: closeMarkdownModal,\n ext: extMarkdown,\n isActive: isMarkdownActive,\n } = useMarkdownModal();\n\n useCommentRT(articleId);\n\n useCommentsLikeRT(\n commentsList.map((c) => c.id),\n articleId,\n );\n\n const onError = useCallback(\n (message?: string) => {\n dispatch(Toast.actions.error({ label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\n },\n [dispatch, intl],\n );\n\n const onCommentUpdate = async (args: UpdateCommentParams) => {\n const commentToUpdate: jCommentList | undefined = commentsList.find((item) => item.id === args.idComment);\n if (!commentToUpdate) return;\n return jApi.article\n .updateComment({\n idComment: args.idComment,\n description: args.description ?? commentToUpdate.description ?? undefined,\n token: args.token,\n widgets: args.widgets,\n })\n .then(() => {\n dispatch(Comment.actions.fetchComments({ idArticle: articleId }));\n fetchToken();\n })\n .catch((e) => {\n onError(e.errorMsg);\n });\n };\n\n const onCommentDelete = async (idComment: number) => {\n dispatch(Comment.actions.deleteComment({ idComment, idArticle: articleId }));\n };\n\n const onWidgetUpdate = () => {\n dispatch(Comment.actions.fetchComments({ idArticle: articleId }));\n fetchToken();\n };\n\n const fetchToken = useCallback(() => {\n if (!token && !tokenLoading) {\n setTokenLoading(true);\n jApi.network\n .token()\n .then((res) => {\n setToken(res.result);\n setTokenLoading(false);\n\n // set comment token to our widget slice to be able to upload image inside our widgets\n dispatch(Widget.slice.actions.setToken({ token: res.result }));\n })\n .catch((e) => {\n onError(e.errorMsg);\n });\n }\n }, [onError, token, tokenLoading, dispatch]);\n\n const onComment = useCallback(\n async (params: Pick<AddCommentParams, 'content' | 'alertAuthor' | 'sendAlert'>) => {\n if (token) {\n setLoading(true);\n const finalWidget: WidgetWrapperProps[] = Object.keys(widgetIds)\n .map((id) => {\n if (widgets?.some((w) => w.widget.uniqid === id)) {\n return widgetIds[id];\n }\n return null;\n })\n .filter((w): w is WidgetWrapperProps => w !== null);\n\n try {\n // TODO : passer par le store pour avoir une réactivité directe après ajout (confirmée ensuite par retour RT)\n // -> état intermédiaire PENDING à gérer.\n await jApi.article\n .addComment({\n ...params,\n widgets: finalWidget,\n token,\n idArticle: articleId,\n type: commentType,\n })\n .then(() => {\n setWidgets([]);\n });\n fetchToken();\n } catch (e: any) {\n onError(e.errorMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n }\n },\n [articleId, commentType, fetchToken, onError, token, widgetIds, widgets],\n );\n\n useEffect(() => {\n fetchToken();\n }, [fetchToken]);\n\n useEffect(() => {\n dispatch(Comment.actions.fetchComments({ idArticle: articleId }));\n }, [articleId, dispatch]);\n\n useEffect(() => {\n if (!commentsList) {\n return;\n }\n commentsList.forEach((comment) => {\n comment._widgets?.forEach((widget) => {\n dispatch(Widget.slice.actions.registerWidgetObject({ uniqid: widget.widget.uniqid, object: comment }));\n dispatch(\n Widget.slice.actions.registerWidgetObjectRights({\n uniqid: widget.widget.uniqid,\n rights: comment._right,\n }),\n );\n });\n });\n }, [commentsList, dispatch]);\n\n return (\n <>\n {tinyMCECommonOptions && tinyMCEExtendedOptions && (\n <>\n <CommentsBlocWrapper>\n <JRCCommentsBloc\n canComment={canComment}\n loading={loading}\n token={token}\n comments={commentsList}\n onComment={onComment}\n onCommentUpdate={onCommentUpdate}\n onCommentDelete={onCommentDelete}\n isWidgetActive={!!(widgetHook?.isActive && widgetHook?.autorize?.includes('comment'))}\n canCreateWidget={\n !!(\n widgetHook?.isActive &&\n widgetHook?.create &&\n widgetHook?.autorize?.includes('comment')\n )\n }\n widgetListComponent={\n <WidgetList\n mode={'comment'}\n namespace={'comment'}\n onChange={(widget) => {\n setWidgets([widget]); // COMMENT DO NOT SUPPORT MULTI WIDGET\n dispatch(\n Widget.slice.actions.registerWidget({\n uniqid: widget.widget.uniqid,\n widget: widget,\n context: 'comment',\n }),\n );\n setToken(undefined);\n fetchToken();\n }}\n view={'edit'}\n />\n }\n newWidgetsWrapperComponent={<CommentsBlocAddCommentWidgetsWrapper widgets={widgets} />}\n existingWidgetsWrapperComponent={(comment, widgets, mode, inplace = true) => (\n <CommentsBlocCommentWidgetsWrapper\n comment={comment}\n widgets={widgets}\n mode={mode}\n inplace={inplace}\n handleWidgetUpdate={onWidgetUpdate}\n handleWidgetRemove={fetchToken}\n />\n )}\n currentUser={currentUser}\n tinyMCEConfig={{\n commonOptions: {\n ...tinyMCECommonOptions,\n toolbar: tinyMCEExtendedOptions.commentsToolbar,\n },\n mentionsQueries: getTinyMCEMentionsQueries(models, theme, onError),\n }}\n onError={onError}\n highlightFields={platformConfig.userHighlightFields}\n userAccountStatus={platformConfig.userAccountStatus}\n userModel={models.find((m) => m.type === 'user')}\n onGetHashError={(message?: string) =>\n dispatch(\n Toast.actions.error({\n label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }),\n }),\n )\n }\n activeDrives={\n [\n ...(fileBank && driveHook ? ['fileBank'] : []),\n ...Hook.utils.buildDrivesArrayFromObject(driveHook?.drives),\n ] as DriveOrFilebank[]\n }\n variant={variant}\n handlers={{\n drive: jApi.drive,\n filebank: jApi.filebank,\n file: jApi.file,\n user: jApi.user,\n global: jApi.global,\n questionAnswer: jApi.questionAnswer,\n }}\n socialQuestion={\n socialQuestionOptions\n ? {\n ...socialQuestionOptions,\n onSelectResponse: (responseId: number) => {\n setSocialQuestionOptions({\n ...socialQuestionOptions,\n responseId,\n isResolved: true,\n });\n },\n onUnselectResponse: () => {\n setSocialQuestionOptions({\n ...socialQuestionOptions,\n responseId: undefined,\n isResolved: false,\n });\n },\n }\n : undefined\n }\n articleId={articleId}\n additionalExtensions={[extMarkdown]}\n onReport={(commentUri) => setReportProps({ articleId, commentUri, articleUri })}\n />\n <EditorsPanel />\n </CommentsBlocWrapper>\n </>\n )}\n {isMarkdownActive && <MarkdownModal onInsert={onInsert} open={open} close={closeMarkdownModal} />}\n {reportProps && <AddReportModal onClose={() => setReportProps(null)} {...reportProps} />}\n </>\n );\n};\n","import { useEffect, useMemo } from 'react';\nimport { Comment } from 'jamespot-front-business';\nimport socket from '../utils/socket';\nimport { useAppDispatch } from '../redux/store';\n\nconst useCommentsLikeRT = (idComments: number[] | undefined, idArticle: number) => {\n const dispatch = useAppDispatch();\n const reactSocket = useMemo(() => socket, []);\n const rtHandlers = useMemo(\n () => Comment.getCommentsLikeRTHandlers(dispatch, idComments, idArticle),\n [dispatch, idComments, idArticle],\n );\n\n useEffect(() => {\n rtHandlers.forEach((handler) => {\n reactSocket.onMessage(handler.namespace, handler.function, handler.handler);\n });\n return () => {\n rtHandlers.forEach((handler) => {\n reactSocket.offMessage(handler.namespace, handler.function, handler.handler);\n });\n };\n }, [rtHandlers, reactSocket]);\n};\n\nexport default useCommentsLikeRT;\n","import React from 'react';\n\n// FIXME move to j-react-components + display error if dev mode\nexport const Empty = () => <></>;\n","import React, { Suspense } from 'react';\nimport { Outlet } from 'react-router-dom';\nimport { commonComponentsRegistry } from '../registry/CommonRegistry';\n\nconst Container = commonComponentsRegistry.getLazyComponent('Container');\n\nexport const FullPageLayout = () => {\n return (\n <Suspense fallback={<></>}>\n <Container backgroundColor={'white'} mode={'fluid'} flexDirection={'column'}>\n <Outlet />\n </Container>\n </Suspense>\n );\n};\n","import { JTinyMCEExtensionsBuilders } from 'jamespot-react-components';\nimport { JIACapabilities } from 'jamespot-user-api';\nimport { useCallback, useMemo, useState } from 'react';\nimport { useIntl } from 'react-intl';\n\nexport type JiaTextEnhanceQuery = {\n resolve: (value: string | PromiseLike<string>) => void;\n reject: (reason?: any) => void;\n capability: JIACapabilities;\n text: string;\n};\n\nexport const useAI = () => {\n const [query, setQuery] = useState<JiaTextEnhanceQuery | undefined>();\n const intl = useIntl();\n\n const isActive = useMemo(() => {\n return (\n J.hooks?.MagicWandHook?.isActive &&\n J.hooks?.MagicWandHook?.menuItems &&\n J.hooks.MagicWandHook.menuItems.length\n );\n }, []);\n\n const PrepareAndSetQuery = useCallback((query: JiaTextEnhanceQuery) => {\n const internalResolve = (value: string | PromiseLike<string>) => {\n query.resolve(value);\n setQuery(undefined);\n };\n const internalReject = (value: any) => {\n query.reject(value);\n setQuery(undefined);\n };\n setQuery({\n ...query,\n reject: internalReject,\n resolve: internalResolve,\n });\n }, []);\n\n const fetch = useCallback(\n (text: string, capability: JIACapabilities) => {\n return new Promise<string>((resolve, reject) => {\n PrepareAndSetQuery({\n reject,\n resolve,\n text,\n capability,\n });\n });\n },\n [PrepareAndSetQuery],\n );\n\n const AICapabilities = useMemo(() => {\n return {\n develop: (text: string) => fetch(text, 'develop'),\n summarize: (text: string) => fetch(text, 'summarize'),\n tldr: (text: string) => fetch(text, 'tldr'),\n en: (text: string) => fetch(text, 'en'),\n es: (text: string) => fetch(text, 'es'),\n formal: (text: string) => fetch(text, 'formal'),\n funny: (text: string) => fetch(text, 'funny'),\n };\n }, [fetch]);\n\n const ext = useMemo(() => JTinyMCEExtensionsBuilders.jia(AICapabilities, intl), [intl, AICapabilities]);\n\n return { query, ext, isActive } as const;\n};\n","import { Model, Toast } from 'jamespot-front-business';\nimport React, { useCallback, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport { useTheme } from 'styled-components';\nimport { JRCInputTinyMCEProps } from 'jamespot-react-components';\nimport { FieldValues } from 'react-hook-form';\nimport { AIModal } from './extension/AIModal';\nimport { useMarkdownModal } from '../../hooks/useMarkdownModal';\nimport { MarkdownModal } from './extension/MarkdownModal';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { tinymceCommonOptions } from '../../initTinymce';\nimport { getTinyMCEMentionsQueries } from '../../utils/tinymce';\nimport { useAI } from '../../hooks/useAI';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\n\nconst JRCInputTinyMCE = commonComponentsRegistry.getLazyComponent('InputTinyMCE');\n\nexport type JRCInputTinyMCEWithExtProps<T extends FieldValues> = Omit<\n JRCInputTinyMCEProps<T>,\n 'commonOptions' | 'mentionsQueries' | 'additionalExtensions'\n>;\n\nexport const JRCInputTinyMCEWithExt = <T extends FieldValues = FieldValues>(props: JRCInputTinyMCEWithExtProps<T>) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const theme = useTheme();\n const models = useAppSelector(Model.selectors.selectAll);\n const { query, ext: extAI, isActive: isAIActive } = useAI();\n const {\n open,\n onInsert,\n close: closeMarkdownModal,\n ext: extMarkdown,\n isActive: isMarkdownActive,\n } = useMarkdownModal();\n\n const extArray = useMemo(() => {\n return [...(isMarkdownActive ? [extMarkdown] : []), ...(isAIActive ? [extAI] : [])];\n }, [extAI, extMarkdown, isAIActive, isMarkdownActive]);\n\n const onMentionsQueryError = useCallback(\n (message?: string) => {\n dispatch(Toast.actions.error({ label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\n },\n [dispatch, intl],\n );\n\n const tinyMentionsQueries = useMemo(() => {\n return getTinyMCEMentionsQueries(models, theme, onMentionsQueryError);\n }, [models, onMentionsQueryError, theme]);\n\n const commonOptions = useMemo(() => tinymceCommonOptions, []);\n\n return (\n <>\n {commonOptions && (\n <JRCInputTinyMCE\n commonOptions={commonOptions}\n additionalExtensions={extArray}\n mentionsQueries={tinyMentionsQueries}\n {...props}\n />\n )}\n {isAIActive && <AIModal query={query} />}\n {isMarkdownActive && <MarkdownModal onInsert={onInsert} open={open} close={closeMarkdownModal} />}\n </>\n );\n};\n","import { Model, Toast } from 'jamespot-front-business';\nimport React, { useCallback, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport { useTheme } from 'styled-components';\nimport { JRCInputTinyMCERawProps } from 'jamespot-react-components';\nimport { AIModal } from './extension/AIModal';\nimport { MarkdownModal } from './extension/MarkdownModal';\nimport { useMarkdownModal } from '../../hooks/useMarkdownModal';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { tinymceCommonOptions } from '../../initTinymce';\nimport { getTinyMCEMentionsQueries } from '../../utils/tinymce';\nimport { useAI } from '../../hooks/useAI';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\n\nconst JRCInputTinyMCERaw = commonComponentsRegistry.getLazyComponent('InputTinyMCERaw');\n\nexport type JRCInputTinyMCEWithExtProps = Omit<\n JRCInputTinyMCERawProps,\n 'commonOptions' | 'mentionsQueries' | 'additionalExtensions'\n>;\n\nexport const JRCInputTinyMCEWithExtRaw = (props: JRCInputTinyMCEWithExtProps) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const theme = useTheme();\n const models = useAppSelector(Model.selectors.selectAll);\n const { query, ext: extAI, isActive: isAIActive } = useAI();\n const {\n open,\n onInsert,\n close: closeMarkdownModal,\n ext: extMarkdown,\n isActive: isMarkdownActive,\n } = useMarkdownModal();\n\n const extArray = useMemo(() => {\n return [...(isMarkdownActive ? [extMarkdown] : []), ...(isAIActive ? [extAI] : [])];\n }, [extAI, extMarkdown, isAIActive, isMarkdownActive]);\n\n const onMentionsQueryError = useCallback(\n (message?: string) => {\n dispatch(Toast.actions.error({ label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\n },\n [dispatch, intl],\n );\n\n const tinyMentionsQueries = useMemo(() => {\n return getTinyMCEMentionsQueries(models, theme, onMentionsQueryError);\n }, [models, onMentionsQueryError, theme]);\n\n const commonOptions = useMemo(() => tinymceCommonOptions, []);\n\n return (\n <>\n {commonOptions && (\n <JRCInputTinyMCERaw\n commonOptions={commonOptions}\n additionalExtensions={extArray}\n mentionsQueries={tinyMentionsQueries}\n {...props}\n />\n )}\n {isAIActive && <AIModal query={query} />}\n {isMarkdownActive && <MarkdownModal onInsert={onInsert} open={open} close={closeMarkdownModal} />}\n </>\n );\n};\n","import React from 'react';\r\nimport { FormattedMessage, useIntl } from 'react-intl';\r\nimport { Control } from 'react-hook-form';\r\nimport jamespot from 'jamespot-user-api';\r\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\r\n\r\nconst JRCInputAudience = commonComponentsRegistry.getLazyComponent('InputAudience');\r\nconst JRCMessage = commonComponentsRegistry.getLazyComponent('Message');\r\nconst JRCModal = commonComponentsRegistry.getLazyComponent('Modal');\r\n\r\nexport type ModalAudienceProps = {\r\n open: boolean;\r\n closeHandler: () => void;\r\n title?: string;\r\n control: Control<any>;\r\n warningMessage?: string;\r\n onSubmit: () => void;\r\n name?: string;\r\n};\r\n\r\nexport const ModalAudience = ({\r\n open,\r\n closeHandler,\r\n title,\r\n control,\r\n warningMessage,\r\n onSubmit,\r\n name = 'publishTo',\r\n}: ModalAudienceProps) => {\r\n const intl = useIntl();\r\n return (\r\n <JRCModal\r\n open={open}\r\n closeHandler={closeHandler}\r\n title={title ?? intl.formatMessage({ id: 'GLOBAL_Audience' })}\r\n buttons={[\r\n {\r\n children: <FormattedMessage id=\"GLOBAL_Cancel\" />,\r\n color: 'cancel',\r\n clickHandler: () => closeHandler(),\r\n },\r\n {\r\n children: <FormattedMessage id=\"GLOBAL_Continue\" />,\r\n color: 'danger',\r\n clickHandler: () => {\r\n closeHandler();\r\n onSubmit();\r\n },\r\n },\r\n ]}>\r\n <JRCMessage\r\n variant={'warning'}\r\n message={warningMessage ?? intl.formatMessage({ id: 'FORM_Audience_Empty' })}\r\n />\r\n <JRCInputAudience\r\n asyncPromise={(inputValue: string) => jamespot.audience.autocomplete(inputValue)}\r\n searchable={true}\r\n control={control}\r\n multiple={true}\r\n placeholder={intl.formatMessage({ id: 'GLOBAL_Audience' })}\r\n name={name}\r\n />\r\n </JRCModal>\r\n );\r\n};\r\n","import React, { Suspense, useEffect, useMemo, useState } from 'react';\nimport { Outlet, matchPath, useLocation } from 'react-router-dom';\nimport { useIntl } from 'react-intl';\nimport { commonComponentsRegistry } from '../registry/CommonRegistry';\nimport { TwoColLayoutProps } from './types';\n\nconst Container = commonComponentsRegistry.getLazyComponent('Container');\nconst AppColumn = commonComponentsRegistry.getLazyComponent('AppColumn');\nconst MainColumn = commonComponentsRegistry.getLazyComponent('MainColumn');\n\nexport function TwoColLayout({\n extensionRoute,\n routes,\n description,\n mode = 'center',\n mainColumnProps,\n}: TwoColLayoutProps) {\n const intl = useIntl();\n const { pathname } = useLocation();\n\n const ROUTES_ARRAY = useMemo(() => Object.values(routes), [routes]);\n const [activeTab, setActiveTab] = useState(ROUTES_ARRAY?.[0]?.key);\n\n const tabs = ROUTES_ARRAY.map((tab) => ({\n ...tab,\n label: intl.formatMessage({ id: tab.label }),\n href: tab.absolutePath ? tab.path : `/ng/rr/${extensionRoute}/${tab.path}`,\n group: tab.group ? intl.formatMessage({ id: tab.group }) : undefined,\n }));\n\n useEffect(() => {\n const activeRoute = ROUTES_ARRAY.find((route) => {\n if (`/ng/rr/${extensionRoute}/${route.path}` === pathname) {\n return true;\n }\n\n return route.paths?.reduce<boolean>((previousValue: boolean, currentValue: string) => {\n const pattern = `/ng/rr/${extensionRoute}/${currentValue}`;\n const isMatch = matchPath(pattern, pathname) !== null;\n return previousValue || isMatch;\n }, false);\n });\n if (activeRoute) setActiveTab(activeRoute.key);\n }, [pathname, ROUTES_ARRAY, extensionRoute]);\n\n return (\n <Suspense fallback={<></>}>\n <Container mode={mode}>\n <AppColumn mode={mode} description={description} tabs={tabs} activeTab={activeTab || ''} />\n <MainColumn mode={mode} flex={true} {...mainColumnProps}>\n <Outlet />\n </MainColumn>\n </Container>\n </Suspense>\n );\n}\n"],"names":["JRCIcon","getLazyComponent","Avatar","props","theme","useTheme","networkPublic","selectors","selectNetworkPublic","uri","name","size","color","primary","variant","JRCAvatar","JRCFlexBox","JRCModalContent","JRCModalLayout","JRCStyledHref","JRCTooltip","JRCTypography","AudienceWrapper","AvatarLink","white","lavender","overlap","Audience","audience","limit","intl","useIntl","isModalOpen","setModalOpen","useState","splice","map","item","index","href","_url","target","key","id","description","undefined","title","position","alt","timestamp","dateModified","Utils","date","strToTimestamp","focusable","length","onClick","closeHandler","enableClickAwayCloseModal","open","maxHeight","formatMessage","overflow","onClickIconClose","i","y","gap","space","l","type","JRCLoader","TextWrapper","md","loadingResponse","response","loading","error","AIModal","query","setResponse","sendAIRequest","useCallback","textEnhancement","text","capacity","capability","then","errorMsg","textResponse","result","catch","_err","useEffect","trim","zIndex","tinyMCEModal","reject","buttons","children","clickHandler","resolve","isFull","align","StretchContainer","css","Container","stretch","Form","FormElm","forwardRef","ref","onSubmit","dataCy","FieldsetWrapper","DisplayForm","onInit","formRef","useRef","configuration","defaultValues","useDisplay","fields","forceMandatory","isInit","setIsInit","useForm","criteriaMode","handleSubmit","control","reset","formFn","formatValuesForSubmit","values","toRet","Object","keys","forEach","k","widget","find","c","v","join","useImperativeHandle","current","scrollTo","getFormattedValues","getValues","Input","conf","readOnly","extraInputs","ModalForm","Loader","Icon","Typography","Ellipsis","StyledHref","ContentPreview","grey2","grey0","sm","ContentWrapper","AddReportModal","onClose","articleId","articleUri","commentUri","dispatch","setOpen","article","setArticle","comment","setComment","contentLoading","setContentLoading","submitLoading","setSubmitLoading","abortController","Promise","all","res","get","idArticle","format","signal","getComments","closeModal","submit","createReport","actions","success","label","e","submitForm","FormattedMessage","_user","CSSEditorPortal","isActive","CSSEditorHeader","CSSEditorAction","CSSEditorLabel","CSSEditorMask","EDITOR_WIDTH","CSSEditor","CSSEditorContent","CSSEditorTab","CSSEditorIsBusy","CSSEditorIsLocked","CSSEditorMenu","CSSEditorMenuButton","DashedFocusBorder","JRCButton","grey1","EditorPopup","uniqid","editor","state","selectEditor","popup","view","style","flex","display","flexDirection","backgroundColor","marginTop","slice","flushEditorPopup","WidgetArticleTitleEditor","WidgetArticleTextEditor","WidgetArticleGalleryEditor","WidgetArticleAttachmentEditor","WidgetArticleSliderEditor","WidgetArticleImageEditor","WidgetButtonEditor","WidgetCheckListEditor","WidgetQuickSurveyEditor","WidgetDatasourceTableEditor","WidgetExcelDatasourceTableEditor","WidgetPresenceEditor","WidgetLuccaAbsenceEditor","WidgetEmailsImapEditor","WidgetContactCardDavEditor","WidgetCalendarCalDavEditor","Editor","token","selectToken","widgetWrapper","selectWidget","shallowEqual","onSaveCallback","onSave","handleHookIsActive","selectHook","getState","content","updateWidget","flushEditor","onStateChange","states","setWidgetState","onOpen","registerEditorPopup","ensureWidgetArticleButtonType","onChange","ensureWidgetArticleGalleryType","ensureWidgetArticleAttachmentType","ensureWidgetLuccaAbsenceType","ensureWidgetArticleImageType","ensureWidgetArticleSliderType","slides","loop","useDots","ensureWidgetArticleTitleType","ensureWidgetArticleTextType","ensureWidgetPresenceType","ensureWidgetCheckListType","arr","w","html","htmlDecodeSpecialChars","onChangeContent","onChangeWrapper","updateWidgetWrapper","handleChange","ensureWidgetQuickSurveyType","ensureWidgetExcelDatasourceTableType","hook","handlers","jamespot","datasource","network","filebank","wedoc","handleStart","busy","handleCatch","err","handleFinally","override","onError","ensureWidgetEmailsImapType","ensureWidgetContactCardDavType","ensureWidgetCalendarCalDavType","ensureWidgetDatasourceTableType","application","EditorPosition","setEditorPosition","InputColorRaw","Label","Fieldset","EditorInputColor","initialValue","palettes","colors","secondary","headerColor","orange","green","navy","overseas","JRCInputNumber","EditorInputNumber","watch","value","subscription","data","unsubscribe","width","placeholder","InputSelectExtended","EditorInputSelect","options","required","optionFromInitialValue","useMemo","el","select","getValue","o","getLabel","getSearch","rules","hideDeleteIcon","JRCInputText","EditorTabWrapper","wrapper","widgetContext","selectWidgetContext","styles","selectWidgetTitleStyle","replace","initialValues","String","black","fontSize","fontWeight","textAlign","setWidgetTitleStyle","colorValue","backgroundColorValue","fontSizeValue","fontWeightValue","textAlignValue","EditorIsBusy","isBusy","selectWidgetState","EditorIsLocked","locked","EditorSave","mode","selectWidgetObjectUri","v2","EditorTabWidgetSelection","selectWidgetWrapperStyle","padding","borderRadius","borderColor","borderWidth","borderStyle","setWidgetWrapperStyle","paddingValue","borderRadiusValue","borderStyleValue","borderColorValue","borderWidthValue","EditorTabDisplayLevel","def","definition","level","selectWidgetLevel","Number","filter","Array","isArray","displayLevel","includes","OVERRIDE_SAVE","Tooltip","EditorWrapper","enableWidgetLevel","tabs","enable","panel","useWrapper","icon","useSelection","useEditor","defaultTab","currentTab","setCurrentTab","setTimeout","className","tab","inset","opacity","CSSEditorPortalWrapper","CSSEditorPortalPopupWrapper","CSSEditorPortalRow","CSSEditorPortalFreeSpace","EditorsPortal","flush","flushAllEditor","window","addEventListener","removeEventListener","editors","selectEditors","JRCThemeProvider","EditorsPanel","portalDiv","document","getElementById","portal","parent","createElement","appendChild","createPortalElement","createPortal","CSSSquareWidgetWrapper","CSSSquareWidget","available","CSSWidgetButton","height","CSSWrapWidgetWrapper","column","CSSWrapTitle","CSSWrapWidget","parentIsColumn","full","Flex","direction","JRCIconButton","WidgetList","namespace","isOpen","widgets","WidgetsName","ArticleTitle","ArticleButton","CheckList","Presence","QuickSurvey","ArticleText","ArticleImage","ArticleSlider","ArticleAttachment","getBuilderWidgets","args","portalId","factory","src","img","minWidth","WidgetModeArticle","WidgetModeComment","calcHeight","Math","ceil","bg","bgHover","iconSize","useMarkdownModal","setEditor","onInsert","execCommand","close","ext","JTinyMCEExtensionsBuilders","markdown","ed","JRCInputFileAdvancedRaw","CSSHidden","WidgetUploader","initialFiles","initialClick","multiple","accept","onUploadStart","onUploadEnd","onUploadSuccess","uploadRef","total","setTotal","files","setFiles","click","totalFile","prevTotal","fileResponse","prevFiles","WidgetAttachment","JRCWidgetEmptyInplace","FileViewer","CSSWrapper","JRCWidgetArticleAttachmentWrapper","inplace","message","mounted","empty","weDoc","selectById","option","file","getAccessHash","Error","hash","idFile","getWedocFilePath","wedocWindowOpen","openWithOptions","condition","f","mimetype","resolveFilePath","url","JRCWidgetButton","CSSButtonWrapper","CSSPointer","clickable","JRCWidgetArticleButtonWrapper","buttonSize","registerEditor","JRCWidgetArticleGallery","CSSImagePointer","JRCWidgetArticleGalleryWrapper","maxWidth","UIWrapper","WidgetStylePadding","UIFlex","UIScrollWrapper","UIScroll","WidgetScroll","header","scrollable","footer","CSSWidgetTitle","UITitle","WidgetIntranetTitle","UIHeaderWrapper","backroundColor","UIHeader","UIHeaderFlex","grey4","xs","WidgetHeader","dropdown","subHeader","styleValues","UIOverlay","WidgetLuccaAbsence","JRCWidgetLuccaAbsenceWrapper","list","setList","setError","isLoading","setIsLoading","today","Date","getFullYear","getMonth","toString","padStart","getDate","getAbsence","aborted","finally","WidgetImage","CSSImageWrapperHover","mockFileLittle","mainType","dateCreation","str","parse","isNaN","getTime","JRCWidgetArticleImageWrapper","useFilter","setUri","formatImgUrl","now","from","path","JRCWidgetSlider","Wrapper","JRCWidgetArticleSliderWrapper","dynamicWidth","setDynamicWidth","fileViewerFiles","slide","handleResize","offsetWidth","isEditable","handleEditor","startAt","onClickSlide","InputTextareaRaw","Modal","MarkdownModal","setMarkdown","doClose","disabled","async","WidgetArticleText","CSSTextWrapper","JRCWidgetArticleTextWrapper","tinyMCECommonOptions","selectTinyMCECommonOptions","models","selectAll","closeMarkdownModal","extMarkdown","isMarkdownActive","tinyMentionsQueries","autoFocus","commonOptions","mentionsQueries","additionalExtensions","WidgetArticleTitle","ToolWrapper","Tool","JRCWidgetArticleTitleWrapper","heading","Toolbar","sizeValue","Footer","WidgetRemove","setIsOpen","removeWidget","flushWidget","WidgetFooterView","collaborationRights","handleOpenEditor","widgetObject","selectWidgetObject","widgetObjectRights","selectWidgetObjectRights","canUpdate","update","canDelete","delete","handleOnClick","ensureWidgetObjectHasMinimumProperties","WidgetInlineInputText","handleClick","setLabel","WidgetIsPending","WidgetCheckList","CommentContainer","border","CSSWidgetCheckListWrapper","JRCWidgetCheckListWrapper","onWidgetUpdate","widgetContent","setToken","tokenLoading","setTokenLoading","entries","setEntries","isPending","setIsPending","tokenFromStore","allRt","selectAllWidgetRTObject","canEditCollaboration","canAdministrate","administrate","fetchToken","handleReloadWidget","getWidget","openEditorPanel","finalEntries","checked","links","user","lastRt","at","object","fn","handleCollabAddEntry","contentToUpdate","fs","push","useRT","JRCFileViewer","initialEntries","onFileClick","entry","onItemCheckListChange","checkListRespond","handleCheckItem","edit","getVisibleColumns","tableColumnsData","columns","isVisible","WidgetTable","AbsoluteWrapper","WidgetDatasourceTableWrapper","tableHeadColor","tableHeadTextColor","tableHeadIconColor","tableRowColor","tableRowTextColor","tableBorderRadius","tableSizedColumns","tableSizedColumnsWidth","datasourceData","setDatasourceData","datasourceModel","setDatasourceModel","datasourceSort","setDatasourceSort","order","datasourceType","setDatasourceType","datasourceIdentifier","setDatasourceIdentifier","DatasourceTable","rtConditions","rtAudience","rtLastObject","fetchDatasource","Format","VIEW","model","sort","rows","tableDefaultSortOrder","tableDefaultSortName","WidgetExcelDatasourceTableWrapper","ExcelDatasourceTable","CSSPaddingMd","CSSHref","CSSHorizontalAlign","WidgetPresenceWrapperClosing","handleClosing","isClosed","JRCWidgetPresence","ModalUserList","CSSWidgetPresenceWrapper","CSSWidgetPresenceIsClosed","JRCWidgetPresenceWrapper","limitValue","closing","userValue","userAvailableList","userUnavailableList","userAvailableTotal","userUnavailableTotal","isPendingResponse","setIsPendingResponse","AbortController","openUsersModal","setOpenUsersModal","usersListIndex","setUsersListIndex","usersList","setUsersList","handleError","canRespond","lockedRespondHandler","handleCancelRespond","presenceCancel","handleRespond","presenceRespond","handleResponse","presenceGetResponse","handleLoadUsersList","page","presenceGetResponseUserList","cnt","elm","abort","handleClickAvailable","handleClickUnavailable","handleOpenUsersModal","WidgetQuickSurvey","WrapperContainer","withPadding","JRCWidgetQuickSurveyWrapper","userResponses","totalRespondent","totalResponse","userLoggedResponses","quickSurveyGetResponse","handleWidgetGet","handleCloseSurvey","finalContent","handleProgressBarClick","quickSurveyRespond","multi","quickSurveyGetResponseUserList","userHasAlreadyVoted","canCloseSurvey","anonymize","seeResponseAfter","handleClickFile","newContent","quickSurveyAddEnty","ModalLayout","ModalContent","InputText","InputNumber","InputPassword","UIForm","isLocked","UIProviderError","UISection","officeConfigurationInitialState","username","password","hostname","imapPort","imapConnectionSecurity","ImapConnection","NONE","imapMailbox","cardDavAddressBook","calDavCalendar","provider","OfficeConfigurationPrompt","useDispatch","useAbortController","setValue","formState","isValid","providerList","setProviderList","imapConnectionSecurityOptions","SSL","STARTTLS","fetchConfiguration","providers","getConfiguration","getProviders","handleClose","hasProvider","radius","SelectProvider","loader","setConfiguration","location","reload","ButtonDropdown","UIDropdown","WidgetContactCardDavHeader","isConfigurationValid","handleLogout","small","smallOpenDirection","WidgetContactCardDav","JRCWidgetContactCardDavWrapper","levelFallback","setIsConfigurationValid","setUrl","doInterval","setDoInterval","initialized","handleLogin","handleLoading","fetchProviderUrls","getProviderBaseUrls","dav_address_book_url","fetchData","davAddressBookGetContacts","WIDGET_LEVEL_3","interval","setInterval","clearInterval","WIDGET_LEVEL_1","contactCardList","WidgetCalendarCalDavHeader","WidgetCalendarCalDav","JRCWidgetCalendarCalDavWrapper","dav_calendar_url","nextMonth","addMonth","davCalendarGetEvents","dateStart","formatDateTime","dateEnd","calendarListEvent","WidgetEmailsImapHeader","count","selectWidgetChipCount","WidgetEmailsImap","JRCWidgetEmailsImapWrapper","fetchUnreadEmailsCount","imapInboxGetUnreadEmailsCount","setWidgetChipCount","imap_inbox_url","imapInboxGetEmails","WIDGET_LEVEL_2","emailList","WidgetTitle","JRCHtml","as","__html","WidgetTitleEdit","widgetWrapperTitle","widgetTitle","margin","CSSModalFooter","CSSWidgetHeaderEdit","CSSWidgetHeaderEditTitle","CSSWidgetHeaderEditActions","WidgetHeaderEdit","handleRemoveWidget","UILicenseRequired","WidgetLicenseWrapper","hasLicense","CSSWidgetWithTitle","DisplayWidget","cannotDisplayComponent","CSSWidgetLayer","pointerEvents","BETA_JRCDoubleClick","WidgetLayer","layers","ids","layer","Layer","LayerWidget","layerId","visible","top","left","x","context","DraggableHandler","onMouseUp","updateLayer","onDoubleTap","mouseIsDown","setMouseDown","mouse","setMouse","start","setStart","child","setChild","handleMouseDown","event","nativeEvent","clientX","clientY","handleMouseMove","dx","dy","handleMouseUp","onMouseDown","WidgetState","justifyContent","alignItems","hover","WrapperEditMode","WidgetWrapperCoreEditHover","WidgetStyleWrapper","WidgetIcon","CSSIconAbsoluteA","JRCWidgetIconWrapper","rel","maxValue","WidgetWrapperCore","indexOrder","editableMap","currentEditableWidgetId","isComponentVisible","setIsComponentVisible","registerWidgetObject","registerWidget","setEditableWidgetId","setEditableIndex","CSSCommentsBlocWidgetWrapper","JRCMessage","CommentsBlocAddCommentWidgetsWrapper","flushedWidgets","selectFlushedWidgets","CommentsBlocCommentWidgetsWrapper","handleWidgetUpdate","JRCCommentsBloc","CommentsBlocWrapper","CommentsBloc","canComment","commentType","socialQuestion","setLoading","setWidgets","currentUser","widgetIds","selectWidgets","tinyMCEExtendedOptions","selectTinyMCEExtendedOptions","platformConfig","selectPlatformConfig","commentsList","commentList","driveHook","fileBank","widgetHook","socialQuestionOptions","setSocialQuestionOptions","reportProps","setReportProps","useCommentRT","idComments","reactSocket","socket","rtHandlers","getCommentsLikeRTHandlers","handler","onMessage","function","offMessage","fetchComments","onComment","params","finalWidget","some","addComment","_widgets","registerWidgetObjectRights","rights","_right","comments","onCommentUpdate","commentToUpdate","idComment","updateComment","onCommentDelete","deleteComment","isWidgetActive","autorize","canCreateWidget","create","widgetListComponent","newWidgetsWrapperComponent","existingWidgetsWrapperComponent","handleWidgetRemove","tinyMCEConfig","toolbar","commentsToolbar","highlightFields","userHighlightFields","userAccountStatus","userModel","m","onGetHashError","activeDrives","utils","buildDrivesArrayFromObject","drives","drive","global","questionAnswer","onSelectResponse","responseId","isResolved","onUnselectResponse","onReport","Empty","FullPageLayout","Suspense","fallback","Outlet","useAI","setQuery","J","hooks","MagicWandHook","menuItems","PrepareAndSetQuery","fetch","AICapabilities","develop","summarize","tldr","en","es","formal","funny","jia","JRCInputTinyMCE","JRCInputTinyMCEWithExt","extAI","isAIActive","extArray","onMentionsQueryError","JRCInputTinyMCERaw","JRCInputTinyMCEWithExtRaw","JRCInputAudience","JRCModal","ModalAudience","warningMessage","asyncPromise","inputValue","autocomplete","searchable","AppColumn","MainColumn","TwoColLayout","extensionRoute","routes","mainColumnProps","pathname","useLocation","ROUTES_ARRAY","activeTab","setActiveTab","absolutePath","group","activeRoute","route","paths","reduce","previousValue","currentValue","pattern","isMatch","matchPath"],"sourceRoot":""}