@performant-software/semantic-components 1.0.21 → 1.0.22-beta.1
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.
- package/build/index.js.map +1 -1
- package/build/main.css +3 -0
- package/package.json +2 -2
- package/src/components/DateInput.css +4 -1
- package/src/components/DateInput.js +24 -1
- package/src/components/ListLoader.js +6 -0
- package/src/components/PlayButton.js +13 -1
- package/types/components/DateInput.js.flow +24 -1
- package/types/components/ListLoader.js.flow +6 -0
- package/types/components/PlayButton.js.flow +13 -1
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://@performant-software/semantic-components/webpack/runtime/chunk loaded","webpack://@performant-software/semantic-components/external commonjs2 \"react\"","webpack://@performant-software/semantic-components/external commonjs \"underscore\"","webpack://@performant-software/semantic-components/external commonjs \"semantic-ui-react\"","webpack://@performant-software/semantic-components/./src/components/NestedAccordion.js","webpack://@performant-software/semantic-components/external commonjs \"@performant-software/shared-components\"","webpack://@performant-software/semantic-components/external commonjs \"react-uuid\"","webpack://@performant-software/semantic-components/external commonjs \"i18next\"","webpack://@performant-software/semantic-components/./src/i18n/i18n.js","webpack://@performant-software/semantic-components/./src/components/Toaster.js","webpack://@performant-software/semantic-components/./src/components/DataList.js","webpack://@performant-software/semantic-components/external commonjs \"react-i18next\"","webpack://@performant-software/semantic-components/./src/components/DropdownButton.js","webpack://@performant-software/semantic-components/./src/components/EditModal.js","webpack://@performant-software/semantic-components/./src/components/AssociatedDropdown.js","webpack://@performant-software/semantic-components/./src/components/DateInput.js","webpack://@performant-software/semantic-components/./src/context/ModalContext.js","webpack://@performant-software/semantic-components/./src/components/FuzzyDate.js","webpack://@performant-software/semantic-components/./src/components/ListFilters.js","webpack://@performant-software/semantic-components/./src/components/FilterLabels.js","webpack://@performant-software/semantic-components/./src/components/List.js","webpack://@performant-software/semantic-components/./src/components/AccordionDataList.js","webpack://@performant-software/semantic-components/./src/components/AccordionList.js","webpack://@performant-software/semantic-components/./src/components/SelectizeHeader.js","webpack://@performant-software/semantic-components/./src/components/AccordionSelector.js","webpack://@performant-software/semantic-components/./src/components/ArrowButtons.js","webpack://@performant-software/semantic-components/./src/components/AudioPlayer.js","webpack://@performant-software/semantic-components/external commonjs \"zotero-api-client\"","webpack://@performant-software/semantic-components/./src/utils/Bibliography.js","webpack://@performant-software/semantic-components/./src/components/CreatorField.js","webpack://@performant-software/semantic-components/./src/components/Creators.js","webpack://@performant-software/semantic-components/./src/components/BibliographyForm.js","webpack://@performant-software/semantic-components/./src/components/BibliographyModal.js","webpack://@performant-software/semantic-components/external commonjs \"zotero-translation-client\"","webpack://@performant-software/semantic-components/./src/context/ZoteroTranslateContext.js","webpack://@performant-software/semantic-components/./src/components/BibliographySearchInput.js","webpack://@performant-software/semantic-components/./src/constants/Sort.js","webpack://@performant-software/semantic-components/./src/components/SortSelector.js","webpack://@performant-software/semantic-components/./src/components/StyleSelector.js","webpack://@performant-software/semantic-components/./src/components/BibliographyList.js","webpack://@performant-software/semantic-components/./src/components/BooleanIcon.js","webpack://@performant-software/semantic-components/./src/components/BreadcrumbItem.js","webpack://@performant-software/semantic-components/./src/components/Breadcrumbs.js","webpack://@performant-software/semantic-components/./src/components/CancelButton.js","webpack://@performant-software/semantic-components/./src/components/ColorButton.js","webpack://@performant-software/semantic-components/external commonjs \"react-color\"","webpack://@performant-software/semantic-components/./src/components/ColorPickerModal.js","webpack://@performant-software/semantic-components/./src/components/CurrentFacetLabels.js","webpack://@performant-software/semantic-components/./src/components/CurrentFacetsModal.js","webpack://@performant-software/semantic-components/./src/components/CurrentFacets.js","webpack://@performant-software/semantic-components/./src/components/ColumnResize.js","webpack://@performant-software/semantic-components/external commonjs \"react-dnd\"","webpack://@performant-software/semantic-components/./src/components/Draggable.js","webpack://@performant-software/semantic-components/./src/components/DataTable.js","webpack://@performant-software/semantic-components/./src/components/DataTableColumnSelector.js","webpack://@performant-software/semantic-components/external commonjs \"axios\"","webpack://@performant-software/semantic-components/./src/components/DropdownMenu.js","webpack://@performant-software/semantic-components/./src/components/MenuBar.js","webpack://@performant-software/semantic-components/./src/components/MenuSidebar.js","webpack://@performant-software/semantic-components/./src/components/DataView.js","webpack://@performant-software/semantic-components/./src/components/ListTable.js","webpack://@performant-software/semantic-components/./src/components/DatabaseView.js","webpack://@performant-software/semantic-components/external commonjs \"react-calendar\"","webpack://@performant-software/semantic-components/./src/components/DatePicker.js","webpack://@performant-software/semantic-components/./src/components/DescriptorField.js","webpack://@performant-software/semantic-components/./src/components/DownloadButton.js","webpack://@performant-software/semantic-components/./src/components/SaveButton.js","webpack://@performant-software/semantic-components/./src/components/EditPage.js","webpack://@performant-software/semantic-components/./src/components/EmbeddedList.js","webpack://@performant-software/semantic-components/./src/components/Facet.js","webpack://@performant-software/semantic-components/./src/components/FacetClearButton.js","webpack://@performant-software/semantic-components/./src/components/LinkButton.js","webpack://@performant-software/semantic-components/./src/components/FacetList.js","webpack://@performant-software/semantic-components/external commonjs \"rc-slider\"","webpack://@performant-software/semantic-components/external commonjs \"rc-slider/assets/index.css\"","webpack://@performant-software/semantic-components/./src/components/FacetSlider.js","webpack://@performant-software/semantic-components/./src/components/FacetToggle.js","webpack://@performant-software/semantic-components/./src/components/FileInputButton.js","webpack://@performant-software/semantic-components/./src/components/FileUpload.js","webpack://@performant-software/semantic-components/./src/components/FileUploadStatus.js","webpack://@performant-software/semantic-components/./src/components/FileUploadProgress.js","webpack://@performant-software/semantic-components/./src/components/FileUploadModal.js","webpack://@performant-software/semantic-components/external commonjs \"@react-google-maps/api\"","webpack://@performant-software/semantic-components/./src/components/GoogleMap.js","webpack://@performant-software/semantic-components/./src/components/GooglePlacesSearch.js","webpack://@performant-software/semantic-components/./src/components/HorizontalCards.js","webpack://@performant-software/semantic-components/./src/components/IIIFModal.js","webpack://@performant-software/semantic-components/./src/components/ImageCarousel.js","webpack://@performant-software/semantic-components/./src/components/ItemsToggle.js","webpack://@performant-software/semantic-components/./src/components/Items.js","webpack://@performant-software/semantic-components/./src/components/ItemCollection.js","webpack://@performant-software/semantic-components/./src/components/ItemList.js","webpack://@performant-software/semantic-components/./src/components/LinkLabel.js","webpack://@performant-software/semantic-components/./src/components/KeyboardField.js","webpack://@performant-software/semantic-components/./src/hooks/BatchEdit.js","webpack://@performant-software/semantic-components/./src/components/KeyValuePairs.js","webpack://@performant-software/semantic-components/./src/components/LazyLoader.js","webpack://@performant-software/semantic-components/./src/components/LazyAudio.js","webpack://@performant-software/semantic-components/external commonjs \"react-pdf\"","webpack://@performant-software/semantic-components/external commonjs \"react-pdf/dist/esm/Page/AnnotationLayer.css\"","webpack://@performant-software/semantic-components/external commonjs \"react-pdf/dist/esm/Page/TextLayer.css\"","webpack://@performant-software/semantic-components/./src/components/LazyDocument.js","webpack://@performant-software/semantic-components/./src/components/PhotoViewer.js","webpack://@performant-software/semantic-components/./src/components/LazyImage.js","webpack://@performant-software/semantic-components/./src/components/VideoPlayer.js","webpack://@performant-software/semantic-components/./src/components/LazyVideo.js","webpack://@performant-software/semantic-components/./src/components/LazyMedia.js","webpack://@performant-software/semantic-components/./src/components/LazyIIIF.js","webpack://@performant-software/semantic-components/./src/components/ListLoader.js","webpack://@performant-software/semantic-components/./src/components/LoginModal.js","webpack://@performant-software/semantic-components/./src/components/MasonryGrid.js","webpack://@performant-software/semantic-components/./src/components/PlayButton.js","webpack://@performant-software/semantic-components/./src/components/VideoPlayerButton.js","webpack://@performant-software/semantic-components/./src/components/MediaGallery.js","webpack://@performant-software/semantic-components/./src/components/MediaGrid.js","webpack://@performant-software/semantic-components/./src/components/MediaList.js","webpack://@performant-software/semantic-components/./src/components/ModalDropdown.js","webpack://@performant-software/semantic-components/./src/components/RemoteDropdown.js","webpack://@performant-software/semantic-components/./src/components/SearchBox.js","webpack://@performant-software/semantic-components/./src/components/SearchPagination.js","webpack://@performant-software/semantic-components/./src/components/SearchResults.js","webpack://@performant-software/semantic-components/./src/components/SearchResultsPerPage.js","webpack://@performant-software/semantic-components/./src/components/SearchResultsSort.js","webpack://@performant-software/semantic-components/./src/components/SearchStats.js","webpack://@performant-software/semantic-components/./src/components/Section.js","webpack://@performant-software/semantic-components/./src/components/Selectize.js","webpack://@performant-software/semantic-components/./src/components/SelectizeImageHeader.js","webpack://@performant-software/semantic-components/./src/components/SimpleEditPage.js","webpack://@performant-software/semantic-components/./src/components/TabbedModal.js","webpack://@performant-software/semantic-components/./src/components/TabsMenu.js","webpack://@performant-software/semantic-components/./src/components/TagsList.js","webpack://@performant-software/semantic-components/./src/components/Thumbnail.js","webpack://@performant-software/semantic-components/./src/components/VideoFrameSelector.js","webpack://@performant-software/semantic-components/external commonjs \"react-syntax-highlighter\"","webpack://@performant-software/semantic-components/./src/components/ViewXML.js","webpack://@performant-software/semantic-components/webpack/bootstrap","webpack://@performant-software/semantic-components/webpack/runtime/compat get default export","webpack://@performant-software/semantic-components/webpack/runtime/define property getters","webpack://@performant-software/semantic-components/webpack/runtime/hasOwnProperty shorthand","webpack://@performant-software/semantic-components/webpack/runtime/make namespace object","webpack://@performant-software/semantic-components/webpack/runtime/jsonp chunk loading","webpack://@performant-software/semantic-components/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"underscore\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"semantic-ui-react\");","// @flow\n\nimport React, { Component, type Element } from 'react';\nimport {\n Accordion,\n Button\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport './NestedAccordion.css';\n\ntype Props = {\n defaultActive?: Array<number> | Array<any>,\n getChildItems: (item: any) => Array<any>,\n inverted?: boolean,\n isItemActive?: (item: any) => boolean,\n multipleItemTypes?: boolean,\n onItemClick?: (item: any) => void,\n onItemToggle?: (item: any) => void,\n renderItem: (item: any) => string | Element<any>,\n renderRight?: (item: any) => string | Element<any>,\n rootItems: Array<any>,\n showToggle: (item: any) => boolean,\n styled?: boolean,\n toggleOnClick?: boolean\n};\n\ntype State = {\n activeItems: Array<any>\n};\n\nclass NestedAccordion extends Component<Props, State> {\n static defaultProps: any;\n\n /**\n * Constructs a new NestedAccordion component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n activeItems: []\n };\n }\n\n /**\n * Sets the activeItems on the state if the defaultActive prop changes.\n *\n * @param prevProps\n */\n componentDidUpdate(prevProps: Props) {\n if (prevProps.defaultActive !== this.props.defaultActive\n && this.props.defaultActive\n && this.props.defaultActive.length) {\n const isActive = this.props.defaultActive.some(\n (active) => typeof active !== 'object' || !_.has(active, 'id') || !_.has(active, 'type')\n );\n if (this.props.multipleItemTypes && !isActive) {\n this.setState({ activeItems: this.props.defaultActive });\n } else {\n this.setState({ activeItems: _.map(this.props.defaultActive, (id) => ({ id })) });\n }\n }\n }\n\n /**\n * Returns the toggle button class names.\n *\n * @param item\n *\n * @returns {string}\n */\n getButtonClass(item: any) {\n const classNames = ['accordion-button'];\n\n if (this.props.showToggle && !this.props.showToggle(item)) {\n classNames.push('hidden');\n }\n\n return classNames.join(' ');\n }\n\n /**\n * Returns true if the passed item is active.\n *\n * @param item\n *\n * @returns {boolean}\n */\n isActive(item: any) {\n let properties = { id: item.id };\n if (this.props.multipleItemTypes && _.has(item, 'type')) {\n properties = { id: item.id, type: item.type };\n }\n return !!_.findWhere(this.state.activeItems, properties);\n }\n\n /**\n * Returns true if the passed item is active.\n *\n * @param item\n *\n * @returns {*}\n */\n isItemActive(item: any) {\n return this.props.isItemActive && this.props.isItemActive(item);\n }\n\n /**\n * Calls the onItemClick prop. Optionally toggles the item active.\n *\n * @param item\n */\n onItemClick(item: any) {\n if (this.props.toggleOnClick) {\n this.onItemToggle(item);\n }\n\n if (this.props.onItemClick) {\n this.props.onItemClick(item);\n }\n }\n\n /**\n * Toggles the passed item and calls the onItemToggle property.\n *\n * @param item\n */\n onItemToggle(item: any) {\n if (this.props.onItemToggle) {\n this.props.onItemToggle(item);\n }\n\n this.toggleItem(item);\n }\n\n /**\n * Renders the NestedAccordion component.\n *\n * @returns {*}\n */\n render() {\n return (\n <Accordion\n className='nested-accordion'\n fluid\n inverted={this.props.inverted}\n panels={_.map(this.props.rootItems, this.renderPanel.bind(this))}\n styled={this.props.styled}\n />\n );\n }\n\n /**\n * Renders the content for the passed item if the item has child elements.\n *\n * @param item\n *\n * @returns {null|*}\n */\n renderContent(item: any) {\n const children = this.props.getChildItems(item);\n if (!(children && children.length)) {\n return null;\n }\n\n return (\n <Accordion.Content\n active={this.isActive(item)}\n >\n <div>\n <Accordion.Accordion\n panels={_.map(children, this.renderPanel.bind(this))}\n />\n </div>\n </Accordion.Content>\n );\n }\n\n /**\n * Renders the title and content (panel) for the passed item.\n *\n * @param item\n *\n * @returns {*}\n */\n renderPanel(item: any) {\n return (\n <div key={_.has(item, 'type') ? `${item.type}-${item.id}` : item.id}>\n <Accordion.Title\n active={this.isActive(item)}\n onClick={this.onItemClick.bind(this, item)}\n style={{\n backgroundColor: this.isItemActive(item) ? 'rgba(255, 255, 255, 0.08)' : undefined\n }}\n >\n <div\n className='container'\n >\n <div>\n { this.renderToggle(item) }\n <div\n className='item-container'\n >\n { this.props.renderItem(item) }\n </div>\n </div>\n { this.props.renderRight && (\n <div\n className='right-container'\n >\n { this.props.renderRight(item) }\n </div>\n )}\n </div>\n </Accordion.Title>\n { this.renderContent(item) }\n </div>\n );\n }\n\n /**\n * Renders the open/close toggle for the passed item.\n *\n * @param item\n *\n * @returns {null|*}\n */\n renderToggle(item: any) {\n return (\n <Button\n aria-label='Open'\n compact\n className={this.getButtonClass(item)}\n icon='dropdown'\n inverted={this.props.inverted}\n onClick={(e) => {\n // Since the containing row also has an onclick, we'll want to prevent that from being triggered.\n e.stopPropagation();\n this.onItemToggle(item);\n }}\n />\n );\n }\n\n /**\n * Toggles the passed item as active.\n *\n * @param item\n */\n toggleItem(item: any) {\n this.setState((state) => ({\n activeItems: this.isActive(item)\n ? _.filter(state.activeItems, (i) => {\n if (this.props.multipleItemTypes && _.has(item, 'type') && _.has(i, 'type')) {\n return i.id !== item.id || i.type !== item.type;\n }\n return i.id !== item.id;\n })\n : [...state.activeItems, item]\n }));\n }\n}\n\nNestedAccordion.defaultProps = {\n defaultActive: [],\n inverted: false,\n isItemActive: undefined,\n multipleItemTypes: false,\n onItemClick: () => {},\n renderRight: () => {},\n styled: true,\n toggleOnClick: false\n};\n\nexport default NestedAccordion;\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@performant-software/shared-components\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-uuid\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"i18next\");","import i18next from 'i18next';\n\nimport en from './en.json';\n\nconst resources = {\n en: {\n translation: en\n }\n};\n\nconst i18n = i18next.createInstance();\n\ni18n\n .init({\n debug: true,\n fallbackLng: 'en',\n lng: 'en',\n interpolation: {\n escapeValue: false,\n },\n resources\n });\n\nexport default i18n;\n","// @flow\n\nimport React, { type Element, useEffect, useState } from 'react';\nimport { Message, Transition } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport './Toaster.css';\n\ntype Props = {\n children: Array<Element<any>>,\n onDismiss?: () => void,\n timeout: number,\n type: string\n};\n\nconst TRANSITION_DURATION = 700;\n\nconst Toaster = (props: Props) => {\n const [visible, setVisible] = useState(true);\n\n /*\n * If a timeout is provided, automatically hide the message after <code>timeout</code> milliseconds.\n */\n if (props.timeout && props.timeout > 0) {\n _.delay(() => {\n setVisible(false);\n }, props.timeout);\n }\n\n /*\n * If the toaster visibility has change to \"false\", call the onDismiss prop. We'll delay the call\n * by <code>TRANSITION_DURATION</code> milliseconds in order for the transition to run.\n */\n useEffect(() => {\n if (!visible && props.onDismiss) {\n _.delay(props.onDismiss.bind(this), TRANSITION_DURATION);\n }\n }, [visible]);\n\n return (\n <Transition\n animation='slide down'\n duration={TRANSITION_DURATION}\n transitionOnMount\n visible={visible}\n >\n <Message\n className='toaster'\n info={props.type === Toaster.MessageTypes.info}\n negative={props.type === Toaster.MessageTypes.negative}\n onDismiss={() => setVisible(false)}\n positive={props.type === Toaster.MessageTypes.positive}\n warning={props.type === Toaster.MessageTypes.negative}\n >\n { props.children }\n </Message>\n </Transition>\n );\n};\n\nToaster.MessageTypes = {\n info: 'info',\n negative: 'negative',\n positive: 'positive',\n warning: 'warning'\n};\n\nToaster.defaultProps = {\n onDismiss: undefined,\n timeout: 3000,\n type: Toaster.MessageTypes.info\n};\n\nexport default Toaster;\n","// @flow\n\nimport { Object as ObjectUtils, Timer } from '@performant-software/shared-components';\nimport React, { Component, type ComponentType } from 'react';\nimport uuid from 'react-uuid';\nimport _ from 'underscore';\nimport { Icon, Input, Message } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport Toaster from './Toaster';\n\ntype Props = {\n /**\n * Name of the collection to retrieve from the API response.\n */\n collectionName: string,\n\n /**\n * The default number of records to display on a single page.\n */\n defaultPerPage?: number,\n\n /**\n * The default value for the search input element.\n */\n defaultSearch?: string,\n\n /**\n * The default value to use for sorting the list.\n */\n defaultSort?: string,\n\n /**\n * The default direction in which to sort the list.\n */\n defaultSortDirection?: string,\n\n /**\n * If provided, the passed <code>component</code> will be rendered when the filter button is clicked.\n * <br />\n * <br />\n *\n * Values passed in the <code>defaults</code> and <code>props</code> properties will be made available in the\n * passed component.\n * <br />\n * <br />\n *\n * The <code>onChange</code> callback will fire when the filters are modified. This action will also reload the list,\n * passing the new filters the <code>onLoad</code> callback.\n */\n filters?: {\n component: ComponentType<any>,\n defaults?: any,\n props?: any,\n onChange?: (filter: any) => Promise<any>,\n showLabels?: boolean\n },\n\n /**\n * Callback fired when the \"delete\" action is clicked.\n * @param item\n */\n onDelete?: (item: any) => Promise<any>,\n\n /**\n * Callback fired when the \"delete all\" action is clicked. This action is typically renedered in the header and will\n * apply to every item in the list.\n */\n onDeleteAll?: () => Promise<any>,\n\n /**\n * Callback fired when loading the list of items from an API. This callback is fired any time the list changes.\n */\n onLoad: (params: any) => Promise<any>,\n\n /**\n * Callback fired when an item is saved via the add/edit modal.\n */\n onSave?: (item: any) => Promise<any>,\n\n /**\n * The numeric list of options to allow the user to select for the number of records to display per page.\n */\n perPageOptions?: Array<number>,\n\n /**\n * If provided, the <code>onLoad</code> callback will fire after a timeout of the passed number of milliseconds. This\n * can be useful in order to show progress (file upload, download, etc) that must be retrieved from the server.\n */\n polling?: number,\n\n /**\n * Callback fired when an error occurs. The passed error can take any form and is up to the consuming component to\n * interpret. The return value should be an array of user-friendly error messages.\n */\n resolveErrors?: (error: any) => Array<string>,\n\n /**\n * Used to inform the list that an external save has taken place. When set to <code>true</code>, a success toaster\n * will display.\n */\n saved?: boolean,\n\n /**\n * If <code>true</code>, this component will render a search input element in the list header.\n */\n searchable?: boolean,\n\n /**\n * If provided, list properties (page number, columns, filters, etc) will be stored in the passed storage element\n * and rehydrated each time the component is mounted. This is useful in order to persist filters, searches, and\n * other properties when a user navigates away from the list.\n */\n session?: {\n key: string,\n storage: typeof sessionStorage\n }\n};\n\ntype State = {\n count: number,\n error: ?any,\n filters: any,\n items: Array<any>,\n loading: boolean,\n page: number,\n pages: number,\n perPage: number,\n saved: boolean,\n search: ?string,\n sortColumn: ?string,\n sortDirection: ?string\n};\n\nconst SESSION_KEY = 'DataList';\nconst SESSION_DEFAULT = '{}';\n\nconst SORT_ASCENDING = 'ascending';\nconst SORT_DESCENDING = 'descending';\n\n/**\n * Returns a function to wrap the passed component as a DataList. The DataList component is intended to be used to load\n * records from an API and display them using the wrapped component. This HOC will handle calling the API, pagination,\n * storing search, filters, and sorting.\n *\n * @param WrappedComponent\n */\nconst useDataList = (WrappedComponent: ComponentType<any>) => (\n class extends Component<Props, State> {\n // Default props\n static defaultProps = {\n filters: {},\n searchable: true\n };\n\n // Polling\n pollingInterval: any;\n\n /**\n * Constructs a new DataList component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = this.initializeState(props);\n }\n\n /**\n * Sets up the polling interval.\n */\n componentDidMount() {\n if (this.props.polling) {\n this.pollingInterval = setInterval(this.fetchData.bind(this), this.props.polling);\n }\n }\n\n /**\n * Sets the saved prop on the state (if changed) and fetches the data. This can provide as a way to manually toggle\n * a save event outside of the DataList context.\n *\n * @param prevProps\n */\n componentDidUpdate(prevProps: Props) {\n if (prevProps.saved !== this.props.saved && this.props.saved) {\n this.setState({ saved: this.props.saved }, this.fetchData.bind(this));\n }\n }\n\n /**\n * Tears down the polling interval.\n */\n componentWillUnmount() {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n }\n\n /**\n * Resets the page number and reloads the data.\n *\n * @returns {void|any|Promise<State>}\n */\n afterDelete() {\n if (this.state.items.length === 1) {\n return this.setState((state) => ({\n page: (state.page - 1) > 1 ? state.page - 1 : 1\n }), this.fetchData.bind(this));\n }\n\n return this.fetchData();\n }\n\n /**\n * Resets the page number and reloads the data.\n */\n afterDeleteAll() {\n this.setState({ page: 1 }, this.fetchData.bind(this));\n }\n\n /**\n * Calls the onLoad prop to populate the array of items in the state.\n */\n fetchData() {\n // Store the session information before fetching the data.\n this.setSession();\n\n // Set the loading indicator and fetch the data.\n this.setState({ loading: true }, () => {\n const {\n page,\n perPage,\n search,\n sortColumn,\n sortDirection\n } = this.state;\n\n const params = {\n ...this.state.filters,\n page,\n search,\n per_page: perPage,\n sort_by: sortColumn,\n sort_direction: sortDirection\n };\n\n this.props\n .onLoad(params)\n .then(({ data }) => {\n const items = data[this.props.collectionName];\n const { pages, count } = data.list;\n\n this.setState({\n count,\n items,\n page,\n pages,\n loading: false\n });\n });\n });\n }\n\n /**\n * Returns the default filters from the \"filter\" prop. This method will merge the default filter with the actual\n * filter and assign a UID value.\n *\n * @param props\n *\n * @returns {{filters: []}}\n */\n getDefaultFilters(props) {\n const filters = [];\n\n if (props.filters && props.filters.defaults) {\n _.each(props.filters.defaults.filters, (f) => {\n const filter = _.findWhere(props.filters.props.filters, { key: f.key });\n\n if (filter) {\n filters.push(this.onCreateFilter({ ...filter, ...f }));\n }\n });\n }\n\n return { filters };\n }\n\n /**\n * Returns the session storage key for the current list.\n *\n * @returns {string|null}\n */\n getSessionKey() {\n if (!this.props.session) {\n return null;\n }\n\n return `${SESSION_KEY}.${this.props.session.key}`;\n }\n\n /**\n * Initializes the state based on the passed props.\n *\n * @param props\n\n * @returns {{search: string, sortColumn: string, sortDirection: string, pages: number, perPage: (number|*),\n * saved: boolean, count: number, filters: (*|{}), page: number, error: null, loading: boolean, items: *[]}}\n */\n initializeState(props: Props) {\n const session = this.restoreSession();\n\n const filters = session.filters || this.getDefaultFilters(props);\n const page = session.page || 1;\n const perPage = session.perPage || props.defaultPerPage || _.first(props.perPageOptions);\n const search = session.search || props.defaultSearch || null;\n const sortColumn = session.sortColumn || props.defaultSort || null;\n const sortDirection = session.sortDirection || props.defaultSortDirection || null;\n\n return {\n count: 0,\n error: null,\n filters,\n items: [],\n loading: false,\n page,\n pages: 1,\n perPage,\n saved: props.saved || false,\n search,\n sortColumn,\n sortDirection\n };\n }\n\n /**\n * Returns true if any filters have been set.\n *\n * @returns {boolean}\n */\n isFilterActive() {\n let isActive = false;\n\n _.each(_.values(this.state.filters), (value) => {\n if (!ObjectUtils.isEmpty(value)) {\n isActive = true;\n }\n });\n\n return isActive;\n }\n\n /**\n * Clears the existing search.\n *\n * @param e\n */\n onClearSearch(e) {\n // Clear the current search\n this.onSearchChange(e, { value: '' });\n\n // Focus on the search input\n this.searchRef?.inputRef?.current?.focus();\n\n // Set the timer to execute a new search\n this.onSearch();\n }\n\n /**\n * Returns the passed filter with a \"uid\" property assigned.\n *\n * @param filter\n *\n * @returns {*&{uid: string}}\n */\n onCreateFilter(filter) {\n return {\n ...filter,\n uid: uuid()\n };\n }\n\n /**\n * Calls the onDelete prop.\n *\n * @param selectedItem\n *\n * @returns {Q.Promise<any> | Promise<R> | Promise<any> | void | *}\n */\n onDelete(selectedItem: any) {\n if (!this.props.onDelete) {\n return Promise.resolve();\n }\n\n return this.props\n .onDelete(selectedItem)\n .then(this.afterDelete.bind(this))\n .catch(this.onError.bind(this));\n }\n\n /**\n * Calls the onDeleteAll prop.\n *\n * @returns {Q.Promise<any> | Promise<R> | Promise<any> | void | *}\n */\n onDeleteAll() {\n if (!this.props.onDeleteAll) {\n return Promise.resolve();\n }\n\n return this.props\n .onDeleteAll()\n .then(this.afterDeleteAll.bind(this));\n }\n\n /**\n * Sets the error on the state if the component is configured to display errors.\n *\n * @param error\n *\n * @returns {*|void|Promise<State>}\n */\n onError(error: any) {\n return this.props.resolveErrors && this.setState({ error });\n }\n\n /**\n * Updates the state with the passed filters.\n *\n * @param filters\n *\n * @returns {Promise<R>}\n */\n onFilterChange(filters: any) {\n return new Promise<void>((resolve) => {\n // Call the custom onChange prop\n if (this.props.filters && this.props.filters.onChange) {\n this.props.filters.onChange(filters);\n }\n\n // Set the filters and re-fetch the data\n this.setState({ filters, page: 1 }, () => {\n this.fetchData();\n resolve();\n });\n });\n }\n\n /**\n * Sets the new active page and reloads the data.\n *\n * @param e\n * @param activePage\n */\n onPageChange(e: Event, { activePage }: { activePage: number }) {\n this.setState({ page: activePage }, this.fetchData.bind(this));\n }\n\n /**\n * Sets the perPage value and reloads the data.\n *\n * @param e\n * @param value\n */\n onPerPageChange(e: Event, { value }: { value: number }) {\n this.setState({ perPage: value }, this.fetchData.bind(this));\n }\n\n /**\n * Calls the onSave prop and reloads the data.\n *\n * @param item\n *\n * @returns {Q.Promise<any> | Promise<R> | Promise<any> | void | *}\n */\n onSave(item: any) {\n if (!this.props.onSave) {\n return Promise.resolve();\n }\n\n return Promise.resolve(this.props.onSave(item))\n .then(() => this.setState({ saved: true }, this.fetchData.bind(this)));\n }\n\n /**\n * Resets the page and reloads the data.\n */\n onSearch() {\n this.setState({ page: 1 }, this.fetchData.bind(this));\n }\n\n /**\n * Updates the search value on the state.\n *\n * @param e\n * @param value\n */\n onSearchChange(e: Event, { value }: { value: any }) {\n this.setState({ search: value });\n }\n\n /**\n * Updates the sortColumn and sortDirection props on the state.\n *\n * @param sortColumn\n * @param direction\n * @param page\n */\n onSort(sortColumn: string, direction?: string, page?: number = 1) {\n let sortDirection = direction;\n\n if (!sortDirection) {\n sortDirection = this.state.sortColumn === sortColumn && this.state.sortDirection === SORT_ASCENDING\n ? SORT_DESCENDING : SORT_ASCENDING;\n }\n\n this.setState({ sortColumn, sortDirection, page }, this.fetchData.bind(this));\n }\n\n /**\n * When no columns are sortable, load data as is\n *\n */\n onInit(page?: number = 1) {\n this.setState({ sortColumn: '', sortDirection: '', page }, this.fetchData.bind(this));\n }\n\n /**\n * Renders the DataList component.\n *\n * @returns {*}\n */\n render() {\n const { filters = {} } = this.props;\n const { component, props, showLabels } = filters;\n\n return (\n <>\n <WrappedComponent\n {...this.props}\n count={this.state.count}\n filters={{\n active: this.isFilterActive(),\n component,\n onChange: this.onFilterChange.bind(this),\n showLabels,\n props: {\n ...props,\n onCreateFilter: this.onCreateFilter.bind(this),\n item: this.state.filters\n }\n }}\n items={this.state.items}\n loading={this.state.loading}\n page={this.state.page}\n pages={this.state.pages}\n perPage={this.state.perPage}\n onDelete={this.onDelete.bind(this)}\n onDeleteAll={this.onDeleteAll.bind(this)}\n onPageChange={this.onPageChange.bind(this)}\n onPerPageChange={this.onPerPageChange.bind(this)}\n onSave={this.onSave.bind(this)}\n onSort={this.onSort.bind(this)}\n onInit={this.onInit.bind(this)}\n renderSearch={this.renderSearch.bind(this)}\n sortColumn={this.state.sortColumn}\n sortDirection={this.state.sortDirection}\n />\n {this.state.saved && (\n <Toaster\n onDismiss={() => this.setState({ saved: false })}\n type={Toaster.MessageTypes.positive}\n >\n <Message.Header\n content={i18n.t('Common.messages.save.header')}\n />\n <Message.Content\n content={i18n.t('Common.messages.save.content')}\n />\n </Toaster>\n )}\n {this.state.error && (\n <Toaster\n onDismiss={() => this.setState({ error: false })}\n timeout={0}\n type={Toaster.MessageTypes.negative}\n >\n <Message.Header\n content={i18n.t('Common.messages.error.header')}\n />\n <Message.List\n items={this.props.resolveErrors && this.props.resolveErrors(this.state.error)}\n />\n </Toaster>\n )}\n </>\n );\n }\n\n /**\n * Renders the search input component.\n *\n * @returns {null|*}\n */\n renderSearch() {\n if (!this.props.searchable) {\n return null;\n }\n\n return (\n <Input\n aria-label='Search'\n type='text'\n icon={(\n <Icon\n link={!_.isEmpty(this.state.search)}\n name={_.isEmpty(this.state.search) ? 'search' : 'times'}\n onClick={this.onClearSearch.bind(this)}\n />\n )}\n input={{\n 'aria-label': 'search'\n }}\n ref={(ref) => {\n this.searchRef = ref;\n }}\n loading={this.state.loading}\n onKeyDown={Timer.clearSearchTimer.bind(this)}\n onKeyUp={Timer.setSearchTimer.bind(this, this.onSearch.bind(this))}\n onChange={this.onSearchChange.bind(this)}\n size='small'\n value={this.state.search}\n />\n );\n }\n\n /**\n * Restores the DataList session object.\n */\n restoreSession() {\n const key = this.getSessionKey();\n\n if (!key) {\n return {};\n }\n\n const session = sessionStorage.getItem(key) || SESSION_DEFAULT;\n return JSON.parse(session);\n }\n\n /**\n * Sets the DataList session object.\n */\n setSession() {\n const key = this.getSessionKey();\n\n if (!key) {\n return;\n }\n\n const {\n filters,\n page,\n perPage,\n search,\n sortColumn,\n sortDirection\n } = this.state;\n\n sessionStorage.setItem(key, JSON.stringify({\n filters,\n page,\n perPage,\n search,\n sortColumn,\n sortDirection\n }));\n }\n }\n);\n\nexport default useDataList;\n\nexport {\n SORT_ASCENDING,\n SORT_DESCENDING\n};\n\nexport type {\n Props\n};\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-i18next\");","// @flow\n\nimport React, { useRef } from 'react';\nimport { Button, Dropdown } from 'semantic-ui-react';\nimport './DropdownButton.css';\n\ntype Option = {\n key: any,\n value: any,\n text: string\n};\n\ntype Props = {\n basic?: boolean,\n color?: string,\n direction?: string,\n disabled?: boolean,\n icon?: string,\n options: Array<Option>,\n onChange: (e: Event, { value: any }) => void,\n scrolling?: boolean,\n selectOnBlur?: boolean,\n text: string,\n value: any\n};\n\nconst DropdownButton = (props: Props) => {\n const dropdownRef = useRef();\n\n return (\n <Button.Group\n basic={props.basic}\n className='dropdown-button'\n color={props.color}\n >\n <Button\n aria-label='Select'\n content={props.text}\n disabled={props.disabled}\n icon={props.icon}\n onClick={(e) => dropdownRef.current && dropdownRef.current.handleClick(e)}\n />\n <Dropdown\n aria-label='Select'\n className='button icon'\n direction={props.direction}\n disabled={props.disabled}\n floating\n onChange={props.onChange.bind(this)}\n options={props.options}\n ref={dropdownRef}\n scrolling={props.scrolling}\n selectOnBlur={props.selectOnBlur}\n trigger={<></>}\n value={props.value}\n />\n </Button.Group>\n );\n};\n\nDropdownButton.defaultProps = {\n color: undefined,\n icon: undefined,\n selectOnBlur: false\n};\n\nexport default DropdownButton;\n","// @flow\n\nimport { useEditContainer, type EditContainerProps } from '@performant-software/shared-components';\nimport React, { type ComponentType, useState } from 'react';\nimport {\n Button,\n Dimmer,\n Loader,\n Message,\n Modal\n} from 'semantic-ui-react';\nimport Toaster from './Toaster';\nimport i18n from '../i18n/i18n';\nimport './EditModal.css';\n\ntype Props = EditContainerProps & {\n /**\n * The form component to render.\n */\n component: ComponentType<any>,\n\n /**\n * Callback fired when the close button is clicked.\n */\n onClose: () => void,\n\n /**\n * Callback fired when the save button is clicked.\n */\n onSave: () => Promise<any>,\n\n /**\n * If <code>true</code>, a loading indicator will display.\n */\n showLoading: boolean\n};\n\n/**\n * The <code>EditModal</code> component can be used to edit the details of a single record within a modal view. This\n * component uses the <code>EditContainer</code> higher-order component to facilitate all of the editing functionality.\n * This component is responsible for rendering the container in which the editable form is rendered.\n */\nconst EditModal = useEditContainer((props: Props) => {\n const OuterComponent = props.component;\n\n const [showToaster, setShowToaster] = useState(false);\n const hasErrors = !!(props.errors && props.errors.length);\n\n return (\n <OuterComponent\n {...props}\n >\n { props.showLoading && props.loading && (\n <Dimmer\n active={props.loading}\n inverted\n >\n <Loader\n content={i18n.t('Common.messages.loading')}\n />\n </Dimmer>\n )}\n { showToaster && hasErrors && (\n <Toaster\n onDismiss={() => setShowToaster(false)}\n timeout={0}\n type={Toaster.MessageTypes.negative}\n >\n <Message.Header\n content={i18n.t('Common.messages.error.header')}\n />\n <Message.List\n items={props.errors}\n />\n </Toaster>\n )}\n <Modal.Actions\n className='edit-modal-actions'\n >\n <Button\n disabled={props.saving}\n onClick={() => {\n setShowToaster(true);\n return props.onSave();\n }}\n primary\n size='medium'\n type='submit'\n >\n { i18n.t('Common.buttons.save') }\n { props.saving && (\n <Loader\n active\n className='saving'\n inline\n size='tiny'\n />\n )}\n </Button>\n <Button\n basic\n disabled={props.saving}\n onClick={props.onClose.bind(this)}\n size='medium'\n type='button'\n >\n { i18n.t('Common.buttons.cancel') }\n </Button>\n </Modal.Actions>\n </OuterComponent>\n );\n});\n\nEditModal.defaultProps = {\n showLoading: true\n};\n\nexport default EditModal;\n","// @flow\n\nimport { Timer } from '@performant-software/shared-components';\nimport React, { Component } from 'react';\nimport { Button, Dropdown, Message } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport EditModal from './EditModal';\nimport i18n from '../i18n/i18n';\nimport Toaster from './Toaster';\nimport './AssociatedDropdown.css';\n\ntype Option = {\n key: number | string,\n value: number | string,\n text: string\n};\n\ntype Props = {\n className?: string,\n collectionName: string,\n modal?: {\n component: Component<{}>,\n props: any,\n onSave: (item: any) => Promise<any>,\n state: any\n },\n onSearch: (search: string) => Promise<any>,\n onSelection: (item: any) => void,\n placeholder?: string,\n renderOption: (option: any) => Option,\n required?: boolean,\n searchQuery: string,\n value: ?number,\n upward?: boolean\n};\n\ntype State = {\n items: Array<any>,\n loading: boolean,\n modalAdd: boolean,\n options: Array<Option>,\n saved: boolean,\n searchQuery: string,\n value: ?number | ?string\n};\n\nconst TIMEOUT = 500;\n\nclass AssociatedDropdown extends Component<Props, State> {\n static defaultProps: any;\n\n timeout: ?TimeoutID;\n\n /**\n * Constructs a new AssociatedDropdown component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n items: [],\n loading: false,\n modalAdd: false,\n modalEdit: false,\n options: [],\n saved: false,\n searchQuery: props.searchQuery || '',\n value: props.value || ''\n };\n\n this.timeout = null;\n }\n\n /**\n * Sets the new search query and value on the state.\n *\n * @param prevProps\n */\n componentDidUpdate(prevProps: Props) {\n if (prevProps.value !== this.props.value) {\n const { searchQuery, value } = this.props;\n this.setState({ searchQuery, value });\n }\n }\n\n /**\n * Clears the search timer.\n */\n clearSearchTimer() {\n clearTimeout(this.timeout);\n }\n\n /**\n * Clears the search query value if an option was not selected.\n */\n onBlur() {\n this.setState((state) => {\n let searchQuery = '';\n\n if (state.value) {\n searchQuery = this.props.searchQuery;\n }\n\n return { searchQuery };\n });\n }\n\n /**\n * Clears the search query and value.\n */\n onClear() {\n this.setState({ searchQuery: '', value: '' }, () => {\n this.props.onSelection(this.state.value);\n });\n }\n\n /**\n * Clears the search query and executes the search.\n */\n onOpen() {\n this.setState({ searchQuery: '' }, this.onSearch.bind(this));\n }\n\n /**\n * Resets the search query and value on the state.\n *\n * @param e\n * @param value\n */\n onOptionSelection(e: Event, { value }: { value: any }) {\n this.setState((state) => {\n const option = _.findWhere(state.options, { value }) || {};\n this.setState({ searchQuery: option.text, value: option.value });\n });\n\n const item = _.findWhere(this.state.items, { id: value });\n this.props.onSelection(item);\n }\n\n /**\n * Executes the search to load the options.\n */\n onSearch() {\n this.setState({ loading: true }, this.search.bind(this));\n }\n\n /**\n * Sets the search query on the state.\n *\n * @param e\n * @param searchQuery\n */\n onSearchChange(e: Event, { searchQuery }: { searchQuery: string }) {\n this.setState({ searchQuery });\n }\n\n search() {\n this.props\n .onSearch(this.state.searchQuery)\n .then(({ data }) => {\n const items = data[this.props.collectionName];\n const options = items.map(this.props.renderOption.bind(this));\n\n this.setState({ items, options, loading: false });\n });\n }\n\n /**\n * Renders the AssociatedDropdown component.\n *\n * @returns {*}\n */\n render() {\n return (\n <div\n className='association-dropdown'\n >\n <div className='dropdown-container'>\n <Dropdown\n className={`inline-dropdown ${this.props.className || ''}`}\n disabled={this.state.loading}\n loading={this.state.loading}\n onBlur={this.onBlur.bind(this)}\n onChange={this.onOptionSelection.bind(this)}\n onOpen={this.onOpen.bind(this)}\n onSearchChange={this.onSearchChange.bind(this)}\n options={this.state.options}\n placeholder={this.props.placeholder}\n search={() => this.state.options}\n searchInput={{\n 'aria-label': this.props.collectionName,\n className: 'dropdown-search-input',\n onKeyDown: Timer.clearSearchTimer.bind(this),\n onKeyUp: Timer.setSearchTimer.bind(this, this.onSearch.bind(this))\n }}\n searchQuery={this.state.searchQuery}\n selectOnBlur={false}\n selection\n upward={this.props.upward}\n value={this.state.value}\n />\n </div>\n <Button.Group\n className='buttons'\n >\n { this.renderEditButton() }\n { this.renderAddButton() }\n { this.renderClearButton() }\n </Button.Group>\n { this.renderModal() }\n { this.state.saved && (\n <Toaster\n onDismiss={() => this.setState({ saved: false })}\n type={Toaster.MessageTypes.positive}\n >\n <Message.Header\n content={i18n.t('Common.messages.save.header')}\n />\n <Message.Content\n content={i18n.t('Common.messages.save.content')}\n />\n </Toaster>\n )}\n </div>\n );\n }\n\n /**\n * Renders the add button (if applicable).\n *\n * @returns {null|*}\n */\n renderAddButton() {\n if (!this.props.modal) {\n return null;\n }\n\n return (\n <Button\n basic\n content={i18n.t('Common.buttons.add')}\n icon='plus'\n onClick={() => this.setState({ modalAdd: true })}\n type='button'\n />\n );\n }\n\n /**\n * Renders the clear button.\n *\n * @returns {*}\n */\n renderClearButton() {\n if (this.props.required) {\n return null;\n }\n\n return (\n <Button\n basic\n content={i18n.t('Common.buttons.clear')}\n icon='times'\n onClick={this.onClear.bind(this)}\n type='button'\n />\n );\n }\n\n /**\n * Renders the edit button (if applicable).\n *\n * @returns {null|*}\n */\n renderEditButton() {\n if (!this.props.modal || !this.props.modal.props || !this.props.modal.props.onInitialize || !this.state.value) {\n return null;\n }\n\n return (\n <Button\n basic\n content={i18n.t('Common.buttons.edit')}\n icon='pencil'\n onClick={() => this.setState({ modalEdit: true })}\n type='button'\n />\n );\n }\n\n /**\n * Renders the add association button.\n *\n * @returns {null|*}\n */\n renderModal() {\n if (!((this.state.modalAdd || this.state.modalEdit) && this.props.modal)) {\n return null;\n }\n\n const { component, props, onSave } = this.props.modal;\n\n // If we're editing the existing record, pass the ID to the modal in order to retrieve the full record.\n let item;\n\n if (this.state.modalEdit) {\n item = {\n id: this.state.value\n };\n }\n\n return (\n <EditModal\n component={component}\n item={item}\n onClose={() => this.setState({ modalAdd: false, modalEdit: false })}\n onSave={(data) => onSave(data)\n .then((record) => {\n this.props.onSelection(record);\n this.setState({ modalAdd: false, modalEdit: false, saved: true });\n })}\n {...props}\n />\n );\n }\n\n /**\n * Sets the search timer.\n */\n setSearchTimer() {\n clearTimeout(this.timeout);\n this.timeout = setTimeout(this.onSearch.bind(this), TIMEOUT);\n }\n}\n\nAssociatedDropdown.defaultProps = {\n className: '',\n modal: null,\n placeholder: null,\n required: false,\n upward: false\n};\n\nexport default AssociatedDropdown;\n","// @flow\n\nimport React from 'react';\nimport { Icon, Input } from 'semantic-ui-react';\nimport './DateInput.css';\n\ntype Props = {\n display?: string,\n formatOptions?: any,\n locale?: string,\n onChange: (date: ?Date) => void,\n onClick: () => void,\n value?: ?Date\n}\n\nconst DateInput = (props: Props) => {\n const formatDate = () => {\n let date = '';\n\n if (props.display) {\n date = props.display;\n } else if (props.value) {\n date = props.value.toLocaleDateString(props.locale, props.formatOptions);\n }\n\n return date;\n };\n\n return (\n <Input\n aria-label='Date Input'\n className='date-input icon'\n icon='calendar alternate outline'\n iconPosition='left'\n >\n <Icon\n className='left icon'\n name='calendar alternate outline'\n />\n <input\n onClick={props.onClick.bind(this)}\n readOnly\n type='text'\n value={formatDate()}\n />\n <Icon\n className='right icon'\n name='times'\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n props.onChange(null);\n }}\n />\n </Input>\n );\n};\n\nexport default DateInput;\n","import React from 'react';\n\nconst ModalContext = React.createContext();\n\nexport default ModalContext;\n","// @flow\n\nimport { Calendar, Browser } from '@performant-software/shared-components';\nimport React, { Component } from 'react';\nimport {\n Button,\n Checkbox,\n Dropdown,\n Form,\n Input,\n Modal,\n TextArea\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport DateField from './DateInput';\nimport ModalContext from '../context/ModalContext';\nimport './FuzzyDate.css';\n\ntype DateInput = {\n accuracy: number,\n description: string,\n endDate: string,\n range: boolean,\n startDate: string\n};\n\ntype DateOutput = {\n accuracy: number,\n description: string,\n endDate?: Date,\n range: boolean,\n startDate?: Date\n};\n\ntype DateComponent = {\n date: number,\n month: number,\n year: number\n};\n\ntype Props = {\n calendar?: string,\n date: DateInput,\n description?: boolean,\n locale?: string,\n onChange: (data: DateOutput) => void,\n title?: string\n};\n\ntype State = {\n accuracy: number,\n calendar: Calendar,\n description: string,\n display: string,\n endDate: DateComponent,\n modal: boolean,\n range: boolean,\n startDate: DateComponent\n};\n\nconst ACCURACY_DATE = 2;\nconst ACCURACY_MONTH = 1;\nconst ACCURACY_YEAR = 0;\n\nconst INTEGER_BASE = 10;\n\nconst MAX_YEAR_LENGTH = 6;\n\nclass FuzzyDate extends Component<Props, State> {\n static defaultProps: any;\n\n /**\n * Constructs a new FuzzyDate component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n ...this.getInitialState(),\n calendar: new Calendar(props.locale, props.calendar)\n };\n }\n\n /**\n * Initializes the FuzzyDate component.\n */\n componentDidMount() {\n this.initializeDate();\n }\n\n /**\n * Sets the state based on prop changes.\n *\n * @param prevProps\n */\n componentDidUpdate(prevProps: Props) {\n if (this.props.locale !== prevProps.locale || this.props.calendar !== prevProps.calendar) {\n this.setState({\n calendar: new Calendar(this.props.locale, this.props.calendar)\n });\n }\n\n if (this.props.date\n && (this.props.date.startDate !== prevProps.date.startDate\n || this.props.date.endDate !== prevProps.date.endDate)) {\n this.initializeDate();\n }\n }\n\n /**\n * Returns the display string for the passed date component.\n *\n * @param dateComponent\n *\n * @returns {*}\n */\n getDisplayDate(dateComponent: DateComponent) {\n const date = this.state.calendar.convertToDate(dateComponent);\n return this.state.calendar.format(date, this.state.accuracy);\n }\n\n /**\n * Returns the initial state object.\n *\n * @returns {{endDate: {}, display: string, accuracy: number, description: string, range: boolean,\n * modal: boolean, startDate: {}}}\n */\n getInitialState() {\n return {\n accuracy: ACCURACY_YEAR,\n description: '',\n display: '',\n endDate: {},\n modal: false,\n range: false,\n startDate: {}\n };\n }\n\n /**\n * Initializes the date.\n */\n initializeDate() {\n if (this.props.date) {\n const { accuracy = ACCURACY_YEAR, description = '', range = false } = this.props.date;\n\n let startDate = {};\n let endDate = {};\n\n if (this.props.date.startDate) {\n startDate = this.state.calendar.parseDate(this.props.date.startDate);\n }\n\n if (this.props.date.endDate) {\n endDate = this.state.calendar.parseDate(this.props.date.endDate);\n }\n\n this.setState({\n accuracy,\n description,\n range,\n startDate,\n endDate\n }, this.setDisplay.bind(this));\n } else {\n this.onAccuracyChange(null, { value: ACCURACY_YEAR });\n }\n }\n\n /**\n * Sets the accuracy value on the state. The start and end date values are also adjusted based on the accuracy.\n *\n * @param e\n * @param value\n */\n onAccuracyChange(e: ?Event, { value }: { value: number }) {\n const accuracy = value;\n\n this.setState((state) => {\n let endDate = { ...state.endDate };\n let startDate = { ...state.startDate };\n\n if (accuracy === ACCURACY_MONTH) {\n endDate = { ...endDate, date: state.calendar.getDefaultDate() };\n startDate = { ...startDate, date: state.calendar.getDefaultDate() };\n } else if (value === ACCURACY_YEAR) {\n endDate = { ...endDate, date: state.calendar.getDefaultDate(), month: state.calendar.getDefaultMonth() };\n startDate = { ...startDate, date: state.calendar.getDefaultDate(), month: state.calendar.getDefaultMonth() };\n }\n\n return {\n accuracy,\n endDate,\n startDate\n };\n }, this.setEndDate.bind(this));\n }\n\n /**\n * Clears the input date(s).\n */\n onClear() {\n this.setState(this.getInitialState(), this.onSave.bind(this));\n }\n\n /**\n * Closes the edit modal.\n */\n onClose() {\n this.setState({ modal: false }, this.initializeDate.bind(this));\n }\n\n /**\n * Sets the date value on the state.\n *\n * @param property\n * @param e\n * @param value\n */\n onDateChange(property: string, e: ?Event, { value }: { value: string }) {\n this.setState((state) => ({\n [property]: {\n ...state[property],\n date: value\n }\n }), this.setEndDate.bind(this));\n }\n\n /**\n * Sets the date description on the state.\n *\n * @param e\n * @param value\n */\n onDescriptionChange(e: Event, { value }: { value: string }) {\n this.setState({ description: value });\n }\n\n /**\n * Opens the edit modal.\n */\n onEdit() {\n this.setState({ modal: true });\n }\n\n /**\n * Sets the month value on the state.\n *\n * @param property\n * @param e\n * @param value\n */\n onMonthChange(property: string, e: ?Event, { value }: { value: string }) {\n this.setState((state) => ({\n [property]: {\n ...state[property],\n month: value\n }\n }), this.setEndDate.bind(this));\n }\n\n /**\n * Sets the range value on the set.\n */\n onRangeChange() {\n this.setState((state) => ({ range: !state.range }), this.setEndDate.bind(this));\n }\n\n /**\n * Sets the display value and closes the edit modal.\n */\n onSave() {\n // Set the display value\n this.setDisplay();\n\n // Convert the state date and end date to Date objects can call the onChange prop\n let startDate;\n let endDate;\n\n if (!_.isEmpty(this.state.startDate)) {\n startDate = this.state.calendar.convertToDate(this.state.startDate).toDate();\n }\n\n if (!_.isEmpty(this.state.endDate)) {\n endDate = this.state.calendar.convertToDate(this.state.endDate).toDate();\n }\n\n const { accuracy, description, range } = this.state;\n\n this.props.onChange({\n accuracy,\n description,\n range,\n startDate,\n endDate\n });\n\n // Close the modal\n this.setState({ modal: false });\n }\n\n /**\n * Sets the year value on the state.\n *\n * @param property\n * @param e\n * @param value\n */\n onYearChange(property: string, e: ?Event, { value }: { value: string }) {\n if (value && value.length > MAX_YEAR_LENGTH) {\n return;\n }\n\n this.setState((state) => ({\n [property]: {\n ...state[property],\n year: parseInt(value, INTEGER_BASE)\n }\n }), this.setEndDate.bind(this));\n }\n\n /**\n * Renders the FuzzyDate component.\n *\n * @returns {*}\n */\n render() {\n return (\n <>\n <DateField\n display={this.state.display}\n onClick={this.onEdit.bind(this)}\n onChange={this.onClear.bind(this)}\n />\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n as={Form}\n className='fuzzy-date-modal'\n mountNode={mountNode}\n open={this.state.modal}\n onClose={this.onClose.bind(this)}\n >\n <Modal.Header\n content={this.props.title || i18n.t('FuzzyDate.title')}\n />\n <Modal.Content>\n <Form.Input\n className='accuracy-container'\n label={i18n.t('FuzzyDate.labels.accuracy')}\n >\n <Checkbox\n checked={this.state.accuracy === ACCURACY_YEAR}\n id='accuracy-year'\n label={i18n.t('FuzzyDate.accuracy.year')}\n name='accuracy'\n onChange={this.onAccuracyChange.bind(this)}\n radio\n value={ACCURACY_YEAR}\n />\n <Checkbox\n checked={this.state.accuracy === ACCURACY_MONTH}\n id='accuracy-month'\n label={i18n.t('FuzzyDate.accuracy.month')}\n name='accuracy'\n onChange={this.onAccuracyChange.bind(this)}\n radio\n value={ACCURACY_MONTH}\n />\n <Checkbox\n checked={this.state.accuracy === ACCURACY_DATE}\n id='accuracy-date'\n label={i18n.t('FuzzyDate.accuracy.date')}\n name='accuracy'\n onChange={this.onAccuracyChange.bind(this)}\n radio\n value={ACCURACY_DATE}\n />\n </Form.Input>\n <Form.Group>\n { this.renderYear('startDate') }\n { this.renderMonth('startDate') }\n { this.renderDate('startDate') }\n { !this.state.range && (\n <div\n className='button-container'\n >\n <Button\n basic\n content={i18n.t('FuzzyDate.buttons.addRange')}\n icon='plus'\n onClick={this.onRangeChange.bind(this)}\n />\n </div>\n )}\n </Form.Group>\n { this.state.range && (\n <Form.Group>\n { this.renderYear('endDate') }\n { this.renderMonth('endDate') }\n { this.renderDate('endDate') }\n <div\n className='button-container'\n >\n <Button\n basic\n content={i18n.t('FuzzyDate.buttons.removeRange')}\n icon='times'\n onClick={this.onRangeChange.bind(this)}\n />\n </div>\n </Form.Group>\n )}\n { this.props.description && (\n <Form.Input\n id='description'\n label={i18n.t('FuzzyDate.labels.description')}\n >\n <TextArea\n id='description'\n onChange={this.onDescriptionChange.bind(this)}\n value={this.state.description}\n />\n </Form.Input>\n )}\n </Modal.Content>\n <Modal.Actions>\n <Button\n onClick={this.onSave.bind(this)}\n primary\n size='medium'\n type='submit'\n >\n { i18n.t('Common.buttons.save') }\n </Button>\n <Button\n basic\n onClick={this.onClose.bind(this)}\n size='medium'\n type='button'\n >\n { i18n.t('Common.buttons.cancel') }\n </Button>\n </Modal.Actions>\n </Modal>\n )}\n </ModalContext.Consumer>\n </>\n );\n }\n\n /**\n * Renders the date dropdown for the passed property.\n *\n * @param property\n *\n * @returns {null|*}\n */\n renderDate(property: string) {\n if (this.state.accuracy !== ACCURACY_DATE) {\n return null;\n }\n\n const date = this.state[property];\n const daysInMonth = this.state.calendar.daysInMonth(date.year, date.month);\n\n return (\n <Form.Input\n id='date-dropdown'\n label={i18n.t('FuzzyDate.labels.date')}\n >\n <Dropdown\n id='date-dropdown'\n onChange={this.onDateChange.bind(this, property)}\n options={_.range(1, daysInMonth + 1).map((i) => ({ key: i, value: i, text: i }))}\n selection\n value={date.date || this.state.calendar.getDefaultDate()}\n />\n </Form.Input>\n );\n }\n\n /**\n * Renders the month dropdown for the passed property.\n *\n * @param property\n *\n * @returns {null|*}\n */\n renderMonth(property: string) {\n if (this.state.accuracy !== ACCURACY_DATE && this.state.accuracy !== ACCURACY_MONTH) {\n return null;\n }\n\n return (\n <Form.Input\n id='month-dropdown'\n label={i18n.t('FuzzyDate.labels.month')}\n >\n <Dropdown\n id='month-dropdown'\n onChange={this.onMonthChange.bind(this, property)}\n options={_.map(this.state.calendar.listMonths(), (m, i) => ({ key: i, value: i, text: m }))}\n selection\n value={this.state[property].month || this.state.calendar.getDefaultMonth()}\n />\n </Form.Input>\n );\n }\n\n /**\n * Renders the year dropdown for the passed property.\n *\n * @param property\n *\n * @returns {*}\n */\n renderYear(property: string) {\n return (\n <Form.Input\n id='year'\n label={i18n.t('FuzzyDate.labels.year')}\n >\n <Input\n id='year'\n onChange={this.onYearChange.bind(this, property)}\n type='number'\n value={this.state[property].year || ''}\n />\n </Form.Input>\n );\n }\n\n /**\n * Sets the display value.\n */\n setDisplay() {\n const display = [];\n\n if (this.state.startDate && !_.isEmpty(this.state.startDate)) {\n display.push(this.getDisplayDate(this.state.startDate));\n }\n\n if (this.state.range && this.state.endDate && !_.isEmpty(this.state.endDate)) {\n display.push(' - ');\n display.push(this.getDisplayDate(this.state.endDate));\n }\n\n this.setState({\n display: display.join(' ')\n });\n }\n\n /**\n * Sets the end date value.\n */\n setEndDate() {\n if (this.state.range || !this.state.startDate || _.isEmpty(this.state.startDate)) {\n return;\n }\n\n this.setState((state) => {\n let endDate = state.calendar.convertToDate(state.startDate);\n\n if (state.accuracy === ACCURACY_YEAR) {\n endDate = state.calendar.addYear(endDate, 1);\n } else if (state.accuracy === ACCURACY_MONTH) {\n endDate = state.calendar.addMonth(endDate, 1);\n } else if (state.accuracy === ACCURACY_DATE) {\n endDate = state.calendar.addDate(endDate, 1);\n }\n\n return {\n endDate: state.calendar.parseDate(endDate)\n };\n });\n }\n}\n\nFuzzyDate.defaultProps = {\n calendar: Calendar.Calendars.gregorian,\n description: true,\n locale: Browser.isBrowser() && navigator.language,\n title: undefined\n};\n\nexport default FuzzyDate;\n","// @flow\n\nimport { type EditContainerProps } from '@performant-software/shared-components';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n type Element\n} from 'react';\nimport {\n Button,\n Checkbox,\n Dropdown,\n Form,\n Grid,\n Header,\n Input,\n Modal\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport AssociatedDropdown from './AssociatedDropdown';\nimport DropdownButton from './DropdownButton';\nimport FuzzyDate from './FuzzyDate';\nimport ModalContext from '../context/ModalContext';\n\ntype Option = {\n key: string | number,\n icon?: string,\n text: string,\n value: any\n};\n\ntype Filter = {\n collectionName?: 'string',\n key: string,\n label: string,\n onSearch?: (search: string) => Promise<any>,\n operator: ?string,\n options?: Array<Option>,\n renderOption?: (item: any) => Option,\n renderSearchQuery?: (item: any) => Element<any> | string,\n searchQuery?: string,\n type: string,\n value: ?any\n};\n\ntype Props = EditContainerProps & {\n filters: Array<Filter>,\n item: {\n filters: Array<Filter>,\n onSort: (filter: Filter) => any\n },\n onCreateFilter: (filter: Filter) => any\n};\n\nconst FilterTypes = {\n boolean: 'boolean',\n date: 'date',\n integer: 'integer',\n relationship: 'relationship',\n select: 'select',\n string: 'string',\n text: 'text'\n};\n\nconst FilterOperators = {\n equal: 'equal',\n notEqual: 'not_equal',\n contain: 'contain',\n notContain: 'not_contain',\n empty: 'empty',\n notEmpty: 'not_empty',\n greaterThan: 'greater_than',\n lessThan: 'less_than'\n};\n\nconst FilterOperatorOptions = [{\n key: FilterOperators.equal,\n value: FilterOperators.equal,\n text: i18n.t('ListFilters.operators.equal')\n}, {\n key: FilterOperators.notEqual,\n value: FilterOperators.notEqual,\n text: i18n.t('ListFilters.operators.notEqual')\n}, {\n key: FilterOperators.contain,\n value: FilterOperators.contain,\n text: i18n.t('ListFilters.operators.contain')\n}, {\n key: FilterOperators.notContain,\n value: FilterOperators.notContain,\n text: i18n.t('ListFilters.operators.notContain')\n}, {\n key: FilterOperators.empty,\n value: FilterOperators.empty,\n text: i18n.t('ListFilters.operators.empty')\n}, {\n key: FilterOperators.notEmpty,\n value: FilterOperators.notEmpty,\n text: i18n.t('ListFilters.operators.notEmpty')\n}, {\n key: FilterOperators.greaterThan,\n value: FilterOperators.greaterThan,\n text: i18n.t('ListFilters.operators.greaterThan')\n}, {\n key: FilterOperators.lessThan,\n value: FilterOperators.lessThan,\n text: i18n.t('ListFilters.operators.lessThan')\n}];\n\nconst OperatorsByType = {\n [FilterTypes.boolean]: [\n FilterOperators.equal\n ],\n [FilterTypes.date]: [\n FilterOperators.equal\n ],\n [FilterTypes.relationship]: [\n FilterOperators.equal,\n FilterOperators.notEqual,\n FilterOperators.empty,\n FilterOperators.notEmpty\n ],\n [FilterTypes.select]: [\n FilterOperators.equal,\n FilterOperators.notEqual,\n FilterOperators.empty,\n FilterOperators.notEmpty\n ],\n [FilterTypes.string]: [\n FilterOperators.equal,\n FilterOperators.notEqual,\n FilterOperators.contain,\n FilterOperators.notContain,\n FilterOperators.empty,\n FilterOperators.notEmpty\n ],\n [FilterTypes.text]: [\n FilterOperators.contain,\n FilterOperators.notContain,\n FilterOperators.empty,\n FilterOperators.notEmpty\n ]\n};\n\nconst ListFilters = (props: Props) => {\n /**\n * Returns the available operators for the passed filter type.\n *\n * @type {function(string): *}\n */\n const getOperatorsByType = useCallback((type: string) => {\n const operators = OperatorsByType[type];\n return _.filter(FilterOperatorOptions, (option) => !operators || _.contains(operators, option.key));\n }, []);\n\n /**\n * Default sort function.\n *\n * @param filter\n */\n const onDefaultSort = (filter) => filter.label;\n\n /**\n * Renders the input element for the passed filter.\n *\n * @type {(function(Filter): (null|*))|*}\n */\n const renderInput = useCallback((filter: Filter) => {\n // No need to render an input for \"empty\" or \"not empty\" operators\n if (filter.operator === FilterOperators.empty || filter.operator === FilterOperators.notEmpty) {\n return null;\n }\n\n // Render a checkbox for boolean types\n if (filter.type === FilterTypes.boolean) {\n return (\n <Checkbox\n onChange={() => props.onSaveChildAssociation('filters', { ...filter, value: !filter.value })}\n checked={filter.value}\n />\n );\n }\n\n // Render a text input for string, text, and integer types\n if (filter.type === FilterTypes.string || filter.type === FilterTypes.text || filter.type === FilterTypes.integer) {\n return (\n <Input\n onChange={(e, { value }) => props.onSaveChildAssociation('filters', { ...filter, value })}\n value={filter.value}\n />\n );\n }\n\n // Render a fuzzy date input for date types\n if (filter.type === FilterTypes.date) {\n return (\n <FuzzyDate\n date={filter.value || {}}\n description={false}\n onChange={(value) => {\n props.onSaveChildAssociation('filters', {\n ...filter,\n value\n });\n }}\n title={filter.label}\n />\n );\n }\n\n // Render a dropdown\n if (filter.type === FilterTypes.select) {\n return (\n <Dropdown\n onChange={(e, { value }) => props.onSaveChildAssociation('filters', { ...filter, value })}\n options={filter.options}\n selectOnBlur={false}\n selection\n value={filter.value}\n />\n );\n }\n\n // Render an AssociatedDropdown for relationship types\n if (filter.type === FilterTypes.relationship) {\n const {\n collectionName,\n onSearch,\n renderOption,\n renderSearchQuery,\n searchQuery,\n value\n } = filter;\n\n if (!(collectionName && onSearch && renderOption)) {\n return null;\n }\n\n return (\n <AssociatedDropdown\n collectionName={collectionName}\n onSearch={onSearch}\n onSelection={(item) => {\n props.onSaveChildAssociation('filters', {\n ...filter,\n searchQuery: renderSearchQuery && renderSearchQuery(item),\n value: item.id\n });\n }}\n renderOption={renderOption}\n required\n searchQuery={searchQuery || ''}\n value={value || null}\n />\n );\n }\n\n return null;\n }, [props.item.filters, props.onSaveChildAssociation]);\n\n /**\n * Sort the filters according to the onSort prop if provided.\n *\n * @type {unknown}\n */\n const filters = useMemo(() => _.sortBy(\n props.filters,\n props.item.onSort || onDefaultSort\n ), [props.filters, props.item.onSort]);\n\n /**\n * Since the filters may be restored from the session storage, complex object and functions are not serialized. Here\n * we'll default any properties for existing filters that could not be serialized when the component is mounted.\n */\n useEffect(() => {\n _.each(props.item.filters, (filter) => {\n const defaults = _.findWhere(props.filters, { key: filter.key });\n\n if (filter.type === FilterTypes.boolean) {\n defaults.value = false;\n }\n\n props.onSaveChildAssociation('filters', _.defaults(filter, defaults));\n });\n }, []);\n\n return (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n as={Form}\n centered={false}\n className='list-filters-modal'\n mountNode={mountNode}\n noValidate\n open\n size='small'\n >\n <Modal.Header>\n <Grid\n columns={2}\n >\n <Grid.Column\n verticalAlign='middle'\n >\n <Header\n content={i18n.t('ListFilters.title')}\n />\n </Grid.Column>\n <Grid.Column\n textAlign='right'\n >\n <DropdownButton\n color='green'\n icon='plus'\n options={_.map(filters, (filter) => ({\n key: filter.key,\n value: filter.key,\n text: filter.label\n }))}\n onChange={(e, { value }) => {\n const filter = _.findWhere(props.filters, { key: value });\n props.onSaveChildAssociation('filters', props.onCreateFilter({\n ...filter,\n operator: FilterOperators.equal\n }));\n }}\n scrolling\n text={i18n.t('ListFilters.buttons.add')}\n value=''\n />\n <Button\n color='red'\n content={i18n.t('ListFilters.buttons.reset')}\n icon='repeat'\n onClick={() => props.onReset()}\n style={{\n marginLeft: '1em'\n }}\n />\n </Grid.Column>\n </Grid>\n </Modal.Header>\n <Modal.Content>\n { !_.isEmpty(props.item.filters) && (\n <Grid>\n { _.map(props.item.filters, (filter) => (\n <Grid.Row\n columns={4}\n key={filter.key}\n verticalAlign='middle'\n >\n <Grid.Column>\n <Header\n content={filter.label}\n />\n </Grid.Column>\n <Grid.Column\n width={5}\n >\n <Dropdown\n options={getOperatorsByType(filter.type)}\n onChange={(e, { value }) => props.onSaveChildAssociation('filters', {\n ..._.omit(filter, 'value'),\n operator: value,\n })}\n selection\n value={filter.operator}\n />\n </Grid.Column>\n <Grid.Column\n width={5}\n >\n { renderInput(filter) }\n </Grid.Column>\n <Grid.Column\n width={1}\n >\n <Button\n basic\n icon='times'\n onClick={() => props.onDeleteChildAssociation('filters', filter)}\n />\n </Grid.Column>\n </Grid.Row>\n ))}\n </Grid>\n )}\n </Modal.Content>\n { props.children }\n </Modal>\n )}\n </ModalContext.Consumer>\n );\n};\n\nexport default ListFilters;\n\nexport {\n FilterTypes,\n FilterOperators,\n FilterOperatorOptions\n};\n\nexport type {\n Filter\n};\n","// @flow\n\nimport React, { useCallback } from 'react';\nimport { Button, Label } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport { FilterOperatorOptions, type Filter } from './ListFilters';\nimport './FilterLabels.css';\n\ntype Props = {\n filters: Array<Filter>,\n onClear?: () => void,\n onClick: (filter: Filter) => void\n};\n\nconst FilterLabels = (props: Props) => {\n /**\n * Returns the content string for the passed filter.\n *\n * @type {function(*): string}\n */\n const getContent = useCallback((filter) => {\n // Content will always container the label\n const content = [filter.label];\n\n // If an option can be found, use the text from the operator\n const option = _.findWhere(FilterOperatorOptions, { key: filter.operator });\n if (option) {\n content.push(option.text);\n }\n\n // Append the value in quotes, if present\n if (filter.value) {\n content.push(`\"${filter.value}\"`);\n }\n\n return content.join(' ');\n }, []);\n\n return (\n <Label.Group\n className='filter-labels'\n >\n { _.map(props.filters, (filter) => (\n <Label\n basic\n content={getContent(filter)}\n onRemove={() => props.onClick(filter)}\n />\n ))}\n { props.onClear && (\n <Label\n as={Button}\n color='red'\n content={i18n.t('FilterLabels.buttons.clear')}\n icon='times'\n onClick={props.onClear}\n />\n )}\n </Label.Group>\n );\n};\n\nexport default FilterLabels;\n","// @flow\n\nimport React, { Component, type ComponentType, type Element } from 'react';\nimport { Trans } from 'react-i18next';\nimport {\n Button,\n Confirm,\n Grid,\n Header,\n Icon,\n Menu,\n Pagination\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport DropdownButton from './DropdownButton';\nimport EditModal from './EditModal';\nimport FilterLabels from './FilterLabels';\nimport './List.css';\n\ntype Action = {\n accept: (item: any) => boolean,\n color?: string,\n icon?: string,\n name: string,\n onClick?: (item: any) => void,\n popup: {\n content: string,\n title: string\n },\n render?: (item: any, index: number) => Element<any>,\n title?: string\n};\n\ntype ListButton = {\n accept?: () => boolean,\n render: (index?: number) => Element<any>\n};\n\ntype Props = {\n /**\n * A list of actions to render for each element in the row. Actions with the names \"edit\" and \"delete\" will be\n * handled specially by the <code>List</code> higher-order component.\n */\n actions?: Array<Action>,\n\n /**\n * If provided, a button will display in the list header allowing the addition of items to the list. When clicked,\n * the <code>modal</code> prop will be rendered.\n */\n addButton?: {\n basic: boolean,\n color: string,\n content?: string,\n inverted?: boolean,\n location: string,\n onClick?: () => void,\n secondary?: boolean\n },\n\n /**\n * A list of arbitrary buttons to the display in the list header. All actions will be handled by the consuming\n * component.\n * <br />\n * <br />\n *\n * In addition to the props listed here for each button, buttons will also accept any of the Semantic UI\n * <a href=\"https://react.semantic-ui.com/elements/button/\" target=\"_blank\">Button</a> props.\n */\n buttons?: Array<ListButton>,\n\n /**\n * The number of total records in the list (not just the current page).\n */\n count?: number,\n\n /**\n * CSS class name to append to the <code>div</code> container.\n */\n className?: string,\n\n /**\n * If provided, a \"delete all\" button will be rendered in the list header.\n */\n deleteButton?: {\n color: string,\n location: string,\n onClick?: () => void\n },\n\n /**\n * If provided, the passed <code>component</code> will be rendered when the filter button is clicked.\n * <br />\n * <br />\n *\n * Values passed in the <code>defaults</code> and <code>props</code> properties will be made available in the\n * passed component.\n * <br />\n * <br />\n *\n * The <code>onChange</code> callback will fire when the filters are modified. This action will also reload the list,\n * passing the new filters the <code>onLoad</code> callback.\n */\n filters?: {\n active: boolean,\n component: Component<{}>,\n props?: any,\n state?: any,\n onChange: (params: any) => Promise<any>,\n showLabels?: boolean\n },\n\n /**\n * If provided, the passed modal will be rendered when the \"add\" button is clicked.\n */\n modal?: {\n component: ComponentType<any>,\n props: any,\n state: any\n },\n\n /**\n * If provided, this callback is fired when the \"copy\" action is clicked for an item. The consuming component\n * should generate a copy of the selected item and return that value. The return value is then set at the\n * current item in the edit modal.\n */\n onCopy?: (item: any) => any,\n\n /**\n * Callback fired when the \"delete\" action is clicked for an item.\n */\n onDelete?: (item: any) => void,\n\n /**\n * Callback fired when the delete all button is clicked. This prop expects a Promise as the return value.\n */\n onDeleteAll?: () => Promise<any>,\n\n /**\n * Callback fired when the page is changed via the pagination component.\n */\n onPageChange?: () => void,\n\n /**\n * Callback fired when the per page value is changed.\n */\n onPerPageChange?: () => void,\n\n /**\n * Callback fired when the save button is clicked in the add/edit modal. This function expects a Promise as the\n * return value.\n */\n onSave?: (item: any) => Promise<any>,\n\n /**\n * Current page number.\n */\n page?: number,\n\n /**\n * Number of pages in the list.\n */\n pages?: number,\n\n /**\n * The number of records to display per page.\n */\n perPage?: number,\n\n /**\n * The options to display in the dropdown for the per page selector.\n */\n perPageOptions?: Array<number>,\n\n /**\n * Custom render function for the modal that appears on the \"delete\" action.\n */\n renderDeleteModal?: ({ selectedItem: any, onCancel: () => void, onConfirm: () => void }) => Element<any>,\n\n /**\n * If provided, this function will return a JSX element that will prepend to the list header.\n */\n renderListHeader?: () => ?Element<any>,\n\n /**\n * If provided, this function will return a JSX element that will replace the default search input.\n */\n renderSearch?: () => Element<any>,\n\n /**\n * If set to <code>true</code>, checkboxes will render as the first table column, allowing each row to be selectable.\n * The consuming component is responsible for tracking the selected items.\n */\n selectable?: boolean,\n\n /**\n * If <code>true</code>, the total number of records will display in the list header.\n */\n showRecordCount?: boolean\n};\n\ntype State = {\n modalDelete: boolean,\n modalDeleteAll: boolean,\n modalEdit: boolean,\n modalFilter: boolean,\n selectedItem: any\n};\n\nconst BUTTON_KEY_ADD = 'add';\nconst BUTTON_KEY_DELETE_ALL = 'delete-all';\n\n/**\n * Renders a function to wrap the passed component in a List. This component will be used as the presentation for the\n * list, additional logic will be defined elsewhere. This component will render list header buttons, pagination,\n * search input, add/edit/delete modals, filter button, filter modal.\n *\n * @param WrappedComponent\n */\nconst useList = (WrappedComponent: ComponentType<any>) => (\n class extends Component<Props, State> {\n // Default props\n static defaultProps = {\n actions: [],\n addButton: {\n basic: true,\n color: 'green',\n location: 'top'\n },\n buttons: [],\n className: '',\n filters: undefined,\n modal: undefined,\n page: 1,\n pages: 1,\n onColumnClick: () => {},\n onCopy: undefined,\n onPageChange: () => {},\n renderDeleteModal: undefined,\n renderSearch: undefined,\n sortColumn: undefined,\n sortDirection: undefined\n };\n\n /**\n * Constructs a new List component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n modalDelete: false,\n modalDeleteAll: false,\n modalEdit: false,\n modalFilter: false,\n selectedItem: null\n };\n }\n\n /**\n * Renders the list of buttons for the passed location.\n *\n * @param location\n */\n getButtons(location: string) {\n const buttons = [];\n\n const {\n addButton = {},\n deleteButton = {},\n modal,\n selectable\n } = this.props;\n\n // Add the add button to the list if the location specified is the passed location.\n if (addButton.location === location && (addButton.onClick || modal) && !selectable) {\n buttons.push({\n render: this.renderAddButton.bind(this)\n });\n }\n\n // Add the delete all button to the list if the location specified is the passed location.\n if (deleteButton.location === location && this.props.onDeleteAll && !selectable) {\n buttons.push({\n render: this.renderDeleteAllButton.bind(this)\n });\n }\n\n // Resolve the array of other buttons\n buttons.push(..._.filter(this.props.buttons, (button) => {\n let include = false;\n\n /*\n * Include the button if the buttons specifies the passed location.\n * Include the button if no location is specified, but the add button is at the passed location.\n * Finally, include the button if the passed location is the top location.\n */\n if ((button.location || 'top') === location) {\n include = true;\n } else if (!button.location && addButton && addButton.location === location) {\n include = true;\n }\n\n return include;\n }));\n\n return buttons;\n }\n\n /**\n * Displays the add/edit modal.\n */\n onAddButton() {\n return this.props.addButton && this.props.addButton.onClick\n ? this.props.addButton.onClick()\n : this.setState({ modalEdit: true });\n }\n\n /**\n * Copies the selected item and displays the add/edit modal.\n *\n * @param selectedItem\n */\n onCopyButton(selectedItem: any) {\n const copy = this.props.onCopy\n ? this.props.onCopy(selectedItem)\n : _.omit(selectedItem, 'id', 'uid');\n\n this.setState({ selectedItem: copy, modalEdit: true });\n }\n\n /**\n * Deletes the currently selected item and clears the state.\n *\n * @returns {*}\n */\n onDelete() {\n const { selectedItem } = this.state;\n this.setState({ selectedItem: null, modalDelete: false });\n\n return this.props.onDelete(selectedItem);\n }\n\n /**\n * Deletes all items in the current list and resets the state.\n *\n * @returns {*}\n */\n onDeleteAll() {\n this.setState({ modalDeleteAll: false });\n return this.props.onDeleteAll && this.props.onDeleteAll();\n }\n\n /**\n * Displays the delete all confirmation modal.\n */\n onDeleteAllButton() {\n this.setState({ modalDeleteAll: true });\n }\n\n /**\n * Displays the delete confirmation modal for the selected item.\n *\n * @param selectedItem\n */\n onDeleteButton(selectedItem: any) {\n this.setState({ selectedItem, modalDelete: true });\n }\n\n /**\n * Displays the add/edit modal for the selected item.\n *\n * @param selectedItem\n */\n onEditButton(selectedItem: any) {\n this.setState({ selectedItem, modalEdit: true });\n }\n\n /**\n * Opens the filters modal.\n */\n onFilterButton() {\n this.setState({ modalFilter: true });\n }\n\n /**\n * Calls the filter onChange function with the passed filter removed.\n *\n * @param filter\n *\n * @returns {*}\n */\n onRemoveFilter(filter) {\n const { onChange, props: { item } } = this.props.filters;\n return onChange({ filters: _.filter(item.filters, (f) => f.uid !== filter.uid) });\n }\n\n /**\n * Saves the passed item and closes the add/edit modal.\n *\n * @param item\n *\n * @returns {*}\n */\n onSave(item: any) {\n return this.props\n .onSave(item)\n .then(() => this.setState({ modalEdit: false, selectedItem: null }));\n }\n\n /**\n * Calls the filters onChange prop and closes the modal.\n *\n * @param filters\n *\n * @returns {Q.Promise<any> | Promise<R> | Promise<any> | void | *}\n */\n onSaveFilter(filters: any) {\n if (!this.props.filters) {\n return null;\n }\n\n return this.props.filters\n .onChange(filters)\n .then(() => this.setState({ modalFilter: false }));\n }\n\n /**\n * Renders the DataTable component.\n *\n * @returns {*}\n */\n render() {\n return (\n <div\n className={`list ${this.props.className}`}\n >\n { this.renderHeader() }\n <WrappedComponent\n {...this.props}\n actions={this.getActions()}\n renderEmptyMessage={this.renderEmptyMessage.bind(this)}\n />\n { this.renderFooter() }\n { this.renderEditModal() }\n { this.renderDeleteModal() }\n { this.renderDeleteAllModal() }\n { this.renderFilterModal() }\n </div>\n );\n }\n\n /**\n * Returns the list of actions with pre-populated defaults for edit, copy, and delete.\n *\n * @returns {*}\n */\n getActions() {\n return _.map(this.props.actions, (action) => {\n let defaults = {};\n\n if (action.name === 'edit') {\n defaults = {\n icon: 'edit outline',\n onClick: this.onEditButton.bind(this)\n };\n } else if (action.name === 'copy') {\n defaults = {\n icon: 'copy outline',\n onClick: this.onCopyButton.bind(this)\n };\n } else if (action.name === 'delete') {\n defaults = {\n icon: 'times circle outline',\n onClick: this.onDeleteButton.bind(this)\n };\n }\n\n return _.defaults(action, defaults);\n });\n }\n\n /**\n * Renders the add button.\n *\n * @returns {*}\n */\n renderAddButton() {\n if (!this.props.addButton) {\n return null;\n }\n\n return (\n <Button\n basic={this.props.addButton.basic !== false}\n color={this.props.addButton.color}\n key={BUTTON_KEY_ADD}\n inverted={this.props.addButton.inverted}\n onClick={this.onAddButton.bind(this)}\n secondary={this.props.addButton.secondary}\n >\n <Icon name='plus' />\n { this.props.addButton.content || i18n.t('List.buttons.add') }\n </Button>\n );\n }\n\n /**\n * Renders the passed button. If a render function is provided, call the render function. Otherwise, assume\n * button props.\n *\n * @param button\n * @param index\n *\n * @returns {*}\n */\n renderButton(button: any, index: number) {\n if (button.render) {\n return button.render(index);\n }\n\n if (button.accept && !button.accept()) {\n return null;\n }\n\n return (\n <Button\n key={index}\n {...button}\n />\n );\n }\n\n /**\n * Renders the delete all button.\n *\n * @returns {null|*}\n */\n renderDeleteAllButton() {\n if (!this.props.deleteButton) {\n return null;\n }\n\n return (\n <Button\n basic\n color={this.props.deleteButton.color}\n key={BUTTON_KEY_DELETE_ALL}\n onClick={this.onDeleteAllButton.bind(this)}\n >\n <Icon name='times' />\n { i18n.t('List.buttons.deleteAll') }\n </Button>\n );\n }\n\n /**\n * Renders the delete all modal if visible.\n *\n * @returns {null|*}\n */\n renderDeleteAllModal() {\n if (!this.state.modalDeleteAll) {\n return null;\n }\n\n return (\n <Confirm\n content={i18n.t('List.deleteAllContent')}\n header={<Header icon='trash alternate outline' content={i18n.t('List.deleteAllHeader')} />}\n onCancel={() => this.setState({ modalDeleteAll: false })}\n onConfirm={this.onDeleteAll.bind(this)}\n open\n />\n );\n }\n\n /**\n * Renders the delete modal if visible.\n *\n * @returns {null|*}\n */\n renderDeleteModal() {\n if (!this.state.modalDelete) {\n return null;\n }\n\n const { selectedItem } = this.state;\n const onCancel = () => this.setState({ selectedItem: null, modalDelete: false });\n const onConfirm = this.onDelete.bind(this);\n\n if (this.props.renderDeleteModal) {\n return this.props.renderDeleteModal({ selectedItem, onConfirm, onCancel });\n }\n\n return (\n <Confirm\n content={i18n.t('List.deleteContent')}\n header={<Header icon='trash alternate outline' content={i18n.t('List.deleteHeader')} />}\n onCancel={onCancel}\n onConfirm={onConfirm}\n open\n />\n );\n }\n\n /**\n * Renders the edit modal if visible.\n *\n * @returns {null|*}\n */\n renderEditModal() {\n if (!this.props.modal || !this.state.modalEdit) {\n return null;\n }\n\n const { component, props } = this.props.modal;\n\n return (\n <EditModal\n component={component}\n onClose={() => this.setState({ selectedItem: null, modalEdit: false })}\n onSave={this.onSave.bind(this)}\n item={this.state.selectedItem}\n {...props}\n />\n );\n }\n\n /**\n * Renders the empty message text/component. The message content is based on whether or not records can be added\n * to this data table.\n *\n * @returns {*}\n */\n renderEmptyMessage() {\n const { addButton = {}, modal } = this.props;\n if (!(addButton.onClick || modal)) {\n return i18n.t('List.emptyList');\n }\n\n return (\n <Trans i18nKey='List.emptyListAdd'>\n You haven't added any yet. Click\n <div className='empty-button'>\n { this.renderAddButton() }\n </div>\n to get started.\n </Trans>\n );\n }\n\n /**\n * Renders the filter button component.\n *\n * @returns {null|*}\n */\n renderFilterButton() {\n if (!(this.props.filters && this.props.filters.component)) {\n return null;\n }\n\n return (\n <Button\n active={this.props.filters.active}\n aria-label='Filter'\n basic\n icon='filter'\n onClick={this.onFilterButton.bind(this)}\n />\n );\n }\n\n /**\n * Renders the filter modal if visible.\n *\n * @returns {null|*}\n */\n renderFilterModal() {\n if (!this.props.filters || !this.state.modalFilter) {\n return null;\n }\n\n const { component, props } = this.props.filters;\n\n return (\n <EditModal\n {...props}\n component={component}\n onClose={() => this.setState({ modalFilter: false })}\n onSave={this.onSaveFilter.bind(this)}\n />\n );\n }\n\n /**\n * Renders the list footer.\n *\n * @returns {null|*}\n */\n renderFooter() {\n let renderFooter = false;\n\n const buttons = this.getButtons('bottom');\n if (buttons && buttons.length) {\n renderFooter = true;\n }\n\n const hasPages = this.props.pages && this.props.pages > 1;\n if (hasPages) {\n renderFooter = true;\n }\n\n const showCount = this.props.count && this.props.showRecordCount;\n if (showCount) {\n renderFooter = true;\n }\n\n if (!renderFooter) {\n return null;\n }\n\n return (\n <div className='footer'>\n <Grid\n columns={2}\n >\n <Grid.Column\n textAlign='left'\n >\n { showCount ? this.renderRecordCount() : '' }\n { _.map(buttons, (button) => button.render()) }\n </Grid.Column>\n <Grid.Column\n textAlign='right'\n >\n { hasPages ? this.renderPagination() : ''}\n </Grid.Column>\n </Grid>\n </div>\n );\n }\n\n /**\n * Renders the table header.\n *\n * @returns {null|*}\n */\n renderHeader() {\n let renderHeader = false;\n\n const buttons = this.getButtons('top');\n\n if (buttons && buttons.length) {\n renderHeader = true;\n }\n\n const {\n filters,\n perPageOptions,\n renderListHeader,\n renderSearch\n } = this.props;\n\n if (filters || perPageOptions || renderListHeader || renderSearch) {\n renderHeader = true;\n }\n\n const hasLabels = filters && filters.showLabels && !_.isEmpty(filters.props.item.filters);\n\n if (!renderHeader) {\n return null;\n }\n\n return (\n <div\n className='header'\n >\n <Grid\n className={hasLabels ? 'filter-labels' : undefined}\n verticalAlign='top'\n >\n <Grid.Row\n columns={2}\n >\n <Grid.Column\n textAlign='left'\n >\n { _.map(buttons, this.renderButton.bind(this)) }\n </Grid.Column>\n <Grid.Column\n textAlign='right'\n >\n <Menu\n compact\n borderless\n secondary\n className='flex-end-menu'\n >\n { renderListHeader && (\n <Menu.Menu className='list-header-menu'>\n { renderListHeader() }\n </Menu.Menu>\n )}\n <Menu.Menu>\n { filters && this.renderFilterButton() }\n </Menu.Menu>\n { perPageOptions && (\n <Menu.Menu className='per-page-menu'>\n { this.renderPerPage() }\n </Menu.Menu>\n )}\n <Menu.Menu>\n { renderSearch && renderSearch() }\n </Menu.Menu>\n </Menu>\n </Grid.Column>\n </Grid.Row>\n { hasLabels && (\n <Grid.Row\n columns={1}\n >\n <Grid.Column>\n <FilterLabels\n filters={filters.props.item.filters}\n onClear={() => filters.onChange({ filters: [] })}\n onClick={(filter) => this.onRemoveFilter(filter)}\n />\n </Grid.Column>\n </Grid.Row>\n )}\n </Grid>\n </div>\n );\n }\n\n /**\n * Renders the pagination component.\n *\n * @returns {null|*}\n */\n renderPagination() {\n return (\n <Pagination\n activePage={this.props.page}\n firstItem={null}\n lastItem={null}\n onPageChange={this.props.onPageChange.bind(this)}\n size='mini'\n totalPages={this.props.pages}\n />\n );\n }\n\n /**\n * Renders the per page selector.\n *\n * @returns {JSX.Element}\n */\n renderPerPage() {\n const { perPage } = this.props;\n\n return (\n <DropdownButton\n basic\n icon='list'\n onChange={this.props.onPerPageChange.bind(this)}\n options={_.map(this.props.perPageOptions, (count) => ({\n key: count,\n value: count,\n text: count\n }))}\n text={i18n.t('List.labels.perPage', { perPage })}\n value={perPage}\n />\n );\n }\n\n /**\n * Renders the record count component.\n *\n * @returns {null|*}\n */\n renderRecordCount() {\n const { count } = this.props;\n return (\n <p className='record-count'>\n {`${Number(count).toLocaleString()} ${i18n.t('List.record', { count })}`}\n </p>\n );\n }\n }\n);\n\nexport default useList;\n\nexport type {\n Action,\n Props\n};\n","// @flow\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n type Element\n} from 'react';\nimport _ from 'underscore';\nimport { Button, Checkbox, Dropdown } from 'semantic-ui-react';\nimport NestedAccordion from './NestedAccordion';\nimport useDataList, { SORT_ASCENDING } from './DataList';\nimport useList, { type Props as ListProps } from './List';\nimport './AccordionDataList.css';\n\ntype Sort = {\n key: any,\n value: any,\n text: string,\n direction?: string\n};\n\ntype Props = ListProps & {\n getChildItems: (items: ?Array<any>, item: any) => Array<any>,\n getRootItems: (items: ?Array<any>) => Array<any>,\n page: number,\n onInit: () => void,\n onSort: (column: string, direction: ?string, page?: number) => void,\n selectable: boolean,\n sort?: Array<Sort>,\n sortColumn?: string,\n sortDirection?: string\n};\n\ntype AccordionProps = ListProps & {\n getChildItems: (items: Array<any>, item: any) => Array<any>,\n onItemToggle: (item: any) => void,\n onRowSelect: (?any, ?any, ?any) => void,\n renderItem: (item: any) => Element<any>,\n rootItems: Array<any>,\n selectable: boolean,\n selectedRows: Array<{id: number}>,\n showToggle: (item: any) => boolean\n};\n\nconst Accordion = useList((props: AccordionProps) => {\n /**\n * Renders the actions for the passed item.\n *\n * @type {(function(*=): (null|*))|*}\n */\n const renderActions = useCallback((item) => {\n const actions = _.filter(props.actions, (action) => !action.accept || action.accept(item));\n\n if (_.isEmpty(actions)) {\n return null;\n }\n\n return (\n <Button.Group>\n { _.map(actions, (action, index) => (\n <Button\n aria-label={action.name}\n basic\n color={action.color}\n icon={action.icon}\n key={`${action.name}-${index}`}\n onClick={action.onClick && action.onClick.bind(this, item)}\n title={action.title}\n />\n ))}\n </Button.Group>\n );\n }, [props.actions]);\n\n /**\n * Renders the checkbox for the passed item.\n *\n * @type {(function(*=): (null|*))|*}\n */\n const renderCheckbox = useCallback((item) => {\n if (!props.selectable) {\n return null;\n }\n\n return (\n <Checkbox\n key={`select-checkbox-${item.id}`}\n className='row-select-checkbox'\n onClick={(e, el) => props.onRowSelect(el, item, e)}\n checked={!!props.selectedRows.find((r) => r.id === item.id)}\n />\n );\n }, [props.onRowSelect, props.selectable, props.selectedRows]);\n\n return (\n <div\n className={['accordion-data-list', props.className || ''].join(' ')}\n >\n <NestedAccordion\n getChildItems={props.getChildItems}\n onItemToggle={(item) => props.onItemToggle && props.onItemToggle(item)}\n renderItem={(item) => props.renderItem(item)}\n renderRight={(item) => (\n <>\n { renderActions(item) }\n { renderCheckbox(item) }\n </>\n )}\n rootItems={props.rootItems}\n showToggle={(item) => props.showToggle(item)}\n />\n </div>\n );\n});\n\nconst AccordionDataList = (props: Props) => {\n const rootItems = useMemo(() => props.getRootItems(props.items), [props.items]);\n const getChildItems = useCallback((item) => props.getChildItems(props.items, item), [props.items]);\n const sortDropdown = useRef<?typeof Dropdown>();\n\n /**\n * Sets the current sort value.\n *\n * @type {unknown}\n */\n const sortValue = useMemo(() => {\n const sort = _.find(props.sort, { value: props.sortColumn });\n return sort && sort.text;\n }, [props.sort, props.sortColumn]);\n\n /**\n * Toggles the sort property.\n *\n * @type {(function(*): void)|*}\n */\n const onSort = useCallback((sort) => {\n if (!props.onSort) {\n return;\n }\n\n let sortDirection;\n\n if (sort.value !== props.sortColumn) {\n sortDirection = sort.direction;\n }\n\n props.onSort(sort.value, sortDirection);\n }, [props.onSort, props.sortColumn]);\n\n /**\n * Renders the sort dropdown.\n *\n * @type {(function(): (null|*))|*}\n */\n const renderSort = useCallback(() => {\n if (_.isEmpty(props.sort)) {\n return null;\n }\n\n return (\n <Button.Group\n basic\n style={{\n fontSize: 'inherit'\n }}\n >\n <Button\n aria-label='Sort by'\n content={sortValue}\n icon={props.sortDirection === SORT_ASCENDING ? 'sort alphabet up' : 'sort alphabet down'}\n onClick={(e) => sortDropdown.current && sortDropdown.current.handleClick(e)}\n />\n <Dropdown\n aria-label='Sort by toggle'\n className='button icon'\n floating\n options={_.map(props.sort, (sort) => ({\n ...sort,\n onClick: () => onSort(sort)\n }))}\n ref={sortDropdown}\n trigger={<></>}\n value={props.sortColumn}\n />\n </Button.Group>\n );\n }, [props.sort, props.sortColumn, props.sortDirection]);\n\n /**\n * Sorts the first column on component mount. If no sort properties are defined, the onInit prop is called.\n */\n useEffect(() => {\n if (_.isEmpty(props.sort)) {\n return props.onInit();\n }\n\n const { page } = props;\n let { sortColumn = '', sortDirection = SORT_ASCENDING } = props;\n\n if (!sortColumn) {\n const defaultSort = _.first(props.sort);\n\n if (defaultSort) {\n sortColumn = defaultSort.value;\n\n if (defaultSort.direction) {\n sortDirection = defaultSort.direction;\n }\n }\n }\n\n return props.onSort(sortColumn, sortDirection, page);\n }, []);\n\n return (\n <Accordion\n {...props}\n renderListHeader={renderSort}\n rootItems={rootItems}\n getChildItems={getChildItems}\n />\n );\n};\n\nexport default useDataList(AccordionDataList);\n","// @flow\n\nimport { Object as ObjectUtils, Timer } from '@performant-software/shared-components';\nimport React, { Component } from 'react';\nimport {\n Button,\n Checkbox,\n Confirm,\n Grid,\n Header,\n Input,\n Message,\n Pagination\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport EditModal from './EditModal';\nimport NestedAccordion from './NestedAccordion';\nimport Toaster from './Toaster';\nimport './AccordionList.css';\n\ntype Props = {\n buttons: Array<Object>,\n canAddItem?: (item: any) => boolean,\n canCopyItem?: (item: any) => boolean,\n canDeleteItem?: (item: any) => boolean,\n canEditItem?: (item: any) => boolean,\n className?: string,\n collectionName: string,\n getChildItems: (items: Array<any>, item: any) => Array<any>,\n getRootItems: (items: Array<any>) => Array<any>,\n hideAddRootButton: boolean,\n lazyLoad: boolean,\n modal?: {\n component: Component<{}>,\n onAddItem: (item: any) => any,\n props: any,\n state: any,\n },\n onCopy: (item: any) => any,\n onDelete: (item: any) => Promise<any>,\n onRowSelect: (?any, ?any, ?any) => void,\n onSave: (item: any) => Promise<any>,\n onSearch: (?number | ?string, ?number | ?string) => Promise<any>,\n onSelectAll: (?any, ?any, ?any, ?any) => void,\n pagination: boolean,\n renderItem: (item: any) => string | Component<{}>,\n selectable: boolean,\n selectedRows: Array<{id: number}>,\n showRecordCount: boolean,\n showToggle: (item: any) => boolean,\n};\n\ntype State = {\n count: number,\n items: Array<any>,\n modalAdd: boolean,\n modalDelete: boolean,\n page: ?number,\n pages: ?number,\n saved: boolean,\n searchQuery: string,\n selectedItem: ?any\n};\n\nclass AccordionList extends Component<Props, State> {\n static defaultProps: any;\n\n /**\n * Constructs a new AccordionList component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n count: 0,\n items: [],\n modalAdd: false,\n modalDelete: false,\n page: 1,\n pages: 1,\n saved: false,\n searchQuery: '',\n selectedItem: null\n };\n }\n\n /**\n * Executes the initial search.\n */\n componentDidMount() {\n this.onSearch();\n }\n\n /**\n * Displays the add modal for the selected item.\n *\n * @param item\n */\n onAddButton(item: any) {\n let selectedItem = item;\n if (this.props.modal && this.props.modal.onAddItem) {\n selectedItem = this.props.modal.onAddItem(item);\n }\n\n this.setState({ modalAdd: true, selectedItem });\n }\n\n /**\n * Deletes the currently selected item.\n *\n * @returns {*}\n */\n onDelete() {\n const item = this.state.selectedItem;\n\n return this.props\n .onDelete(item)\n .then(() => {\n this.setState((state) => ({\n modalDelete: false,\n selectedItem: null,\n items: _.reject(state.items, (i) => i === item)\n }));\n });\n }\n\n /**\n * Displays the delete modal and sets the selected item.\n *\n * @param item\n */\n onDeleteButton(item: any) {\n this.setState({ modalDelete: true, selectedItem: item });\n }\n\n /**\n * Displays the edit modal and sets the selected item.\n *\n * @param item\n */\n onEditButton(item: any) {\n this.setState({ modalAdd: true, selectedItem: item });\n }\n\n /**\n * Copies the selected item and displays the add/edit modal.\n *\n * @param selectedItem\n */\n onCopyButton(selectedItem: any) {\n let copy;\n if (this.props.onCopy) {\n copy = this.props.onCopy(selectedItem);\n if (ObjectUtils.isPromise(copy)) {\n copy.then((item) => {\n this.setState({ selectedItem: item, modalAdd: true });\n });\n } else {\n copy = _.omit(selectedItem, 'id', 'uid');\n this.setState({ selectedItem: copy, modalAdd: true });\n }\n }\n }\n\n /**\n * Lazy-loads the children of the passed item and sets them on the state..\n *\n * @param item\n */\n onItemToggle(item: any) {\n if (!item.loaded && this.props.lazyLoad) {\n this.onSearch(item.id).then(() => {\n // Set the \"loaded\" property on item to prevent multiple API calls\n this.setState((state) => ({\n items: _.map(state.items, (i) => (i.id === item.id ? { ...i, loaded: true } : i))\n }));\n });\n }\n }\n\n /**\n * Changes active page and fetches new set of paginated data.\n */\n onPageChange(e: any, selectedPage: any) {\n this.setState({ page: selectedPage.activePage }, () => this.onSearch());\n }\n\n /**\n * Saves the passed item.\n *\n * @param item\n *\n * @returns {*}\n */\n onSave(item: any) {\n return this.props\n .onSave(item)\n .then((saved) => {\n this.setState((state) => ({\n modalAdd: false,\n selectedItem: false,\n saved: true,\n items: item.id ? _.map(state.items, (i) => (i.id === saved.id ? saved : i)) : [...state.items, saved]\n }));\n });\n }\n\n /**\n * Executes the search and sets the returned items on the state.\n *\n * @param parentId\n *\n * @returns {*}\n */\n onSearch(parentId?: number) {\n if (this.props.lazyLoad) {\n return this.props\n .onSearch(parentId, this.state.searchQuery)\n .then(({ data }) => {\n const items = data[this.props.collectionName];\n this.setState((state) => (parentId\n ? { items: [...state.items || [], ...items] }\n : { items }));\n });\n }\n // for models that use a join table or a relationship\n // structure other than nestable node levels/ancestors\n return this.props\n .onSearch(this.state.searchQuery, this.state.page)\n .then(({ data }) => {\n const items = data[this.props.collectionName];\n this.setState({ items });\n if (this.props.showRecordCount) {\n this.setState({ count: data.list.count });\n }\n if (this.props.pagination) {\n const pageCount = data.list.pages;\n this.setState({ pages: pageCount });\n }\n });\n }\n\n /**\n * Sets the search query on the state.\n *\n * @param e\n * @param value\n */\n onSearchChange(e: Event, { value }: any) {\n this.setState({ searchQuery: value });\n }\n\n /**\n * Renders the AccordionList component.\n *\n * @returns {*}\n */\n render() {\n return (\n <div\n className={['accordion-list', this.props.className || ''].join(' ')}\n >\n <Header\n className='accordion-header'\n >\n <Input\n aria-label='Search'\n autoFocus\n className='search'\n icon='search'\n onKeyDown={Timer.clearSearchTimer.bind(this)}\n onKeyUp={Timer.setSearchTimer.bind(this, this.onSearch.bind(this))}\n onChange={this.onSearchChange.bind(this)}\n size='mini'\n type='text'\n value={this.state.searchQuery}\n />\n { this.renderHeaderAddButton() }\n { this.props.buttons.map((b) => b.render()) }\n </Header>\n { this.renderSubHeader() }\n <NestedAccordion\n getChildItems={this.props.getChildItems.bind(this, this.state.items)}\n onItemToggle={this.onItemToggle.bind(this)}\n renderItem={this.props.renderItem.bind(this)}\n renderRight={this.renderRight.bind(this)}\n rootItems={this.props.getRootItems(this.state.items)}\n showToggle={this.props.showToggle.bind(this)}\n />\n { this.renderFooter() }\n { this.renderAddModal() }\n <Confirm\n content={i18n.t('AccordionList.deleteContent')}\n header={i18n.t('AccordionList.deleteHeader')}\n open={this.state.modalDelete}\n onCancel={() => this.setState({ modalDelete: false, selectedItem: null })}\n onConfirm={this.onDelete.bind(this)}\n />\n { this.state.saved && (\n <Toaster\n onDismiss={() => this.setState({ saved: false })}\n type={Toaster.MessageTypes.positive}\n >\n <Message.Header\n content={i18n.t('Common.messages.save.header')}\n />\n <Message.Content\n content={i18n.t('Common.messages.save.content')}\n />\n </Toaster>\n )}\n </div>\n );\n }\n\n /**\n * Renders the add button for the passed item (if applicable).\n *\n * @param item\n *\n * @returns {null|*}\n */\n renderAddButton(item: any) {\n if (this.props.canAddItem && !this.props.canAddItem(item)) {\n return null;\n }\n\n return (\n <Button\n aria-label='Add'\n basic\n compact\n icon='plus'\n onClick={this.onAddButton.bind(this, item)}\n />\n );\n }\n\n renderSelectAll() {\n if (!this.props.selectable && !this.props.onSelectAll) {\n return null;\n }\n\n const selectedRowIds = this.props.selectedRows.map((r) => r.id);\n const itemsOnPage = this.state.items ? this.state.items : [];\n const toBeSelected = itemsOnPage.reduce((tbs, item) => (\n selectedRowIds.includes(item.id) ? tbs : [...tbs, item]), []);\n\n return (\n <Checkbox\n aria-label='Select All'\n onClick={(e, el) => this.props.onSelectAll(el, toBeSelected, this.state.items, e)}\n checked={!toBeSelected.length}\n />\n );\n }\n\n renderSubHeader() {\n return (\n <div className='sub-header'>\n { this.renderSelectAll() }\n </div>\n );\n }\n\n /**\n * Renders the add modal.\n *\n * @returns {null|*}\n */\n renderAddModal() {\n if (!(this.state.modalAdd && this.props.modal)) {\n return null;\n }\n const { component, props } = this.props.modal;\n\n return (\n <EditModal\n component={component}\n item={this.state.selectedItem}\n onClose={() => this.setState({ modalAdd: false, selectedItem: null })}\n onSave={this.onSave.bind(this)}\n {...props}\n />\n );\n }\n\n /**\n * Renders the delete button for the passed item (if applicable).\n *\n * @param item\n *\n * @returns {null|*}\n */\n renderDeleteButton(item: any) {\n if (this.props.canDeleteItem && !this.props.canDeleteItem(item)) {\n return null;\n }\n\n return (\n <Button\n aria-label='Delete'\n basic\n compact\n icon='trash'\n onClick={this.onDeleteButton.bind(this, item)}\n />\n );\n }\n\n /**\n * Renders the edit button for the passed item (if applicable).\n *\n * @param item\n *\n * @returns {null|*}\n */\n renderEditButton(item: any) {\n if (this.props.canEditItem && !this.props.canEditItem(item)) {\n return null;\n }\n\n return (\n <Button\n aria-label='Edit'\n basic\n compact\n icon='edit'\n onClick={this.onEditButton.bind(this, item)}\n />\n );\n }\n\n /**\n * Renders the copy button for the passed item (if applicable).\n *\n * @param item\n *\n * @returns {null|*}\n */\n renderCopyButton(item: any) {\n if (this.props.canCopyItem && !this.props.canCopyItem(item)) {\n return null;\n }\n\n return (\n <Button\n aria-label='Copy'\n basic\n compact\n icon='copy'\n onClick={() => this.onCopyButton(item)}\n />\n );\n }\n\n /**\n * Renders the header add button.\n *\n * @returns {null|*}\n */\n renderHeaderAddButton() {\n if (!this.props.modal || this.props.hideAddRootButton) {\n return null;\n }\n\n return (\n <Button\n basic\n className='add-button'\n content={i18n.t('Common.buttons.add')}\n icon='plus'\n onClick={() => this.setState({ modalAdd: true })}\n />\n );\n }\n\n /**\n * Renders the record count component.\n *\n * @returns {null|*}\n */\n renderRecordCount() {\n const recordCount = this.state.count;\n if (!recordCount) {\n return null;\n }\n\n return (\n <span className='record-count'>\n {`${Number(recordCount).toLocaleString()} ${i18n.t('AccordionList.record', { count: recordCount })}`}\n </span>\n );\n }\n\n /**\n * Renders the pagination button row.\n *\n * @returns {null|*}\n */\n renderPagination() {\n if (!this.props.pagination) {\n return null;\n }\n\n return (\n <Pagination\n activePage={this.state.page}\n onPageChange={this.onPageChange.bind(this)}\n size='mini'\n totalPages={this.state.pages}\n />\n );\n }\n\n /**\n * Renders the footer.\n *\n * @returns {null|*}\n */\n renderFooter() {\n if (this.props.pagination || this.props.showRecordCount) {\n return (\n <div className='footer'>\n <Grid\n columns={2}\n >\n <Grid.Column\n textAlign='left'\n >\n { this.renderRecordCount() }\n </Grid.Column>\n <Grid.Column\n textAlign='right'\n >\n { this.renderPagination() }\n </Grid.Column>\n </Grid>\n </div>\n );\n }\n return null;\n }\n\n /**\n * Renders the select checkbox for the passed item.\n *\n * @returns {null|*}\n */\n renderSelectCheckbox(item: {id: number}) {\n if (!this.props.selectable) {\n return null;\n }\n const selected = this.props.selectedRows.find((r) => r.id === item.id);\n return (\n <Checkbox\n aria-label='Select'\n key={`select-checkbox-${item.id}`}\n className='row-select-checkbox'\n onClick={(e, el) => this.props.onRowSelect(el, item, e)}\n checked={!!selected}\n />\n );\n }\n\n /**\n * Renders the right side of the passed item.\n *\n * @param item\n *\n * @returns {*}\n */\n renderRight(item: any) {\n return (\n <>\n <Button.Group>\n { this.renderAddButton(item) }\n { this.renderEditButton(item) }\n { this.renderCopyButton(item) }\n { this.renderDeleteButton(item) }\n </Button.Group>\n { this.renderSelectCheckbox(item) }\n </>\n );\n }\n}\n\nAccordionList.defaultProps = {\n buttons: [],\n canAddItem: () => true,\n canDeleteItem: () => true,\n canEditItem: () => true,\n canCopyItem: () => false,\n className: '',\n lazyLoad: true,\n modal: undefined,\n pagination: false\n};\n\nexport default AccordionList;\n","// @flow\n\nimport React, { type Element } from 'react';\nimport { Button, Segment } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport './SelectizeHeader.css';\n\ntype Props = {\n isSelected: (item: any) => boolean,\n items: Array<any>,\n onItemClick: (item: any) => void,\n renderItem: (item: any) => string | Element<any>\n};\n\nconst SelectizeHeader = (props: Props) => {\n if (!(props.items && props.items.length)) {\n return null;\n }\n\n return (\n <Segment\n className='selectize-header'\n textAlign='left'\n >\n { _.map(props.items, (item, index) => (\n <Button\n className='selected'\n content={props.renderItem(item)}\n icon={props.isSelected(item) ? 'times circle outline' : undefined}\n key={index}\n onClick={props.onItemClick.bind(this, item)}\n primary\n size='small'\n />\n ))}\n </Segment>\n );\n};\n\nexport default SelectizeHeader;\n","// @flow\n\nimport { Timer } from '@performant-software/shared-components';\nimport React, { Component, type ComponentType, type Element } from 'react';\nimport { withTranslation } from 'react-i18next';\nimport {\n Button,\n Grid,\n Header,\n Icon,\n Input,\n Message,\n Modal\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport EditModal from './EditModal';\nimport ModalContext from '../context/ModalContext';\nimport NestedAccordion from './NestedAccordion';\nimport SelectizeHeader from './SelectizeHeader';\nimport Toaster from './Toaster';\nimport './AccordionSelector.css';\n\ntype Props = {\n collectionName: string,\n getChildItems: (items: Array<any>, item: any) => Array<any>,\n getRootItems: (items: Array<any>) => Array<any>,\n isSelectable?: (item: any) => boolean,\n modal?: {\n component: ComponentType<{}>,\n onSave: (item: any) => Promise<any>,\n props: any,\n state: any,\n },\n multiple?: boolean,\n onClose: () => void,\n onSave: (selectedItems: Array<any>) => void,\n onSearch: (parentId: ?number, search: ?string) => any,\n open?: boolean,\n renderItem: (item: any) => string | Element<any>,\n selectedItems?: Array<any>,\n showToggle: (item: any) => boolean,\n title?: string\n};\n\ntype State = {\n items: Array<any>,\n modalAdd: boolean,\n saved: boolean,\n searchQuery: string,\n selectedItem: ?any,\n selectedItems: Array<any>\n};\n\nclass AccordionSelector extends Component<Props, State> {\n static defaultProps: any;\n\n /**\n * Constructs a new AccordionSelector component.\n *\n * @param props\n */\n constructor(props) {\n super(props);\n\n this.state = {\n items: [],\n modalAdd: false,\n saved: false,\n searchQuery: '',\n selectedItem: null,\n selectedItems: props.selectedItems\n };\n }\n\n /**\n * Executes the initial search when the modal is opened.\n */\n componentDidUpdate(prevProps) {\n if (this.props.open && !prevProps.open) {\n this.onSearch();\n }\n\n if (this.props.selectedItems !== prevProps.selectedItems) {\n this.setState({ selectedItems: this.props.selectedItems });\n }\n }\n\n /**\n * Returns true if the passed item is selected.\n *\n * @param item\n *\n * @returns {boolean}\n */\n isSelected(item) {\n return !!_.findWhere(this.state.selectedItems, { id: item.id });\n }\n\n /**\n * Toggles selection for the passed item.\n *\n * @param item\n */\n onItemClick(item) {\n if (this.props.isSelectable && !this.props.isSelectable(item)) {\n return;\n }\n\n this.setState((state) => {\n let selectedItems;\n\n if (this.isSelected(item)) {\n selectedItems = _.filter(state.selectedItems, (i) => i.id !== item.id);\n } else if (!this.props.multiple) {\n selectedItems = [item];\n } else {\n selectedItems = [\n ...state.selectedItems,\n item\n ];\n }\n\n return { selectedItems };\n });\n }\n\n /**\n * Toggles selection for the passed item.\n *\n * @param item\n */\n onItemSelection(item) {\n if (this.state.selectedItem === item) {\n this.setState({ selectedItem: null }, this.onItemClick.bind(this, item));\n } else {\n this.setState({ selectedItem: item });\n }\n }\n\n /**\n * Lazy-loads the children for the passed item.\n *\n * @param item\n */\n onItemToggle(item) {\n if (!item.loaded) {\n this.onSearch(item.id).then(() => {\n // Set the \"loaded\" property on item to prevent multiple API calls\n this.setState((state) => ({\n items: _.map(state.items, (i) => (i.id === item.id ? { ...i, loaded: true } : i))\n }));\n });\n }\n }\n\n /**\n * Executes the search.\n *\n * @param parentId\n *\n * @returns {*}\n */\n onSearch(parentId = null) {\n return this.props\n .onSearch(parentId, this.state.searchQuery)\n .then(({ data }) => {\n const items = data[this.props.collectionName];\n this.setState((state) => (parentId ? { items: [...state.items || [], ...items] } : { items }));\n });\n }\n\n /**\n * Sets the search query value on the state.\n *\n * @param e\n * @param value\n */\n onSearchChange(e, { value }) {\n this.setState({ searchQuery: value });\n }\n\n /**\n * Renders the AccordionSelector modal.\n *\n * @returns {*}\n */\n render() {\n return (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n className='accordion-selector'\n mountNode={mountNode}\n open={this.props.open}\n size='small'\n >\n <Modal.Header>\n <Grid\n columns={2}\n verticalAlign='middle'\n >\n <Grid.Column\n textAlign='left'\n width={7}\n >\n <Header\n content={this.props.title\n ? this.props.title\n : i18n.t('AccordionSelector.title')}\n />\n </Grid.Column>\n <Grid.Column\n textAlign='right'\n width={9}\n >\n <Input\n aria-label='Search'\n autoFocus\n icon='search'\n onKeyDown={Timer.clearSearchTimer.bind(this)}\n onKeyUp={Timer.setSearchTimer.bind(this, this.onSearch.bind(this))}\n onChange={this.onSearchChange.bind(this)}\n size='mini'\n type='text'\n value={this.state.searchQuery}\n />\n { this.renderAddButton() }\n </Grid.Column>\n </Grid>\n </Modal.Header>\n <Modal.Content>\n <SelectizeHeader\n isSelected={(item) => this.state.selectedItem === item}\n items={this.state.selectedItems}\n onItemClick={this.onItemSelection.bind(this)}\n renderItem={this.props.renderItem.bind(this)}\n />\n <NestedAccordion\n getChildItems={this.props.getChildItems.bind(this, this.state.items)}\n onItemClick={this.onItemClick.bind(this)}\n onItemToggle={this.onItemToggle.bind(this)}\n renderItem={this.props.renderItem.bind(this)}\n renderRight={this.renderRight.bind(this)}\n rootItems={this.props.getRootItems(this.state.items)}\n showToggle={this.props.showToggle.bind(this)}\n />\n { this.renderAddModal() }\n { this.state.saved && (\n <Toaster\n onDismiss={() => this.setState({ saved: false })}\n type={Toaster.MessageTypes.positive}\n >\n <Message.Header\n content={i18n.t('Common.messages.save.header')}\n />\n <Message.Content\n content={i18n.t('Common.messages.save.content')}\n />\n </Toaster>\n )}\n </Modal.Content>\n <Modal.Actions>\n <Button\n onClick={this.props.onSave.bind(this, this.state.selectedItems)}\n primary\n size='medium'\n type='submit'\n >\n { i18n.t('Common.buttons.save') }\n </Button>\n <Button\n basic\n onClick={this.props.onClose.bind(this)}\n size='medium'\n type='button'\n >\n { i18n.t('Common.buttons.cancel') }\n </Button>\n </Modal.Actions>\n </Modal>\n )}\n </ModalContext.Consumer>\n );\n }\n\n /**\n * Renders the add button.\n *\n * @returns {null|*}\n */\n renderAddButton() {\n if (!this.props.modal) {\n return null;\n }\n\n return (\n <Button\n basic\n className='add-button'\n content={i18n.t('Common.buttons.add')}\n icon='plus'\n onClick={() => this.setState({ modalAdd: true })}\n />\n );\n }\n\n /**\n * Renders the add modal.\n *\n * @returns {null|*}\n */\n renderAddModal() {\n if (!(this.state.modalAdd && this.props.modal)) {\n return null;\n }\n\n const { component, props, onSave } = this.props.modal;\n\n return (\n <EditModal\n component={component}\n onClose={() => this.setState({ modalAdd: false, selectedItem: null })}\n onSave={(item) => onSave(item)\n .then((saved) => this.setState({\n modalAdd: false,\n saved: true,\n searchQuery: '',\n selectedItems: [saved]\n }, this.onSearch.bind(this)))}\n {...props}\n />\n );\n }\n\n /**\n * Renders the right column for the passed item.\n *\n * @param item\n *\n * @returns {null|*}\n */\n renderRight(item) {\n if (!this.isSelected(item)) {\n return null;\n }\n\n return (\n <Icon\n color='green'\n name='check'\n />\n );\n }\n}\n\nAccordionSelector.defaultProps = {\n isSelectable: undefined,\n modal: undefined,\n multiple: false,\n open: false,\n selectedItems: [],\n title: undefined\n};\n\nexport default withTranslation()(AccordionSelector);\n","// @flow\n\nimport React from 'react';\nimport { Button } from 'semantic-ui-react';\nimport './ArrowButtons.css';\n\ntype Props = {\n /**\n * Callback for left arrow click\n */\n onLeft: () => void,\n\n /**\n * Callback for right arrow click\n */\n onRight: () => void,\n};\n\n/**\n * A component used to move items from left to right or right to left.\n */\nconst ArrowButtons = (props: Props) => (\n <Button.Group\n className='arrow-buttons'\n vertical\n >\n <Button\n aria-label='Move Right'\n basic\n icon='arrow right'\n onClick={props.onRight.bind(this)}\n />\n <Button\n aria-label='Move Left'\n basic\n icon='arrow left'\n onClick={props.onLeft.bind(this)}\n />\n </Button.Group>\n);\n\nexport default ArrowButtons;\n","// @flow\n\nimport React, { useState } from 'react';\nimport { Button, Message, Modal } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport ModalContext from '../context/ModalContext';\nimport './AudioPlayer.css';\n\ntype Props = {\n centered?: boolean,\n onClose: () => void,\n open: boolean,\n src: string\n};\n\nconst AudioPlayer = (props: Props) => {\n const [error, setError] = useState(false);\n\n return (\n <ModalContext.Consumer>\n {(mountNode) => (\n <Modal\n centered={props.centered}\n className='audio-player'\n mountNode={mountNode}\n open={props.open}\n >\n <Modal.Content>\n { error && (\n <Message\n content={i18n.t('AudioPlayer.errors.path.content', { path: props.src })}\n header={i18n.t('AudioPlayer.errors.path.header')}\n icon='exclamation circle'\n />\n )}\n <audio\n controls\n onError={() => setError(true)}\n src={props.src}\n />\n </Modal.Content>\n <Modal.Actions>\n <Button\n content={i18n.t('Common.buttons.close')}\n onClick={props.onClose}\n />\n </Modal.Actions>\n </Modal>\n )}\n </ModalContext.Consumer>\n );\n};\n\nexport default AudioPlayer;\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"zotero-api-client\");","// @flow\n\nimport _ from 'underscore';\nimport api from 'zotero-api-client';\nimport BibliographyTypes from '../resources/BibliographyTypes.json';\n\nconst hiddenFields = [\n 'mimeType',\n 'linkMode',\n 'charset',\n 'md5',\n 'mtime',\n 'version',\n 'key',\n 'collections',\n 'relations',\n 'parentItem',\n 'contentType',\n 'filename',\n 'tags',\n 'creator',\n 'abstractNote',\n 'notes',\n 'rights',\n 'extra'\n];\n\nconst noEditFields = [\n 'modified',\n 'filename',\n 'dateAdded',\n 'dateModified'\n];\n\n/**\n * Checks the API cache for the passed key.\n *\n * @param key\n *\n * @returns {boolean}\n */\nconst apiCheckCache = (key) => {\n let cacheTimes = {};\n let okToUseCache = false;\n\n try {\n cacheTimes = JSON.parse(localStorage.getItem('zotero-bib-api-cache')) || {};\n } catch (e) {\n // ignore\n }\n\n if (key in cacheTimes) {\n okToUseCache = (Date.now() - cacheTimes[key]) < 24 * 60 * 60 * 1000;\n }\n\n if (!okToUseCache) {\n cacheTimes[key] = Date.now();\n localStorage.setItem('zotero-bib-api-cache', JSON.stringify(cacheTimes));\n }\n\n return okToUseCache;\n};\n\n/**\n * Returns the fields for the passed item. This function was largely copied directly from zotero/bib-web.\n *\n * @param item\n * @param itemTypeFields\n * @param itemTypes\n *\n * @returns {{item, fields: Array<T|unknown>}|{item, fields: *[]}}\n */\nconst getFieldsAndItem = (item, itemTypeFields, itemTypes) => {\n if (!item || !itemTypeFields || !itemTypes) {\n return { item, fields: [] };\n }\n\n const titleField = (item.itemType in BibliographyTypes && BibliographyTypes[item.itemType]?.title) || 'title';\n let fields = [\n { field: 'itemType', localized: 'Item Type' },\n itemTypeFields.find((itf) => itf.field === titleField),\n { field: 'creators', localized: 'Creators' },\n ...itemTypeFields.filter((itf) => itf.field !== titleField)\n ]\n .filter((f) => f && !hiddenFields.includes(f.field))\n .concat([\n itemTypeFields.find((itf) => itf.field === 'abstractNote'),\n itemTypeFields.find((itf) => itf.field === 'extra'),\n ]);\n\n // Add Original Date field to book and bookSection #188\n if (['book', 'bookSection'].includes(item.itemType)) {\n const dateIndex = fields.findIndex((f) => f.field === 'date');\n fields.splice(dateIndex + 1, 0, { field: 'original-date', localized: 'Original Date' });\n const matches = 'extra' in item && item.extra.match(/^original-date:\\s*(.*?)$/);\n if (matches) {\n _.extend(item, {\n 'original-date': matches[1],\n extra: item.extra.replace(/^original-date:\\s*.*?$/, '')\n });\n }\n }\n\n // Add Publisher to webpage\n if (['webpage'].includes(item.itemType)) {\n const beforeIndex = fields.findIndex((f) => f.field === 'websiteType');\n fields.splice(beforeIndex + 1, 0, { field: 'publisher', localized: 'Publisher' });\n const matches = 'extra' in item && item.extra.match(/^publisher:\\s*(.*?)$/i);\n if (matches) {\n _.extend(item, {\n publisher: matches[1],\n extra: item.extra.replace(/^publisher:\\s*.*?$/, '')\n });\n }\n }\n\n fields = fields.map((f) => ({\n options: f.field === 'itemType' ? itemTypes : null,\n key: f.field,\n label: f.localized,\n readonly: noEditFields.includes(f.field),\n processing: false,\n value: f.field in item ? item[f.field] : null\n }));\n\n return { item, fields };\n};\n\n/**\n * Calls the Zotero API to get the fields for the passed item type.\n *\n * @param itemType\n * @param retryOnFailure\n *\n * @returns {Promise<{itemTypes, itemTypeFields, itemTypeCreatorTypes}|*>}\n */\nconst getItemTypeMeta = async (itemType: string, retryOnFailure: boolean = true): any => {\n let itemTypes;\n let itemTypeFields;\n let itemTypeCreatorTypes;\n\n try {\n const [itemTypeR, itemTypeFieldsR, creatorTypesR] = await Promise.all([\n api()\n .itemTypes()\n .get({ cache: apiCheckCache('itemTypes') ? 'force-cache' : 'default' }),\n api()\n .itemTypeFields(itemType)\n .get({ cache: apiCheckCache(`itemTypeFields-${itemType}`) ? 'force-cache' : 'default' }),\n api()\n .itemTypeCreatorTypes(itemType)\n .get({ cache: apiCheckCache(`itemTypeCreatorTypes-${itemType}`) ? 'force-cache' : 'default' })\n ]);\n\n itemTypes = itemTypeR.getData();\n itemTypeFields = itemTypeFieldsR.getData();\n itemTypeCreatorTypes = creatorTypesR.getData();\n } catch (e) {\n // Clear the api cache\n localStorage.removeItem('zotero-bib-api-cache');\n\n // Call again if we're re-trying on failure\n if (retryOnFailure) {\n return getItemTypeMeta(itemType, false);\n }\n\n // If all else fails, throw an exception\n throw e;\n }\n\n return {\n itemTypes,\n itemTypeFields,\n itemTypeCreatorTypes\n };\n};\n\n/**\n * Returns true if the passed identifier matches a URL pattern.\n *\n * @param id\n *\n * @returns {boolean}\n */\nconst isUrl = (id) => !!id.match(/^(https?:\\/\\/)?[-a-zA-Z0-9@:%._+~#=]{2,256}\\.[a-z]{2,6}\\b(\\S*)$/i);\n\nexport default {\n getFieldsAndItem,\n getItemTypeMeta,\n isUrl\n};\n","// @flow\n\nimport React, { useCallback, useEffect, useMemo } from 'react';\nimport { Dropdown, Form } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport './CreatorField.css';\n\nconst NameTypes = {\n single: 0,\n full: 1\n};\n\ntype Props = {\n allowDelete?: boolean,\n creatorTypes: Array<any>,\n creator: any,\n onAdd: () => void,\n onDelete: () => void,\n onUpdate: (props: any) => void\n};\n\nconst CreatorField = (props: Props) => {\n /**\n * Updates the passed attribute for the current creator.\n *\n * @type {function(string, ?Event, *): *}\n */\n const onUpdate = useCallback((attribute: string, e: ?Event, { value }: any) => (\n props.onUpdate({ ...props.creator || {}, [attribute]: value })\n ), [props.creator, props.onUpdate]);\n\n /**\n * Updates the passed attributes for the current creator.\n *\n * @type {function(*): *}\n */\n const onUpdateAttributes = useCallback((attributes) => (\n props.onUpdate({ ...props.creator || {}, ...attributes })\n ), [props.creator, props.onUpdate]);\n\n /**\n * Sets the label attribute as a dropdown of the passed creatorTypes prop.\n *\n * @type {unknown}\n */\n const label = useMemo(() => (\n // eslint-disable-next-line jsx-a11y/label-has-associated-control\n <label>\n <Dropdown\n onChange={onUpdate.bind(this, 'creatorType')}\n options={_.map(props.creatorTypes, (ct) => ({\n key: ct.value,\n value: ct.value,\n text: ct.label\n }))}\n value={props.creator.creatorType}\n />\n </label>\n ), [props.creator.creatorType, props.creatorTypes]);\n\n /**\n * Default the nameType property to full (first name/last name).\n */\n useEffect(() => {\n if (!_.has(props.creator, 'nameType')) {\n onUpdateAttributes({ nameType: NameTypes.full });\n }\n }, [props.creator, onUpdateAttributes]);\n\n /**\n * Convert between firstName/lastName and name attributes depending on the name type.\n */\n useEffect(() => {\n if (props.creator.name && props.creator.nameType === NameTypes.full) {\n const [firstName, lastName] = props.creator.name.split(' ');\n onUpdateAttributes({ name: null, firstName, lastName });\n } else if ((props.creator.firstName || props.creator.lastName) && props.creator.nameType === NameTypes.single) {\n const name = _.compact([props.creator.firstName, props.creator.lastName]).join(' ');\n onUpdateAttributes({ firstName: null, lastName: null, name });\n }\n }, [props.creator.nameType]);\n\n return (\n <Form.Group\n className='creator-field'\n >\n { props.creator.nameType === NameTypes.full && (\n <>\n <Form.Input\n className='flex'\n label={label}\n onChange={onUpdate.bind(this, 'firstName')}\n placeholder={i18n.t('CreatorField.labels.firstName')}\n value={props.creator.firstName}\n />\n <Form.Input\n className='flex'\n onChange={onUpdate.bind(this, 'lastName')}\n placeholder={i18n.t('CreatorField.labels.lastName')}\n value={props.creator.lastName}\n />\n <Form.Button\n icon='exchange'\n onClick={() => onUpdateAttributes({ nameType: NameTypes.single })}\n />\n </>\n )}\n { props.creator.nameType === NameTypes.single && (\n <>\n <Form.Input\n className='flex'\n label={label}\n onChange={onUpdate.bind(this, 'name')}\n placeholder={i18n.t('CreatorField.labels.name')}\n value={props.creator.name}\n />\n <Form.Button\n icon='exchange'\n onClick={() => onUpdateAttributes({ nameType: NameTypes.full })}\n />\n </>\n )}\n <Form.Button\n icon='plus'\n onClick={props.onAdd}\n />\n <Form.Button\n disabled={!props.allowDelete}\n icon='minus'\n onClick={props.onDelete}\n />\n </Form.Group>\n );\n};\n\nexport default CreatorField;\n","// @flow\n\nimport React, { useCallback, useEffect, useMemo } from 'react';\nimport _ from 'underscore';\nimport CreatorField from './CreatorField';\n\ntype Props = {\n creatorTypes: Array<any>,\n onChange: (creators: Array<any>) => void,\n value: Array<any>\n};\n\nconst Creators = (props: Props) => {\n /**\n * Sets the default creator type.\n *\n * @type {unknown}\n */\n const defaultCreatorType = useMemo(() => (\n props.creatorTypes && props.creatorTypes.length && props.creatorTypes[0].value\n ), [props.creatorTypes]);\n\n /**\n * Adds a new creator record with the default type.\n *\n * @type {function(): *}\n */\n const onAddCreator = useCallback(() => props.onChange([\n ...(props.value || []),\n { creatorType: defaultCreatorType }\n ]), [props.onChange, props.value]);\n\n /**\n * Deletes the creator at the passed index.\n *\n * @type {function(*): *}\n */\n const onDeleteCreator = useCallback((index) => props.onChange(\n _.filter(props.value, (v, i) => i !== index)\n ), [props.onChange, props.value]);\n\n /**\n * Updates the creator at the passed index.\n *\n * @type {function(*, *): *}\n */\n const onUpdateCreator = useCallback((index, value) => props.onChange(\n _.map(props.value, (v, i) => (i === index ? value : v))\n ), [props.onChange, props.value]);\n\n /**\n * Updates the creator type on the items if the selected value is not longer valid.\n *\n * @type {(function(*): (*))|*}\n */\n const onUpdateCreatorType = useCallback((item) => {\n const creatorType = _.findWhere(props.creatorTypes, { value: item.creatorType });\n if (creatorType) {\n return item;\n }\n\n return {\n ...item,\n creatorType: defaultCreatorType\n };\n }, [props.creatorTypes, defaultCreatorType]);\n\n /**\n * Add the first creator when the component is mounted.\n */\n useEffect(() => {\n onAddCreator();\n }, []);\n\n /**\n * If the list of creator types changes, reset any invalid creator types to the default value.\n */\n useEffect(() => {\n if (props.value && props.value.length) {\n props.onChange(_.map(props.value, onUpdateCreatorType));\n }\n }, [onUpdateCreatorType, props.creatorTypes]);\n\n return _.map(props.value, (creator, index) => (\n <CreatorField\n allowDelete={props.value.length > 1}\n creator={creator}\n creatorTypes={props.creatorTypes}\n key={index}\n onAdd={() => onAddCreator()}\n onDelete={() => onDeleteCreator(index)}\n onUpdate={(value) => onUpdateCreator(index, value)}\n />\n ));\n};\n\nexport default Creators;\n","// @flow\n\nimport type { EditContainerProps } from '@performant-software/shared-components/types';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { Form } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport BibliographyUtils from '../utils/Bibliography';\nimport Creators from './Creators';\n\ntype Props = EditContainerProps & {\n /**\n * A JSON representation of the bibliographic item.\n */\n item: any\n};\n\n// Field constants\nconst FIELD_ABSTRACT_NOTE = 'abstractNote';\nconst FIELD_CREATORS = 'creators';\nconst FIELD_EXTRA = 'extra';\nconst FIELD_ITEM_TYPE = 'itemType';\n\n/**\n * This component can be used in conjunction with the `useEditContainer` higher-order component to create a form\n * used to enter bibliographic data.\n */\nconst BibliographyForm = (props: Props) => {\n const [creators, setCreators] = useState([]);\n const [fields, setFields] = useState([]);\n\n /**\n * Renders the input element for the passed field.\n *\n * @type {(function(*): *)|*}\n */\n const renderField = useCallback((field) => {\n if (field.key === FIELD_ITEM_TYPE) {\n return (\n <Form.Dropdown\n disabled={field.readonly}\n key={field.key}\n label={field.label}\n onChange={props.onTextInputChange.bind(this, field.key)}\n options={_.map(field.options, (option) => ({\n key: option.value,\n value: option.value,\n text: option.label\n }))}\n selectOnBlur={false}\n selection\n value={props.item[field.key] || ''}\n />\n );\n }\n\n if (field.key === FIELD_CREATORS) {\n return (\n <Creators\n creatorTypes={creators}\n key={field.key}\n onChange={(value) => props.onSetState({ [field.key]: value })}\n value={props.item[field.key] || []}\n />\n );\n }\n\n if (field.key === FIELD_ABSTRACT_NOTE || field.key === FIELD_EXTRA) {\n return (\n <Form.TextArea\n disabled={field.readonly}\n key={field.key}\n label={field.label}\n onChange={props.onTextInputChange.bind(this, field.key)}\n value={props.item[field.key] || ''}\n />\n );\n }\n\n return (\n <Form.Input\n disabled={field.readonly}\n key={field.key}\n label={field.label}\n onChange={props.onTextInputChange.bind(this, field.key)}\n value={props.item[field.key] || ''}\n />\n );\n }, [creators, props.item]);\n\n /**\n * Load the metadata for the selected item type.\n */\n useEffect(() => {\n BibliographyUtils\n .getItemTypeMeta(props.item.itemType)\n .then((data) => {\n const itemTypes = _.map(data.itemTypes, (it) => ({\n value: it.itemType,\n label: it.localized\n }));\n\n const itemTypeCreatorTypes = _.map(data.itemTypeCreatorTypes, (ct) => ({\n value: ct.creatorType,\n label: ct.localized\n }));\n\n setCreators(itemTypeCreatorTypes);\n\n const bibliographyData = BibliographyUtils.getFieldsAndItem(props.item, data.itemTypeFields, itemTypes);\n setFields(bibliographyData.fields);\n });\n }, [props.item.itemType]);\n\n return (\n <>\n { _.map(fields, renderField) }\n </>\n );\n};\n\nexport default BibliographyForm;\n","// @flow\n\nimport type { EditContainerProps } from '@performant-software/shared-components/types';\nimport React from 'react';\nimport { Form, Modal } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport BibliographyForm from './BibliographyForm';\n\ntype Props = EditContainerProps & {\n item: any\n};\n\nconst BibliographyModal = (props: Props) => (\n <Modal\n as={Form}\n centered={false}\n open\n >\n <Modal.Header\n content={i18n.t('BibliographyModal.title')}\n />\n <Modal.Content>\n <BibliographyForm\n {...props}\n />\n </Modal.Content>\n { props.children }\n </Modal>\n);\n\nexport default BibliographyModal;\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"zotero-translation-client\");","// @flow\n\nimport { createContext } from 'react';\n\nconst ZoteroTranslateContext = createContext();\n\nexport default ZoteroTranslateContext;\n","// @flow\n\nimport React, { useCallback, useContext, useState } from 'react';\nimport { Button, Input } from 'semantic-ui-react';\nimport ZoteroTranslationClient from 'zotero-translation-client';\nimport BibliographyUtils from '../utils/Bibliography';\nimport i18n from '../i18n/i18n';\nimport ZoteroTranslateContext from '../context/ZoteroTranslateContext';\nimport './BibliographySearchInput.css';\n\ntype Props = {\n /**\n * Callback fired when the translator encounters an error.\n */\n onError: () => void,\n\n /**\n * Callback fired when the translator is successful.\n * @param items\n */\n onFind: (items: array<any>) => void\n};\n\n/**\n * This component renders a search input and can be used within a `ZoteroTranslateContext` to lookup sources by URL,\n * ISBN, DOI, and more identifiers. The `ZoteroTranslateContext` requires a running\n * [Zotero Translation Server](https://github.com/zotero/translation-server) to be passed as the `translateUrl` key.\n */\nconst BibliographySearchInput = (props: Props) => {\n const [loading, setLoading] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n\n const { translateUrl } = useContext(ZoteroTranslateContext);\n\n /**\n * Calls the onFind prop if the request is successful, otherwise onError.\n *\n * @type {(function(*): void)|*}\n */\n const onLoadItems = useCallback((response) => {\n const { ok } = response.response;\n\n if (ok) {\n props.onFind(response.items);\n } else {\n props.onError();\n }\n }, [props.onFind]);\n\n /**\n * Uses the Zotero Translation API client to translate the search query.\n *\n * @type {(function(): void)|*}\n */\n const onSearch = useCallback(() => {\n setLoading(true);\n\n const translator = new ZoteroTranslationClient({\n translateURL: translateUrl,\n persist: false,\n });\n\n if (BibliographyUtils.isUrl(searchQuery)) {\n translator\n .translateUrl(searchQuery, { add: false })\n .then(onLoadItems)\n .finally(() => setLoading(false));\n } else {\n translator\n .translateIdentifier(searchQuery, { add: false })\n .then(onLoadItems)\n .finally(() => setLoading(false));\n }\n }, [searchQuery]);\n\n return (\n <div\n className='bibliography-search-input'\n >\n <Input\n autoFocus\n disabled={loading}\n onChange={(e, { value }) => setSearchQuery(value)}\n placeholder={i18n.t('BibliographySearchInput.labels.placeholder')}\n value={searchQuery}\n />\n <Button\n className='search-button'\n content={i18n.t('Common.buttons.search')}\n disabled={loading}\n loading={loading}\n onClick={onSearch}\n primary\n />\n </div>\n );\n};\n\nexport default BibliographySearchInput;\n","export const SORT_ASCENDING = 'ascending';\nexport const SORT_DESCENDING = 'descending';\n","// @flow\n\nimport React, { useCallback, useEffect, useRef } from 'react';\nimport { Button, Dropdown } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport { SORT_ASCENDING, SORT_DESCENDING } from '../constants/Sort';\n\ntype Option = {\n key: string,\n value: string,\n text: string\n};\n\ntype Sort = Option & {\n direction?: string\n};\n\ntype Props = {\n defaultValue?: string,\n direction: string,\n onChange: (sort: Sort) => void,\n options: Array<Option>,\n text: string,\n value: string\n};\n\n// TODO: Add this to ItemsToggle component\nconst SortSelector = (props: Props) => {\n const sortRef = useRef();\n\n /**\n * Calls the onChange prop with the direction, text, and value of the selected sort.\n *\n * @type {(function(*): void)|*}\n */\n const onSelection = useCallback((option) => {\n const direction = props.value === option.value && props.direction === SORT_ASCENDING\n ? SORT_DESCENDING\n : SORT_ASCENDING;\n\n props.onChange({ ...option, direction });\n }, [props.direction, props.onChange, props.value]);\n\n /**\n * Set the default sort to the passed default value or the first option in the list.\n */\n useEffect(() => {\n if (!props.value) {\n let defaultSort;\n\n if (props.defaultValue) {\n defaultSort = _.findWhere(props.options, { value: props.defaultValue });\n } else {\n defaultSort = _.first(props.options);\n }\n\n onSelection(defaultSort);\n }\n }, []);\n\n return (\n <Button.Group\n basic\n className='sort-selector'\n style={{\n fontSize: 'inherit'\n }}\n >\n <Button\n aria-label='Sort by'\n content={props.text}\n icon={props.direction === SORT_ASCENDING ? 'sort alphabet up' : 'sort alphabet down'}\n onClick={(e) => sortRef.current.handleClick(e)}\n />\n <Dropdown\n aria-label='Sort'\n className='button icon'\n floating\n options={_.map(props.options, (option) => ({\n ...option,\n onClick: () => onSelection(option)\n }))}\n ref={sortRef}\n trigger={<></>}\n value={props.value}\n />\n </Button.Group>\n );\n};\n\nexport default SortSelector;\n","// @flow\n\nimport { useCitationStyles } from '@performant-software/shared-components';\nimport React, { useEffect } from 'react';\nimport { Dropdown } from 'semantic-ui-react';\nimport _ from 'underscore';\n\ntype Props = {\n /**\n * Callback fired when the style selector is changed.\n */\n onChange: (name: string, xml: string) => void,\n\n /**\n * Default style value.\n */\n value?: string\n};\n\n/**\n * This component can be used, along with the `useCitationStyles` hook, to display a list of bibliographic styles\n * supported by Zotero.\n */\nconst StyleSelector = (props: Props) => {\n const { onStyleChange, style, styles } = useCitationStyles(props.value);\n\n /**\n * Call the onChange prop when the style changes.\n */\n useEffect(() => {\n if (style?.name && style?.xml) {\n props.onChange(style.name, style.xml);\n }\n }, [style]);\n\n return (\n <Dropdown\n onChange={(e, { value }) => onStyleChange(value)}\n options={_.map(styles, ({ name, title }) => ({\n key: name,\n value: name,\n text: title\n }))}\n search\n searchInput={{\n 'aria-label': 'Search styles',\n }}\n selectOnBlur={false}\n selection\n text={style?.title}\n value={style?.name || ''}\n />\n );\n};\n\nexport default StyleSelector;\n","// @flow\n\nimport { Citation } from '@performant-software/shared-components';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type ComponentType\n} from 'react';\nimport uuid from 'react-uuid';\nimport {\n Button,\n Grid,\n List,\n Message\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport BibliographyModal from './BibliographyModal';\nimport BibliographySearchInput from './BibliographySearchInput';\nimport i18n from '../i18n/i18n';\nimport SortSelector from './SortSelector';\nimport { SORT_DESCENDING } from '../constants/Sort';\nimport StyleSelector from './StyleSelector';\nimport Toaster from './Toaster';\nimport useList, { Props as ListProps } from './List';\nimport ZoteroTranslateContext from '../context/ZoteroTranslateContext';\nimport './BibliographyList.css';\n\ntype Item = {\n id?: number,\n uid?: string,\n data: any\n};\n\ntype ComponentProps = {\n items: Array<Item>,\n locale: string,\n style: ?{\n name: string,\n xml: string\n }\n};\n\nconst DEFAULT_ITEM_TYPE = 'book';\nconst LOCALE_URL = 'https://raw.githubusercontent.com/citation-style-language/locales/master/locales-en-US.xml';\n\nconst Sort = {\n author: 'author',\n date: 'date',\n title: 'title'\n};\n\nconst SortOptions = [{\n key: Sort.title,\n value: Sort.title,\n text: i18n.t('BibliographyList.sort.title')\n}, {\n key: Sort.author,\n value: Sort.author,\n text: i18n.t('BibliographyList.sort.author')\n}, {\n key: Sort.date,\n value: Sort.date,\n text: i18n.t('BibliographyList.sort.date')\n}];\n\nconst BibliographyListComponent: ComponentType<any> = useList((props: ComponentProps) => (\n <List\n divided\n relaxed='very'\n >\n { _.map(props.items, (item, index) => (\n <List.Item\n as={Grid}\n columns={2}\n key={index}\n padded\n >\n <List.Content\n as={Grid.Column}\n textAlign='left'\n verticalAlign='middle'\n width={14}\n >\n <Citation\n item={item}\n locale={props.locale}\n style={props.style && props.style.xml}\n />\n </List.Content>\n <List.Content\n as={Grid.Column}\n textAlign='right'\n verticalAlign='middle'\n width={2}\n >\n { _.map(props.actions, (action, actionIndex) => (\n <Button\n aria-label={action.name}\n basic\n icon={action.icon}\n key={actionIndex}\n onClick={action.onClick.bind(this, item)}\n />\n ))}\n </List.Content>\n </List.Item>\n ))}\n </List>\n));\n\ntype Props = ListProps & {\n /**\n * The array of bibliography items.\n */\n items: Array<Item>,\n\n /**\n * Callback fired when the passed item is deleted. This function should return a Promise.\n */\n onDelete: (item: Item) => Promise<any>,\n\n /**\n * Callback fired when the passed item is saved. This function should return a Promise.\n */\n onSave: (item: Item) => Promise<any>,\n\n /**\n * URL of the Zotero translation server.\n */\n translateUrl: string\n};\n\n/**\n * This component renders a list of bibliography items in Zbib format. This component requires the URL of a running\n * [Zotero Translation Server](https://github.com/zotero/translation-server) to be passed as the `translateUrl` prop.\n */\nconst BibliographyList = (props: Props) => {\n const [locale, setLocale] = useState();\n const [showToaster, setShowToaster] = useState(false);\n const [style, setStyle] = useState();\n const [sort, setSort] = useState({});\n\n /**\n * Converts the passed item into an object with \"id\", \"uid\", and \"data\" keys.\n *\n * @type {function(*): {uid: string, data: *, id: *}}\n */\n const createItem = useCallback((item) => {\n const { id } = item || {};\n const { uid = uuid() } = item || {};\n\n // Build the data object\n const data = _.omit(item, 'id', 'uid', 'data');\n\n // Remove any empty creators\n _.extend(data, {\n creators: _.reject(item.creators, (creator) => !(creator.name || creator.firstName || creator.lastName))\n });\n\n return { id, uid, data };\n }, []);\n\n /**\n * Returns the sort property value for the passed item based on the selected sort.\n *\n * @type {function(*, *): *}\n */\n const getSortProperty = useCallback((item, index) => {\n let value;\n\n if (sort === Sort.title) {\n value = item.title;\n } else if (sort === Sort.author) {\n const author = _.first(item.creators);\n value = author?.name || `${author?.lastName}, ${author?.firstName}`;\n } else if (sort === Sort.date) {\n value = item.date;\n } else {\n value = index;\n }\n\n return value;\n }, []);\n\n /**\n * Sets the items to display in the list. This function will filter out any items marked for delete,\n * expand the \"data\" property into the main object, and sort the collection according the user's selection.\n */\n const items = useMemo(() => {\n // Filter the list to exclude items marked for removal and transform the items\n let newItems = _.chain(props.items)\n .filter((item) => !item._destroy)\n .map((item) => ({ ..._.omit(item, 'data'), ...item.data }))\n .value();\n\n // Sort the list according to the selected sort property\n newItems = _.sortBy(newItems, getSortProperty);\n\n // If sorting in descending order, reverse the list\n if (sort.direction === SORT_DESCENDING) {\n newItems = newItems.reverse();\n }\n\n return newItems;\n }, [getSortProperty, sort, props.items]);\n\n /**\n * Renders the style selector and sort components.\n *\n * @type {unknown}\n */\n const renderListHeader = useCallback(() => (\n <>\n <StyleSelector\n onChange={(name, xml) => setStyle({ name, xml })}\n />\n <SortSelector\n direction={sort.direction}\n onChange={(value) => setSort(value)}\n options={SortOptions}\n text={sort.text}\n value={sort.value}\n />\n </>\n ), [sort, style]);\n\n /**\n * Deletes the passed item.\n *\n * @type {function(*): Promise<unknown>}\n */\n const onDelete = useCallback((item) => Promise.resolve(\n props.onDelete(createItem(item))\n ), [createItem, props.onDelete]);\n\n /**\n * Saves the passed item.\n *\n * @type {function(*): Promise<unknown>}\n */\n const onSave = useCallback((item) => Promise.resolve(\n props.onSave(createItem(item))\n ), [createItem, props.onSave]);\n\n /**\n * Loads the locale XML.\n */\n useEffect(() => {\n fetch(LOCALE_URL)\n .then((resp) => resp.text())\n .then((text) => setLocale(text));\n }, []);\n\n return (\n <ZoteroTranslateContext.Provider\n value={{ translateUrl: props.translateUrl }}\n >\n <div>\n <BibliographySearchInput\n onError={() => setShowToaster(true)}\n onFind={(results) => _.map(results, onSave)}\n />\n <BibliographyListComponent\n {...props}\n actions={[{\n name: 'edit'\n }, {\n name: 'delete'\n }]}\n className='bibliography-list'\n items={items}\n locale={locale}\n modal={{\n component: BibliographyModal,\n props: {\n defaults: {\n itemType: DEFAULT_ITEM_TYPE\n }\n }\n }}\n onDelete={onDelete}\n onSave={onSave}\n renderListHeader={renderListHeader}\n style={style}\n />\n { showToaster && (\n <Toaster\n onDismiss={() => setShowToaster(false)}\n timeout={2500}\n type={Toaster.MessageTypes.warning}\n >\n <Message.Header\n content={i18n.t('Common.messages.noResults')}\n />\n </Toaster>\n )}\n </div>\n </ZoteroTranslateContext.Provider>\n );\n};\n\nexport default BibliographyList;\n","// @flow\n\nimport React from 'react';\nimport { Icon } from 'semantic-ui-react';\n\ntype Props = {\n value: boolean\n};\n\nconst ICON_FALSE = 'times circle outline';\nconst ICON_TRUE = 'check circle outline';\n\nconst COLOR_FALSE = 'red';\nconst COLOR_TRUE = 'green';\n\nconst BooleanIcon = (props: Props) => {\n let name = ICON_FALSE;\n let color = COLOR_FALSE;\n\n if (props.value) {\n name = ICON_TRUE;\n color = COLOR_TRUE;\n }\n\n return (\n <Icon\n color={color}\n name={name}\n />\n );\n};\n\nexport default BooleanIcon;\n","// @flow\n\nimport React, { useEffect, useState, type ComponentType } from 'react';\nimport { Breadcrumb, Loader } from 'semantic-ui-react';\n\ntype Props = {\n active: boolean,\n as?: ComponentType<any>,\n id?: number,\n label?: string,\n name: string,\n onLoad: (id: number, name: string) => Promise<any>,\n url: string\n};\n\nconst BreadcrumbItem: ComponentType<any> = (props: Props) => {\n const [loading, setLoading] = useState(false);\n const [name, setName] = useState(null);\n\n /**\n * Sets or clears the name attribute on the state.\n */\n useEffect(() => {\n if (props.id) {\n props\n .onLoad(props.id, props.name)\n .then((n) => setName(n))\n .finally(() => setLoading(false));\n\n setLoading(true);\n } else {\n setName(null);\n }\n }, [props.id, props.name]);\n\n return (\n <>\n <Breadcrumb.Section\n active={props.active && !props.id}\n as={props.as}\n to={`/${props.url}`}\n >\n { props.label }\n </Breadcrumb.Section>\n { props.id && (\n <Breadcrumb.Divider\n icon='right chevron'\n />\n )}\n { loading && (\n <Loader\n active\n inline\n />\n )}\n { name && props.id && (\n <Breadcrumb.Section\n active={props.active}\n as={props.as}\n to={`/${props.url}/${props.id}`}\n >\n { name }\n </Breadcrumb.Section>\n )}\n </>\n );\n};\n\nexport default BreadcrumbItem;\n","// @flow\n\nimport React, { useCallback, useMemo, type ComponentType } from 'react';\nimport { Breadcrumb } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport BreadcrumbItem from './BreadcrumbItem';\nimport './Breadcrumbs.css';\n\nconst URL_DELIMITER = '/';\n\ntype Props = {\n /**\n * Alternate component to use to render the breadcrumb.\n */\n as?: ComponentType<any>,\n\n /**\n * A key-value pair of types to labels to match the `pathname`.\n */\n labels: { key: string, value: string },\n\n /**\n * Callback fired to lookup the name of the passed breadcrumb item.\n */\n onLoad: (id: number, name: string) => Promise<any>,\n\n /**\n * The URL for which to generate the breadcrumb.\n */\n pathname: string\n};\n\n/**\n * This component can be used to render a breadcrumb for the passed URL.\n */\nconst Breadcrumbs: ComponentType<any> = (props: Props) => {\n /**\n * Returns true if the passed string contains only digits.\n *\n * @type {function(*): boolean}\n */\n const isNumeric = useCallback((str: string) => /^\\d+$/.test(str), []);\n\n /**\n * Sets the items to display based on the URL path.\n *\n * @type {[]}\n */\n const items = useMemo(() => {\n const value = [];\n\n const path = props.pathname.split(URL_DELIMITER).splice(1);\n\n for (let i = 0; i < path.length; i += 1) {\n const key = path[i];\n const id = path[i + 1];\n const url = path.slice(0, i + 1).join(URL_DELIMITER);\n\n /*\n * If the item in the path is non-numeric, we'll add it as the item label.\n * If the next item is numeric, we'll add it as the ID.\n * If the next item is non-numeric, it'll be added as a separate label on the next iteration.\n */\n if (!isNumeric(key)) {\n const item = { key, url, id: undefined };\n\n if (isNumeric(id)) {\n item.id = id;\n }\n\n value.push(item);\n }\n }\n\n return value;\n }, [props.pathname]);\n\n /**\n * Returns true if there are more items to display.\n *\n * @type {function(*): boolean}\n */\n const hasMore = useCallback((index: number) => index < (items.length - 1), [items]);\n\n return (\n <Breadcrumb\n size='large'\n >\n { _.map(items, (item, index) => (\n <>\n <BreadcrumbItem\n active={!hasMore(index)}\n as={props.as}\n id={item.id}\n label={props.labels[item.key]}\n name={item.key}\n onLoad={props.onLoad}\n url={item.url}\n />\n { hasMore(index) && (\n <Breadcrumb.Divider\n icon='right chevron'\n />\n )}\n </>\n ))}\n </Breadcrumb>\n );\n};\n\nexport default Breadcrumbs;\n","// @flow\n\nimport React from 'react';\nimport { Button } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\n\ntype Props = {\n disabled: boolean,\n onClick: () => void\n};\n\nconst CancelButton = (props: Props) => (\n <Button\n basic\n disabled={props.disabled}\n onClick={props.onClick.bind(this)}\n size='medium'\n type='button'\n >\n { i18n.t('Common.buttons.cancel') }\n </Button>\n);\n\nexport default CancelButton;\n","// @flow\n\nimport React from 'react';\nimport { Button } from 'semantic-ui-react';\nimport './ColorButton.css';\n\ntype Props = {\n color: string,\n height?: number,\n onClick?: () => void,\n width?: number\n}\n\nconst ColorButton = (props: Props) => (\n <Button\n className='color-button'\n onClick={props.onClick && props.onClick.bind(this)}\n style={{\n backgroundColor: props.color,\n cursor: props.onClick ? 'pointer' : 'default',\n height: props.height,\n width: props.width\n }}\n title='color-button'\n />\n);\n\nColorButton.defaultProps = {\n height: undefined,\n onClick: undefined,\n width: undefined\n};\n\nexport default ColorButton;\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-color\");","// @flow\n\nimport React, { Component } from 'react';\nimport { SketchPicker } from 'react-color';\nimport { Button, Modal } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport ModalContext from '../context/ModalContext';\nimport './ColorPickerModal.css';\n\ntype Props = {\n color: string,\n onClose: () => void,\n onSave: (selectedColor: string) => void,\n open: boolean\n};\n\ntype State = {\n selectedColor: string\n};\n\nclass ColorPickerModal extends Component<Props, State> {\n /**\n * Constructs a new ColorPickerModal component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n selectedColor: props.color\n };\n }\n\n /**\n * Renders the ColorPickerModal component.\n *\n * @returns {*}\n */\n render() {\n return (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n className='color-picker-modal'\n mountNode={mountNode}\n onClose={this.props.onClose.bind(this)}\n open={this.props.open}\n >\n <Modal.Content>\n <SketchPicker\n color={this.state.selectedColor}\n disableAlpha={false}\n onChangeComplete={(selectedColor) => this.setState({ selectedColor })}\n />\n </Modal.Content>\n <Modal.Actions>\n <Button\n onClick={this.props.onSave.bind(this, this.state.selectedColor)}\n primary\n size='medium'\n type='submit'\n >\n { i18n.t('Common.buttons.save') }\n </Button>\n <Button\n basic\n onClick={this.props.onClose.bind(this)}\n size='medium'\n type='button'\n >\n { i18n.t('Common.buttons.cancel') }\n </Button>\n </Modal.Actions>\n </Modal>\n )}\n </ModalContext.Consumer>\n );\n }\n}\n\nexport default ColorPickerModal;\n","// @flow\n\nimport React from 'react';\nimport { Button, Label } from 'semantic-ui-react';\nimport _ from 'underscore';\n\ntype Item = {\n label: string,\n onClick: () => void\n};\n\ntype Props = {\n count?: number,\n items: Array<Item>,\n onShowMore?: () => void\n};\n\n/**\n * This component displays the passed items as labels. If a <code>count</code> prop is provided, the component\n * will display a \"+\" button.\n */\nconst CurrentFacetLabels = (props: Props) => (\n <Label.Group>\n { _.map(props.items, (item, index) => (\n <Label\n content={item.label}\n key={index}\n onRemove={item.onClick}\n />\n ))}\n { props.count && props.count > props.items.length && props.onShowMore && (\n <Label\n as={Button}\n content={`+${props.count - props.items.length}`}\n onClick={props.onShowMore}\n />\n )}\n </Label.Group>\n);\n\nCurrentFacetLabels.defaultProps = {\n count: undefined,\n onShowMore: undefined\n};\n\nexport default CurrentFacetLabels;\n\nexport type {\n Item\n};\n","// @flow\n\nimport React from 'react';\nimport { Button, Modal } from 'semantic-ui-react';\nimport CurrentFacetLabels, { type Item } from './CurrentFacetLabels';\nimport i18n from '../i18n/i18n';\n\ntype Props = {\n /**\n * An array of facet values.\n */\n items: Array<Item>,\n\n /**\n * Callback fired when the \"Done\" button is clicked.\n */\n onClose: () => void,\n\n /**\n * If `true` the modal will be visible.\n */\n open?: boolean\n};\n\n/**\n * This component displays all of the facets currently applied, without any limit.\n */\nconst CurrentFacetsModal = (props: Props) => (\n <Modal\n centered={false}\n open={props.open}\n >\n <Modal.Header\n content={i18n.t('CurrentFacetsModal.title')}\n />\n <Modal.Content>\n <CurrentFacetLabels\n items={props.items}\n />\n </Modal.Content>\n <Modal.Actions>\n <Button\n content={i18n.t('Common.buttons.done')}\n onClick={props.onClose}\n primary\n />\n </Modal.Actions>\n </Modal>\n);\n\nCurrentFacetsModal.defaultProps = {\n open: undefined\n};\n\nexport default CurrentFacetsModal;\n","// @flow\n\nimport React, { useMemo, useState } from 'react';\nimport _ from 'underscore';\nimport CurrentFacetLabels from './CurrentFacetLabels';\nimport CurrentFacetsModal from './CurrentFacetsModal';\nimport { type CurrentRefinementsProps } from '../types/InstantSearch';\n\ntype Props = CurrentRefinementsProps & {\n /**\n * The maximum number of facets to display. If more facets are added, they will be accessible via modal.\n */\n limit?: number\n};\n\n/**\n * This component can be used to display the facets/refinements currently applied to an InstantSearch index.\n */\nconst CurrentFacets = ({ useCurrentRefinements, ...props }: Props) => {\n const [modal, setModal] = useState(false);\n const { items } = useCurrentRefinements(props);\n\n /**\n * Sets the facet items based on the current refinements.\n */\n const facets = useMemo(() => (\n _.flatten(_.map(items, (group) => _.map(group.refinements, (refinement) => ({\n label: `${group.label}: ${refinement.label}`,\n onClick: () => group.refine(refinement)\n }))))\n ), [items]);\n\n /**\n * Limits the list of facets to the passed \"limit\" prop.\n */\n const filteredFacets = useMemo(() => _.filter(facets, (facet, index) => (\n !props.limit || index < props.limit\n )), [facets, props.limit]);\n\n /**\n * Don't render the component if no refinements are applied.\n */\n if (_.isEmpty(facets)) {\n return null;\n }\n\n return (\n <>\n <CurrentFacetLabels\n count={facets.length}\n items={filteredFacets}\n onShowMore={() => setModal(true)}\n />\n <CurrentFacetsModal\n items={facets}\n open={modal}\n onClose={() => setModal(false)}\n />\n </>\n );\n};\n\nCurrentFacets.defaultProps = {\n limit: undefined\n};\n\nexport default CurrentFacets;\n","// @flow\n\nimport React from 'react';\nimport './ColumnResize.css';\n\ntype Props = {\n onMouseDown: (e: MouseEvent) => void\n};\n\nconst ColumnResize = (props: Props) => (\n <div\n className='column-resize'\n onMouseDown={props.onMouseDown.bind(this)}\n role='presentation'\n >\n \n </div>\n);\n\nexport default ColumnResize;\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-dnd\");","// @flow\n\nimport React, { type Element, useRef } from 'react';\nimport { Ref } from 'semantic-ui-react';\nimport { useDrag, useDrop } from 'react-dnd';\n\ntype Props = {\n children: Element<any>,\n direction: 'horizontal' | 'vertical',\n id: any,\n index: number,\n onDrag: (dragIndex: number, hoverIndex: number) => void,\n onDragEnd?: () => void,\n onDragStart?: () => void\n};\n\nconst DIRECTION_VERTICAL = 'vertical';\n\nconst TYPE_ANY = 'any';\n\nconst Draggable = (props: Props) => {\n const { index, id, direction = DIRECTION_VERTICAL } = props;\n\n const ref = useRef(null);\n const [, drop] = useDrop({\n accept: TYPE_ANY,\n hover(i, monitor) {\n if (!ref.current) {\n return;\n }\n\n const dragIndex = i.index;\n const hoverIndex = index;\n\n // Don't replace items with themselves\n if (dragIndex === hoverIndex) {\n return;\n }\n\n // Determine rectangle on screen\n const hoverBoundingRect = ref.current.getBoundingClientRect();\n\n // Determine mouse position\n const clientOffset = monitor.getClientOffset();\n\n let hoverMiddle;\n let hoverClient;\n\n // Get middle\n if (direction === DIRECTION_VERTICAL) {\n hoverMiddle = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;\n } else {\n hoverMiddle = (hoverBoundingRect.right - hoverBoundingRect.left) / 2;\n }\n\n // Get pixels to the top/left\n if (direction === DIRECTION_VERTICAL) {\n hoverClient = clientOffset.y - hoverBoundingRect.top;\n } else {\n hoverClient = clientOffset.x - hoverBoundingRect.left;\n }\n\n // Only perform the move when the mouse has crossed half of the items height\n // When dragging downwards, only move when the cursor is below 50%\n // When dragging upwards, only move when the cursor is above 50%\n // Dragging downwards\n if (dragIndex < hoverIndex && hoverClient < hoverMiddle) {\n return;\n }\n\n // Dragging upwards\n if (dragIndex > hoverIndex && hoverClient > hoverMiddle) {\n return;\n }\n\n // Time to actually perform the action\n props.onDrag(dragIndex, hoverIndex);\n\n // // Note: we're mutating the monitor item here!\n // // Generally it's better to avoid mutations,\n // // but it's good here for the sake of performance\n // // to avoid expensive index searches.\n // eslint-disable-next-line no-param-reassign\n i.index = hoverIndex;\n },\n });\n\n const [{ isDragging }, drag] = useDrag({\n item: { type: TYPE_ANY, id, index },\n begin: () => props.onDragStart && props.onDragStart(),\n end: () => props.onDragEnd && props.onDragEnd(),\n collect: (monitor) => ({\n isDragging: monitor.isDragging(),\n }),\n });\n\n drag(drop(ref));\n\n if (ref && ref.current) {\n ref.current.style.opacity = isDragging ? 0 : 1;\n }\n\n return (\n <Ref\n innerRef={ref}\n >\n { props.children }\n </Ref>\n );\n};\n\nexport default Draggable;\n","// @flow\n\nimport { Browser, Object as ObjectUtils } from '@performant-software/shared-components';\nimport React, { Component, createRef, type Element } from 'react';\nimport {\n Checkbox,\n Button,\n Loader,\n Popup,\n Ref,\n Table\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport ColumnResize from './ColumnResize';\nimport useColumnSelector, { Props as ColumnSelectorProps } from './DataTableColumnSelector';\nimport useList, { Props as ListProps } from './List';\nimport './DataTable.css';\n\nimport type { Action } from './List';\n\ntype Props = ListProps & ColumnSelectorProps & {\n /**\n * If <code>true</code>, the rows of the table can be expanded and collapsed.\n */\n expandableRows?: boolean,\n\n /**\n * Function that returns JSX to render when the row for the passed item is expanded.\n */\n expandPanel?: (item: any, activePanel: any) => Element<any>,\n\n /**\n * Callback returning <code>true</code> if the row for the passed item is selected.\n */\n isRowSelected?: (item: any) => boolean,\n\n /**\n * An array of objects to render as rows in the list.\n */\n items: ?Array<any>,\n\n /**\n * Set to <code>true</code> if the list is currently loading data. If true, a loading indicator will display.\n */\n loading?: boolean,\n\n /**\n * Callback to clear the selected set of records.\n */\n onClearSelected?: () => void,\n\n /**\n * Callback fired when the passed column is clicked.\n */\n onColumnClick?: (column: Column) => void,\n\n /**\n * Callback fired when the passed item is selected. This callback is <i>only</i> fired if the <code>selectable</code>\n * prop is passed as <code>true</code>.\n */\n onRowSelect?: (item: any)=> void,\n\n /**\n * Callback fired when the select all checkbox in the table header is clicked.\n */\n onSelectAll?: (items: Array<any>) => void,\n\n /**\n * A function that returns a JSX element to render when the list is empty.\n */\n renderEmptyMessage?: () => Element<any>,\n\n /**\n * A function that returns a custom JSX element to render when the list is empty. This element will replace the\n * entire single row of the table.\n */\n renderEmptyRow?: () => void,\n\n /**\n * A function that returns a custom JSX element to render for the passed item. This element will replace the entire\n * table row.\n */\n renderItem?: (item: any, index: number, children?: any) => Element<any>,\n\n /**\n * If set to <code>true</code>, checkboxes will render as the first table column, allowing each row to be selectable.\n * The consuming component is responsible for tracking the selected items.\n */\n selectable?: boolean,\n\n /**\n * Name of the current sort column.\n */\n sortColumn?: string,\n\n /**\n * Current sort direction (ascending or descending).\n */\n sortDirection?: string,\n\n /**\n * Customization props for the\n * <a target=\"_blank\" href=\"https://react.semantic-ui.com/collections/table/\"><code>Table</code></a>\n * component.\n */\n tableProps?: any\n};\n\ntype State = {\n activePanel: any,\n resize: ?{\n columnRef: typeof Ref,\n offset: number\n }\n};\n\nclass DataTable extends Component<Props, State> {\n static defaultProps: any;\n\n columnRefs: any;\n onClick: (e: Event) => void;\n onMouseMove: (e: Event) => void;\n onMouseUp: (e: Event) => void;\n\n /**\n * Constructs a new DataTable component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n resize: null,\n activePanel: null\n };\n\n this.initializeColumnRefs();\n\n this.onClick = this.onPreventClick.bind(this);\n this.onMouseMove = this.onColumnResize.bind(this);\n this.onMouseUp = this.afterColumnResize.bind(this);\n }\n\n /**\n * If the resize object is present on the state, sets the capture click handler on the document and\n * clears the resize object on the state.\n */\n afterColumnResize() {\n if (this.state.resize && Browser.isBrowser()) {\n document.addEventListener('click', this.onClick, true);\n this.setState({ resize: undefined });\n }\n }\n\n /**\n * Initializes a ref for each table column.\n */\n initializeColumnRefs() {\n this.columnRefs = {};\n\n _.each(this.props.columns, (c) => {\n this.columnRefs[c.name] = createRef();\n });\n }\n\n /**\n * Adds the mousemove and mouseup event listeners for dynamic column resizing.\n */\n componentDidMount() {\n if (Browser.isBrowser()) {\n document.addEventListener('mousemove', this.onMouseMove);\n document.addEventListener('mouseup', this.onMouseUp);\n }\n }\n\n /**\n * Reinitialize the column refs if the columns change.\n *\n * @param prevProps\n */\n componentDidUpdate(prevProps: Props) {\n if (!ObjectUtils.isEqual(prevProps.columns, this.props.columns)) {\n this.initializeColumnRefs();\n }\n }\n\n /**\n * Removes the mousemove and mouseup event listeners.\n */\n componentWillUnmount() {\n if (Browser.isBrowser()) {\n document.removeEventListener('mousemove', this.onMouseMove);\n document.removeEventListener('mouseup', this.onMouseUp);\n }\n }\n\n /**\n * Returns the actual column count. This will be the number of columns +1 if the table allows actions.\n *\n * @returns {number}\n */\n getColumnCount() {\n let columnCount = this.props.columns.length;\n\n if (this.props.actions && this.props.actions.length) {\n columnCount += 1;\n }\n\n return columnCount;\n }\n\n /**\n * Resizes the current column based on the user's mouse position.\n *\n * @param e\n */\n onColumnResize(e: MouseEvent) {\n const { resize } = this.state;\n\n if (resize) {\n const { columnRef, offset } = resize;\n columnRef.current.style.width = `${offset + e.pageX}px`;\n }\n }\n\n /**\n * Stops progagation of the onclick event. The column resizing seems to trigger the 'click' event on the <th>\n * containing the <div> used to resize the column. Since the <th> already provides a 'click' event, this makes for\n * an awkward user experience because it will trigger a column sort each time a column is resized.\n *\n * This function will capture the onclick prior to it bubbling to the <th> element and prevent it from happening. It\n * will also remove the event listener from the document so that clicks elsewhere in the document are not prevented.\n *\n * @param e\n */\n onPreventClick(e: Event) {\n e.stopPropagation();\n\n if (Browser.isBrowser()) {\n document.removeEventListener('click', this.onClick, true);\n }\n }\n\n /**\n * Selects all of the items in the current collection.\n *\n * @param allSelected\n */\n onSelectAll(allSelected) {\n let items;\n\n if (allSelected) {\n items = [...this.props.items || []];\n } else {\n items = _.reject(this.props.items, this.props.isRowSelected.bind(this));\n }\n\n _.each(items, this.props.onRowSelect && this.props.onRowSelect.bind(this));\n }\n\n /**\n * Renders the DataTable component.\n *\n * @returns {*}\n */\n render() {\n return (\n <Table\n className='data-table'\n {...this.props.tableProps}\n >\n <Table.Header>\n <Table.Row>\n { this.renderSelectHeader() }\n { this.props.columns.map(this.renderHeaderCell.bind(this)) }\n { this.renderActionsHeader() }\n </Table.Row>\n </Table.Header>\n <Table.Body>\n { this.props.items && this.props.items.map(this.renderItem.bind(this)) }\n { this.renderEmptyTableRow() }\n { this.renderLoading() }\n </Table.Body>\n </Table>\n );\n }\n\n /**\n * Renders the action button for the passed item and action.\n *\n * @param item\n * @param action\n * @param index\n *\n * @returns {*}\n */\n renderActionButton(item: any, index: number, action: Action) {\n // If the action specified its own render function, return the result of the function call\n if (action.render) {\n return action.render(item, index);\n }\n\n const actionButton = (\n <Button\n aria-label={action.name}\n basic\n compact\n color={action.color}\n icon={action.icon}\n key={`${action.name}-${index}`}\n onClick={action.onClick && action.onClick.bind(this, item)}\n title={action.title}\n />\n );\n\n // Wrap the button in a popup if the action specifies a popup attribute\n if (action.popup) {\n const { content, title } = action.popup;\n\n return (\n <Popup\n content={content}\n header={title}\n hideOnScroll\n mouseEnterDelay={500}\n position='top right'\n trigger={actionButton}\n />\n );\n }\n\n // Otherwise, simply return the button\n return actionButton;\n }\n\n /**\n * Renders the actions for the passed item.\n *\n * @param item\n * @param index\n *\n * @returns {null|*}\n */\n renderActions(item: any, index: number) {\n if (!(this.props.actions && this.props.actions.length)) {\n return null;\n }\n\n const actions = this.props.actions\n .filter((action) => !action.accept || action.accept(item))\n .map((action) => {\n let defaults = {};\n\n if (action.name === 'edit') {\n defaults = {\n popup: {\n title: i18n.t('DataTable.actions.edit.title'),\n content: i18n.t('DataTable.actions.edit.content')\n }\n };\n } else if (action.name === 'copy') {\n defaults = {\n popup: {\n title: i18n.t('DataTable.actions.copy.title'),\n content: i18n.t('DataTable.actions.copy.content')\n }\n };\n } else if (action.name === 'delete') {\n defaults = {\n popup: {\n title: i18n.t('DataTable.actions.delete.title'),\n content: i18n.t('DataTable.actions.delete.content')\n }\n };\n }\n\n return _.defaults(action, defaults);\n });\n\n return (\n <Table.Cell\n className='actions-cell'\n key={index}\n >\n { actions.map(this.renderActionButton.bind(this, item, index)) }\n </Table.Cell>\n );\n }\n\n /**\n * Renders the action list header.\n *\n * @returns {null|*}\n */\n renderActionsHeader() {\n if (!(this.props.actions && this.props.actions.length)) {\n return null;\n }\n\n return (\n <Table.HeaderCell>\n { i18n.t('DataTable.columns.actions') }\n </Table.HeaderCell>\n );\n }\n\n /**\n * Renders the table cell for the passed item/column.\n *\n * @param item\n * @param column\n *\n * @returns {*}\n */\n renderCell(item: any, column: Column) {\n if (column.hidden) {\n return null;\n }\n\n let value;\n\n if (column.render) {\n value = column.render(item);\n } else if (column.resolve) {\n value = column.resolve(item);\n } else {\n value = item[column.name];\n }\n\n return (\n <Table.Cell\n key={`${item.id}-${column.name}`}\n className={column.className}\n >\n { value }\n </Table.Cell>\n );\n }\n\n /**\n * Renders the empty table row.\n *\n * @returns {null|*}\n */\n renderEmptyTableRow() {\n if (this.props.loading || (this.props.items && this.props.items.length)) {\n return null;\n }\n\n if (this.props.renderEmptyRow) {\n return this.props.renderEmptyRow();\n }\n\n return (\n <Table.Row>\n <Table.Cell\n colSpan={this.getColumnCount()}\n textAlign='center'\n >\n <div className='empty-container'>\n { this.props.renderEmptyMessage() }\n </div>\n </Table.Cell>\n </Table.Row>\n );\n }\n\n /**\n * Renders the table header cell for the passed column.\n *\n * @param column\n *\n * @returns {*}\n */\n renderHeaderCell(column: Column) {\n if (column.hidden) {\n return null;\n }\n\n if (column.renderHeader) {\n return column.renderHeader();\n }\n\n return (\n <Ref\n innerRef={this.columnRefs[column.name]}\n >\n <Table.HeaderCell\n key={column.name}\n sorted={this.props.sortColumn === column.name ? this.props.sortDirection : null}\n onClick={() => this.props.onColumnClick(column)}\n >\n { column.label }\n <ColumnResize\n onMouseDown={(e: MouseEvent) => {\n const columnRef = this.columnRefs[column.name];\n const offset = columnRef.current.offsetWidth - e.pageX;\n this.setState({ resize: { columnRef, offset } });\n }}\n />\n </Table.HeaderCell>\n </Ref>\n );\n }\n\n /**\n * Renders the table row for the passed item.\n *\n * @param item\n * @param index\n *\n * @returns {*}\n */\n renderItem(item: any, index: number) {\n const children = [\n this.renderSelectCheckbox(item, index),\n this.props.columns.map(this.renderCell.bind(this, item)),\n this.renderActions(item, index)\n ];\n\n const handleCellClick = (e) => {\n // only target table cells, not action buttons or checkboxes, etc.\n if (e.target.nodeName === 'TD') {\n this.setState((state) => ({\n activePanel: state.activePanel === item.id ? '' : item.id\n }));\n }\n };\n\n if (this.props.renderItem) {\n return this.props.renderItem(item, index, children);\n }\n\n return (\n <>\n <Table.Row\n key={index}\n onClick={this.props.expandableRows ? handleCellClick : () => { }}\n className={this.props.expandableRows ? 'expandable' : ''}\n >\n { children }\n </Table.Row>\n { this.props.expandableRows && (\n <Table.Row\n className={this.state.activePanel === item.id ? 'expanded-panel' : 'hidden'}\n >\n { this.props.expandPanel && this.props.expandPanel(item, this.state.activePanel) }\n </Table.Row>\n )}\n </>\n );\n }\n\n renderLoading() {\n if (!this.props.loading) {\n return null;\n }\n\n return (\n <Table.Row>\n <Table.Cell\n colSpan={this.getColumnCount()}\n textAlign='center'\n >\n <Loader\n active\n content={i18n.t('DataTable.loading')}\n inline\n />\n </Table.Cell>\n </Table.Row>\n );\n }\n\n /**\n * Renders the select checkbox for the passed item.\n *\n * @returns {null|*}\n */\n renderSelectCheckbox(item, index) {\n if (!(this.props.selectable && this.props.onRowSelect && this.props.isRowSelected)) {\n return null;\n }\n\n return (\n <Table.Cell\n className='select-cell'\n key={`select-cell-${index}`}\n >\n <Checkbox\n onClick={this.props.onRowSelect.bind(this, item)}\n checked={this.props.isRowSelected(item)}\n />\n </Table.Cell>\n );\n }\n\n /**\n * Renders the select list header.\n *\n * @returns {null|*}\n */\n renderSelectHeader() {\n if (!this.props.selectable) {\n return null;\n }\n\n const allSelected = this.props.items\n && this.props.items.length\n && _.every(this.props.items, this.props.isRowSelected.bind(this));\n\n return (\n <Table.HeaderCell\n className='select-cell'\n >\n <Checkbox\n onClick={this.onSelectAll.bind(this, allSelected)}\n checked={allSelected}\n />\n </Table.HeaderCell>\n );\n }\n}\n\nDataTable.defaultProps = {\n actions: undefined,\n addButton: {\n location: 'top',\n color: 'green'\n },\n buttons: [],\n count: 0,\n className: '',\n expandableRows: false,\n expandPanel: undefined,\n filters: undefined,\n items: [],\n loading: false,\n modal: undefined,\n page: 1,\n pages: 1,\n onColumnClick: () => {},\n onCopy: undefined,\n onPageChange: () => {},\n renderDeleteModal: undefined,\n renderEmptyRow: undefined,\n renderSearch: undefined,\n renderItem: undefined,\n showRecordCount: false,\n sortColumn: undefined,\n sortDirection: undefined,\n};\n\nexport default useColumnSelector(useList(DataTable));\n\nexport type {\n Props\n};\n","// @flow\n\nimport { Object as ObjectUtils } from '@performant-software/shared-components';\nimport React, { Component, type ComponentType, type Element } from 'react';\nimport { Checkbox, Dropdown, Icon } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport Draggable from './Draggable';\nimport type { Props as ListProps } from './List';\nimport './DataTableColumnSelector.css';\n\ntype Column = {\n className?: string,\n hidden?: boolean,\n label?: string,\n name: string,\n render?: (item: any) => Element<any>,\n renderHeader?: (item: any) => Element<any>,\n resolve?: (item: any) => any,\n sortable: boolean\n};\n\ntype Props = ListProps & {\n /**\n * CSS class name to append to the wrapped component.\n */\n className?: string,\n\n /**\n * An array of columns to display within the <code>Table</code>.\n * <br />\n * <br />\n *\n * If only a <code>name</code> attribute is provided, the value for each record will be pulled from the item property\n * matching that name.\n * <br />\n * <br />\n *\n * If a <code>resolve</code> callback is provided, the item will be passed to the function and the return value will\n * display as the property value.\n * <br />\n * <br />\n *\n * If a <code>render</code> callback is provided, the item will be passed to the function and the return JSX\n * will display as the property value.\n */\n columns: Array<Column>\n};\n\ntype State = {\n columns: Array<Column>\n};\n\n/**\n * Returns a function to wrap the passed component in a column selector. The ColumnSelector component will bind a\n * renderListHeader function, which can be used in the wrapped component to render a column selector dropdown button.\n *\n * @param WrappedComponent\n */\nconst useColumnSelector = (WrappedComponent: ComponentType<any>) => (\n class extends Component<Props, State> {\n static defaultProps = {\n className: ''\n };\n\n /**\n * Constructs a new DataTableColumnSelector component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n columns: props.columns\n };\n }\n\n /**\n * Reset the columns on the state when the props change.\n *\n * @param prevProps\n */\n componentDidUpdate(prevProps: Props): * {\n if (!ObjectUtils.isEqual(prevProps.columns, this.props.columns)) {\n this.setState({ columns: this.props.columns });\n }\n }\n\n /**\n * Toggles the hidden property for the passed column.\n *\n * @param column\n */\n onColumnCheckbox(column: Column) {\n this.setState((state) => ({\n columns: _.map(state.columns, (c) => (c.name === column.name ? { ...c, hidden: !c.hidden } : c))\n }));\n }\n\n /**\n * Drags/drops the column at the passed index to the new position.\n *\n * @param dragIndex\n * @param hoverIndex\n */\n onDrag(dragIndex: number, hoverIndex: number) {\n this.setState((state) => {\n const columns = [];\n const anchoredColumns = [];\n\n // Preserve the index of any unlabeled columns\n _.each(state.columns, (column, index) => {\n if (column.label && column.label.length) {\n columns.push(column);\n } else {\n anchoredColumns.push({ index, column });\n }\n });\n\n const column = columns[dragIndex];\n columns.splice(dragIndex, 1);\n columns.splice(hoverIndex, 0, column);\n\n // Add the unlabeled columns back in\n _.each(anchoredColumns, (c) => columns.splice(c.index, 0, c.column));\n\n return { columns };\n });\n }\n\n /**\n * Renders the DataTableColumnSelector component.\n *\n * @returns {*}\n */\n render() {\n return (\n <WrappedComponent\n {...this.props}\n className={`data-table-column-selector ${this.props.className}`}\n columns={this.state.columns}\n renderListHeader={this.renderHeader.bind(this)}\n />\n );\n }\n\n /**\n * Renders the dropdown column selector.\n *\n * @returns {*}\n */\n renderHeader() {\n return (\n <>\n { this.props.renderListHeader && this.props.renderListHeader() }\n <Dropdown\n aria-label='Select Columns'\n basic\n button\n icon='cog'\n className='icon configure-button open-right'\n closeOnBlur={false}\n >\n <Dropdown.Menu>\n { this.state.columns\n .filter((c) => c.label && c.label.length)\n .map((c, index) => (\n <Draggable\n id={c.name}\n index={index}\n key={c.name}\n onDrag={this.onDrag.bind(this)}\n >\n <Dropdown.Item\n aria-dropeffect='move'\n onClick={(e) => e.stopPropagation()}\n >\n <Icon\n name='bars'\n />\n <Checkbox\n aria-label='Select Column'\n checked={!c.hidden}\n label={c.label}\n onClick={this.onColumnCheckbox.bind(this, c)}\n />\n </Dropdown.Item>\n </Draggable>\n ))}\n </Dropdown.Menu>\n </Dropdown>\n </>\n );\n }\n }\n);\n\nexport default useColumnSelector;\n\nexport type {\n Column,\n Props\n};\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"axios\");","// @flow\n\nimport React, {\n useCallback,\n useEffect,\n useRef,\n useState,\n type Node\n} from 'react';\nimport { Dropdown, Ref } from 'semantic-ui-react';\n\ntype Props = {\n children: Node,\n onClick?: () => void,\n role?: string\n};\n\nconst DropdownMenu = (props: Props) => {\n const [open, setOpen] = useState(false);\n const ref = useRef();\n\n const onMouseEnter = useCallback(() => setOpen(true), []);\n const onMouseLeave = useCallback(() => setOpen(false), []);\n\n /**\n * Adds/removes the mouseenter/mouseleave events.\n */\n useEffect(() => {\n if (ref.current) {\n ref.current.addEventListener('mouseenter', onMouseEnter);\n ref.current.addEventListener('mouseleave', onMouseLeave);\n }\n\n return () => {\n if (ref.current) {\n ref.current.removeEventListener('mouseenter', onMouseEnter);\n ref.current.removeEventListener('mouseleave', onMouseLeave);\n }\n };\n }, [ref]);\n\n /**\n * Sets the \"role\" aria attribute on the current element if provided.\n */\n useEffect(() => {\n if (ref.current && props.role) {\n ref.current.setAttribute('role', props.role);\n }\n }, [ref, props.role]);\n\n return (\n <Ref\n innerRef={ref}\n >\n <Dropdown\n {...props}\n open={open}\n onClick={() => {\n if (props.onClick) {\n props.onClick();\n }\n\n setOpen(false);\n }}\n >\n <Dropdown.Menu>\n { props.children }\n </Dropdown.Menu>\n </Dropdown>\n </Ref>\n );\n};\n\nDropdownMenu.defaultProps = {\n onClick: undefined\n};\n\nexport default DropdownMenu;\n","// @flow\n\nimport React, { useCallback } from 'react';\nimport {\n Dropdown,\n Menu,\n type DropdownItemProps,\n type HeaderProps,\n type MenuProps\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport DropdownMenu from './DropdownMenu';\n\ntype Props = MenuProps & {\n header: HeaderProps,\n items: Array<DropdownItemProps | MenuProps>\n};\n\nconst MenuBar = ({ header, items, ...props }: Props) => {\n /**\n * Renders the passed item as a dropdown item.\n *\n * @param item\n *\n * @returns {JSX.Element}\n */\n const renderDropdownItem = useCallback((item, index) => (\n <Dropdown.Item\n key={index}\n {...item}\n />\n ), []);\n\n /**\n * Renders the passed item as a menu item.\n *\n * @returns {JSX.Element}\n */\n const renderMenuItem = useCallback((item, index) => (\n <Menu.Item\n key={index}\n {...item}\n />\n ), []);\n\n /**\n * Renders the passed item as a dropdown menu.\n *\n * @returns {JSX.Element}\n */\n const renderDropdown = useCallback((item, index) => (\n <DropdownMenu\n aria-label={item.content}\n item\n key={index}\n role='group'\n text={item.content}\n >\n { _.map(item.items, (i) => (i.items ? renderDropdown(i) : renderDropdownItem(i)))}\n </DropdownMenu>\n ), []);\n\n /**\n * Renders the passed item.\n *\n * @returns {JSX.Element}\n */\n const renderItem = useCallback((item) => (item.items ? renderDropdown(item) : renderMenuItem(item)), []);\n\n return (\n <Menu\n {...props}\n className='menu-bar'\n >\n <Menu.Item\n {...header}\n header\n />\n { _.map(items, (item) => renderItem(item)) }\n </Menu>\n );\n};\n\nexport default MenuBar;\n","// @flow\n\nimport React, { useCallback } from 'react';\nimport {\n Header,\n Menu,\n Ref,\n type HeaderProps,\n type MenuItemProps\n} from 'semantic-ui-react';\nimport _ from 'underscore';\n\ntype Props = {\n contextRef: {\n current: ?HTMLElement\n },\n header: HeaderProps,\n items: Array<HeaderProps | MenuItemProps>\n};\n\nconst MenuSidebar = ({\n contextRef,\n header,\n items,\n ...props\n}: Props) => {\n /**\n * Renders the passed item as a menu.\n *\n * @type {unknown}\n */\n const renderMenu = useCallback((item, index) => (\n <Menu.Item\n key={index}\n >\n <Menu.Header\n {...item}\n />\n <Menu.Menu>\n { _.map(item.items, (i) => renderItem(i)) }\n </Menu.Menu>\n </Menu.Item>\n ), []);\n\n /**\n * Renders the passed item as a menu item.\n *\n * @type {unknown}\n */\n const renderMenuItem = useCallback((item, index) => (\n <Menu.Item\n key={index}\n {...item}\n />\n ), []);\n\n /**\n * Renders the passed item.\n *\n * @type {function(*): *}\n */\n const renderItem = useCallback((item) => (item.items ? renderMenu(item) : renderMenuItem(item)), []);\n\n return (\n <Ref\n innerRef={contextRef}\n >\n <Menu\n {...props}\n fixed='left'\n vertical\n >\n <Menu.Item>\n <Header\n {...header}\n />\n </Menu.Item>\n { _.map(items, (item) => renderItem(item)) }\n </Menu>\n </Ref>\n );\n};\n\nexport default MenuSidebar;\n","// @flow\n\nimport axios from 'axios';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState\n} from 'react';\nimport { Form, Grid, Modal } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport DataTable from './DataTable';\nimport DropdownButton from './DropdownButton';\nimport i18n from '../i18n/i18n';\nimport MenuBar from './MenuBar';\nimport MenuSidebar from './MenuSidebar';\nimport ModalContext from '../context/ModalContext';\nimport useDataList, { SORT_ASCENDING, SORT_DESCENDING } from './DataList';\nimport './DataView.css';\n\nimport type { Column } from './DataTableColumnSelector';\n\ntype Sort = {\n label: string,\n value: string\n};\n\ntype Item = {\n id: string,\n label: string,\n group?: string,\n columns?: Array<Column>,\n sorts?: Array<Sort>\n};\n\ntype Props = {\n columnCount?: number,\n items: Array<Item>,\n layout: 'top' | 'left',\n title: string\n};\n\n/**\n * Sets up the List component used by the DataView component. This component is responsible for rendering the DataTable\n * and handling sorting.\n */\nconst List = useDataList((props) => {\n const [activeSort, setActiveSort] = useState();\n\n /**\n * Sets the active sort object on the state.\n *\n * @type {(function(*): void)|*}\n */\n const onSortChange = useCallback((sort) => {\n const newSort = { ...sort };\n\n if (activeSort && activeSort.value === sort.value) {\n newSort.direction = activeSort.direction === SORT_DESCENDING ? SORT_ASCENDING : SORT_DESCENDING;\n }\n\n setActiveSort(newSort);\n }, [props.sorts, activeSort]);\n\n /**\n * Calls the onSort prop when the active sort is changed.\n */\n useEffect(() => {\n if (activeSort) {\n props.onSort(activeSort.value, activeSort.direction, props.page);\n }\n }, [activeSort]);\n\n /**\n * Calls the onSort prop when the component is loaded to initialize the data set.\n */\n useEffect(() => {\n const { page } = props;\n\n let { sortColumn = '', sortDirection = SORT_ASCENDING } = props;\n\n if (!sortColumn) {\n const defaultSort = _.first(props.sort);\n\n if (defaultSort) {\n sortColumn = defaultSort.value;\n\n if (defaultSort.direction) {\n sortDirection = defaultSort.direction;\n }\n }\n }\n\n props.onSort(sortColumn, sortDirection, page);\n }, []);\n\n return (\n <DataTable\n {...props}\n renderListHeader={() => props.sorts && (\n <DropdownButton\n basic\n icon={activeSort && activeSort.direction === SORT_DESCENDING\n ? 'sort alphabet down'\n : 'sort alphabet up'}\n onChange={() => {}}\n options={_.map(props.sorts, (sort) => ({\n key: sort.value,\n value: sort.value,\n text: sort.label,\n onClick: () => onSortChange(sort)\n }))}\n text={activeSort\n ? i18n.t('DataView.labels.sortBy', { column: activeSort.label })\n : i18n.t('DataView.labels.noSort')}\n value={activeSort && activeSort.value}\n />\n )}\n tableProps={{\n ...props.tableProps || {},\n celled: true\n }}\n />\n );\n});\n\nconst DataView = (props: Props) => {\n const [activeItem, setActiveItem] = useState();\n const [selectedRecord, setSelectedRecord] = useState();\n\n const [columns, setColumns] = useState([]);\n const [menu, setMenu] = useState([]);\n const [paddingLeft, setPaddingLeft] = useState();\n const [key, setKey] = useState();\n\n const menuRef = useRef();\n\n /**\n * Sets the collection name based on the URL of the active item.\n *\n * @type {string}\n */\n const collectionName = useMemo(() => {\n let name = '';\n\n if (activeItem) {\n name = activeItem.url.substr(activeItem.url.lastIndexOf('/') + 1, activeItem.url.length);\n }\n\n return name;\n }, [activeItem]);\n\n /**\n * Merges the calculated columns with the columns passed with the active item. The idea is to allow customization\n * of the columns by the implementing component, but not require it.\n *\n * @type {(function(*): ([]|*))|*}\n */\n const mergeColumns = useCallback((items) => {\n if (!activeItem) {\n return [];\n }\n\n // Build the list of columns based on the unique set of properties\n const keys = _.chain(items)\n .map((item) => _.keys(item))\n .flatten()\n .uniq()\n .value();\n\n // Merge any columns provided by the implementing component by name\n let cols = _.map(keys, (col, index) => {\n const columnValue = _.findWhere(activeItem.columns, { name: col }) || {};\n\n const defaultValue = {\n name: col,\n label: col.trim().replace(/^\\w/, (c) => c.toUpperCase()).replaceAll('_', ' '),\n sortable: false,\n resolve: (item) => resolveValue(item, col),\n hidden: index > props.columnCount,\n index\n };\n\n return _.extend(defaultValue, columnValue);\n });\n\n // Include any columns provided by the implementing component that do not exist on the object (i.e. extra columns)\n cols = [\n ...cols,\n ..._.reject(activeItem.columns, (col) => _.contains(keys, col.name))\n ];\n\n // Sort the columns by the index property\n return _.sortBy(cols, 'index');\n }, [activeItem]);\n\n /**\n * Calls the \"show\" URL for the passed item. It's possible that the API does not implement a public \"show\" route. In\n * this case and error is expected and the passed item will be set as the selected record.\n *\n * @type {(function(*): void)|*}\n */\n const onItemSelection = useCallback((item) => {\n if (activeItem) {\n axios\n .get(`${activeItem.url}/${item.id}`)\n .then(({ data }) => {\n const itemKey = _.first(_.keys(data));\n setSelectedRecord(data[itemKey]);\n })\n .catch(() => {\n setSelectedRecord(item);\n });\n }\n }, [activeItem]);\n\n /**\n * Calls the \"index\" URL to initialize the data set.\n *\n * @type {function(*): *}\n */\n const onLoad = useCallback((params) => {\n let promise;\n\n if (activeItem) {\n promise = axios\n .get(activeItem.url, { params })\n .then((response) => {\n const items = response.data[collectionName];\n setColumns(mergeColumns(items));\n\n return response;\n });\n } else {\n promise = Promise.resolve();\n }\n\n return promise;\n }, [activeItem]);\n\n /**\n * Returns the value of the passed attribute on the passed item. This function handles use cases for special\n * types of objects.\n *\n * @type {function(*, *): *}\n */\n const resolveValue = useCallback((item, attribute) => {\n let value = item[attribute];\n\n if (_.isArray(value)) {\n value = _.size(value);\n } else if (_.isBoolean(value)) {\n value = Boolean(value).toString();\n } else if (_.isObject(value)) {\n value = value[_.first(_.keys(value))];\n }\n\n return value;\n }, []);\n\n /**\n * Re-formats the passed items as a menu object. If we're grouping the menu items, items will be added as\n * a child property of the group object.\n */\n useEffect(() => {\n const hasGroups = _.every(props.items, (item) => !!item.group);\n\n if (!hasGroups) {\n setMenu(props.items);\n } else {\n const menuItems = _.groupBy(props.items, 'group');\n const headers = _.keys(menuItems);\n\n setMenu(_.map(headers, (header) => ({\n content: header,\n items: _.map(menuItems[header], (item) => ({\n active: activeItem && activeItem.id === item.id,\n content: item.label,\n onClick: () => setActiveItem(item)\n }))\n })));\n }\n }, [activeItem, props.items]);\n\n /**\n * Set the active item as the first item in the list.\n */\n useEffect(() => {\n if (props.items && props.items.length) {\n setActiveItem(_.first(props.items));\n }\n }, [props.items]);\n\n /**\n * If we're using the sidebar layout, set the padding so the fixed positioned menu does not overlap the content.\n */\n useEffect(() => {\n if (props.layout === 'left' && menuRef && menuRef.current) {\n setPaddingLeft(menuRef.current.offsetWidth);\n }\n }, [menuRef, props.layout]);\n\n /**\n * Calculates the key value when the active item or columns are changed. This is done to force re-rendering\n * of the List component when the columns are loaded via the API.\n */\n useEffect(() => {\n const keys = [];\n\n if (activeItem) {\n keys.push(activeItem.id);\n }\n\n if (columns && columns.length) {\n keys.push(..._.pluck(columns, 'name'));\n }\n\n setKey(keys.join(''));\n }, [activeItem, columns]);\n\n return (\n <div\n className='data-view'\n >\n { props.layout === 'top' && (\n <MenuBar\n header={{\n content: props.title\n }}\n items={menu}\n />\n )}\n { props.layout === 'left' && (\n <MenuSidebar\n contextRef={menuRef}\n header={{\n content: props.title\n }}\n items={menu}\n />\n )}\n <div\n style={{\n marginLeft: paddingLeft\n }}\n >\n { activeItem && (\n <List\n actions={[{\n name: 'details',\n icon: 'info',\n onClick: onItemSelection\n }]}\n collectionName={collectionName}\n columns={columns}\n key={key}\n onLoad={onLoad}\n perPageOptions={[10, 25, 50, 100]}\n searchable\n sorts={activeItem.sorts}\n />\n )}\n </div>\n { selectedRecord && (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n as={Form}\n centered={false}\n className='data-view-modal'\n closeIcon\n mountNode={mountNode}\n onClose={() => setSelectedRecord(null)}\n open\n >\n <Modal.Header\n content={i18n.t('DataView.labels.details')}\n />\n <Modal.Content>\n <Grid\n columns={3}\n doubling\n >\n { _.map(mergeColumns([selectedRecord]), (column) => (\n <Grid.Column\n as={Form.Field}\n key={column.name}\n >\n <span\n className='label'\n >\n { column.label }\n </span>\n { resolveValue(selectedRecord, column.name) }\n </Grid.Column>\n ))}\n </Grid>\n </Modal.Content>\n </Modal>\n )}\n </ModalContext.Consumer>\n )}\n </div>\n );\n};\n\nDataView.defaultProps = {\n columnCount: 5,\n layout: 'left'\n};\n\nexport default DataView;\n","// @flow\n\nimport { Hooks, Object as ObjectUtils } from '@performant-software/shared-components';\nimport React, { useEffect } from 'react';\nimport _ from 'underscore';\nimport DataTable from './DataTable';\nimport type { Props as DataTableProps } from './DataTable';\nimport useDataList, { SORT_ASCENDING, SORT_DESCENDING, type Props as DataListProps } from './DataList';\nimport './ListTable.css';\n\ntype Props = DataListProps & DataTableProps & {\n /**\n * If true, columns can be shown/hidden by the user.\n */\n configurable?: boolean,\n\n /**\n * The name of the default sort column.\n */\n defaultSort?: string,\n\n /**\n * The default direction to sort the list (ascending vs. descending).\n */\n defaultSortDirection?: string,\n\n /**\n * Callback supplied by the <code>DataList</code> higher-order component which can be used to initialize the list.\n */\n onInit?: (page?: number) => void,\n\n /**\n * Callback supplied by the <code>DataList</code> higher-order component which can be used to sort the list.\n */\n onSort?: (sortColumn: string, sortDirection: string, page?: number) => void,\n\n /**\n * Current sort column supplied by the <code>DataList</code> higher-order component.\n */\n sortColumn?: string,\n\n /**\n * Current sort direction supplied by the <code>DataList</code> higher-order component.\n */\n sortDirection?: string,\n\n /**\n * Customization props for the\n * <a target=\"_blank\" href=\"https://react.semantic-ui.com/collections/table/\"><code>Table</code></a>\n * component.\n */\n tableProps?: any\n};\n\n/**\n * The <code>ListTable</code> component renders a list which has the ability to load, save, and delete records from\n * an API (via the <code>DataList</code> higher-order component). This component will integrate seamlessly with a\n * back-end implementing the <code>resource-api</code>. See the\n * <a href=\"https://github.com/performant-software/resource-api\">GitHub page</a> for more details.\n */\nconst ListTable = useDataList((props: Props) => {\n const prevColumns = Hooks.usePrevious(props.columns);\n\n /**\n * Sorts the list by the selected column, and/or reverse the direction.\n *\n * @param column\n */\n const onColumnClick = (column) => {\n if (!column.sortable) {\n return;\n }\n\n const sortColumn = column.name;\n let sortDirection = SORT_ASCENDING;\n\n /**\n * If the column has not yet been click-sorted, check to see if there is a default sort\n * direction on the column. Otherwise, toggle the sort direction on the state.\n */\n if (column.name === props.sortColumn) {\n sortDirection = props.sortDirection === SORT_ASCENDING ? SORT_DESCENDING : SORT_ASCENDING;\n } else if (column.sortDirection) {\n sortDirection = column.sortDirection;\n }\n\n props.onSort(sortColumn, sortDirection);\n };\n\n /**\n * Initializes the list by calling the onSort prop. If no sortColumn prop is passed, we'll sort the list by the first\n * sortable column.\n */\n useEffect(() => {\n if (!ObjectUtils.isEqual(props.columns, prevColumns)) {\n const {\n page,\n defaultSort,\n defaultSortDirection = SORT_ASCENDING\n } = props;\n\n if (defaultSort) {\n props.onSort(defaultSort, defaultSortDirection, page);\n } else {\n const sortableColumn = _.findWhere(props.columns, { sortable: true });\n\n if (sortableColumn) {\n onColumnClick(sortableColumn);\n } else {\n // If no columns are sortable, load the data as is\n props.onInit();\n }\n }\n }\n }, [props.columns]);\n\n return (\n <DataTable\n {...props}\n onColumnClick={onColumnClick.bind(this)}\n />\n );\n});\n\nListTable.defaultProps = {\n configurable: true,\n tableProps: {\n celled: true,\n sortable: true\n }\n};\n\nexport default ListTable;\n","// @flow\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState\n} from 'react';\nimport axios from 'axios';\nimport _ from 'underscore';\nimport ListTable from './ListTable';\nimport MenuSidebar from './MenuSidebar';\n\ntype Props = {\n columnCount?: number,\n title: string,\n url: string\n};\n\nconst DatabaseView = (props: Props) => {\n const [columns, setColumns] = useState([]);\n const [selectedTable, setSelectedTable] = useState();\n const [tables, setTables] = useState([]);\n\n const menuRef = useRef();\n\n const service = useMemo(() => ({\n getColumns: (params) => axios.get(`${props.url}/api/columns`, { params }),\n getData: (params) => axios.post(`${props.url}/api/search`, params),\n getTables: () => axios.get(`${props.url}/api/tables`)\n }), [props.url]);\n\n const resolveValue = useCallback((column, item) => {\n let value = item[column.column_name];\n\n const { data_type: dataType } = column;\n\n if (value) {\n switch (dataType) {\n case 'timestamp without time zone':\n value = new Date(value).toLocaleDateString();\n break;\n\n default:\n // Value is already set\n }\n }\n\n return value;\n }, []);\n\n useEffect(() => {\n if (service) {\n service\n .getTables()\n .then(({ data }) => {\n setTables(data);\n setSelectedTable(_.first(data));\n });\n }\n }, [service]);\n\n useEffect(() => {\n if (selectedTable) {\n service\n .getColumns({ table_name: selectedTable.table_name })\n .then(({ data }) => setColumns(data));\n }\n }, [selectedTable, service]);\n\n const test = useMemo(() => _.map(columns, (column, index) => ({\n name: column.column_name,\n label: column.column_name,\n resolve: resolveValue.bind(this, column),\n sortable: true,\n hidden: index > props.columnCount\n })), [columns, resolveValue, props.columnCount]);\n\n return (\n <div\n className='database-view'\n >\n <MenuSidebar\n contextRef={menuRef}\n header={{\n content: props.title,\n inverted: true\n }}\n inverted\n items={[{\n items: _.map(tables, (table) => ({\n active: selectedTable === table,\n content: table.table_name,\n onClick: () => setSelectedTable(table)\n }))\n }]}\n style={{\n overflow: 'auto',\n width: '250px'\n }}\n />\n <div\n style={{\n marginLeft: '250px'\n }}\n >\n { selectedTable && (\n <ListTable\n collectionName='items'\n columns={test}\n onLoad={(params) => service.getData({ ...params, table_name: selectedTable.table_name })}\n perPageOptions={[10, 25, 50, 100]}\n searchable\n />\n )}\n </div>\n </div>\n );\n};\n\nDatabaseView.defaultProps = {\n columnCount: Number.MAX_SAFE_INTEGER\n};\n\nexport default DatabaseView;\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-calendar\");","// @flow\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport Calendar from 'react-calendar';\nimport { Icon, Transition } from 'semantic-ui-react';\nimport DateInput from './DateInput';\n\nimport './DatePicker.css';\n\ntype Props = {\n closeOnSelection?: boolean,\n formatOptions?: any,\n locale?: string,\n onChange: (date: ?Date) => void,\n value: ?Date\n};\n\nconst DatePicker = (props: Props) => {\n const [calendar, setCalendar] = useState(false);\n const calendarWrapper = useRef<any>(null);\n\n const onDocumentClick = (event: Event) => {\n const calendarInstance = calendarWrapper.current;\n\n if (calendarInstance && !calendarInstance.contains(event.target)) {\n setCalendar(false);\n }\n };\n\n useEffect(() => {\n // Bind the event listener\n document.addEventListener('mousedown', onDocumentClick);\n\n // Unbind the event listener\n return () => document.removeEventListener('mousedown', onDocumentClick);\n }, [calendarWrapper]);\n\n return (\n <>\n <DateInput\n formatOptions={props.formatOptions}\n locale={props.locale}\n onChange={props.onChange.bind(this)}\n onClick={() => setCalendar(true)}\n value={props.value}\n />\n <Transition\n visible={calendar}\n >\n <div\n ref={calendarWrapper}\n style={{\n position: 'absolute',\n zIndex: '999'\n }}\n >\n <Calendar\n locale={props.locale}\n onChange={(date) => {\n props.onChange(date);\n if (props.closeOnSelection) {\n setCalendar(false);\n }\n }}\n next2AriaLabel='Next Year'\n next2Label={<Icon name='angle double right' />}\n nextAriaLabel='Next Month'\n nextLabel={<Icon name='chevron right' />}\n prev2AriaLabel='Previous Year'\n prev2Label={<Icon name='angle double left' />}\n prevAriaLabel='Previous Month'\n prevLabel={<Icon name='chevron left' />}\n value={props.value}\n />\n </div>\n </Transition>\n </>\n );\n};\n\nDatePicker.defaultProps = {\n closeOnSelection: true\n};\n\nexport default DatePicker;\n","// @flow\n\nimport React, { type Component } from 'react';\nimport { Popup } from 'semantic-ui-react';\n\ntype Props = {\n className?: string,\n content: string,\n delayInterval?: number,\n renderPopup?: () => Component<any>,\n popupContent?: string\n}\n\n/**\n * Renders the DescriptorField component. This component can be used to static text as with a popup on hover.\n *\n * @param props\n *\n * @returns {*}\n *\n * @constructor\n */\nconst DescriptorField = (props: Props) => (\n <Popup\n className={props.className}\n content={props.popupContent}\n hoverable\n mouseEnterDelay={props.delayInterval}\n trigger={props.renderPopup\n ? props.renderPopup()\n : (<span className='text'>{ props.content }</span>)}\n wide\n />\n);\n\nDescriptorField.defaultProps = {\n delayInterval: 1000,\n renderPopup: undefined,\n popupContent: undefined\n};\n\nexport default DescriptorField;\n","// @flow\n\nimport React, { useMemo } from 'react';\nimport uuid from 'react-uuid';\nimport { Icon } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\n\ntype Props = {\n basic?: boolean,\n className?: string,\n color?: string,\n compact?: boolean,\n filename?: string,\n primary?: boolean,\n size?: string,\n secondary?: boolean,\n url: string\n};\n\nconst DownloadButton = (props: Props) => {\n /**\n * Sets the appropriate class names based on the formatting props.\n *\n * @type {string}\n */\n const className = useMemo(() => {\n const classNames = ['ui', 'button'];\n\n if (props.basic) {\n classNames.push('basic');\n }\n\n if (props.className) {\n classNames.push(...props.className.split(' '));\n }\n\n if (props.color) {\n classNames.push(props.color);\n }\n\n if (props.compact) {\n classNames.push('compact');\n }\n\n if (props.primary) {\n classNames.push('primary');\n }\n\n if (props.secondary) {\n classNames.push('secondary');\n }\n\n if (props.size) {\n classNames.push(props.size);\n }\n\n return classNames.join(' ');\n }, [props.basic, props.color]);\n\n return (\n <a\n className={className}\n download={props.filename || uuid()}\n href={props.url}\n >\n <Icon\n name='cloud download'\n />\n { i18n.t('Common.buttons.download') }\n </a>\n );\n};\n\nexport default DownloadButton;\n","// @flow\n\nimport React from 'react';\nimport { Button, Loader } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\n\ntype Props = {\n onClick: (item: any) => Promise<any>,\n saving: boolean\n};\n\nconst SaveButton = (props: Props) => (\n <Button\n onClick={props.onClick.bind(this)}\n primary\n size='medium'\n type='submit'\n >\n { i18n.t('Common.buttons.save') }\n { props.saving && (\n <Loader\n active\n className='saving'\n inline\n size='tiny'\n />\n )}\n </Button>\n);\n\nexport default SaveButton;\n","// @flow\n\nimport { useEditContainer, type EditContainerProps } from '@performant-software/shared-components';\nimport React, { Component, type ComponentType } from 'react';\nimport {\n Dimmer,\n Form,\n Loader,\n Menu,\n Message,\n type MenuProps\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport CancelButton from './CancelButton';\nimport SaveButton from './SaveButton';\nimport Toaster from './Toaster';\nimport i18n from '../i18n/i18n';\nimport './EditPage.css';\n\ntype Props = EditContainerProps & {\n /**\n * CSS class name to append to the container <code>div</code> element.\n */\n className?: string,\n\n /**\n * The form component to render.\n */\n component: ComponentType<any>,\n\n /**\n * If provided, the passed menu will render as tabs at the top of the page.\n */\n menu?: MenuProps,\n\n /**\n * Callback fired when the close button is clicked.\n */\n onClose: () => void,\n\n /**\n * Callback fired when the save button is clicked.\n */\n onSave: () => Promise<any>,\n\n /**\n * If <code>true</code>, a loading indicator will display.\n */\n showLoading: boolean\n};\n\ntype State = {\n currentTab: string,\n showToaster: boolean\n};\n\n/**\n * The <code>EditPage</code> component can be used to edit the details of a single record within a page view. This\n * component uses the <code>EditContainer</code> higher-order component to facilitate all of the editing functionality.\n * This component is responsible for rendering the container in which the editable form is rendered.\n */\nclass EditPageClass extends Component<Props, State> {\n static defaultProps: any;\n\n /**\n * Constructs a new EditPage component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n currentTab: '',\n showToaster: false\n };\n }\n\n /**\n * Sets the current tab to the first tab in the array.\n */\n componentDidMount() {\n if (this.props.menu) {\n const tab = _.first(this.props.menu.items);\n this.setState({ currentTab: tab && tab.key });\n }\n }\n\n /**\n * Resets the <code>showToaster</code> property when the set of errors changes.\n *\n * @param prevProps\n */\n componentDidUpdate(prevProps: Props) {\n if (!_.isEmpty(this.props.errors) && !_.isEmpty(prevProps.errors) && prevProps.errors !== this.props.errors) {\n this.setState({ showToaster: true });\n }\n }\n\n /**\n * Shows the toaster and calls the onSave prop.\n *\n * @returns {*}\n */\n onSave() {\n this.setState({ showToaster: true });\n return this.props.onSave();\n }\n\n /**\n * Renders the EditPage component.\n *\n * @returns {*}\n */\n render() {\n return (\n <Dimmer.Dimmable\n as='div'\n className={`edit-page ${this.props.className || ''}`}\n >\n { this.renderLoading() }\n <Form\n noValidate\n >\n { this.renderMenu() }\n { this.renderButtons() }\n { this.renderComponent() }\n { this.renderToaster() }\n </Form>\n </Dimmer.Dimmable>\n );\n }\n\n /**\n * Renders the buttons and container if no menu is present.\n *\n * @returns {null|*}\n */\n renderButtons() {\n if (this.props.menu) {\n return null;\n }\n\n return (\n <div\n className='button-container'\n >\n <SaveButton\n onClick={this.onSave.bind(this)}\n saving={this.props.saving}\n />\n <CancelButton\n disabled={this.props.saving}\n onClick={this.props.onClose.bind(this)}\n />\n </div>\n );\n }\n\n /**\n * Renders the wrapped component.\n *\n * @returns {*}\n */\n renderComponent() {\n const WrappedComponent = this.props.component;\n\n return (\n <WrappedComponent\n {...this.props}\n currentTab={this.state.currentTab}\n />\n );\n }\n\n /**\n * Renders the loading indicator.\n *\n * @returns {null|*}\n */\n renderLoading() {\n if (!(this.props.showLoading && this.props.loading)) {\n return null;\n }\n\n return (\n <Dimmer\n active={this.props.loading}\n inverted\n >\n <Loader\n content={i18n.t('Common.messages.loading')}\n />\n </Dimmer>\n );\n }\n\n /**\n * Renders the menu (if present).\n *\n * @returns {null|*}\n */\n renderMenu() {\n if (!this.props.menu) {\n return null;\n }\n\n return (\n <Menu\n {..._.omit(this.props.menu, 'items')}\n >\n { this.props.menu && _.map(this.props.menu.items, (item) => (\n <Menu.Item\n active={item.key === this.state.currentTab}\n key={item.key}\n name={item.name}\n onClick={() => this.setState({ currentTab: item.key })}\n />\n ))}\n <Menu.Menu\n position='right'\n >\n <Menu.Item>\n <SaveButton\n onClick={this.onSave.bind(this)}\n saving={this.props.saving}\n />\n <CancelButton\n disabled={this.props.saving}\n onClick={this.props.onClose.bind(this)}\n />\n </Menu.Item>\n </Menu.Menu>\n </Menu>\n );\n }\n\n /**\n * Renders the toaster component.\n *\n * @returns {null|*}\n */\n renderToaster() {\n if (!this.state.showToaster) {\n return null;\n }\n\n if (!(this.props.errors && this.props.errors.length)) {\n return null;\n }\n\n return (\n <Toaster\n onDismiss={() => this.setState({ showToaster: false })}\n timeout={0}\n type={Toaster.MessageTypes.negative}\n >\n <Message.Header\n content={i18n.t('Common.messages.error.header')}\n />\n <Message.List\n items={this.props.errors}\n />\n </Toaster>\n );\n }\n}\n\nEditPageClass.defaultProps = {\n showLoading: true\n};\n\nconst EditPage = useEditContainer(EditPageClass);\nexport default EditPage;\n\nexport type EditPageProps = EditContainerProps & {\n currentTab: string\n};\n","// @flow\n\nimport React, { Component, type ComponentType } from 'react';\nimport { Table } from 'semantic-ui-react';\nimport uuid from 'react-uuid';\nimport _ from 'underscore';\nimport DataTable, { type Props as DataTableProps } from './DataTable';\nimport Draggable from './Draggable';\nimport './EmbeddedList.css';\n\nimport type { Column, Props as ColumnSelectorProps } from './DataTableColumnSelector';\n\ntype Props = DataTableProps & ColumnSelectorProps & {\n /**\n * The name of the default sort column.\n */\n defaultSort?: string,\n\n /**\n * The default direction to sort the list (ascending vs. descending).\n */\n defaultSortDirection?: string,\n\n /**\n * Callback fired when a table row is dragged.\n */\n onDrag?: (dragIndex: number, hoverIndex: number) => void\n};\n\ntype State = {\n sortColumn: ?string,\n sortDirection: ?string\n};\n\nconst PATH_DELIMITER = '.';\nconst SORT_ASCENDING = 'ascending';\nconst SORT_DESCENDING = 'descending';\n\n/**\n * The <code>EmbeddedList</code> component can be used to display a collection of records that live within a parent\n * object. This is especially useful when the collection is to be saved at the same time as the parent.\n */\nclass EmbeddedList extends Component<Props, State> {\n static defaultProps: any;\n\n /**\n * Constructs a new EmbeddedList component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n sortColumn: null,\n sortDirection: null\n };\n }\n\n /**\n * Sorts the table by the first column.\n */\n componentDidMount() {\n let column;\n\n if (this.props.defaultSort) {\n column = _.findWhere(this.props.columns, { name: this.props.defaultSort });\n } else {\n column = _.find(this.props.columns, (c) => c.sortable !== false);\n }\n\n if (column) {\n this.onColumnClick(column, this.props.defaultSortDirection);\n }\n }\n\n /**\n * Returns the sorted, filtered list of items.\n *\n * @returns {*}\n */\n getItems() {\n const { items } = this.props;\n const { sortColumn, sortDirection } = this.state;\n\n return _.orderBy(_.filter(items, (item) => !item._destroy), sortColumn, sortDirection);\n }\n\n /**\n * Sorts the table by the passed column.\n *\n * @param column\n */\n onColumnClick(column: Column, direction: string = SORT_ASCENDING) {\n /*\n * We'll disable the column sorting if the table rows are draggable. Making the table rows draggable implies\n * that the sorting will be done manually. Allowing column click sorting could make things confusing.\n */\n if (this.props.onDrag) {\n return;\n }\n\n /*\n * If the column is not sortable, we'll do nothing. Check explicity for \"false\" here because the default behavior\n * should allow columns to be sortable.\n */\n if (column.sortable === false) {\n return;\n }\n\n const sortColumn = column.name;\n let sortDirection = direction || SORT_ASCENDING;\n\n if (column.name === this.state.sortColumn) {\n sortDirection = this.state.sortDirection === SORT_ASCENDING ? SORT_DESCENDING : SORT_ASCENDING;\n }\n\n this.setState({ sortColumn, sortDirection });\n }\n\n /**\n * Deletes the passed item. This function returns a promise so that calls can be chained together.\n *\n * @param item\n *\n * @returns {Promise}\n */\n onDelete(item: any) {\n this.props.onDelete(item);\n return Promise.resolve();\n }\n\n /**\n * Saves the passed item, resets the state, and reloads the data. This function returns a promise so that calls can\n * be chained together.\n *\n * @param item\n *\n * @returns {Promise}\n */\n onSave(item: any) {\n const uid = item.uid ? item.uid : uuid();\n\n if (this.props.onSave) {\n this.props.onSave({ ...item, uid });\n }\n\n return Promise.resolve();\n }\n\n /**\n * Renders the EmbeddedList component.\n *\n * @returns {*}\n */\n render() {\n return (\n <DataTable\n {...this.props}\n actions={this.props.actions}\n addButton={this.props.addButton}\n buttons={this.props.buttons}\n className={`embedded-list ${this.props.className ? this.props.className : ''}`}\n configurable={this.props.configurable}\n columns={this.props.columns}\n count={this.props.items.length}\n items={this.getItems()}\n modal={this.props.modal}\n onColumnClick={this.onColumnClick.bind(this)}\n onCopy={this.props.onCopy}\n onDrag={this.props.onDrag}\n onDelete={this.onDelete.bind(this)}\n onSave={this.onSave.bind(this)}\n renderDeleteModal={this.props.renderDeleteModal}\n renderEmptyRow={this.props.renderEmptyRow}\n renderItem={this.renderItem.bind(this)}\n sortColumn={this.state.sortColumn}\n sortDirection={this.state.sortDirection}\n tableProps={{\n celled: true,\n sortable: !this.props.onDrag\n }}\n selectable={this.props.selectable}\n onRowSelect={this.props.onRowSelect}\n selectedRows={this.props.selectedRows}\n showRecordCount={this.props.showRecordCount}\n />\n );\n }\n\n /**\n * Renders the passed item. This function should be used if the table row is draggable.\n *\n * @param item\n * @param index\n * @param children\n *\n * @returns {*}\n */\n renderItem(item: any, index: number, children: ComponentType<any>) {\n if (this.props.onDrag) {\n // Since the item may not be saved yet, we'll look for the ID or UID columns as the key. This is necessary to\n // maintain the correct element when dragging.\n const key = item.id || item.uid;\n\n return (\n <Draggable\n id={key}\n index={index}\n item={item}\n key={key}\n onDrag={this.props.onDrag.bind(this)}\n >\n <Table.Row>\n { children }\n </Table.Row>\n </Draggable>\n );\n }\n\n return (\n <Table.Row\n key={index}\n >\n { children }\n </Table.Row>\n );\n }\n}\n\n/**\n * UnderscoreJS mixin to allow sorting by a property string (i.e. \"person.name\") and a sort\n * direction (\"ascending\" or \"descending\").\n */\n_.mixin({\n orderBy: (items, property, direction) => {\n if (!property) {\n return items;\n }\n\n const sortProperty = _.property(property.split(PATH_DELIMITER));\n let ordered = _.sortBy(items, (item) => sortProperty(item));\n\n if (direction === SORT_DESCENDING) {\n ordered = ordered.reverse();\n }\n\n return ordered;\n }\n});\n\nEmbeddedList.defaultProps = {\n items: [],\n addButton: {\n location: 'top'\n },\n buttons: [],\n className: '',\n configurable: true,\n modal: undefined,\n onCopy: undefined,\n onDrag: undefined,\n onSave: () => {},\n renderDeleteModal: undefined,\n renderEmptyRow: undefined\n};\n\nexport default EmbeddedList;\n\nexport {\n SORT_ASCENDING,\n SORT_DESCENDING\n};\n","// @flow\n\nimport React, {\n useImperativeHandle,\n useMemo,\n useState,\n type Node\n} from 'react';\nimport {\n Accordion,\n Divider,\n Header,\n Icon\n} from 'semantic-ui-react';\nimport './Facet.css';\n\ntype Props = {\n /**\n * Facet content to display inside the accordion menu.\n */\n children: Node,\n\n /**\n * Classname to apply to the root element.\n */\n className?: string,\n\n /**\n * If `true`, the facet will be expanded by default.\n */\n defaultActive?: boolean,\n\n /**\n * If `true`, a divider will be rendered between each facet in the list.\n */\n divided?: boolean,\n\n /**\n * React ref element to apply to the expand/collapse functions.\n */\n innerRef?: {\n current: ?HTMLElement\n },\n\n /**\n * Facet title to display at the top.\n */\n title: string,\n\n /**\n * If `true`, the facet will be visible in the DOM.\n */\n visible?: boolean\n};\n\n/**\n * This component can be used as a wrapper to display various types of facets (list, toggle, etc).\n */\nconst Facet = (props: Props) => {\n const [active, setActive] = useState(props.defaultActive);\n\n /**\n * Sets the class name variable for the Accordion component.\n *\n * @type {string}\n */\n const className = useMemo(() => {\n const classNames = ['facet'];\n\n if (!props.visible) {\n classNames.push('hidden');\n }\n\n if (props.className) {\n classNames.push(props.className);\n }\n\n return classNames.join(' ');\n }, [props.className, props.visible]);\n\n /**\n * Expose collapse/expand functions on the ref object to allow parent components to imperatively open/close.\n */\n useImperativeHandle(props.innerRef, () => ({\n collapse: () => setActive(false),\n expand: () => setActive(true)\n }));\n\n return (\n <>\n <Accordion\n className={className}\n >\n <Accordion.Title\n active={active}\n index={0}\n onClick={() => setActive((prevActive) => !prevActive)}\n >\n <div\n className='facet-title'\n >\n <Header\n content={props.title}\n size='tiny'\n />\n <Icon\n name='dropdown'\n />\n </div>\n </Accordion.Title>\n <Accordion.Content\n active={active}\n >\n { props.children }\n </Accordion.Content>\n </Accordion>\n { props.divided && (\n <Divider />\n )}\n </>\n );\n};\n\nFacet.defaultProps = {\n children: undefined,\n defaultActive: true,\n divided: false,\n visible: true\n};\n\nexport type {\n Props\n};\n\nexport default Facet;\n","// @flow\n\nimport React from 'react';\nimport { Button, type ButtonProps } from 'semantic-ui-react';\nimport { type ClearRefinementsProps } from '../types/InstantSearch';\n\ntype Props = ButtonProps & ClearRefinementsProps;\n\n/**\n * This component is used with the `useClearRefinements` hook from Instant Search Hooks. This component also accepts\n * all of the props of the Semantic UI <code>Button</code> component.\n */\nconst FacetClearButton = ({ useClearRefinements, ...props }: Props) => {\n const { refine, canRefine } = useClearRefinements(props);\n\n return (\n <Button\n {...props}\n disabled={!canRefine}\n onClick={() => refine()}\n />\n );\n};\n\nexport default FacetClearButton;\n","// @flow\n\nimport React from 'react';\nimport { Button } from 'semantic-ui-react';\nimport './LinkButton.css';\n\ntype Props = {\n content: string,\n onClick: () => void\n};\n\nconst LinkButton = (props: Props) => (\n <Button\n basic\n className='link-button'\n compact\n content={props.content}\n onClick={props.onClick.bind(this)}\n type='button'\n />\n);\n\nexport default LinkButton;\n","// @flow\n\nimport { Timer } from '@performant-software/shared-components';\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState\n} from 'react';\nimport {\n Checkbox,\n Icon,\n Input,\n Label,\n List\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport Facet, { type Props as FacetProps } from './Facet';\nimport i18n from '../i18n/i18n';\nimport LinkButton from './LinkButton';\nimport { type RefinementListProps } from '../types/InstantSearch';\nimport './FacetList.css';\n\ntype Props = FacetProps & RefinementListProps & {\n /**\n * The default value for the `operator` prop. If not provided, this will default to `or`.\n */\n defaultOperator?: string,\n\n /**\n * Default value of the facet list.\n */\n defaultValue?: string,\n\n /**\n * If \"true\", the component will render a search box for searching individual facet values.\n */\n searchable?: boolean,\n\n /**\n * If \"true\", the component will render a toggle to change the behavior of the list from \"or\" to \"and\" logic.\n */\n toggleable?: boolean\n};\n\nconst OPERATOR_OR = 'or';\nconst OPERATOR_AND = 'and';\n\n/**\n * This component is used with the `useRefinementList` hook from Instant Search Hooks. If the `searchable` prop\n * is \"true\", the component will also render a search box used to filter the list of facet values.\n */\nconst FacetList = forwardRef(({ useRefinementList, ...props }: Props, ref: HTMLElement) => {\n const [operator, setOperator] = useState(props.defaultOperator || OPERATOR_OR);\n\n const {\n canRefine,\n canToggleShowMore,\n isShowingMore,\n items,\n refine,\n searchForItems,\n toggleShowMore,\n } = useRefinementList({ ...props, operator });\n\n const searchRef = useRef();\n const [query, setQuery] = useState('');\n\n /**\n * Clears the current search state.\n *\n * @type {(function(): void)|*}\n */\n const onClear = useCallback(() => {\n // Reset the query view\n setQuery('');\n\n // Reset the list of refinements\n searchForItems();\n\n // Refocus the input element\n const { current: instance } = searchRef;\n if (instance) {\n instance.focus();\n }\n }, []);\n\n /**\n * Executes the search within the list of facet values.\n *\n * @type {function(): *}\n */\n const onSearch = useCallback(() => searchForItems(query), [query, searchForItems]);\n\n /**\n * Toggles the \"and\" / \"or\" list operator.\n *\n * @type {function(): void}\n */\n const onToggleOperator = useCallback(() => {\n setOperator((prevOperator) => (prevOperator === OPERATOR_OR ? OPERATOR_AND : OPERATOR_OR));\n }, []);\n\n /**\n * Sets the visibility variable based on the items and query.\n */\n const visible = useMemo(() => !(canRefine && _.isEmpty(items) && _.isEmpty(query)), [items, query]);\n\n /**\n * Sets the default value if provided.\n */\n useEffect(() => {\n if (props.defaultValue) {\n refine(props.defaultValue);\n }\n }, [props.defaultValue]);\n\n /**\n * Persist the facet search when a user selects or deselects items.\n */\n useEffect(() => {\n if (query) {\n searchForItems(query);\n }\n }, [items]);\n\n return (\n <Facet\n className='facet-list'\n defaultActive={props.defaultActive}\n divided={props.divided}\n innerRef={ref}\n title={props.title}\n visible={visible}\n >\n { props.searchable && (\n <Input\n icon={query && (\n <Icon\n link\n name='times'\n onClick={onClear}\n />\n )}\n fluid\n onChange={(e, { value }) => setQuery(value)}\n onKeyDown={() => Timer.clearSearchTimer()}\n onKeyUp={() => Timer.setSearchTimer(onSearch)}\n placeholder={i18n.t('FacetList.labels.search')}\n ref={searchRef}\n value={query}\n />\n )}\n <List\n className='facet-list'\n >\n { _.map(items, (item, index) => (\n <List.Item\n key={index}\n >\n <Checkbox\n checked={item.isRefined}\n label={{\n children: (\n <>\n <span>{ item.label }</span>\n <Label\n circular\n content={item.count}\n size='small'\n />\n </>\n )\n }}\n onClick={() => refine(item.value)}\n />\n </List.Item>\n ))}\n </List>\n { canToggleShowMore && (\n <>\n <Icon\n name={isShowingMore ? 'angle up' : 'angle down'}\n />\n <LinkButton\n content={isShowingMore\n ? i18n.t('FacetList.buttons.showLess')\n : i18n.t('FacetList.buttons.showMore')}\n onClick={() => toggleShowMore()}\n />\n </>\n )}\n { props.toggleable && (\n <Checkbox\n className='toggleable'\n checked={operator === OPERATOR_AND}\n label={operator === OPERATOR_OR\n ? i18n.t('FacetList.labels.matchAny')\n : i18n.t('FacetList.labels.matchAll')}\n onChange={onToggleOperator}\n toggle\n />\n )}\n </Facet>\n );\n});\n\nFacetList.defaultProps = {\n ...Facet.defaultProps,\n defaultOperator: OPERATOR_OR\n};\n\nexport default FacetList;\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"rc-slider\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"rc-slider/assets/index.css\");","// @flow\n\nimport Slider from 'rc-slider';\nimport React, {\n forwardRef,\n useEffect,\n useMemo,\n useState\n} from 'react';\nimport { Grid } from 'semantic-ui-react';\nimport Facet, { type Props as FacetProps } from './Facet';\nimport { type RangeSliderProps } from '../types/InstantSearch';\nimport 'rc-slider/assets/index.css';\nimport './FacetSlider.css';\n\ntype Props = FacetProps & RangeSliderProps;\n\n/**\n * This component can be used with the `useRange` hook from Instant Search Hooks.\n */\nconst FacetSlider = forwardRef(({ useRangeSlider, ...props }: Props, ref: HTMLElement) => {\n const {\n start,\n range,\n refine,\n } = useRangeSlider(props);\n\n const [valueView, setValueView] = useState<Array<number>>([range.min, range.max]);\n\n /**\n * Sets the visibility variable based on the range min and max.\n *\n * @type {unknown}\n */\n const visible = useMemo(() => range.min === 0 && range.max === 0, [range.min, range.max]);\n\n /**\n * Resets the value and valueView when the current refinement is cleared.\n */\n useEffect(() => {\n if (start[0] <= range.min && start[1] >= range.max) {\n setValueView([range.min, range.max]);\n }\n }, [range, start]);\n\n return (\n <Facet\n defaultActive={props.defaultActive}\n divided={props.divided}\n innerRef={ref}\n title={props.title}\n visible={visible}\n >\n <div\n className='facet-slider'\n >\n <div\n className='range-container'\n >\n <Slider\n allowCross={false}\n defaultValue={start}\n max={range.max}\n min={range.min}\n onAfterChange={(v) => refine(v)}\n onChange={(v) => setValueView(v)}\n range\n value={valueView}\n />\n </div>\n <Grid\n columns={2}\n >\n <Grid.Column>\n { valueView[0] }\n </Grid.Column>\n <Grid.Column\n textAlign='right'\n >\n { valueView[1] }\n </Grid.Column>\n </Grid>\n </div>\n </Facet>\n );\n});\n\nFacetSlider.defaultProps = Facet.defaultProps;\n\nexport default FacetSlider;\n","// @flow\n\nimport React, { forwardRef, useMemo } from 'react';\nimport { Checkbox, Label } from 'semantic-ui-react';\nimport Facet, { type Props as FacetProps } from './Facet';\nimport { type ToggleRefinementProps } from '../types/InstantSearch';\n\ntype Props = FacetProps & ToggleRefinementProps;\n\n/**\n * This component is used with the `useToggleRefinement` hook from Instant Search Hooks.\n */\nconst FacetToggle = forwardRef(({ useToggleRefinement, ...props }: Props, ref: HTMLElement) => {\n const {\n value: {\n isRefined,\n count\n },\n refine\n } = useToggleRefinement(props);\n\n /**\n * Sets the visibility variable based on the count.\n *\n * @type {boolean}\n */\n const visible = useMemo(() => !!count, [count]);\n\n return (\n <Facet\n defaultActive={props.defaultActive}\n divided={props.divided}\n innerRef={ref}\n title={props.title}\n visible={visible}\n >\n <Checkbox\n checked={isRefined}\n label={{\n children: (\n <Label\n circular\n content={count}\n size='small'\n />\n )\n }}\n onClick={() => refine({ isRefined })}\n toggle\n />\n </Facet>\n );\n});\n\nFacetToggle.defaultProps = Facet.defaultProps;\n\nexport default FacetToggle;\n","// @flow\n\nimport React, { useRef } from 'react';\nimport { Button } from 'semantic-ui-react';\n\ntype Props = {\n multiple?: boolean,\n onSelection: (files: Array<File>) => void\n};\n\nconst FileInputButton = ({ onSelection, multiple, ...buttonProps }: Props) => {\n const fileInputRef = useRef();\n\n /**\n * Converts the passed file list to an array.\n *\n * @param fileList\n *\n * @returns {[]}\n */\n const toArray = (fileList) => {\n const array = [];\n\n for (let i = 0; i < fileList.length; i += 1) {\n array.push(fileList.item(i));\n }\n\n return array;\n };\n\n return (\n <>\n <Button\n {...buttonProps}\n onClick={() => fileInputRef.current && fileInputRef.current.click()}\n />\n <input\n ref={fileInputRef}\n type='file'\n multiple={multiple}\n onChange={(e) => onSelection(toArray(e.target.files))}\n style={{\n display: 'none'\n }}\n />\n </>\n );\n};\n\nFileInputButton.defaultProps = {\n multiple: false\n};\n\nexport default FileInputButton;\n","// @flow\n\nimport React, { Component, createRef } from 'react';\nimport { Icon, Message } from 'semantic-ui-react';\nimport { Trans } from 'react-i18next';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport './FileUpload.css';\n\ntype Props = {\n /**\n * A list of file types to include\n */\n fileTypes?: Array<string>,\n\n /**\n * The maximum size for a single file\n */\n maxSize?: number,\n\n /**\n * Call back for when files are added\n */\n onFilesAdded: (files: Array<File>) => void,\n};\n\ntype State = {\n errors: ?Array<string>\n};\n\ntype FileEvent = {\n dataTransfer: HTMLInputElement,\n preventDefault: () => void,\n target: HTMLInputElement\n};\n\n/**\n * The <code>FileUpload</code> component renders a dropzone and allows a user to drop or select one or more files\n * from their local file system. Optionally, the files can be limited by size or type.\n */\nclass FileUpload extends Component<Props, State> {\n fileInput: any;\n filePattern: any;\n\n /**\n * Constructs a new FileUpload component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n errors: null\n };\n\n this.fileInput = createRef();\n this.filePattern = this.props.fileTypes && new RegExp(`(.*?)\\\\.${this.props.fileTypes.join('|')}$`);\n }\n\n /**\n * Triggers the file input click.\n */\n onClickDropzone() {\n this.fileInput.current.click();\n }\n\n /**\n * Adds the selected files.\n *\n * @param e\n */\n onDropFiles(e: FileEvent) {\n e.preventDefault();\n const files = this.toArray(e.dataTransfer.files);\n const validFiles = this.validate(files);\n if (validFiles.length === files.length) {\n this.props.onFilesAdded(files);\n }\n }\n\n /**\n * Adds the selected files.\n *\n * @param e\n */\n onFilesAdded(e: FileEvent) {\n e.preventDefault();\n const files = this.toArray(e.target.files);\n const validFiles = this.validate(files);\n if (validFiles.length === files.length) {\n this.props.onFilesAdded(files);\n }\n }\n\n /**\n * Renders the FileUpload component.\n */\n render() {\n return (\n <div\n className='file-upload'\n >\n <Message\n error\n header={i18n.t('Common.errors.title')}\n hidden={!(this.state.errors && this.state.errors.length)}\n visible={this.state.errors && this.state.errors.length}\n onDismiss={() => this.setState({ errors: null })}\n list={this.state.errors}\n />\n <div\n className='file-dropzone'\n onClick={this.onClickDropzone.bind(this)}\n onDragLeave={(e) => { e.preventDefault(); }}\n onDragOver={(e) => { e.preventDefault(); }}\n onDrop={this.onDropFiles.bind(this)}\n onKeyDown={() => {}}\n role='button'\n tabIndex={-1}\n >\n <Icon\n color='blue'\n name='cloud upload'\n size='large'\n />\n <div className='file-dropzone-text'>\n <Trans i18nKey='FileUpload.add'>\n <span className='link-text'>Add files</span>\n or drop files here\n </Trans>\n </div>\n <input\n ref={this.fileInput}\n className='file-input'\n type='file'\n multiple\n onChange={this.onFilesAdded.bind(this)}\n />\n </div>\n </div>\n );\n }\n\n /**\n * Converts the passed file list to an array.\n *\n * @param fileList\n *\n * @returns {[]}\n */\n toArray(fileList: any) {\n const array = [];\n\n for (let i = 0; i < fileList.length; i += 1) {\n array.push(fileList.item(i));\n }\n\n return array;\n }\n\n /**\n * Validates the passed list of files.\n *\n * @param files\n *\n * @returns {[]|*}\n */\n validate(files: Array<File>) {\n if (!this.props.maxSize && !this.props.fileTypes) {\n return files;\n }\n\n const validFiles = [];\n const errors = [];\n\n _.each(files, (file) => {\n let valid = true;\n\n // Files are invalid if they exceed the maximum size\n if (this.props.maxSize && file.size > this.props.maxSize) {\n valid = false;\n errors.push(i18n.t('FileUpload.errors.maxSize', { name: file.name }));\n }\n\n // Files are invalid if they do not match the acceptable types\n if (this.filePattern && !file.name.match(this.filePattern)) {\n valid = false;\n errors.push(i18n.t('FileUpload.errors.fileType', { name: file.name, type: /[^.]+$/.exec(file.name) }));\n }\n\n if (valid) {\n validFiles.push(file);\n }\n });\n\n this.setState({ errors });\n\n return validFiles;\n }\n}\n\nexport default FileUpload;\n","// @flow\n\nimport React, { useMemo, type ComponentType } from 'react';\nimport { Icon, Label, Loader } from 'semantic-ui-react';\nimport './FileUploadStatus.css';\n\ntype Props = {\n status: string\n};\n\nconst Status = {\n pending: 'pending',\n processing: 'processing',\n complete: 'complete',\n error: 'error'\n};\n\nconst ColorsByStatus = {\n [Status.processing]: 'black',\n [Status.complete]: 'green',\n [Status.error]: 'red'\n};\n\nconst IconsByStatus = {\n [Status.pending]: 'clock outline',\n [Status.complete]: 'checkmark',\n [Status.error]: 'warning circle'\n};\n\nconst TextByStatus = {\n [Status.pending]: 'Pending',\n [Status.processing]: 'Processing',\n [Status.complete]: 'Complete',\n [Status.error]: 'Error'\n};\n\nconst FileUploadStatus: ComponentType<any> = ({ status = Status.pending }: Props) => {\n const color = useMemo(() => ColorsByStatus[status], [status]);\n const icon = useMemo(() => IconsByStatus[status], [status]);\n const text = useMemo(() => TextByStatus[status], [status]);\n\n return (\n <Label\n className='file-upload-status'\n color={color}\n >\n { status === Status.processing && (\n <Loader\n active\n inline\n inverted\n size='mini'\n />\n )}\n { icon && (\n <Icon\n name={icon}\n />\n )}\n { text }\n </Label>\n );\n};\n\nexport default FileUploadStatus;\n","// @flow\n\nimport React, { useMemo, type ComponentType } from 'react';\nimport { Header, Icon, Progress } from 'semantic-ui-react';\nimport './FileUploadProgress.css';\n\ntype Props = {\n completed: number,\n total: number,\n uploading?: boolean\n};\n\nconst FileUploadProgress: ComponentType<any> = (props: Props) => {\n /**\n * Sets the \"complete\" variable to \"true\" if the number of completed items is equal to the total and\n * greater than zero.\n *\n * @type {unknown}\n */\n const complete = useMemo(() => (\n props.completed > 0 && props.completed === props.total\n ), [props.completed, props.total]);\n\n /**\n * Sets the percent of completed items.\n *\n * @type {number|number}\n */\n const percent = useMemo(() => (\n props.total > 0 ? (props.completed / props.total) : 0\n ), [props.completed, props.total]);\n\n /**\n * Sets the formatted percent view.\n */\n const percentView = useMemo(() => (\n Number(percent)\n .toLocaleString(undefined, {\n style: 'percent',\n minimumFractionDigits: 0\n })\n ), [percent]);\n\n return (\n <div\n className='file-upload-progress'\n >\n <Icon\n color='blue'\n name='cloud upload'\n size='big'\n />\n <div\n className='progress-container'\n >\n <Header>\n <Header.Content\n content={percentView}\n />\n <Header.Subheader>\n { !(props.uploading || complete) && 'Getting Started' }\n { props.uploading && 'Uploading...' }\n { complete && 'Completed' }\n </Header.Subheader>\n </Header>\n <Progress\n color='blue'\n percent={percent * 100}\n />\n </div>\n </div>\n );\n};\n\nexport default FileUploadProgress;\n","// @flow\n\nimport React, {\n useCallback,\n useMemo,\n useState,\n type ComponentType\n} from 'react';\nimport {\n Button,\n Dimmer,\n Form,\n Item,\n Loader,\n Message,\n Modal\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport FileUpload from './FileUpload';\nimport FileUploadStatus from './FileUploadStatus';\nimport FileUploadProgress from './FileUploadProgress';\nimport i18n from '../i18n/i18n';\nimport ModalContext from '../context/ModalContext';\n\ntype Props = {\n /**\n * If <code>true</code>, the modal will close once the upload has completed.\n */\n closeOnComplete?: boolean,\n\n /**\n * Component to render at top of modal.\n */\n headerComponent?: ComponentType<any>,\n\n /**\n * Component to render within the modal.\n */\n itemComponent: ComponentType<any>,\n\n /**\n * Callback fired when a file is added.\n */\n onAddFile: (file: File) => any,\n\n /**\n * Callback fired when the close button is clicked.\n */\n onClose: () => void,\n\n /**\n * Callback fired when the save button is clicked. See <code>strategy</code> prop.\n */\n onSave: (items: Array<any>) => Promise<any>,\n\n /**\n * An object with keys containing the names of properties that are required.\n */\n required?: { [key: string]: string },\n\n /**\n * If <code>true</code>, a full page loader will display while uploading is in progress.\n */\n showPageLoader?: boolean,\n\n /**\n * The upload strategy to use. If <code>batch</code>, we'll execute one <code>onSave</code> request with each item\n * as an array in the body. If <code>single</code>, we'll execute an <code>onSave</code> request for each item.\n */\n strategy?: string\n};\n\nconst Strategy = {\n batch: 'batch',\n single: 'single'\n};\n\nconst Status = {\n pending: 'pending',\n processing: 'processing',\n complete: 'complete',\n error: 'error'\n};\n\n/**\n * The <code>FileUploadModal</code> is a convenience wrapper for the <code>FileUpload</code> component, allowing\n * it to render in a modal.\n */\nconst FileUploadModal: ComponentType<any> = (props: Props) => {\n const [items, setItems] = useState([]);\n const [uploadCount, setUploadCount] = useState(0);\n const [uploading, setUploading] = useState(false);\n const [statuses, setStatuses] = useState({});\n\n /**\n * Sets the <code>hasErrors</code> value to <code>true</code> if at least one item on the state contains errors.\n */\n const hasErrors = useMemo(() => !!_.find(items, (item) => !_.isEmpty(item.errors)), [items]);\n\n /**\n * Sets the <code>hasUploadErrors</code> value to <code>true</code> if at least one file uploaded with\n * an error status.\n */\n const hasUploadErrors = useMemo(() => (\n !!_.find(_.values(statuses), (status) => status === Status.error)\n ), [statuses]);\n\n /**\n * Calls the <code>onAddFile</code> prop for each item in the passed collection of files and adds them\n * to the items on the state.\n *\n * @type {function(*): void}\n */\n const onAddFiles = useCallback((files) => (\n setItems((prevItems) => [\n ...prevItems,\n ..._.map(files, props.onAddFile)\n ])\n ), []);\n\n /**\n * Updates the passed association for the passed item.\n *\n * @type {function(*, string, string, *): void}\n */\n const onAssociationInputChange = useCallback((item: any, idAttribute: string, attribute: string, value: any) => (\n setItems((prevItems) => _.map(prevItems, (i) => (i !== item ? i : {\n ...i,\n [idAttribute]: value.id,\n [attribute]: value,\n errors: _.without(item.errors, idAttribute)\n })))\n ), []);\n\n /**\n * Calls the <code>onSave</code> prop with the current list of items.\n *\n * @type {function(): *}\n */\n const onBatchUpload = useCallback(() => (\n props\n .onSave(items)\n .then(() => setUploadCount(1))\n ), [items]);\n\n /**\n * Sets the uploading state <code>false</code> and calls the <code>onClose</code> prop if necessary.\n *\n * @type {(function(): void)|*}\n */\n const onComplete = useCallback(() => {\n setUploading(false);\n\n if (props.closeOnComplete) {\n props.onClose();\n }\n }, [props.closeOnComplete, props.onClose]);\n\n /**\n * Deletes the passed item from the state.\n *\n * @type {function(*): void}\n */\n const onDelete = useCallback((item) => (\n setItems((prevItems) => _.filter(prevItems, (i) => i !== item))\n ), []);\n\n /**\n * Sets the status for the item at the passed index.\n *\n * @type {function(*, *): void}\n */\n const setStatus = useCallback((index, status) => (\n setStatuses((prevStatuses) => ({ ...prevStatuses, [index]: status }))\n ));\n\n /**\n * Iterates of the list of items and sequentially calls the <code>onSave</code> prop for each.\n *\n * @type {function(): Promise<unknown>}\n */\n const onSingleUpload = useCallback(async () => {\n for (let i = 0; i < items.length; i += 1) {\n const item = items[i];\n\n // Update the status for the item\n setStatus(i, Status.processing);\n\n let error;\n\n // Do the upload\n try {\n // eslint-disable-next-line no-await-in-loop\n await props.onSave(item);\n } catch (e) {\n error = e;\n }\n\n // Update the status for the item\n if (error) {\n setStatus(i, Status.error);\n } else {\n setStatus(i, Status.complete);\n }\n\n // Update the upload count\n setUploadCount((prevCount) => prevCount + 1);\n }\n\n return Promise.resolve();\n }, [items, props.onSave]);\n\n /**\n * Sets the passed item onto the state.\n *\n * @type {function(*, *): void}\n */\n const onSetState = useCallback((item: any, attributes: string) => (\n setItems((prevItems) => _.map(prevItems, (i) => (i !== item ? i : {\n ...i,\n ...attributes,\n errors: []\n })))\n ), []);\n\n /**\n * Updates the text value for the passed item.\n *\n * @type {function(*, string, Event, {value: *}): void}\n */\n const onTextInputChange = useCallback((item: any, attribute: string, e: Event, { value }: { value: any }) => (\n setItems((prevItems) => _.map(prevItems, (i) => (i !== item ? i : {\n ...i,\n [attribute]: value,\n errors: _.without(item.errors, attribute)\n })))\n ), []);\n\n /**\n * Updates the passed item with the passed object of attributes.\n *\n * @type {function(*, *): void}\n */\n const onUpdate = useCallback((item, attributes) => (\n setItems((prevItems) => _.map(prevItems, (i) => (i !== item ? i : { ...i, ...attributes })))\n ), []);\n\n /**\n * Validates the passed item.\n *\n * @type {function(*): *&{errors: []}}\n */\n const validateItem = useCallback((item) => {\n const errors = [];\n\n _.each(_.keys(props.required), (key) => {\n const value = item[key];\n let invalid;\n\n if (_.isNumber(value)) {\n invalid = _.isEmpty(value.toString());\n } else {\n invalid = _.isEmpty(value);\n }\n\n if (invalid) {\n errors.push(key);\n }\n });\n\n return {\n ...item,\n errors\n };\n }, [props.required]);\n\n /**\n * Validates the items on the state.\n *\n * @type {function(): Promise<void>}\n */\n const onValidate = useCallback(() => new Promise((resolve, reject) => {\n let error = false;\n\n // Validate each item\n const newItems = _.map(items, (item) => {\n const newItem = validateItem(item);\n\n if (!_.isEmpty(newItem.errors)) {\n error = true;\n }\n\n return newItem;\n });\n\n // Set the new items on the state\n setItems(newItems);\n\n // Reject or resolve the promise\n if (error) {\n reject();\n } else {\n resolve();\n }\n }), [items]);\n\n /**\n * Updates the passed item with the passed props.\n *\n * @type {(function(): void)|*}\n */\n const onUpload = useCallback(() => {\n // Set the uploading indicator\n setUploading(true);\n\n // Upload the files\n onValidate()\n .then(() => (\n props.strategy === Strategy.batch\n ? onBatchUpload()\n : onSingleUpload()\n ))\n .finally(onComplete);\n }, [onBatchUpload, onComplete, onSingleUpload, onValidate, props.strategy]);\n\n /**\n * Renders the error message for the passed item.\n *\n * @type {(function(*, *): (null|*))|*}\n */\n const renderMessageItem = useCallback((item, index) => {\n if (_.isEmpty(item.errors)) {\n return null;\n }\n\n const filename = !_.isEmpty(item.name) ? item.name : index;\n const fields = _.map(item.errors, (e) => props.required[e]).join(', ');\n\n return (\n <Message.Item\n content={i18n.t('FileUploadModal.errors.required', { filename, fields })}\n key={index}\n />\n );\n }, []);\n\n /**\n * Renders the status component for the passed index.\n *\n * @type {(function(*): (null|*))|*}\n */\n const renderStatus = useCallback((index) => {\n if (props.strategy !== Strategy.single) {\n return null;\n }\n\n return (\n <FileUploadStatus\n status={statuses[index]}\n />\n );\n }, [statuses, props.strategy]);\n\n /**\n * Memoization and case correction for the <code>headerComponent</code> prop.\n *\n * @type {React$AbstractComponent<*, *>}\n */\n const HeaderComponent = useMemo(() => props.headerComponent, [props.headerComponent]);\n\n /**\n * Memoization and case correction for the <code>itemComponent</code> prop.\n *\n * @type {React$AbstractComponent<*, *>}\n */\n const UploadItem = useMemo(() => props.itemComponent, [props.itemComponent]);\n\n return (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n centered={false}\n className='serial-upload-modal'\n mountNode={mountNode}\n open\n >\n { props.showPageLoader && (\n <Dimmer\n active={uploading}\n inverted\n >\n <Loader\n content={i18n.t('FileUploadModal.loader')}\n />\n </Dimmer>\n )}\n <Modal.Header>\n { props.strategy === Strategy.batch && i18n.t('FileUploadModal.title') }\n { props.strategy === Strategy.single && (\n <FileUploadProgress\n completed={uploadCount}\n total={items.length}\n uploading={uploading}\n />\n )}\n </Modal.Header>\n <Modal.Content\n scrolling\n >\n { hasErrors && (\n <Message\n error\n >\n <Message.Header\n content={i18n.t('FileUploadModal.errors.header')}\n />\n <Message.List>\n { _.map(items, renderMessageItem) }\n </Message.List>\n </Message>\n )}\n { hasUploadErrors && (\n <Message\n content={i18n.t('FileUploadModal.errors.upload.content')}\n header={i18n.t('FileUploadModal.errors.upload.header')}\n error\n />\n )}\n <FileUpload\n onFilesAdded={onAddFiles}\n />\n { HeaderComponent && (\n <HeaderComponent\n items={items}\n onSetItems={setItems}\n uploading={uploading}\n />\n )}\n <Item.Group\n as={Form}\n divided\n noValidate\n relaxed='very'\n >\n { _.map(items, (item, index) => (\n <UploadItem\n isError={(key) => _.contains(item.errors, key)}\n isRequired={(key) => !!(props.required && props.required[key])}\n item={item}\n key={index}\n onAssociationInputChange={onAssociationInputChange.bind(this, item)}\n onDelete={onDelete.bind(this, item)}\n onSetState={onSetState.bind(this, item)}\n onTextInputChange={onTextInputChange.bind(this, item)}\n onUpdate={onUpdate.bind(this, item)}\n renderStatus={renderStatus.bind(this, index)}\n />\n ))}\n </Item.Group>\n </Modal.Content>\n <Modal.Actions>\n <Button\n content={i18n.t('Common.buttons.upload')}\n disabled={uploading || uploadCount > 0 || _.isEmpty(items)}\n icon='cloud upload'\n loading={uploading && !props.showPageLoader}\n onClick={onUpload}\n primary\n />\n <Button\n content={uploadCount > 0\n ? i18n.t('Common.buttons.close')\n : i18n.t('Common.buttons.cancel')}\n disabled={uploading}\n onClick={props.onClose}\n />\n </Modal.Actions>\n </Modal>\n )}\n </ModalContext.Consumer>\n );\n};\n\nFileUploadModal.defaultProps = {\n closeOnComplete: true,\n strategy: Strategy.batch,\n showPageLoader: true\n};\n\nexport default FileUploadModal;\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@react-google-maps/api\");","// @flow\n\nimport { Map } from '@performant-software/shared-components';\nimport {\n GoogleMap as MapComponent,\n Marker\n} from '@react-google-maps/api';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useState\n} from 'react';\n\ntype LatLng = {\n lat: () => number,\n lng: () => number\n};\n\ntype Props = {\n className?: string,\n containerStyle?: any,\n defaultCenter?: {\n lat: number,\n lng: number\n },\n defaultZoom?: number,\n onDragEnd?: (latLng: LatLng) => void,\n position?: {\n lat: number,\n lng: number\n }\n};\n\nconst DEFAULT_ZOOM = 1;\nconst DEFAULT_ZOOM_MARKER = 12;\n\nconst GoogleMap = (props: Props) => {\n // Convert the position props to floats to avoid Javascript errors.\n const position = Map.getPosition(props.position);\n\n const [center, setCenter] = useState(position || props.defaultCenter);\n const [map, setMap] = useState();\n\n /**\n * Set the zoom value based on the position and defaultZoom prop.\n *\n * @type {*}\n */\n const zoom = useMemo(() => {\n let value;\n\n if (position) {\n value = DEFAULT_ZOOM_MARKER;\n } else if (props.defaultZoom) {\n value = props.defaultZoom;\n } else {\n value = DEFAULT_ZOOM;\n }\n\n return value;\n }, [position, props.defaultZoom]);\n\n /**\n * Call the onDragEnd prop, passing the new location.\n *\n * @type {(function({latLng: *}): void)|*}\n */\n const onDragEnd = useCallback(({ latLng }) => {\n if (props.onDragEnd) {\n props.onDragEnd({\n lat: latLng.lat(),\n lng: latLng.lng()\n });\n }\n }, [props.onDragEnd]);\n\n /**\n * Sets the map object when the component mounts.\n *\n * @type {function(*): void}\n */\n const onLoad = useCallback((m) => setMap(m), []);\n\n // If the position is changed manually and the new location is outside of the current bounds, re-center the map.\n useEffect(() => {\n if (map && position) {\n const bounds = map.getBounds();\n if (bounds && !bounds.contains(position)) {\n setCenter(position);\n }\n }\n }, [props.position]);\n\n return (\n <MapComponent\n center={center}\n mapContainerClassName={props.className}\n mapContainerStyle={props.containerStyle}\n onClick={onDragEnd}\n onLoad={onLoad}\n zoom={zoom}\n >\n { position && (\n <Marker\n draggable={!!props.onDragEnd}\n onDragEnd={onDragEnd}\n position={position}\n visible\n />\n )}\n </MapComponent>\n );\n};\n\nGoogleMap.defaultProps = {\n containerStyle: {\n height: '400px'\n },\n defaultCenter: {\n lat: 0,\n lng: 0\n }\n};\n\nexport default GoogleMap;\n","// @flow\n\nimport { StandaloneSearchBox } from '@react-google-maps/api';\nimport React, { useCallback, useState, type Element } from 'react';\nimport _ from 'underscore';\n\ntype Props = {\n children: Element<any>,\n onLocationSelection: ({ lat: number, lng: number }) => void\n}\n\nconst GooglePlacesSearch = (props: Props) => {\n const [searchBox, setSearchBox] = useState();\n\n const onPlacesChanged = useCallback(() => {\n if (searchBox) {\n const place = _.first(searchBox.getPlaces());\n const { location } = place.geometry;\n\n const name = place.formatted_address;\n const lat = location.lat();\n const lng = location.lng();\n\n props.onLocationSelection({\n name,\n lat,\n lng,\n result: place\n });\n }\n }, [searchBox, props.onLocationSelection]);\n\n return (\n <StandaloneSearchBox\n onLoad={(s) => setSearchBox(s)}\n onPlacesChanged={onPlacesChanged}\n >\n { props.children }\n </StandaloneSearchBox>\n );\n};\n\nexport default GooglePlacesSearch;\n","// @flow\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState\n} from 'react';\nimport _ from 'underscore';\nimport {\n Button,\n Card,\n Header,\n Image,\n Ref\n} from 'semantic-ui-react';\nimport Draggable from './Draggable';\nimport './HorizontalCards.css';\n\ntype Props = {\n cardClassName?: string,\n cardsClassName?: string,\n className?: string,\n inlineImage?: boolean,\n items: Array<any>,\n onClick?: (item: any, index: number) => void,\n onDrag?: (dragIndex: number, hoverIndex: number) => void,\n perPage: number,\n renderDescription?: (item: any) => Element<any> | string,\n renderExtra?: (item: any) => Element<any> | string,\n renderHeader?: (item: any) => Element<any> | string,\n renderImage: (item: any) => string,\n renderMeta?: (item: any) => Element<any> | string,\n};\n\nconst HorizontalCards = (props: Props) => {\n const [marginWidth, setMarginWidth] = useState(0);\n const [pageWidth, setPageWidth] = useState(0);\n const [scrollPage, setScrollPage] = useState(0);\n const [scrollPages, setScrollPages] = useState(0);\n\n const ref = useRef();\n\n /**\n * Sets the flex-box style based on the page width.\n *\n * @type {function(): {flex: string}}\n */\n const cardStyle = useMemo(() => ({\n flex: `0 0 ${(pageWidth / props.perPage) - marginWidth}px`\n }), [pageWidth, marginWidth, props.perPage]);\n\n /**\n * Helper function to concatenate class names.\n *\n * @type {function(*, *=): string}\n */\n const getClassName = useCallback((className, defaultClassName = null) => {\n const classNames = [];\n\n if (defaultClassName) {\n classNames.push(defaultClassName);\n }\n\n if (className) {\n classNames.push(className);\n }\n\n return classNames.join(' ');\n }, []);\n\n /**\n * Initializes the page width and scroll pages on the sate.\n *\n * @type {(function(*=): void)|*}\n */\n const initialize = useCallback((event) => {\n const instance = ref.current;\n\n if (instance) {\n const { clientWidth, scrollWidth } = instance;\n\n setPageWidth(clientWidth);\n setScrollPages(Math.ceil(scrollWidth / clientWidth));\n\n if (!event) {\n setScrollPage(0);\n }\n\n const child = instance.firstChild;\n if (child) {\n const style = window.getComputedStyle(child);\n const leftMargin = parseFloat(style.marginLeft) || 0;\n const rightMargin = parseFloat(style.marginRight) || 0;\n\n setMarginWidth(leftMargin + rightMargin);\n }\n }\n }, [ref, props.items]);\n\n /**\n * Sets the current page number on the state.\n *\n * @type {function(*): void}\n */\n const onPageChange = useCallback((increment) => {\n let nextPage = scrollPage + increment;\n\n if (nextPage < 0) {\n nextPage = scrollPages;\n } else if (nextPage >= scrollPages) {\n nextPage = 0;\n }\n\n setScrollPage(nextPage);\n }, [scrollPage, scrollPages]);\n\n /**\n * Sets the window resize event listener.\n */\n useEffect(() => {\n window.addEventListener('resize', initialize);\n\n return () => window.removeEventListener('resize', initialize);\n }, []);\n\n /**\n * Re-initialize the component if the items change.\n */\n useEffect(() => initialize(), [initialize, props.items]);\n\n /**\n * Sets the total number of pages on the state.\n */\n useEffect(() => {\n const instance = ref.current;\n\n if (instance) {\n const { scrollWidth } = instance;\n setScrollPages(Math.ceil(scrollWidth / pageWidth));\n }\n }, [pageWidth]);\n\n /**\n * Scrolls to the new position once the page changes.\n */\n useEffect(() => {\n const instance = ref.current;\n\n if (instance) {\n instance.scrollTo({ left: (scrollPage * pageWidth), behavior: 'smooth' });\n }\n }, [scrollPage, pageWidth]);\n\n /**\n * Renders the card component. If a \"route\" prop is passed, the component is wrapped in a Link.\n *\n * @param item\n * @param index\n *\n * @returns {JSX.Element}\n */\n const renderCard = (item, index) => {\n let card = (\n <Card\n className={getClassName(props.cardClassName)}\n link\n onClick={props.onClick && props.onClick.bind(this, item, index)}\n style={cardStyle}\n >\n { !props.inlineImage && renderImage(item) }\n { (props.renderHeader || props.renderMeta || props.renderDescription) && (\n <Card.Content>\n { props.inlineImage && renderImage(item) }\n { props.renderHeader && (\n <Card.Header\n as={Header}\n size='small'\n >\n { props.renderHeader(item) }\n </Card.Header>\n )}\n { props.renderMeta && (\n <Card.Meta>\n { props.renderMeta(item) }\n </Card.Meta>\n )}\n { props.renderDescription && (\n <Card.Description>\n { props.renderDescription(item) }\n </Card.Description>\n )}\n </Card.Content>\n )}\n { props.renderExtra && (\n <Card.Content\n extra\n >\n { props.renderExtra(item) }\n </Card.Content>\n )}\n </Card>\n );\n\n if (props.onDrag) {\n // Since the item may not be saved yet, we'll look for the ID or UID columns as the key. This is necessary to\n // maintain the correct element when dragging.\n const key = item.id || item.uid;\n\n card = (\n <Draggable\n direction='horizontal'\n id={key}\n index={index}\n item={item}\n key={key}\n onDrag={props.onDrag}\n >\n { card }\n </Draggable>\n );\n }\n\n return card;\n };\n\n /**\n * Renders the image based on the return type of the renderImage prop. String values returned will be assumed to be\n * a src attribute for the image.\n *\n * @type {(function(*=): (*))|*}\n */\n const renderImage = useCallback((item) => {\n const image = props.renderImage(item);\n\n if (_.isString(image) || !image) {\n return (\n <Image\n alt={item.alt}\n className='image-placeholder'\n src={image}\n style={{\n objectFit: 'cover'\n }}\n />\n );\n }\n\n return image;\n }, [props.renderImage]);\n\n return (\n <div\n className={getClassName(props.className, 'horizontal-cards')}\n >\n <Ref\n innerRef={ref}\n >\n <Card.Group\n className={getClassName(props.cardsClassName)}\n >\n { _.map(props.items, renderCard.bind(this)) }\n </Card.Group>\n </Ref>\n <div\n className='button-container'\n >\n { scrollPages > 1 && (\n <div\n className='pagination'\n >\n <Button\n aria-label='Left'\n basic\n circular\n icon='angle left'\n onClick={onPageChange.bind(this, -1)}\n />\n <Button\n aria-label='Right'\n basic\n circular\n icon='angle right'\n onClick={onPageChange.bind(this, 1)}\n />\n </div>\n )}\n </div>\n </div>\n );\n};\n\nHorizontalCards.defaultProps = {\n perPage: 4\n};\n\nexport default HorizontalCards;\n","// @flow\n\nimport React from 'react';\nimport { Modal } from 'semantic-ui-react';\nimport { IIIFViewer } from '@performant-software/shared-components';\n\ntype Props = {\n onClose: () => void\n};\n\nconst IIIFModal = ({ onClose, ...props }: Props) => (\n <Modal\n centered={false}\n closeIcon\n onClose={onClose}\n open\n >\n <Modal.Content>\n <IIIFViewer\n {...props}\n />\n </Modal.Content>\n </Modal>\n);\n\nexport default IIIFModal;\n","// @flow\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useState\n} from 'react';\nimport {\n Button,\n Dimmer,\n Grid,\n Image,\n Loader,\n Transition\n} from 'semantic-ui-react';\nimport './ImageCarousel.css';\n\ntype ImageType = {\n caption?: string,\n src: string\n};\n\ntype Props = {\n images: Array<ImageType>,\n onClose: () => void\n};\n\nconst ImageCarousel = (props: Props) => {\n const [currentIndex, setCurrentIndex] = useState(0);\n const [visible, setVisible] = useState(true);\n\n /**\n * Sets the current image based on the current index.\n *\n * @type {*}\n */\n const image = useMemo(() => {\n let value;\n\n if (props.images && props.images.length > currentIndex) {\n value = props.images[currentIndex];\n }\n\n return value;\n }, [currentIndex, props.images]);\n\n /**\n * Sets the new index value.\n *\n * @type {(function(*): void)|*}\n */\n const onIndexChange = useCallback((increment) => {\n const newIndex = currentIndex + increment;\n\n if (newIndex >= 0 && newIndex < props.images.length) {\n setCurrentIndex(newIndex);\n setVisible(false);\n }\n }, [currentIndex, props.images]);\n\n /**\n * Sets up the component when initially mounted.\n */\n useEffect(() => {\n // Disabled scrolling on the page when carousel is visible.\n if (document.body) {\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n // Re-enable scrolling\n if (document.body) {\n document.body.style.overflow = 'auto';\n }\n };\n }, []);\n\n return (\n <Dimmer\n active\n className='image-carousel'\n page\n >\n <Grid\n padded\n >\n <Grid.Row>\n <Grid.Column\n textAlign='right'\n >\n <Button\n icon='times'\n onClick={props.onClose}\n size='huge'\n />\n </Grid.Column>\n </Grid.Row>\n <Grid.Row\n className='image-content'\n >\n <Grid.Column>\n { props.images && props.images.length > 1 && (\n <Button\n disabled={currentIndex === 0}\n icon='chevron left'\n onClick={() => onIndexChange(-1)}\n size='massive'\n />\n )}\n </Grid.Column>\n <Grid.Column\n className='image-container'\n >\n { !visible && (\n <Loader\n active\n />\n )}\n <Transition\n animation='fade'\n duration={500}\n visible={visible}\n >\n <Image\n src={image?.src}\n onLoad={() => setVisible(true)}\n />\n </Transition>\n </Grid.Column>\n <Grid.Column>\n { props.images && props.images.length > 1 && (\n <Button\n disabled={currentIndex === props.images.length - 1}\n icon='chevron right'\n onClick={() => onIndexChange(1)}\n size='massive'\n />\n )}\n </Grid.Column>\n </Grid.Row>\n <Grid.Row>\n <Grid.Column\n textAlign='center'\n >\n { image?.caption }\n </Grid.Column>\n </Grid.Row>\n </Grid>\n </Dimmer>\n );\n};\n\nexport default ImageCarousel;\n","// @flow\n\nimport React, { Component, type ComponentType } from 'react';\nimport { Button, Dropdown } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport { SORT_ASCENDING } from './DataList';\n\ntype Sort = {\n key: string,\n text: string,\n value: string,\n direction?: ?string\n};\n\ntype Props = {\n defaultView?: number,\n hideToggle?: boolean,\n onSort?: (sortColumn: string, sortDirection?: ?string) => void,\n sort?: Array<Sort>,\n sortColumn?: string,\n sortDirection?: string\n};\n\ntype State = {\n view: number\n};\n\nconst Views = {\n list: 0,\n grid: 1\n};\n\n/**\n * Returns a function to wrap the passed component in a ItemToggle. The ItemToggle component can be used to toggle a\n * list of records between list and grid views. It will also render a sort dropdown component if a list of sort\n * properties is provided.\n *\n * @param WrappedComponent\n */\nconst useItemsToggle = (WrappedComponent: ComponentType<any>) => (\n class extends Component<Props, State> {\n // Default props\n static defaultProps = {\n hideToggle: false,\n sort: []\n };\n\n // Sort dropdown ref\n sortDropdown: typeof Dropdown;\n\n /**\n * Constructs a new ItemsToggle component.\n *\n * @param props\n */\n constructor(props: any) {\n super(props);\n\n this.state = {\n view: props.defaultView || Views.list\n };\n }\n\n /**\n * Renders the sort value for the current option.\n *\n * @returns {*}\n */\n getSortValue() {\n const sort = _.find(this.props.sort, { value: this.props.sortColumn });\n return sort && sort.text;\n }\n\n /**\n * Returns true if the component should be hidden.\n *\n * @returns {boolean|*}\n */\n isHidden() {\n return this.props.hideToggle && _.isEmpty(this.props.sort);\n }\n\n /**\n * Calls the onSort prop.\n *\n * @param sort\n *\n * @returns {*|void}\n */\n onSort(sort: Sort) {\n if (!this.props.onSort) {\n return;\n }\n\n let sortDirection;\n\n if (sort.value !== this.props.sortColumn) {\n sortDirection = sort.direction;\n }\n\n this.props.onSort(sort.value, sortDirection);\n }\n\n /**\n * Renders the ItemsToggle component.\n *\n * @returns {*}\n */\n render() {\n const renderListHeader = this.isHidden()\n ? undefined\n : this.renderHeader.bind(this);\n\n return (\n <WrappedComponent\n {...this.props}\n renderListHeader={renderListHeader}\n view={this.state.view}\n />\n );\n }\n\n /**\n * Renders the list header icons:\n * <ul>\n * <li>List/Grid view toggle</li>\n * <li>Sort dropdown</li>\n * </ul>\n *\n * @returns {*}\n */\n renderHeader() {\n if (this.isHidden()) {\n return null;\n }\n\n return (\n <>\n { !this.props.hideToggle && (\n <>\n <Button\n active={this.state.view === Views.list}\n aria-label='List View'\n basic\n icon='list'\n onClick={() => this.setState({ view: Views.list })}\n />\n <Button\n active={this.state.view === Views.grid}\n aria-label='Grid View'\n basic\n icon='grid layout'\n onClick={() => this.setState({ view: Views.grid })}\n />\n </>\n )}\n { !_.isEmpty(this.props.sort) && this.props.onSort && (\n <Button.Group\n basic\n style={{\n fontSize: 'inherit'\n }}\n >\n <Button\n aria-label='Sort by'\n content={this.getSortValue()}\n icon={this.props.sortDirection === SORT_ASCENDING ? 'sort alphabet up' : 'sort alphabet down'}\n onClick={(e) => this.sortDropdown.handleClick(e)}\n />\n <Dropdown\n aria-label='Sort'\n className='button icon'\n floating\n options={_.map(this.props.sort, (sort) => ({\n ...sort,\n onClick: this.onSort.bind(this, sort)\n }))}\n ref={(sortDropdown) => {\n this.sortDropdown = sortDropdown;\n }}\n trigger={<></>}\n value={this.props.sortColumn}\n />\n </Button.Group>\n )}\n </>\n );\n }\n }\n);\n\nexport default useItemsToggle;\n\nexport {\n Views\n};\n","// @flow\n\nimport React, { Component, type Element } from 'react';\nimport {\n Button,\n Card,\n Checkbox,\n Header,\n Icon,\n Item,\n Segment\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport useList from './List';\nimport useItemsToggle, { Views } from './ItemsToggle';\nimport Draggable from './Draggable';\nimport './Items.css';\n\nimport type { Props as ListProps } from './List';\n\ntype Props = ListProps & {\n /**\n * Renders the Card/Item component as the passed component.\n */\n as?: Element<any>,\n\n /**\n * Props to supply to the Card/Item component.\n */\n asProps?: any,\n\n /**\n * Child elements to append below the list content.\n */\n children?: Element<any>,\n\n /**\n * Callback returning <code>true</code> if the row for the passed item is selected.\n */\n isRowSelected?: (item: any) => boolean,\n\n /**\n * An array of objects to render as rows in the list.\n */\n items: Array<any>,\n\n /**\n * If true, the list items will be formatted as a link.\n */\n link?: boolean,\n\n /**\n * Callback fired when a table row is dragged\n */\n onDrag?: (dragIndex: number, hoverIndex: number) => void,\n\n /**\n * Callback fired when the passed item is selected. This callback is <i>only</i> fired if the <code>selectable</code>\n * prop is passed as <code>true</code>.\n */\n onRowSelect?: (item: any) => void,\n\n /**\n * Callback fired when the select all checkbox is checked.\n */\n onSelectAllRows?: (items: Array<any>) => void,\n\n /**\n * A function that returns a JSX element to render as additional card content.\n */\n renderAdditionalContent?: (item: any) => Element<any>,\n\n /**\n * A function that returns a JSX element to render as the card description.\n * See Semantic UI <a href=\"https://react.semantic-ui.com/views/card/\">Card</a>.\n */\n renderDescription?: (item: any) => Element<any>,\n\n /**\n * A function that returns a JSX element to render when the list has no items.\n */\n renderEmptyList?: () => Element<any>,\n\n /**\n * A function that returns a JSX element to render as the card extra content.\n * See Semantic UI <a href=\"https://react.semantic-ui.com/views/card/\">Card</a>.\n */\n renderExtra?: (item: any) => Element<any>,\n\n /**\n * A function that returns a JSX element to render as the card header.\n * See Semantic UI <a href=\"https://react.semantic-ui.com/views/card/\">Card</a>.\n */\n renderHeader?: (item: any) => Element<any>,\n\n /**\n * A function that returns a JSX element to render as the card image.\n * See Semantic UI <a href=\"https://react.semantic-ui.com/views/card/\">Card</a>.\n */\n renderImage?: (item: any) => Element<any>,\n\n /**\n * A function that returns a JSX element to render as the card meta.\n * See Semantic UI <a href=\"https://react.semantic-ui.com/views/card/\">Card</a>.\n */\n renderMeta?: (item: any) => Element<any>,\n\n /**\n * If <code>true</code>, a selection box will display for each row.\n */\n selectable?: boolean,\n\n /**\n * Toggles between list view and grid view. This prop is provided by the <code>ItemsToggle</code> higher-order\n * component.\n */\n view: number\n};\n\n/**\n * The <code>Items</code> component is used as the presentation for a list of records. The component renders\n * both a <a href=\"https://react.semantic-ui.com/elements/list/\" target=\"_blank\">List</a> and\n * <a href=\"https://react.semantic-ui.com/views/card/\" target=\"_blank\">Card</a> views.\n */\nclass ItemsClass extends Component<Props, {}> {\n static defaultProps: any;\n\n /**\n * Returns the list of actions for the passed item.\n *\n * @param item\n *\n * @returns {Array<*>}\n */\n getActions(item) {\n return this.props.actions\n .filter((action) => !action.accept || action.accept(item))\n .map((action) => {\n let defaults = {};\n\n if (action.name === 'edit') {\n defaults = {\n basic: true,\n label: i18n.t('ItemList.actions.edit')\n };\n } else if (action.name === 'copy') {\n defaults = {\n basic: true,\n label: i18n.t('ItemList.actions.copy')\n };\n } else if (action.name === 'delete') {\n defaults = {\n basic: true,\n color: 'red',\n label: i18n.t('ItemList.actions.delete')\n };\n }\n\n return _.defaults(action, defaults);\n });\n }\n\n /**\n * Returns a space delimited string of class names.\n *\n * @returns {string}\n */\n getClassName() {\n const classNames = ['item-list'];\n\n if (this.props.className) {\n classNames.push(this.props.className);\n }\n\n return classNames.join(' ');\n }\n\n /**\n * Returns as asProps function value for the passed item, if provided.\n *\n * @param item\n *\n * @returns {*|{}}\n */\n getItemProps(item) {\n return (this.props.asProps && this.props.asProps(item)) || {};\n }\n\n /**\n * Returns true if the component has the necessary props to render itself in the \"selectable\" state.\n *\n * @returns {boolean}\n */\n isSelectable() {\n return !!(this.props.selectable && this.props.isRowSelected && this.props.onRowSelect);\n }\n\n /**\n * Renders the Items component.\n *\n * @returns {*}\n */\n render() {\n return (\n <div\n className={this.getClassName()}\n >\n { this.renderList() }\n { this.renderGrid() }\n { this.renderEmptyList() }\n { this.props.children }\n </div>\n );\n }\n\n /**\n * Renders the card for the passed item.\n *\n * @param item\n * @param index\n *\n * @returns {*}\n */\n renderCard(item, index) {\n const actions = this.getActions(item);\n\n let card = (\n <Card\n as={this.props.as}\n key={item.id || index}\n link={this.props.link}\n {...this.getItemProps(item)}\n >\n { this.props.renderImage && this.props.renderImage(item) }\n <Card.Content>\n { this.props.renderHeader && (\n <Card.Header>\n { this.props.renderHeader(item) }\n </Card.Header>\n )}\n { this.props.renderMeta && (\n <Card.Meta>\n { this.props.renderMeta(item) }\n </Card.Meta>\n )}\n { this.props.renderDescription && (\n <Card.Description>\n { this.props.renderDescription(item) }\n </Card.Description>\n )}\n </Card.Content>\n { this.props.renderExtra && (\n <Card.Content\n extra\n >\n { this.props.renderExtra(item) }\n </Card.Content>\n )}\n { !_.isEmpty(actions) && (\n <Card.Content\n extra\n textAlign='center'\n >\n { _.map(actions, (action, actionIndex) => (\n <Button\n aria-label={action.name}\n basic\n color={action.resolveColor ? action.resolveColor(item) : action.color}\n icon={action.resolveIcon ? action.resolveIcon(item) : action.icon}\n key={actionIndex}\n onClick={action.onClick.bind(this, item)}\n />\n ))}\n { this.isSelectable() && (\n <Button\n aria-label='Select'\n basic\n color={this.props.isRowSelected && this.props.isRowSelected(item) ? 'green' : undefined}\n icon='checkmark'\n onClick={this.props.onRowSelect && this.props.onRowSelect.bind(this, item)}\n />\n )}\n </Card.Content>\n )}\n </Card>\n );\n\n if (this.props.onDrag) {\n card = (\n <Draggable\n id={item.id || item.uid}\n index={index}\n item={item}\n key={item.id || item.uid}\n onDrag={this.props.onDrag.bind(this)}\n >\n { card }\n </Draggable>\n );\n }\n\n return card;\n }\n\n /**\n * Renders the empty list.\n *\n * @returns {null|*}\n */\n renderEmptyList() {\n if (this.props.loading || (this.props.items && this.props.items.length)) {\n return null;\n }\n\n if (this.props.renderEmptyList) {\n return this.props.renderEmptyList();\n }\n\n return (\n <Segment\n className='empty-list'\n padded='very'\n textAlign='center'\n >\n <Header\n icon\n >\n <Icon\n name='file outline'\n />\n </Header>\n { this.props.renderEmptyMessage() }\n </Segment>\n );\n }\n\n /**\n * Renders the grid view.\n *\n * @returns {null|*}\n */\n renderGrid() {\n if (this.props.view !== Views.grid || !(this.props.items && this.props.items.length)) {\n return null;\n }\n\n return (\n <Card.Group>\n { _.map(this.props.items, this.renderCard.bind(this)) }\n </Card.Group>\n );\n }\n\n /**\n * Renders the list item for the passed item.\n *\n * @param item\n * @param index\n *\n * @returns {*}\n */\n renderItem(item, index) {\n let listItem = (\n <Item\n as={this.props.as}\n key={item.id || index}\n {...this.getItemProps(item)}\n >\n { this.props.renderImage && (\n <Item.Image>\n { this.props.renderImage(item) }\n </Item.Image>\n )}\n <Item.Content\n className='primary-content'\n >\n { this.props.renderHeader && (\n <Item.Header>\n { this.props.renderHeader(item) }\n </Item.Header>\n )}\n { this.props.renderMeta && (\n <Item.Meta>\n { this.props.renderMeta(item) }\n </Item.Meta>\n )}\n { this.props.renderDescription && (\n <Item.Description>\n { this.props.renderDescription(item) }\n </Item.Description>\n )}\n { this.props.renderExtra && (\n <Item.Extra>\n { this.props.renderExtra(item) }\n </Item.Extra>\n )}\n { _.map(this.getActions(item), (action, actionIndex) => (\n <Button\n basic={action.basic}\n color={action.resolveColor ? action.resolveColor(item) : action.color}\n content={action.resolveName ? action.resolveName(item) : action.label}\n key={actionIndex}\n icon={action.resolveIcon ? action.resolveIcon(item) : action.icon}\n onClick={action.onClick.bind(this, item)}\n />\n ))}\n </Item.Content>\n { this.props.renderAdditionalContent && this.props.renderAdditionalContent(item) }\n { this.isSelectable() && (\n <div\n className='checkbox-container'\n >\n <Checkbox\n checked={this.props.isRowSelected && this.props.isRowSelected(item)}\n onChange={this.props.onRowSelect && this.props.onRowSelect.bind(this, item)}\n />\n </div>\n )}\n </Item>\n );\n\n if (this.props.onDrag) {\n listItem = (\n <Draggable\n id={item.id || item.uid}\n index={index}\n item={item}\n key={item.id || item.uid}\n onDrag={this.props.onDrag.bind(this)}\n >\n { listItem }\n </Draggable>\n );\n }\n\n return listItem;\n }\n\n /**\n * Renders the list view.\n *\n * @returns {null|*}\n */\n renderList() {\n if (this.props.view !== Views.list || !(this.props.items && this.props.items.length)) {\n return null;\n }\n\n return (\n <Item.Group\n divided\n link={this.props.link}\n relaxed='very'\n >\n { _.map(this.props.items, this.renderItem.bind(this)) }\n </Item.Group>\n );\n }\n}\n\nItemsClass.defaultProps = {\n actions: []\n};\n\nconst Items = useItemsToggle(useList(ItemsClass));\nexport default Items;\n\nexport type {\n Props\n};\n","// @flow\n\nimport { InfiniteScroll } from '@performant-software/shared-components';\nimport React, { Component } from 'react';\nimport uuid from 'react-uuid';\nimport { Loader } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport Items, { type Props as ItemsProps } from './Items';\nimport './ItemCollection.css';\n\ntype Props = ItemsProps & {\n /**\n * Appends the passed <code>className</code> and passes it to the <code>Items</code> component.\n */\n className?: string,\n\n /**\n * The DOM element responsible for infinite scrolling. If no context is provided, the document <code>body</code>\n * will be assumed.\n */\n context: {\n current: HTMLElement\n },\n\n /**\n * If <code>true</code>, the list will display a loading indicator.\n */\n loading?: boolean,\n\n /**\n * Callback fired when the bottom of the scroll container is reached.\n */\n onBottomReached?: (page: number) => void,\n\n /**\n * Callback fired when the delete action is clicked.\n */\n onDelete?: (item: any) => void,\n\n /**\n * Callback fired when a new record is added to the list.\n */\n onSave?: (item: any) => void,\n\n /**\n * The number of records to display on a single page.\n */\n perPage?: number,\n\n /**\n * The number of pixels from the bottom of the scroll container the <code>onBottomReached</code> callback\n * should fire.\n */\n scrollOffset?: number\n};\n\ntype State = {\n page: number\n};\n\n/**\n * An <code>ItemCollection</code> component can be used to render a list of records stored on an object in memory. This\n * component is responsible for handling infinite scroll and rendering the <code>Items</code> component, which handles\n * the presentation.\n */\nclass ItemCollection extends Component<Props, State> {\n static defaultProps: any;\n\n /**\n * Constructs a new ItemCollection component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n page: 1\n };\n }\n\n /**\n * Returns the concatenated class names.\n *\n * @returns {string}\n */\n getClassName() {\n const classNames = ['item-collection'];\n\n if (this.props.className) {\n classNames.push(this.props.className);\n }\n\n return classNames.join(' ');\n }\n\n /**\n * Returns the list of items to render based on the current page.\n *\n * @returns {Array<T>|*[]}\n */\n getItems(): Array<any> {\n const endIndex = this.state.page * this.props.perPage;\n const items = (this.props.items && this.props.items.slice(0, endIndex)) || [];\n return _.filter(items, (item) => !item._destroy);\n }\n\n /**\n * Increments the page number and fetches the data.\n */\n onBottomReached() {\n if (this.props.loading) {\n return;\n }\n\n this.setState((state) => ({ page: state.page + 1 }), () => {\n if (this.props.onBottomReached) {\n this.props.onBottomReached(this.state.page);\n }\n });\n }\n\n /**\n * Calls the onDelete prop and returns a promise.\n *\n * @param item\n *\n * @returns {Promise<unknown>}\n */\n onDelete(item: any) {\n this.props.onDelete(item);\n return Promise.resolve();\n }\n\n /**\n * Calls the onSave prop and returns a promise.\n *\n * @param item\n *\n * @returns {Promise<unknown>}\n */\n onSave(item: any) {\n if (this.props.onSave) {\n const uid = item.uid ? item.uid : uuid();\n this.props.onSave({ ...item, uid });\n }\n\n return Promise.resolve();\n }\n\n /**\n * Renders the ItemCollection component.\n *\n * @returns {*}\n */\n render() {\n return (\n <InfiniteScroll\n context={this.props.context}\n offset={this.props.scrollOffset}\n onBottomReached={this.onBottomReached.bind(this)}\n >\n <Items\n {...this.props}\n items={this.getItems()}\n className={this.getClassName()}\n onDelete={this.onDelete.bind(this)}\n onSave={this.onSave.bind(this)}\n >\n <Loader\n active={this.props.loading}\n content={i18n.t('Common.messages.loading')}\n />\n </Items>\n </InfiniteScroll>\n );\n }\n}\n\nItemCollection.defaultProps = {\n addButton: {\n location: 'top'\n },\n buttons: [],\n className: '',\n configurable: true,\n modal: undefined,\n onCopy: undefined,\n onDrag: undefined,\n onSave: () => {},\n perPage: Number.MAX_SAFE_INTEGER,\n renderDeleteModal: undefined,\n renderEmptyRow: undefined,\n scrollOffset: 0\n};\n\nexport default ItemCollection;\n","// @flow\n\nimport React, { useCallback, useEffect, useMemo } from 'react';\nimport { Dimmer, Loader } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport Items, { type ItemsProps } from './Items';\nimport useDataList, { SORT_ASCENDING, type Props as DataListProps } from './DataList';\n\ntype Sort = {\n key: any,\n value: any,\n text: string,\n direction: ?string\n};\n\ntype Props = DataListProps & ItemsProps & {\n /**\n * Callback fired when the sort dropdown is changed. This prop is provided by the <code>DataList</code>\n * higher-order component.\n */\n onSort: (column: string, direction: ?string, page?: number) => void,\n\n /**\n * An array of sort attributes to apply to the list. The values provided will display in a dropdown in the\n * list header.\n */\n sort?: Array<Sort>,\n\n /**\n * Name of the current sort column.\n */\n sortColumn?: string,\n\n /**\n * Current sort direction (ascending or descending).\n */\n sortDirection?: string\n};\n\n/**\n * An <code>ItemList</code> component can be used to render a list of records returned from an API. Under the\n * hood, the <code>DataList</code> component handles calling the API, storing the records, filters, etc, and\n * the <code>Items</code> component handles the presentation.\n */\nconst ItemList = useDataList((props: Props) => {\n useEffect(() => {\n const { page } = props;\n\n let { sortColumn = '', sortDirection = SORT_ASCENDING } = props;\n\n if (!sortColumn) {\n const defaultSort = _.first(props.sort);\n\n if (defaultSort) {\n sortColumn = defaultSort.value;\n\n if (defaultSort.direction) {\n sortDirection = defaultSort.direction;\n }\n }\n }\n\n props.onSort(sortColumn, sortDirection, page);\n }, []);\n\n /**\n * Sets the variable to true if every item in the passed collection is selected.\n */\n const allSelected = useMemo(() => props.isRowSelected && props.items && props.items.length && _.every(\n props.items,\n props.isRowSelected.bind(this)\n ), [props.items, props.isRowSelected]);\n\n /**\n * Selects all items in the collection. If all items are currently selected, deselects all items.\n *\n * @type {(function(): void)|*}\n */\n const onSelectAll = useCallback(() => {\n if (props.items && props.isRowSelected && props.onRowSelect) {\n let items;\n\n if (allSelected) {\n items = [...props.items];\n } else {\n items = _.reject(props.items, props.isRowSelected.bind(this));\n }\n\n _.each(items, props.onRowSelect.bind(this));\n }\n }, [allSelected, props.isRowSelected, props.items, props.onRowSelect]);\n\n return (\n <>\n <Dimmer\n active={props.loading}\n inverted\n >\n <Loader\n content={i18n.t('Common.messages.loading')}\n />\n </Dimmer>\n <Items\n {...props}\n buttons={[...(props.buttons || []), {\n accept: () => props.selectable,\n color: 'green',\n content: allSelected ? i18n.t('ItemList.buttons.deselectAll') : i18n.t('ItemList.buttons.selectAll'),\n icon: 'checkmark',\n onClick: onSelectAll.bind(this)\n }]}\n />\n </>\n );\n});\n\nItemList.defaultProps = {\n filters: {},\n searchable: true,\n};\n\nexport default ItemList;\n","// @flow\n\nimport React from 'react';\nimport LinkButton from './LinkButton';\nimport './LinkLabel.css';\n\ntype Props = {\n content: string,\n htmlFor: string,\n label: string,\n onClick: () => void\n};\n\nconst LinkLabel = (props: Props) => (\n <>\n <label\n className='link-label'\n htmlFor={props.htmlFor}\n >\n { props.label }\n </label>\n <LinkButton\n content={props.content}\n onClick={props.onClick.bind(this)}\n />\n </>\n);\n\nexport default LinkLabel;\n","// @flow\n\nimport { Keyboard } from '@performant-software/shared-components';\nimport React, { Component, type Node } from 'react';\nimport { Form, Segment, Transition } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport LinkLabel from './LinkLabel';\nimport './KeyboardField.css';\n\ntype Props = {\n autoFocus?: boolean,\n children: Node<any>,\n className?: string,\n error?: boolean,\n id?: string,\n label: string,\n layout: any,\n name: string,\n onChange: (e: ?Event, { value: string }) => void,\n required: boolean,\n value: string,\n visible: boolean\n};\n\ntype State = {\n showKeyboard: boolean\n};\n\nclass KeyboardField extends Component<Props, State> {\n static defaultProps: any;\n\n /**\n * Constructs a new KeyboardField component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n showKeyboard: false\n };\n }\n\n /**\n * Hides the keyboard when the parent component is no longer visible.\n *\n * @param prevProps\n */\n componentDidUpdate(prevProps: Props) {\n if (prevProps.visible && !this.props.visible) {\n this.setState({ showKeyboard: false });\n }\n }\n\n /**\n * Triggers the text input change.\n *\n * @param e\n * @param value\n */\n onInputChange(e: Event, value: any) {\n this.props.onChange(e, value);\n }\n\n /**\n * Triggers the keyboard input change.\n *\n * @param value\n */\n onKeyboardChange(value: any) {\n this.props.onChange(null, { value });\n }\n\n /**\n * Renders the KeyboardField component.\n *\n * @returns {*}\n */\n render() {\n return (\n <Form.Field\n className='keyboard-field'\n >\n <Form.Input\n autoFocus={this.props.autoFocus}\n className={this.props.className}\n error={this.props.error}\n id={this.props.id}\n input={{\n 'aria-label': this.props.name\n }}\n label={this.renderLabel()}\n name={this.props.name}\n onChange={this.onInputChange.bind(this)}\n required={this.props.required}\n value={this.props.value}\n >\n { this.props.children }\n </Form.Input>\n <Transition\n duration={{\n hide: 50,\n show: 500\n }}\n visible={this.state.showKeyboard}\n >\n <Segment>\n <Keyboard\n layout={this.props.layout}\n onChange={this.onKeyboardChange.bind(this)}\n value={this.props.value}\n keyboardClass={this.props.name}\n />\n </Segment>\n </Transition>\n </Form.Field>\n );\n }\n\n /**\n * Renders the input label.\n *\n * @returns {*}\n */\n renderLabel() {\n return (\n <LinkLabel\n content={this.state.showKeyboard\n ? i18n.t('KeyboardField.labels.hideKeyboard')\n : i18n.t('KeyboardField.labels.showKeyboard')}\n htmlFor={this.props.name}\n label={this.props.label}\n onClick={() => this.setState((state) => ({ showKeyboard: !state.showKeyboard }))}\n />\n );\n }\n}\n\nKeyboardField.defaultProps = {\n autoFocus: false,\n className: '',\n error: false,\n id: ''\n};\n\nexport default KeyboardField;\n","// @flow\n\nimport React, { useCallback, type ComponentType } from 'react';\nimport _ from 'underscore';\n\ntype Props = {\n items: Array<any>,\n onChange: (items: Array<any>) => void\n};\n\nconst withBatchEdit = (WrappedComponent: ComponentType<any>): any => (props: Props) => {\n /**\n * Adds a new item to the list.\n *\n * @type {(function(): void)|*}\n */\n const onAddItem = useCallback(() => {\n props.onChange([...props.items, {}]);\n }, [props.items]);\n\n /**\n * Removes the item at the passed index from the list.\n *\n * @type {(function(*): void)|*}\n */\n const onRemoveItem = useCallback((findIndex) => {\n props.onChange(_.reject(props.items, (item, index) => index === findIndex));\n }, [props.items]);\n\n /**\n * Updates the passed attribute of the item at the passed index.\n *\n * @type {(function(number, string, ?Event, {value: *}): void)|*}\n */\n const onUpdateItem = useCallback((findIndex: number, attribute: string, e: ?Event, { value }) => {\n props.onChange(_.map(props.items, (item, index) => (\n index !== findIndex ? item : ({ ...item, [attribute]: value })\n )));\n }, [props.items]);\n\n return (\n <WrappedComponent\n {...props}\n onAddItem={onAddItem}\n onRemoveItem={onRemoveItem}\n onUpdateItem={onUpdateItem}\n />\n );\n};\n\nexport default withBatchEdit;\n\nexport type BatchEditProps = {\n onAddItem: () => void,\n onRemoveItem: (index: number) => void,\n onUpdateItem: (index: number, attribute: string, e: Event, data: any) => void\n};\n","// @flow\n\nimport React, { type ComponentType } from 'react';\nimport { Button, Grid, Input } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport withBatchEdit, { type BatchEditProps } from '../hooks/BatchEdit';\n\ntype Item = {\n key: string,\n value: string\n};\n\ntype Props = BatchEditProps & {\n items: Array<Item>,\n onChange: (items: Array<Item>) => void\n};\n\nconst KeyValuePairs: ComponentType<any> = withBatchEdit((props: Props) => (\n <div>\n <Button\n basic\n content={i18n.t('Common.buttons.add')}\n icon='plus'\n onClick={props.onAddItem.bind(this)}\n type='button'\n />\n <Grid\n padded='vertically'\n >\n { _.map(props.items, (item, index) => (\n <Grid.Row\n columns={3}\n >\n <Grid.Column\n width={8}\n >\n <Input\n fluid\n onChange={props.onUpdateItem.bind(this, index, 'key')}\n placeholder={i18n.t('KeyValuePairs.labels.key')}\n value={item.key}\n />\n </Grid.Column>\n <Grid.Column\n width={7}\n >\n <Input\n fluid\n onChange={props.onUpdateItem.bind(this, index, 'value')}\n placeholder={i18n.t('KeyValuePairs.labels.value')}\n value={item.value}\n />\n </Grid.Column>\n <Grid.Column\n width={1}\n >\n <Button\n color='red'\n icon='trash'\n onClick={props.onRemoveItem.bind(this, index)}\n />\n </Grid.Column>\n </Grid.Row>\n ))}\n { _.isEmpty(props.items) && (\n <Grid.Row\n columns={1}\n >\n <Grid.Column>\n { i18n.t('Common.labels.noRecords') }\n </Grid.Column>\n </Grid.Row>\n )}\n </Grid>\n </div>\n));\n\nexport default KeyValuePairs;\n","// @flow\n\nimport React from 'react';\nimport { Image, Loader } from 'semantic-ui-react';\nimport './LazyLoader.css';\n\ntype Props = {\n active: boolean,\n size: string\n};\n\nconst LazyLoader = (props: Props) => (\n <Image\n className='lazy-loader'\n size={props.size}\n >\n <Loader\n active={props.active}\n />\n </Image>\n);\n\nLazyLoader.defaultProps = {\n active: false,\n size: 'small'\n};\n\nexport default LazyLoader;\n","// @flow\n\nimport React, { useState, type Node } from 'react';\nimport {\n Button,\n Dimmer,\n Icon,\n Image,\n Loader,\n Segment,\n Transition,\n Visibility\n} from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport AudioPlayer from './AudioPlayer';\nimport DownloadButton from './DownloadButton';\nimport LazyLoader from './LazyLoader';\nimport './LazyAudio.css';\n\ntype Props = {\n children?: Node,\n dimmable: boolean,\n download?: string,\n duration?: number,\n image?: any,\n name?: string,\n preview?: string,\n size?: string,\n src?: string\n};\n\nconst LazyAudio = (props: Props) => {\n const [dimmer, setDimmer] = useState(false);\n const [error, setError] = useState(false);\n const [loaded, setLoaded] = useState(!props.preview);\n const [modal, setModal] = useState(false);\n const [visible, setVisible] = useState(false);\n\n if (!visible) {\n return (\n <Visibility\n as='span'\n fireOnMount\n onTopVisible={() => setVisible(true)}\n >\n <Loader\n active\n inline='centered'\n size={props.size}\n />\n </Visibility>\n );\n }\n\n return (\n <>\n <Transition\n duration={props.duration}\n visible\n >\n <Dimmer.Dimmable\n as={Segment}\n className='lazy-audio'\n compact\n onBlur={() => setDimmer(false)}\n onMouseEnter={() => setDimmer(true)}\n onMouseLeave={() => setDimmer(false)}\n >\n { !loaded && (\n <LazyLoader\n active\n size={props.size}\n />\n )}\n { !error && props.preview && (\n <Image\n {...props.image}\n onError={() => {\n setError(true);\n setLoaded(true);\n }}\n onLoad={() => {\n setError(false);\n setLoaded(true);\n }}\n size={props.size}\n src={props.preview}\n />\n )}\n { (error || !props.preview) && (\n <Image\n {...props.image}\n className='placeholder-image'\n size={props.size}\n >\n <Icon\n name='file audio outline'\n size='big'\n />\n </Image>\n )}\n { (props.src || props.children) && props.dimmable && (\n <Dimmer\n active={dimmer}\n >\n <div\n className='buttons'\n >\n { props.src && (\n <Button\n content={i18n.t('LazyAudio.buttons.play')}\n icon='play circle outline'\n onClick={() => setModal(true)}\n primary\n />\n )}\n { props.download && (\n <DownloadButton\n color='green'\n filename={props.name}\n url={props.download}\n />\n )}\n { props.children }\n </div>\n </Dimmer>\n )}\n </Dimmer.Dimmable>\n </Transition>\n { props.src && (\n <AudioPlayer\n onClose={() => setModal(false)}\n open={modal}\n size='large'\n src={props.src}\n />\n )}\n </>\n );\n};\n\nLazyAudio.defaultProps = {\n dimmable: true,\n duration: 1000,\n preview: undefined,\n size: 'medium',\n src: undefined\n};\n\nexport default LazyAudio;\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-pdf\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-pdf/dist/esm/Page/AnnotationLayer.css\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-pdf/dist/esm/Page/TextLayer.css\");","// @flow\n\nimport React, { useCallback, useState, type Node } from 'react';\nimport { pdfjs, Document, Page } from 'react-pdf';\nimport {\n Dimmer,\n Icon,\n Image,\n Loader,\n Segment,\n Transition,\n Visibility\n} from 'semantic-ui-react';\nimport DownloadButton from './DownloadButton';\nimport LazyLoader from './LazyLoader';\n\nimport 'react-pdf/dist/esm/Page/AnnotationLayer.css';\nimport 'react-pdf/dist/esm/Page/TextLayer.css';\nimport './LazyDocument.css';\n\ntype Props = {\n children?: Node,\n dimmable?: boolean,\n download?: string,\n duration?: number,\n image?: any,\n pdf?: boolean,\n preview?: ?string,\n size?: string,\n src?: string\n};\n\npdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.js`;\n\nconst LazyDocument = (props: Props) => {\n const [dimmer, setDimmer] = useState(false);\n const [error, setError] = useState(false);\n const [loaded, setLoaded] = useState(!props.preview);\n const [visible, setVisible] = useState(false);\n\n /**\n * Returns the list of class names for the image component.\n *\n * @type {function(*=): []}\n */\n const getClassNames = useCallback((defaultClass = null) => {\n const classNames = [];\n\n if (defaultClass) {\n classNames.push(defaultClass);\n }\n\n if (!loaded) {\n classNames.push('hidden');\n }\n\n return classNames.join(' ');\n }, [loaded]);\n\n if (!visible) {\n return (\n <Visibility\n as='span'\n fireOnMount\n onTopVisible={() => setVisible(true)}\n >\n <Loader\n active\n inline='centered'\n size={props.size}\n />\n </Visibility>\n );\n }\n\n return (\n <>\n <Transition\n duration={props.duration}\n visible\n >\n <Dimmer.Dimmable\n as={Segment}\n className='lazy-document'\n compact\n onBlur={() => setDimmer(false)}\n onMouseEnter={() => setDimmer(true)}\n onMouseLeave={() => setDimmer(false)}\n >\n { !loaded && (\n <LazyLoader\n active\n size={props.size}\n />\n )}\n { !error && props.preview && (\n <Image\n {...props.image}\n className={getClassNames()}\n onError={() => {\n setError(true);\n setLoaded(true);\n }}\n onLoad={() => {\n setError(false);\n setLoaded(true);\n }}\n src={props.preview}\n size={props.size}\n />\n )}\n { !error && loaded && !props.preview && props.src && props.pdf && (\n <Image\n {...props.image}\n className={getClassNames()}\n size={props.size}\n >\n <Document\n file={props.src}\n onLoadError={(e) => console.log(e.message)}\n >\n <Page\n pageNumber={1}\n />\n </Document>\n </Image>\n )}\n { (error || (!props.preview && !(props.src && props.pdf))) && (\n <Image\n {...props.image}\n className={getClassNames('placeholder-image')}\n size={props.size}\n >\n <Icon\n name='file alternate outline'\n size='big'\n />\n </Image>\n )}\n { (props.download || props.src || props.children) && props.dimmable && (\n <Dimmer\n active={dimmer}\n >\n <div\n className='buttons'\n >\n { props.download && (\n <DownloadButton\n primary\n url={props.download || props.src}\n />\n )}\n { props.children }\n </div>\n </Dimmer>\n )}\n </Dimmer.Dimmable>\n </Transition>\n </>\n );\n};\n\nLazyDocument.defaultProps = {\n dimmable: true,\n duration: 1000,\n pdf: false,\n preview: undefined,\n size: 'medium',\n src: undefined\n};\n\nexport default LazyDocument;\n","// @flow\n\nimport React, { useState } from 'react';\nimport { Image, Message, Modal } from 'semantic-ui-react';\nimport ModalContext from '../context/ModalContext';\nimport './PhotoViewer.css';\nimport i18n from '../i18n/i18n';\n\ntype Props = {\n alt?: string,\n image: string,\n onClose: () => void,\n open: boolean,\n size?: string\n};\n\nconst PhotoViewer = (props: Props) => {\n const [error, setError] = useState(false);\n\n return (\n <ModalContext.Consumer>\n {(mountNode) => (\n <Modal\n centered={false}\n className='photo-viewer'\n closeIcon\n mountNode={mountNode}\n onClose={props.onClose.bind(this)}\n open={props.open}\n size={props.size}\n >\n <Modal.Content>\n { error && (\n <Message\n content={i18n.t('PhotoViewer.errors.path.content', { path: props.image })}\n header={i18n.t('PhotoViewer.errors.path.header')}\n icon='exclamation circle'\n />\n )}\n { !error && (\n <Image\n alt={props.alt}\n fluid\n onError={() => setError(true)}\n src={props.image}\n />\n )}\n </Modal.Content>\n </Modal>\n )}\n </ModalContext.Consumer>\n );\n};\n\nPhotoViewer.defaultProps = {\n size: 'small'\n};\n\nexport default PhotoViewer;\n","// @flow\n\nimport React, { useCallback, useState, type Node } from 'react';\nimport {\n Button,\n Dimmer,\n Icon,\n Image,\n Loader,\n Segment,\n Transition,\n Visibility\n} from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport DownloadButton from './DownloadButton';\nimport LazyLoader from './LazyLoader';\nimport PhotoViewer from './PhotoViewer';\nimport './LazyImage.css';\n\ntype Props = {\n children?: Node,\n dimmable: boolean,\n download?: string,\n duration?: number,\n image?: any,\n name?: string,\n preview?: string,\n size?: string,\n src?: string\n};\n\nconst LazyImage = (props: Props) => {\n const [dimmer, setDimmer] = useState(false);\n const [error, setError] = useState(false);\n const [loaded, setLoaded] = useState(!(props.src || props.preview));\n const [modal, setModal] = useState(false);\n const [visible, setVisible] = useState(false);\n\n /**\n * Returns the list of class names for the image component.\n *\n * @type {function(*=): []}\n */\n const getClassNames = useCallback((defaultClass = null) => {\n const classNames = [];\n\n if (defaultClass) {\n classNames.push(defaultClass);\n }\n\n if (!loaded) {\n classNames.push('hidden');\n }\n\n return classNames.join(' ');\n }, [loaded]);\n\n if (!visible) {\n return (\n <Visibility\n as='span'\n fireOnMount\n onTopVisible={() => setVisible(true)}\n >\n <Loader\n active\n inline='centered'\n size={props.size}\n />\n </Visibility>\n );\n }\n\n return (\n <>\n <Transition\n duration={props.duration}\n visible\n >\n <Dimmer.Dimmable\n as={Segment}\n className='lazy-image'\n compact\n onBlur={() => setDimmer(false)}\n onMouseEnter={() => setDimmer(true)}\n onMouseLeave={() => setDimmer(false)}\n >\n { !loaded && (\n <LazyLoader\n active\n size={props.size}\n />\n )}\n { !error && (props.preview || props.src) && (\n <Image\n {...props.image}\n className={getClassNames()}\n onError={() => {\n setError(true);\n setLoaded(true);\n }}\n onLoad={() => {\n setError(false);\n setLoaded(true);\n }}\n size={props.size}\n src={props.preview || props.src}\n />\n )}\n { (error || !(props.preview || props.src)) && (\n <Image\n {...props.image}\n className={getClassNames('placeholder-image')}\n size={props.size}\n >\n <Icon\n name='image'\n size='big'\n />\n </Image>\n )}\n { (props.src || props.children) && props.dimmable && (\n <Dimmer\n active={dimmer}\n >\n <div\n className='buttons'\n >\n { props.src && (\n <Button\n content={i18n.t('LazyImage.buttons.view')}\n icon='photo'\n onClick={() => setModal(true)}\n primary\n />\n )}\n { props.download && (\n <DownloadButton\n color='green'\n filename={props.name}\n url={props.download}\n />\n )}\n { props.children }\n </div>\n </Dimmer>\n )}\n </Dimmer.Dimmable>\n </Transition>\n { props.src && (\n <PhotoViewer\n image={props.src}\n onClose={() => setModal(false)}\n open={modal}\n size='large'\n />\n )}\n </>\n );\n};\n\nLazyImage.defaultProps = {\n dimmable: true,\n duration: 1000,\n size: 'medium'\n};\n\nexport default LazyImage;\n","// @flow\n\nimport React, {\n useEffect,\n useRef,\n useState,\n type Element\n} from 'react';\nimport {\n Embed,\n Message,\n Modal,\n Ref\n} from 'semantic-ui-react';\nimport ModalContext from '../context/ModalContext';\nimport './VideoPlayer.css';\nimport i18n from '../i18n/i18n';\n\ntype Props = {\n autoPlay?: boolean,\n embedded?: boolean,\n icon?: string | Element<any>,\n onClose: () => void,\n open: boolean,\n placeholder?: ?string,\n placeholderAlt?: string,\n size?: string,\n video: string\n};\n\nconst VideoPlayer = (props: Props) => {\n const [error, setError] = useState(false);\n\n const embedRef = useRef();\n\n /**\n * Work-around to set the \"alt\" attribute on the placeholder <img> element if provided.\n */\n useEffect(() => {\n if (embedRef && embedRef.current && props.placeholderAlt) {\n const placeholder = embedRef.current.querySelector('.placeholder');\n\n if (placeholder) {\n placeholder.setAttribute('alt', props.placeholderAlt);\n }\n }\n }, [embedRef, props.placeholderAlt]);\n\n return (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n centered={false}\n className='video-player'\n closeIcon\n mountNode={mountNode}\n onClose={props.onClose.bind(this)}\n open={props.open}\n size={props.size}\n >\n <Modal.Content>\n { error && (\n <Message\n content={i18n.t('VideoPlayer.errors.path.content', { path: props.video })}\n header={i18n.t('VideoPlayer.errors.path.header')}\n icon='exclamation circle'\n />\n )}\n { props.embedded && (\n <Ref\n innerRef={embedRef}\n >\n <Embed\n active={props.autoPlay}\n icon={props.icon}\n iframe={props.autoPlay ? { allow: 'autoplay' } : undefined}\n placeholder={props.placeholder}\n url={`${props.video}${props.autoPlay ? '?autoplay=true' : ''}`}\n />\n </Ref>\n )}\n { !props.embedded && (\n <video\n autoPlay={props.autoPlay}\n controls\n onError={() => setError(true)}\n src={props.video}\n />\n )}\n </Modal.Content>\n </Modal>\n )}\n </ModalContext.Consumer>\n );\n};\n\nVideoPlayer.defaultProps = {\n autoPlay: false,\n embedded: false,\n icon: 'right circle arrow',\n size: 'small'\n};\n\nexport default VideoPlayer;\n","// @flow\n\nimport React, {\n useCallback,\n useState,\n type Element,\n type Node\n} from 'react';\nimport {\n Button,\n Dimmer,\n Icon,\n Image,\n Loader,\n Segment,\n Transition,\n Visibility\n} from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport DownloadButton from './DownloadButton';\nimport LazyLoader from './LazyLoader';\nimport VideoPlayer from './VideoPlayer';\nimport './LazyVideo.css';\n\ntype Props = {\n autoPlay?: boolean,\n children?: Node,\n dimmable: boolean,\n download?: string,\n duration?: number,\n embedded?: boolean,\n icon?: string | Element<any>,\n image?: any,\n name?: string,\n preview?: ?string,\n size?: string,\n src?: string\n};\n\nconst LazyVideo = (props: Props) => {\n const [dimmer, setDimmer] = useState(false);\n const [error, setError] = useState(false);\n const [loaded, setLoaded] = useState(!(props.preview || props.src));\n const [modal, setModal] = useState(false);\n const [visible, setVisible] = useState(false);\n\n /**\n * Returns the list of class names for the image component.\n *\n * @type {function(*=): []}\n */\n const getClassNames = useCallback((defaultClass = null) => {\n const classNames = [];\n\n if (defaultClass) {\n classNames.push(defaultClass);\n }\n\n if (!loaded) {\n classNames.push('hidden');\n }\n\n return classNames.join(' ');\n }, [loaded]);\n\n if (!visible) {\n return (\n <Visibility\n as='span'\n fireOnMount\n onTopVisible={() => setVisible(true)}\n >\n <Loader\n active\n inline='centered'\n size={props.size}\n />\n </Visibility>\n );\n }\n\n return (\n <>\n <Transition\n duration={props.duration}\n visible\n >\n <Dimmer.Dimmable\n as={Segment}\n className='lazy-video'\n compact\n onBlur={() => setDimmer(false)}\n onMouseEnter={() => setDimmer(true)}\n onMouseLeave={() => setDimmer(false)}\n >\n { !loaded && (\n <LazyLoader\n active\n size={props.size}\n />\n )}\n { !error && props.preview && (\n <Image\n {...props.image}\n className={getClassNames()}\n onError={() => {\n setError(true);\n setLoaded(true);\n }}\n onLoad={() => {\n setError(false);\n setLoaded(true);\n }}\n src={props.preview}\n size={props.size}\n />\n )}\n { !error && !props.preview && props.src && (\n <Image\n {...props.image}\n className={getClassNames()}\n size={props.size}\n >\n <video\n onError={() => {\n setError(true);\n setLoaded(true);\n }}\n onLoadedData={() => {\n setError(false);\n setLoaded(true);\n }}\n src={props.src}\n />\n </Image>\n )}\n { (error || (!props.preview && !props.src)) && (\n <Image\n {...props.image}\n className={getClassNames('placeholder-image')}\n size={props.size}\n >\n <Icon\n name='image'\n size='big'\n />\n </Image>\n )}\n { (props.src || props.children) && props.dimmable && (\n <Dimmer\n active={dimmer}\n >\n <div\n className='buttons'\n >\n { props.src && (\n <Button\n content={i18n.t('LazyVideo.buttons.play')}\n icon='video'\n onClick={() => setModal(true)}\n primary\n />\n )}\n { props.download && (\n <DownloadButton\n color='green'\n filename={props.name}\n url={props.download}\n />\n )}\n { props.children }\n </div>\n </Dimmer>\n )}\n </Dimmer.Dimmable>\n </Transition>\n { props.src && (\n <VideoPlayer\n autoPlay={props.autoPlay}\n embedded={props.embedded}\n icon={props.icon}\n onClose={() => setModal(false)}\n open={modal}\n placeholder={props.preview}\n size='large'\n video={props.src}\n />\n )}\n </>\n );\n};\n\nLazyVideo.defaultProps = {\n autoPlay: false,\n dimmable: true,\n duration: 1000,\n embedded: false,\n icon: 'right circle arrow',\n size: 'medium'\n};\n\nexport default LazyVideo;\n","// @flow\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type ComponentType,\n type Node\n} from 'react';\nimport { Icon } from 'semantic-ui-react';\nimport { Trans } from 'react-i18next';\nimport _ from 'underscore';\nimport FileInputButton from './FileInputButton';\nimport i18n from '../i18n/i18n';\nimport LazyAudio from './LazyAudio';\nimport LazyDocument from './LazyDocument';\nimport LazyImage from './LazyImage';\nimport LazyVideo from './LazyVideo';\n\ntype Props = {\n children?: Node,\n contentType: string,\n dimmable?: boolean,\n downloadUrl?: string,\n name?: string,\n onUpload: (file: File) => void,\n preview?: string,\n size?: string,\n src?: string\n};\n\nconst ContentTypes = {\n audio: 'audio',\n image: 'image',\n pdf: 'application/pdf',\n video: 'video'\n};\n\nconst WebContentTypes = [\n 'image/png',\n 'image/jpeg',\n 'image/gif',\n 'image/webp',\n 'image/bmp',\n 'video/m4v',\n 'video/mp4'\n];\n\nconst LazyMedia: ComponentType<any> = (props: Props) => {\n const [contentType, setContentType] = useState(props.contentType || '');\n const [name, setName] = useState(props.name);\n const [preview, setPreview] = useState(props.preview);\n const [source, setSource] = useState(props.src);\n\n /**\n * Sets the file extension based on the name.\n *\n * @type {*}\n */\n const fileExtension = useMemo(() => {\n let value;\n\n if (name) {\n value = name.split('.').pop();\n value = value && value.toUpperCase();\n }\n\n return value;\n }, [name]);\n\n /**\n * Sets the content type, name, preview, and source attributes. Also calls the onUpload prop.\n *\n * @type {(function(*): void)|*}\n */\n const onUpload = useCallback((files) => {\n const file = _.first(files);\n\n setContentType(file.type);\n setName(file.name);\n setPreview(null);\n\n if (_.contains(WebContentTypes, file.type)\n || file.type.startsWith(ContentTypes.audio)\n || file.type === ContentTypes.pdf) {\n setSource(URL.createObjectURL(file));\n } else {\n setSource(null);\n }\n\n props.onUpload(file);\n }, [props.onUpload]);\n\n /**\n * Renders the child buttons.\n *\n * @type {unknown}\n */\n const renderChildren = useCallback(() => (\n <>\n { props.onUpload && (\n <FileInputButton\n color='orange'\n content={i18n.t('Common.buttons.upload')}\n icon='cloud upload'\n onSelection={onUpload}\n />\n )}\n { props.children }\n </>\n ));\n\n /**\n * Renders the media component.\n *\n * @type {(function(): *)|*}\n */\n const renderMedia = useCallback(() => {\n if (contentType.startsWith(ContentTypes.image)) {\n return (\n <LazyImage\n dimmable={props.dimmable}\n download={props.downloadUrl}\n preview={preview}\n src={source}\n size={props.size}\n >\n { renderChildren() }\n </LazyImage>\n );\n }\n\n if (contentType.startsWith(ContentTypes.video)) {\n return (\n <LazyVideo\n dimmable={props.dimmable}\n download={props.downloadUrl}\n preview={preview}\n src={source}\n size={props.size}\n >\n { renderChildren() }\n </LazyVideo>\n );\n }\n\n if (contentType.startsWith(ContentTypes.audio)) {\n return (\n <LazyAudio\n dimmable={props.dimmable}\n download={props.downloadUrl}\n preview={preview}\n src={source}\n size={props.size}\n >\n { renderChildren() }\n </LazyAudio>\n );\n }\n\n return (\n <LazyDocument\n dimmable={props.dimmable}\n download={props.downloadUrl}\n pdf={contentType === ContentTypes.pdf}\n preview={preview}\n src={source}\n size={props.size}\n >\n { renderChildren() }\n </LazyDocument>\n );\n }, [contentType, preview, source, props.dimmable, props.downloadUrl, props.size]);\n\n /**\n * Renders the upload message.\n *\n * @type {(function(): (null|*))|*}\n */\n const renderMessage = useCallback(() => {\n if (!fileExtension) {\n return null;\n }\n\n return (\n <div>\n <Icon\n name='info circle'\n />\n <span>\n <Trans\n components={{ bold: <strong /> }}\n default='Your <bold>{{type}}</bold> has been received'\n i18n={i18n}\n i18nKey='LazyMedia.messages.uploaded'\n values={{\n type: fileExtension\n }}\n />\n </span>\n </div>\n );\n }, [fileExtension]);\n\n /**\n * Sets the content type, name, preview, and source.\n */\n useEffect(() => {\n if (props.contentType) {\n setContentType(props.contentType);\n }\n\n if (props.name) {\n setName(props.name);\n }\n\n if (props.preview) {\n setPreview(props.preview);\n }\n\n if (props.src) {\n setSource(props.src);\n } else {\n setSource(null);\n }\n }, [props.contentType, props.name, props.preview, props.src]);\n\n return (\n <div\n className='lazy-media'\n >\n { renderMedia() }\n { renderMessage() }\n </div>\n );\n};\n\nLazyMedia.defaultProps = {\n dimmable: true,\n size: 'medium'\n};\n\nexport default LazyMedia;\n","// @flow\n\nimport React, { useState, type Node } from 'react';\nimport { Button } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport IIIFModal from './IIIFModal';\nimport LazyMedia from './LazyMedia';\n\ntype Props = {\n children?: Node,\n color?: string,\n content?: string,\n manifest?: string,\n options?: any\n};\n\nconst LazyIIIF = ({ manifest, options = {}, ...props }: Props) => {\n const [modal, setModal] = useState(false);\n\n return (\n <>\n <LazyMedia\n {...props}\n >\n { manifest && (\n <Button\n color={props.color}\n content={props.content || i18n.t('Common.buttons.iiif')}\n icon='images outline'\n onClick={() => setModal(true)}\n />\n )}\n { props.children }\n </LazyMedia>\n { modal && (\n <IIIFModal\n manifestId={manifest}\n onClose={() => setModal(false)}\n options={_.defaults(options, { showIIIFBadge: false })}\n />\n )}\n </>\n );\n};\n\nexport default LazyIIIF;\n","// @flow\n\nimport React from 'react';\nimport { Dimmer, Loader, Segment } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport './ListLoader.css';\n\ntype Props = {\n active: boolean\n};\n\nconst ListLoader = (props: Props) => (\n <Dimmer.Dimmable\n as={Segment}\n className='listLoader'\n dimmed={props.active}\n style={{\n opacity: props.active ? '0.8' : '0'\n }}\n >\n <Dimmer\n active={props.active}\n inverted\n >\n <Loader\n content={i18n.t('Common.messages.loading')}\n />\n </Dimmer>\n </Dimmer.Dimmable>\n);\n\nexport default ListLoader;\n","// @flow\n\nimport React, { type Element } from 'react';\nimport {\n Button,\n Form,\n Grid,\n Header,\n Icon,\n Input,\n Message,\n Modal\n} from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport ModalContext from '../context/ModalContext';\nimport './LoginModal.css';\n\ntype Props = {\n disabled: boolean,\n loginFailed: boolean,\n onClose: () => void,\n onLogin: () => void,\n onPasswordChange: () => void,\n onUsernameChange: () => void,\n open: boolean,\n trigger?: () => Element<any>,\n placeholder: string\n};\n\nconst LoginModal = (props: Props) => (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n as={Form}\n className='login-modal'\n error={props.loginFailed}\n mountNode={mountNode}\n open={props.open}\n size='small'\n trigger={props.trigger}\n >\n <Header\n icon='user circle'\n content={i18n.t('LoginModal.header')}\n />\n <Message\n error\n header={i18n.t('LoginModal.loginErrorHeader')}\n content={i18n.t('LoginModal.loginErrorContent')}\n />\n <Grid\n padded='vertically'\n textAlign='center'\n >\n <Grid.Column>\n <Grid.Row>\n <Input\n autoFocus\n className='form-field'\n icon={<Icon name='at' />}\n onChange={props.onUsernameChange.bind(this)}\n placeholder={props.placeholder}\n size='huge'\n />\n </Grid.Row>\n <Grid.Row\n className='row'\n >\n <Input\n className='form-field'\n icon={<Icon name='lock' />}\n onChange={props.onPasswordChange.bind(this)}\n placeholder={i18n.t('LoginModal.password')}\n size='huge'\n type='password'\n />\n </Grid.Row>\n </Grid.Column>\n </Grid>\n <Modal.Actions>\n <Button\n disabled={props.disabled}\n onClick={props.onLogin.bind(this)}\n primary\n size='large'\n type='submit'\n >\n { i18n.t('LoginModal.buttonLogin') }\n </Button>\n { props.onClose && (\n <Button\n basic\n onClick={props.onClose.bind(this)}\n size='large'\n >\n { i18n.t('LoginModal.buttonCancel') }\n </Button>\n )}\n </Modal.Actions>\n </Modal>\n )}\n </ModalContext.Consumer>\n);\n\nLoginModal.defaultProps = {\n placeholder: i18n.t('LoginModal.email')\n};\n\nexport default LoginModal;\n","// @flow\n\nimport React, {\n useEffect,\n useState,\n type Element,\n type Node\n} from 'react';\nimport {\n Dimmer,\n Header,\n Image,\n Loader,\n Pagination,\n Segment,\n Transition\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport './MasonryGrid.css';\n\ntype Item = {\n alt: string,\n extra?: Element<any> | string,\n id: number,\n image: string,\n subtitle?: string,\n title?: string,\n};\n\ntype LayoutProps = {\n children: Array<Node>,\n columns: number,\n gap: number\n};\n\nconst MasonryLayout = (props: LayoutProps) => {\n const columnWrapper = {};\n const result = [];\n\n // create columns\n for (let i = 0; i < props.columns; i += 1) {\n columnWrapper[`column${i}`] = [];\n }\n\n // divide children into columns\n for (let i = 0; i < props.children.length; i += 1) {\n const columnIndex = i % props.columns;\n columnWrapper[`column${columnIndex}`].push(\n <div\n className='itemContainer'\n key={i}\n style={{\n marginBottom: `${props.gap}px`\n }}\n >\n { props.children[i] }\n </div>\n );\n }\n\n // wrap children in each column with a div\n for (let i = 0; i < props.columns; i += 1) {\n result.push(\n <div\n className='column'\n key={i}\n style={{\n marginLeft: `${i > 0 ? props.gap : 0}px`\n }}\n >\n { columnWrapper[`column${i}`] }\n </div>\n );\n }\n\n return (\n <div\n className='masonryGrid'\n >\n { result }\n </div>\n );\n};\n\ntype TileProps = {\n item: Item,\n onClick?: (item: any) => void,\n renderContent?: (item: Item) => Node\n};\n\nconst HEIGHT_OFFSET = 350;\nconst MIN_HEIGHT = 175;\n\nconst MasonryTile = (props: TileProps) => {\n const [dimmerActive, setDimmerActive] = useState(false);\n const [height, setHeight] = useState(0);\n\n /**\n * Calculate the height of the tile once the component mounts.\n */\n useEffect(() => {\n setHeight(MIN_HEIGHT + Math.ceil(Math.random() * HEIGHT_OFFSET));\n }, []);\n\n return (\n <Dimmer.Dimmable\n className='item'\n dimmed={dimmerActive}\n onClick={() => props.onClick && props.onClick(props.item)}\n onMouseEnter={() => setDimmerActive(true)}\n onMouseLeave={() => setDimmerActive(false)}\n style={{\n cursor: props.onClick ? 'pointer' : undefined,\n height: `${height}px`\n }}\n >\n <Transition\n duration={800}\n visible={dimmerActive}\n >\n <Dimmer.Inner\n active={dimmerActive}\n >\n <Header\n content={props.item.title}\n inverted\n subheader={props.item.subtitle}\n />\n { props.item.extra && (\n <div\n className='extraContainer'\n >\n { props.item.extra }\n </div>\n )}\n </Dimmer.Inner>\n </Transition>\n <Image\n alt={props.item.alt}\n className='image'\n src={props.item.image}\n />\n { props.renderContent && props.renderContent(props.item) }\n </Dimmer.Dimmable>\n );\n};\n\ntype Props = {\n columns: number,\n gap: number,\n items: Array<Item>,\n loading?: boolean,\n onClick?: (item: any) => void,\n onPageChange?: (page: number) => void,\n page: number,\n pages: number,\n renderContent?: (item: Item) => Node,\n renderEmpty?: () => Node\n};\n\nconst MasonryGrid = (props: Props) => (\n <div\n className='masonry-grid'\n >\n <Loader\n active={props.loading}\n />\n <div>\n <MasonryLayout\n columns={props.columns}\n gap={props.gap}\n >\n { _.map(props.items, (item, index) => (\n <MasonryTile\n key={index}\n item={item}\n onClick={props.onClick}\n renderContent={props.renderContent}\n />\n ))}\n </MasonryLayout>\n { props.pages > 1 && props.onPageChange && (\n <Segment\n basic\n textAlign='center'\n >\n <Pagination\n activePage={props.page}\n firstItem={null}\n lastItem={null}\n onPageChange={(e, { activePage }) => props.onPageChange && props.onPageChange(activePage)}\n totalPages={props.pages}\n size='small'\n />\n </Segment>\n )}\n </div>\n { !props.loading && !(props.items && props.items.length) && props.renderEmpty && props.renderEmpty() }\n </div>\n);\n\nexport default MasonryGrid;\n","// @flow\n\nimport React from 'react';\nimport { Button } from 'semantic-ui-react';\nimport './PlayButton.css';\n\ntype Props = {\n onClick?: () => void,\n size?: string,\n style?: any\n};\n\nconst PlayButton = (props: Props) => (\n <Button\n className='play-button'\n color='black'\n icon='play'\n onClick={(e) => {\n if (props.onClick) {\n e.stopPropagation();\n\n // $FlowFixMe - Not really an issue since we're checking for props.onClick above.\n props.onClick();\n }\n }}\n size={props.size}\n style={props.style}\n />\n);\n\nPlayButton.defaultProps = {\n onClick: undefined,\n size: 'massive',\n style: undefined\n};\n\nexport default PlayButton;\n","// @flow\n\nimport React from 'react';\nimport PlayButton from './PlayButton';\nimport './VideoPlayerButton.css';\n\nconst VideoPlayerButton = () => (\n <div\n className='icon video-player-button'\n >\n <div>\n <PlayButton />\n </div>\n </div>\n);\n\nexport default VideoPlayerButton;\n","// @flow\n\nimport React, { useState, type Element } from 'react';\nimport {\n Button,\n Dimmer, Image,\n Loader,\n Transition\n} from 'semantic-ui-react';\nimport PlayButton from './PlayButton';\nimport VideoPlayer from './VideoPlayer';\nimport VideoPlayerButton from './VideoPlayerButton';\nimport './MediaGallery.css';\n\ntype Item = {\n image?: string,\n embedded?: boolean,\n preview?: string,\n src?: string,\n type: 'image' | 'video'\n};\n\ntype Props = {\n item: Item,\n label?: string,\n loading?: boolean,\n onClose?: () => void,\n onNext?: () => void,\n onPrevious?: () => void,\n renderContent?: () => Element<any>,\n visible: boolean\n};\n\nconst MediaGallery = (props: Props) => {\n const [video, setVideo] = useState(false);\n\n return (\n <Dimmer\n active={props.visible}\n className='media-gallery mediaGallery'\n page\n >\n { props.loading && (\n <Loader\n active\n size='big'\n />\n )}\n { props.item && (\n <>\n <Transition\n animation='fade'\n mountOnShow={false}\n >\n <div\n className='imageContainer'\n >\n <Image\n src={props.item.image}\n style={{\n objectFit: 'contain'\n }}\n />\n { props.item.type === 'video' && (\n <PlayButton\n onClick={() => setVideo(true)}\n style={{\n position: 'absolute',\n top: '50%'\n }}\n />\n )}\n </div>\n </Transition>\n { props.renderContent && props.renderContent() }\n { props.onClose && (\n <div\n className='controls top right'\n >\n <Button\n basic\n circular\n icon='times'\n inverted\n onClick={props.onClose}\n size='large'\n />\n </div>\n )}\n { props.label && (\n <div\n className='controls top left'\n >\n <Button\n basic\n content={props.label}\n inverted\n size='large'\n />\n </div>\n )}\n { props.onPrevious && (\n <div\n className='controls middle left'\n >\n <Button\n basic\n disabled={!props.onPrevious}\n inverted\n icon='angle left'\n onClick={props.onPrevious}\n size='huge'\n />\n </div>\n )}\n { props.onNext && (\n <div\n className='controls middle right'\n >\n <Button\n basic\n disabled={!props.onNext}\n inverted\n icon='angle right'\n onClick={props.onNext}\n size='huge'\n />\n </div>\n )}\n { props.item.src && (\n <VideoPlayer\n autoPlay\n embedded={props.item.embedded}\n icon={<VideoPlayerButton />}\n onClose={() => setVideo(false)}\n open={video}\n placeholder={props.item.preview}\n size='huge'\n video={props.item.src}\n />\n )}\n </>\n )}\n </Dimmer>\n );\n};\n\nexport default MediaGallery;\n","// @flow\n\nimport React, { useEffect, useState } from 'react';\nimport { Image, Loader } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport './MediaGrid.css';\n\ntype Item = {\n image: string\n};\n\ntype Props = {\n items: Array<Item>,\n loading?: boolean,\n onClick?: (item: Item) => void\n};\n\nconst MAX_IMAGES = 5;\n\nconst MediaGrid = (props: Props) => {\n const [items, setItems] = useState([]);\n\n /**\n * Grab the list of image URLs to display and save it on the sate.\n */\n useEffect(() => {\n const list = [];\n\n for (let i = 0; i < props.items.length && list.length < MAX_IMAGES; i += 1) {\n if (!_.isEmpty(props.items[i].image)) {\n list.push(props.items[i]);\n }\n }\n\n setItems(list);\n }, [props.items]);\n\n // Return null if no items are passed\n if (_.isEmpty(props.items)) {\n return null;\n }\n\n return (\n <div\n className='mediaGrid'\n >\n <Loader\n active={props.loading}\n />\n <div\n className={`grid${items.length}`}\n >\n { _.map(items, (item, index) => (\n <div\n className='mediaImage'\n key={index}\n >\n <Image\n onClick={() => props.onClick && props.onClick(item)}\n src={item.image}\n style={{\n cursor: props.onClick ? 'pointer' : undefined,\n objectFit: 'cover',\n width: '100%'\n }}\n />\n </div>\n ))}\n </div>\n </div>\n );\n};\n\nexport default MediaGrid;\n","// @flow\n\nimport React, { type Element } from 'react';\nimport { InfiniteScroll } from '@performant-software/shared-components';\nimport { Card, Image } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport ListLoader from './ListLoader';\nimport PlayButton from './PlayButton';\nimport './MediaList.css';\n\ntype Item = {\n ...any,\n image: string,\n type: 'image' | 'video'\n};\n\ntype Props = {\n items: Array<Item>,\n loading?: boolean,\n onBottomReached: () => void,\n onClick: (item: any, index: number) => void,\n renderDescription?: (item: Item) => Element<any>,\n renderExtra?: (item: Item) => Element<any>,\n renderHeader?: (item: Item) => Element<any>,\n renderMeta?: (item: Item) => Element<any>,\n textAlign?: 'left' | 'center' | 'right'\n};\n\nconst MediaList = (props: Props) => (\n <InfiniteScroll\n offset={100}\n onBottomReached={props.onBottomReached}\n >\n <ListLoader\n active={props.loading || false}\n />\n <Card.Group\n doubling\n stackable\n >\n { _.map(props.items, (item, i) => (\n <Card\n onClick={props.onClick.bind(this, item, i)}\n >\n <Image\n alt={item.alt}\n src={item.image}\n style={{\n objectFit: 'cover'\n }}\n />\n { item.type === 'video' && (\n <div\n style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)'\n }}\n >\n <PlayButton />\n </div>\n )}\n { (props.renderMeta || props.renderHeader || props.renderDescription) && (\n <Card.Content>\n { props.renderHeader && (\n <Card.Header\n content={props.renderHeader(item)}\n textAlign={props.textAlign}\n />\n )}\n { props.renderMeta && (\n <Card.Meta\n content={props.renderMeta(item)}\n textAlign={props.textAlign}\n />\n )}\n { props.renderDescription && (\n <Card.Description\n content={props.renderDescription(item)}\n textAlign={props.textAlign}\n />\n )}\n </Card.Content>\n )}\n { props.renderExtra && (\n <Card.Content\n content={props.renderExtra(item)}\n extra\n textAlign={props.textAlign}\n />\n )}\n </Card>\n ))}\n </Card.Group>\n </InfiniteScroll>\n);\n\nexport default MediaList;\n","// @flow\n\nimport React, { Component } from 'react';\nimport { withTranslation } from 'react-i18next';\nimport { Button, Dropdown } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport './ModalDropdown.css';\n\ntype Props = {\n onClear: () => void,\n renderModal: ({ onClose: () => void, open: boolean }) => void,\n searchQuery: ?string\n};\n\ntype State = {\n modalVisible: boolean\n};\n\nclass ModalDropdown extends Component<Props, State> {\n /**\n * Constructs a new ModalDropdown component.\n *\n * @param props\n */\n constructor(props) {\n super(props);\n\n this.state = {\n modalVisible: false\n };\n }\n\n /**\n * Closes the modal.\n */\n onClose() {\n this.setState({ modalVisible: false });\n }\n\n /**\n * Renders the ModalDropdown component.\n *\n * @returns {*}\n */\n render() {\n return (\n <>\n <Dropdown\n className='modal-dropdown'\n onClick={() => this.setState({ modalVisible: true })}\n onSearchChange={() => {}}\n open={false}\n search\n searchInput={{\n 'aria-label': 'Search'\n }}\n selection\n searchQuery={this.props.searchQuery || ''}\n />\n <Button.Group>\n <Button\n basic\n content={i18n.t('Common.buttons.clear')}\n icon='times'\n onClick={this.props.onClear.bind(this)}\n type='button'\n />\n </Button.Group>\n { this.renderModal() }\n </>\n );\n }\n\n /**\n * Renders the modal.\n *\n * @returns {*}\n */\n renderModal() {\n return this.props.renderModal({\n onClose: this.onClose.bind(this),\n open: this.state.modalVisible\n });\n }\n}\n\nexport default withTranslation()(ModalDropdown);\n","// @flow\n\nimport { Timer } from '@performant-software/shared-components';\nimport React, { Component, createRef } from 'react';\nimport { Dropdown, DropdownSearchInput, Icon } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport './RemoteDropdown.css';\n\ntype Option = {\n key: string,\n value: string,\n text: any\n};\n\ntype ApiResponse = {\n data: {\n items: Array<any>,\n list: {\n pages: number\n }\n }\n};\n\ntype Props = {\n allowAdditions?: boolean,\n className?: string,\n collectionName: string,\n fluid?: boolean,\n multiple?: boolean,\n onAddItem?: (value: string) => Promise<any>,\n onLoad: ({ search: string, page: number}) => Promise<ApiResponse>,\n onSelection: (value: string) => void,\n placeholder?: string,\n renderOption: (item: any) => Option,\n value: string\n};\n\ntype State = {\n loading: boolean,\n options: Array<Option>,\n page: number,\n pages: number,\n search: string\n};\n\nclass RemoteDropdown extends Component<Props, State> {\n static defaultProps: any;\n dropdown: DropdownSearchInput;\n\n /**\n * Constructs a new RemoteDropdown component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n loading: false,\n options: [],\n page: 1,\n pages: 1,\n search: ''\n };\n\n this.dropdown = createRef();\n }\n\n /**\n * Resets the component.\n */\n componentDidMount() {\n this.onReset();\n }\n\n /**\n * Resets the state and executes the search.\n *\n * @param prevProps\n */\n componentDidUpdate(prevProps: Props) {\n if (this.props.value !== prevProps.value) {\n this.setState({\n page: 1,\n pages: 1,\n search: ''\n }, this.onSearch.bind(this));\n }\n }\n\n /**\n * Returns the dropdown class name(s).\n *\n * @returns {string}\n */\n getClassNames() {\n const classNames = ['remote-dropdown'];\n if (this.props.className) {\n classNames.push(this.props.className);\n }\n\n return classNames.join(' ');\n }\n\n /**\n * Returns the dropdown value as an array.\n *\n * @returns {[]}\n */\n getValues() {\n let values = [];\n const { value } = this.props;\n\n if (value && value.length) {\n values = Array.isArray(value) ? value : [value];\n }\n\n return values;\n }\n\n /**\n * Returns the passed value as a dropdown option.\n *\n * @param value\n *\n * @returns {{text: *, value: *, key: *}}\n */\n getOption(value: string) {\n return {\n key: value,\n text: value,\n value\n };\n }\n\n /**\n * Returns the complete list of dropdown options. If applicable, the \"Add\" and \"Load more\" options are added to the\n * end of the list.\n *\n * @returns {*[]}\n */\n getOptions() {\n const options = [...this.state.options];\n\n /*\n * Add the current dropdown value to the list. Since the value doesn't render unless it exists in the list of\n * options, we'll need to add the value to the list of options if it exists of another page.\n */\n _.each(this.getValues(), (value) => {\n if (!_.findWhere(options, { value })) {\n options.push(this.getOption(value));\n }\n });\n\n /*\n * Add the \"Add\" option if the dropdown allows additions and the search query does not already exist in the list\n * of options.\n */\n const { search } = this.state;\n\n if (this.props.allowAdditions && search && !_.findWhere(options, { text: search })) {\n options.push({\n key: 'add',\n value: 'add',\n text: this.renderAddOption(),\n onClick: this.onAddItem.bind(this)\n });\n }\n\n /*\n * Add the \"Load more\" option if the dropdown is paginated and contains more pages.\n */\n if (this.state.page < this.state.pages) {\n options.push({\n key: 'more',\n value: 'more',\n text: this.renderLoadMoreOption(),\n onClick: () => this.setState((state) => ({ page: state.page + 1 }), this.onSearch.bind(this))\n });\n }\n\n return options;\n }\n\n /**\n * Returns the list of options to display for the search. This list will include the options that match the search\n * criteria with the current value(s) excluded.\n *\n * @returns {*}\n */\n getSearchOptions() {\n return _.filter(this.getOptions(), (option) => !this.getValues().includes(option.value));\n }\n\n /**\n * Adds the current search query as a new dropdown option.\n *\n * @param e\n *\n * @returns {*|Q.Promise<any>|Promise<R>|Promise<any>|void}\n */\n onAddItem(e: Event) {\n return this.props.onAddItem && this.props\n .onAddItem(this.state.search)\n .then(() => {\n // Resolve the new value. If multiple are allowed, append the new value to the existing list.\n let value = this.state.search;\n if (this.props.multiple) {\n value = [\n ...this.props.value,\n this.state.search\n ];\n }\n\n // Set the new value\n this.onOptionSelection(e, { value });\n\n // Close the dropdown (single select only)\n if (!this.props.multiple) {\n this.dropdown.current.close();\n }\n });\n }\n\n /**\n * Selects the passed value.\n *\n * @param e\n * @param value\n */\n onOptionSelection(e: Event, { value }: any) {\n this.props.onSelection(value);\n }\n\n /**\n * Resets the dropdown state.\n */\n onReset() {\n this.setState({\n options: _.map(this.getValues(), this.getOption.bind(this)),\n page: 1,\n pages: 1,\n search: ''\n });\n }\n\n /**\n * Executes the search and sets the rendered options on the state.\n */\n onSearch() {\n const { page, search } = this.state;\n\n this.setState({\n loading: true\n }, () => {\n this.props\n .onLoad({ page, search })\n .then(({ data }) => {\n const options = _.map(data[this.props.collectionName], this.props.renderOption.bind(this));\n const { pages } = data.list;\n\n this.setState((state) => ({\n loading: false,\n options: [\n ...page > 1 ? (state.options || []) : [],\n ...options\n ],\n page,\n pages\n }));\n });\n });\n }\n\n /**\n * Sets the search on the state and re-sets the page counts.\n *\n * @param e\n * @param searchQuery\n */\n onSearchChange(e: Event, { searchQuery }: any) {\n this.setState({\n page: 1,\n pages: 1,\n search: searchQuery\n });\n }\n\n /**\n * Renders the RemoteDropdown component.\n *\n * @returns {*}\n */\n render() {\n return (\n <Dropdown\n className={this.getClassNames()}\n clearable\n fluid={this.props.fluid}\n loading={this.state.loading}\n multiple={this.props.multiple}\n onBlur={this.onReset.bind(this)}\n onClose={this.onReset.bind(this)}\n onChange={this.onOptionSelection.bind(this)}\n onOpen={this.onSearch.bind(this)}\n onSearchChange={this.onSearchChange.bind(this)}\n options={this.getOptions()}\n placeholder={this.props.placeholder}\n ref={this.dropdown}\n scrolling\n search={() => this.getSearchOptions()}\n searchInput={{\n 'aria-label': 'Search',\n className: 'remote-dropdown-search-input',\n onKeyDown: Timer.clearSearchTimer.bind(this),\n onKeyUp: Timer.setSearchTimer.bind(this, this.onSearch.bind(this))\n }}\n searchQuery={this.state.search}\n selectOnBlur={false}\n selection\n value={this.props.value}\n />\n );\n }\n\n /**\n * Renders the \"Add\" dropdown option.\n *\n * @returns {*}\n */\n renderAddOption() {\n return (\n <div\n className='extra-option'\n >\n <Icon name='plus circle' />\n {`${i18n.t('RemoteDropdown.labels.add')} ${this.state.search}`}\n </div>\n );\n }\n\n /**\n * Renders the \"Load more\" dropdown option.\n *\n * @returns {*}\n */\n renderLoadMoreOption() {\n return (\n <div\n className='extra-option'\n >\n <Icon name='refresh' />\n { i18n.t('RemoteDropdown.labels.loadMore') }\n </div>\n );\n }\n}\n\nRemoteDropdown.defaultProps = {\n allowAdditions: false,\n className: '',\n fluid: false,\n multiple: false,\n onAddItem: undefined,\n placeholder: null\n};\n\nexport default RemoteDropdown;\n","// @flow\n\nimport { Timer } from '@performant-software/shared-components';\nimport React, { useCallback, useRef, useState } from 'react';\nimport { Icon, Input, type InputProps } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport { type SearchBoxProps } from '../types/InstantSearch';\n\ntype Props = InputProps & SearchBoxProps;\n\n/**\n * This component is used with the `useSearchBox` function from Instant Search Hooks and renders an input element that\n * when changed will execute a new query.\n */\nconst SearchBox = ({ useSearchBox, ...props }: Props) => {\n const {\n query,\n refine,\n clear,\n isSearchStalled\n } = useSearchBox(props);\n\n const [search, setSearch] = useState(query);\n const ref = useRef();\n\n /**\n * Clears the current search state.\n *\n * @type {(function(): void)|*}\n */\n const onClear = useCallback(() => {\n // Reset the query view\n setSearch('');\n\n // Clear the results\n clear();\n\n // Refocus the input element\n const { current: instance } = ref;\n if (instance) {\n instance.focus();\n }\n }, [clear]);\n\n /**\n * Calls the refine prop when the search changes.\n *\n * @type {function(): void}\n */\n const onSearch = useCallback(() => refine(search), [refine, search]);\n\n return (\n <Input\n {...props}\n aria-label='Search'\n icon={(\n <Icon\n link={!_.isEmpty(query)}\n name={_.isEmpty(query) ? 'search' : 'times'}\n onClick={onClear}\n />\n )}\n input={{\n 'aria-label': 'search'\n }}\n loading={isSearchStalled}\n onChange={(e, { value }) => setSearch(value)}\n onKeyDown={() => Timer.clearSearchTimer()}\n onKeyUp={() => Timer.setSearchTimer(onSearch)}\n ref={ref}\n type='text'\n value={search}\n />\n );\n};\n\nexport default SearchBox;\n","// @flow\n\nimport React, { useCallback, useEffect } from 'react';\nimport { Pagination } from 'semantic-ui-react';\nimport { type PaginationProps } from '../types/InstantSearch';\n\ntype Props = PaginationProps & {\n /**\n * If `true`, we'll scroll to the top of the page after applying the new page value.\n */\n scrollToTop?: boolean\n};\n\n/**\n * This component is used with the `usePagination` hook from Instant Search Hooks and renders a list of page numbers\n * that can be selected by the user. If the `scrollToTop` prop is set to `true`, the window will scroll to the top\n * after applying a new value.\n */\nconst SearchPagination = ({ usePagination, ...props }: Props) => {\n const { currentRefinement, nbPages: pages, refine } = usePagination(props);\n const onPageChange = useCallback((e, { activePage }) => refine(activePage - 1), [refine]);\n\n /**\n * Scroll to the top of the page when the current page changes.\n */\n useEffect(() => {\n if (props.scrollToTop) {\n window.scroll({ top: 0, behavior: 'smooth' });\n }\n }, [currentRefinement, props.scrollToTop]);\n\n /**\n * Return null if there are no pages.\n */\n if (pages === 0) {\n return null;\n }\n\n return (\n <Pagination\n activePage={currentRefinement + 1}\n onPageChange={onPageChange}\n totalPages={pages}\n />\n );\n};\n\nSearchPagination.defaultProps = {\n scrollToTop: false\n};\n\nexport default SearchPagination;\n","// @flow\n\nimport React, { type Element, type Node } from 'react';\nimport ItemCollection from './ItemCollection';\nimport { type HitsProps } from '../types/InstantSearch';\n\ntype Props = HitsProps & {\n /**\n * Renders the component as the passed `as` prop.\n */\n as?: Element<any>,\n\n /**\n * Additional props to pass to the container component.\n */\n asProps?: any,\n\n /**\n * If `true` each item will be rendered as a Link.\n */\n link?: boolean,\n\n /**\n * Renders the description for the passed item.\n */\n renderDescription?: (item: any) => Node,\n\n /**\n * Component to render if the list contains no records.\n */\n renderEmptyList?: () => Node,\n\n /**\n * Renders the extra content for the passed item.\n */\n renderExtra?: (item: any) => Node,\n\n /**\n * Renders the header for the passed item.\n */\n renderHeader?: (item: any) => Node,\n\n /**\n * Renders the image for the passed item.\n */\n renderImage?: (item: any) => Node,\n\n /**\n * Renders the meta for the passed item.\n */\n renderMeta?: (item: any) => Node\n};\n\n/**\n * This component is used with the `useHits` hook from Instant Search Hooks and renders a pass-through to the\n * `ItemCollection` component.\n */\nconst SearchResults = ({ useHits, ...props }: Props) => {\n const { hits } = useHits(props);\n\n const {\n as,\n asProps,\n link,\n renderDescription,\n renderEmptyList,\n renderExtra,\n renderHeader,\n renderImage,\n renderMeta\n } = props;\n\n return (\n <ItemCollection\n as={as}\n asProps={asProps}\n hideToggle\n items={hits}\n link={link}\n renderDescription={renderDescription}\n renderEmptyList={renderEmptyList}\n renderExtra={renderExtra}\n renderHeader={renderHeader}\n renderImage={renderImage}\n renderMeta={renderMeta}\n />\n );\n};\n\nSearchResults.defaultProps = {\n as: undefined,\n asProps: undefined,\n link: undefined,\n renderDescription: undefined,\n renderEmptyList: undefined,\n renderExtra: undefined,\n renderHeader: undefined,\n renderImage: undefined,\n renderMeta: undefined\n};\n\nexport default SearchResults;\n","// @flow\n\nimport React from 'react';\nimport _ from 'underscore';\nimport DropdownButton from './DropdownButton';\nimport i18n from '../i18n/i18n';\nimport { type HitsPerPageProps } from '../types/InstantSearch';\n\ntype Props = HitsPerPageProps & {\n /**\n * An array of numeric values to present to the user as the number of records to display per page.\n */\n options: Array<number>\n};\n\n/**\n * This component is used with the `useHitsPerPage` hook from Instant Search Hooks and renders a dropdown with\n * options for the number of records to display per page.\n */\nconst SearchResultsPerPage = ({ useHitsPerPage, options }: Props) => {\n const { items, refine } = useHitsPerPage({\n items: _.map(options, (option, index) => ({\n label: option,\n value: option,\n default: index === 0\n }))\n });\n\n const { value } = _.findWhere(items, { isRefined: true });\n\n return (\n <DropdownButton\n basic\n icon='list'\n onChange={(e, data) => refine(data.value)}\n options={_.map(items, (item) => ({\n key: item.value,\n value: item.value,\n text: item.label\n }))}\n text={i18n.t('SearchResultsPerPage.labels.show', { value })}\n value={value}\n />\n );\n};\n\nexport default SearchResultsPerPage;\n","// @flow\n\nimport React, { useMemo } from 'react';\nimport _ from 'underscore';\nimport DropdownButton from './DropdownButton';\nimport type { SortByProps } from '../types/InstantSearch';\n\nconst ICON_SORT_ASCENDING = 'sort alphabet up';\nconst ICON_SORT_DESCENDING = 'sort alphabet down';\nconst SORT_DIRECTION_DESCENDING = 'desc';\n\ntype Props = SortByProps & {\n /**\n * A list of label/value objects to use as the dropdown options.\n */\n items: Array<{ label: string, value: string }>\n};\n\nconst SearchResultsSort = ({ useSortBy, ...props }: Props) => {\n const { currentRefinement, options, refine } = useSortBy(props);\n const { label, value } = _.findWhere(options, { value: currentRefinement }) || _.first(options);\n\n /**\n * Sets the icon variable based on the current sort value.\n *\n * @type {string}\n */\n const icon = useMemo(() => (\n value && value.endsWith(SORT_DIRECTION_DESCENDING)\n ? ICON_SORT_DESCENDING\n : ICON_SORT_ASCENDING\n ), [value]);\n\n return (\n <DropdownButton\n basic\n icon={icon}\n onChange={(e, data) => refine(data.value)}\n options={_.map(options, (option) => ({\n key: option.value,\n value: option.value,\n text: option.description || option.label,\n }))}\n text={label}\n value={value}\n />\n );\n};\n\nexport default SearchResultsSort;\n","// @flow\n\nimport React from 'react';\nimport i18n from '../i18n/i18n';\nimport type { StatsProps } from '../types/InstantSearch';\n\nconst MsToS = 1000.0;\nconst DECIMAL_PLACES = 2;\n\n/**\n * This component is used with the `useStats` hook from Instant Search Hooks and renders a label of the number of\n * records returned and the time it took to execute the request.\n */\nconst SearchStats = ({ useStats, ...props }: StatsProps) => {\n const { nbHits: count, processingTimeMS } = useStats(props);\n const seconds = (processingTimeMS / MsToS).toFixed(DECIMAL_PLACES);\n\n return (\n <div>\n { i18n.t('SearchStats.labels.results', { count, seconds }) }\n </div>\n );\n};\n\nexport default SearchStats;\n","// @flow\n\nimport React, { type Node } from 'react';\nimport { Divider, Header } from 'semantic-ui-react';\n\ntype Props = {\n children: Node,\n divided?: boolean,\n header?: string,\n visible?: boolean\n}\n\nconst Section = (props: Props) => {\n if (!props.visible) {\n return null;\n }\n\n return (\n <div\n className='section'\n >\n { props.header && (\n <Header\n content={props.header}\n />\n )}\n { props.children }\n <Divider\n hidden={!props.divided}\n />\n </div>\n );\n};\n\nSection.defaultProps = {\n divided: true,\n header: undefined,\n visible: true\n};\n\nexport default Section;\n","// @flow\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type ComponentType,\n type Element\n} from 'react';\nimport {\n Button,\n Form,\n Grid,\n Icon,\n Message,\n Modal,\n Table\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport SelectizeHeader from './SelectizeHeader';\nimport i18n from '../i18n/i18n';\nimport ModalContext from '../context/ModalContext';\nimport useDataList from './DataList';\nimport useList, { type Props as ListProps } from './List';\nimport './Selectize.css';\n\ntype Props = {\n centered?: boolean,\n collectionName: string,\n filters?: {\n component: ComponentType<any>,\n defaults: any,\n props: any,\n onChange?: (filter: any) => Promise<any>\n },\n modal?: {\n onSave: (item: any) => Promise<any>\n },\n multiple?: boolean | number,\n onClose: () => void,\n onLoad: (params: any) => Promise<any>,\n onSave: (items: any) => void,\n selectedItems: Array<any>,\n title: string\n};\n\ntype GridProps = ListProps & {\n isSelected: (item: any) => boolean,\n onInit: () => void,\n onItemSelection: (item: any) => void,\n onSelect: (item: any) => void,\n renderHeader?: (params: any) => Element<any>,\n renderItem?: (item: any) => Element<any>,\n renderItems?: ({\n isSelected: (item: any) => boolean,\n items: any,\n onSelect: () => void\n }) => Element<any>,\n selectedItem: any,\n selectedItems: Array<any>\n};\n\nconst SelectizeGrid = useDataList(useList((props: GridProps) => {\n useEffect(() => {\n if (props.onInit) {\n props.onInit();\n }\n }, []);\n\n /**\n * Renders a checkmark of the passed item is selected.\n *\n * @type {(function(*): (null|*))|*}\n */\n const renderCheckmark = useCallback((item: any) => {\n if (!props.isSelected(item)) {\n return null;\n }\n\n return (\n <Icon\n color='green'\n name='check'\n />\n );\n }, [props.selectedItems]);\n\n /**\n * Renders the selectize header component.\n *\n * @returns {JSX.Element|*}\n */\n const renderHeader = () => {\n if (props.renderHeader) {\n return props.renderHeader({\n onItemClick: props.onItemSelection.bind(this),\n selectedItem: props.selectedItem,\n selectedItems: props.selectedItems,\n });\n }\n\n return (\n <SelectizeHeader\n isSelected={(item) => props.selectedItem === item}\n items={props.selectedItems}\n onItemClick={props.onItemSelection.bind(this)}\n renderItem={props.renderItem.bind(this)}\n />\n );\n };\n\n /**\n * Renders the list of items as a table.\n *\n * @type {(function(): (null|*))|*}\n */\n const renderItems = useCallback(() => {\n if (_.isEmpty(props.items)) {\n return null;\n }\n\n if (props.renderItems) {\n return props.renderItems({\n isSelected: props.isSelected,\n items: props.items,\n onSelect: props.onSelect\n });\n }\n\n return (\n <Table\n basic\n padded\n selectable\n >\n <Table.Body>\n { _.map(props.items, (item, index) => (\n <Table.Row\n key={index}\n onClick={props.onSelect.bind(this, item)}\n >\n <Table.Cell>{ props.renderItem(item) }</Table.Cell>\n <Table.Cell>\n { renderCheckmark(item) }\n </Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n );\n }, [renderCheckmark, props.items, props.onSelect, props.renderItem]);\n\n /**\n * Renders the empty list component.\n *\n * @type {(function(): (null|*))|*}\n */\n const renderEmpty = useCallback(() => {\n if ((props.items && props.items.length) || props.loading) {\n return null;\n }\n\n return (\n <Grid\n className='empty'\n padded='vertically'\n >\n <Grid.Column\n textAlign='center'\n >\n <Grid.Row>\n <Icon\n name='search'\n size='huge'\n />\n </Grid.Row>\n <Grid.Row>\n { i18n.t('Selectize.messages.noRecords') }\n </Grid.Row>\n </Grid.Column>\n </Grid>\n );\n }, [props.items, props.loading]);\n\n return (\n <Grid>\n <Grid.Column\n textAlign='center'\n >\n { renderHeader() }\n { renderItems() }\n { renderEmpty() }\n </Grid.Column>\n </Grid>\n );\n}));\n\nconst Selectize = (props: Props) => {\n const [error, setError] = useState(false);\n const [selectedItem, setSelectedItem] = useState();\n const [selectedItems, setSelectedItems] = useState(props.selectedItems || []);\n\n /**\n * Sets the allowMultiple prop to \"true\" if the multiple prop is a boolean or non-zero integer.\n *\n * @type {boolean}\n */\n const allowMultiple = useMemo(() => !!props.multiple, [props.multiple]);\n\n /**\n * Sets the allowed number of items that can be selected. If the multiple prop is a boolean, this will be\n * and unlimited amount.\n *\n * @type {boolean|number}\n */\n const allowedCount = useMemo(() => (\n _.isNumber(props.multiple) ? props.multiple : Number.MAX_SAFE_INTEGER\n ), [props.multiple]);\n\n /**\n * Returns true if the passed item is selected.\n *\n * @type {function(*): boolean}\n */\n const isSelected = useCallback((item) => !!_.findWhere(selectedItems, { id: item.id }, [selectedItems]));\n\n /**\n * If the passed item is selected, deselect the item. If we're not allowing multiple select, replace the selected\n * items with the passed item. Otherwise, append the passed item to the list of selected items.\n *\n * If the user has already selected the maximum number allowed, display an error message.\n *\n * @type {(function(*=): void)|*}\n */\n const onSelect = useCallback((item) => {\n if (isSelected(item)) {\n setSelectedItems((prevItems) => _.filter(prevItems, (i) => i.id !== item.id));\n } else if (!allowMultiple) {\n setSelectedItems([item]);\n } else if (selectedItems.length >= allowedCount) {\n setError(true);\n } else {\n setSelectedItems((prevItems) => [\n ...prevItems,\n item\n ]);\n }\n }, [isSelected, props.multiple]);\n\n /**\n * Selects or deselects the single passed item.\n *\n * @type {(function(*=): void)|*}\n */\n const onItemSelection = useCallback((item) => {\n if (selectedItem === item) {\n setSelectedItem(null);\n onSelect(item);\n } else {\n setSelectedItem(item);\n }\n }, [selectedItem, onSelect]);\n\n /**\n * Returns the promise from the modal onSave prop, if provided. Otherwise returns a resolved promise.\n *\n * @type {(function(*=): (*))|*}\n */\n const onSave = useCallback((item) => {\n if (props.modal && props.modal.onSave) {\n return props.modal.onSave(item).then((saved) => onSelect(saved));\n }\n\n return Promise.resolve();\n }, [onSelect, props.modal]);\n\n return (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n as={Form}\n centered={props.centered}\n className='selectize'\n mountNode={mountNode}\n noValidate\n open\n size='small'\n >\n <Modal.Header\n content={props.title}\n />\n <Modal.Content>\n <Message\n content={i18n.t('Selectize.messages.maxSelected.content')}\n error\n header={i18n.t('Selectize.messages.maxSelected.header')}\n onDismiss={() => setError(false)}\n visible={error}\n />\n <SelectizeGrid\n {...props}\n actions={[]}\n isSelected={isSelected}\n onDelete={() => Promise.resolve()}\n onDeleteAll={() => Promise.resolve()}\n onItemSelection={onItemSelection}\n onSave={onSave}\n onSelect={onSelect}\n selectedItem={selectedItem}\n selectedItems={selectedItems}\n />\n </Modal.Content>\n <Modal.Actions>\n <Button\n onClick={props.onSave.bind(this, selectedItems)}\n primary\n size='medium'\n type='submit'\n >\n { i18n.t('Common.buttons.save') }\n </Button>\n <Button\n basic\n onClick={props.onClose.bind(this)}\n size='medium'\n type='button'\n >\n { i18n.t('Common.buttons.cancel') }\n </Button>\n </Modal.Actions>\n </Modal>\n )}\n </ModalContext.Consumer>\n );\n};\n\nSelectize.defaultProps = {\n centered: false,\n modal: undefined,\n multiple: true,\n searchable: true,\n selectedItems: []\n};\n\nexport default Selectize;\n","// @flow\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type Element\n} from 'react';\nimport {\n Button,\n Card,\n Header,\n Icon,\n Image,\n Segment,\n Transition\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport './SelectizeImageHeader.css';\n\ntype Props = {\n collapsable?: boolean,\n onItemClick: (item: any) => void,\n perPage?: number,\n renderDescription?: (item: any) => Element<any> | string,\n renderExtra?: (item: any) => Element<any> | string,\n renderHeader?: (item: any) => Element<any> | string,\n renderImage?: (item: any) => Element<any> | string,\n renderMeta?: (item: any) => Element<any> | string,\n selectedItem: any,\n selectedItems: Array<any>\n};\n\ntype CardProps = {\n onClick: () => void,\n onDelete: () => void,\n description?: Element<any> | string,\n extra?: Element<any> | string,\n header?: Element<any> | string,\n image?: Element<any> | string,\n meta?: Element<any> | string,\n selected: boolean\n};\n\nconst DEFAULT_PER_PAGE = 5;\n\nconst SelectizeCard = (props: CardProps) => (\n <Card\n raised={props.selected}\n link\n onClick={props.onClick}\n >\n { props.image && _.isString(props.image) && (\n <Image\n size='small'\n src={props.image}\n />\n )}\n { !!props.image && !_.isString(props.image) && props.image }\n { !props.image && (\n <Segment\n placeholder\n >\n <Icon\n name='image'\n size='large'\n />\n </Segment>\n )}\n <Card.Content>\n { props.header && (\n <Card.Header>\n <Header\n as='h6'\n content={props.header}\n />\n </Card.Header>\n )}\n { props.meta && (\n <Card.Meta\n content={props.meta}\n />\n )}\n { props.description && (\n <Card.Description\n content={props.description}\n />\n )}\n </Card.Content>\n { props.extra && (\n <Card.Content\n extra\n >\n { props.extra }\n </Card.Content>\n )}\n { props.selected && (\n <Card.Content\n extra\n >\n <Button\n basic\n circular\n compact\n icon='times'\n onClick={props.onDelete}\n />\n </Card.Content>\n )}\n </Card>\n);\n\nSelectizeCard.defaultProps = {\n header: undefined,\n image: undefined,\n meta: undefined,\n renderExtra: undefined\n};\n\nconst SelectizeImageHeader = (props: Props) => {\n const [page, setPage] = useState(1);\n const [pages, setPages] = useState(0);\n const [collapsed, setCollapsed] = useState(false);\n\n /**\n * Sets the items for the current page.\n *\n * @type {null}\n */\n const items = useMemo(() => {\n let records = null;\n\n if (page && props.selectedItems && props.selectedItems.length) {\n const startIndex = (page - 1) * (props.perPage || DEFAULT_PER_PAGE);\n const endIndex = startIndex + (props.perPage || DEFAULT_PER_PAGE);\n\n records = props.selectedItems.slice(startIndex, endIndex);\n }\n\n return records;\n }, [page, props.perPage, props.selectedItems]);\n\n /**\n * Sets the pagination label.\n *\n * @type {string}\n */\n const pagination = useMemo(() => {\n const startIndex = (page - 1) * (props.perPage || DEFAULT_PER_PAGE);\n const endIndex = startIndex + (props.perPage || DEFAULT_PER_PAGE);\n const total = props.selectedItems.length;\n\n return `${startIndex + 1} - ${Math.min(endIndex, total)} of ${total}`;\n }, [page, props.perPage, props.selectedItems]);\n\n /**\n * Changes the current page number. If the next page is invalid, we move to the first page or last page.\n *\n * @type {(function(*): void)|*}\n */\n const onPageChange = useCallback((increment) => {\n let nextPage = page + increment;\n\n if (nextPage < 1) {\n nextPage = pages;\n } else if (nextPage > pages) {\n nextPage = 1;\n }\n\n setPage(nextPage);\n }, [page, pages]);\n\n /**\n * Set the number of pages when the perPage or selectedItems props change.\n */\n useEffect(() => {\n if (props.perPage && props.selectedItems) {\n setPages(Math.ceil(props.selectedItems.length / props.perPage));\n }\n }, [props.perPage, props.selectedItems]);\n\n /**\n * If we're removing the last item on the page, decrement the page by 1.\n */\n useEffect(() => {\n if (!(items && items.length) && props.selectedItems && props.selectedItems.length && page > 1) {\n setPage(page - 1);\n }\n }, [items, page, props.selectedItems]);\n\n if (_.isEmpty(items)) {\n return null;\n }\n\n return (\n <Segment\n className='selectize-image-header'\n >\n <Transition\n visible={!collapsed}\n >\n <div>\n <div\n className='container'\n >\n <Button\n basic\n circular\n disabled={pages <= 1}\n icon='arrow left'\n onClick={onPageChange.bind(this, -1)}\n />\n <Card.Group\n itemsPerRow={props.perPage}\n >\n { _.map(items, (item) => (\n <SelectizeCard\n description={props.renderDescription && props.renderDescription(item)}\n extra={props.renderExtra && props.renderExtra(item)}\n header={props.renderHeader && props.renderHeader(item)}\n image={props.renderImage && props.renderImage(item)}\n meta={props.renderMeta && props.renderMeta(item)}\n key={item.id}\n onClick={() => (\n props.selectedItem === item\n ? props.onItemClick(null)\n : props.onItemClick(item)\n )}\n onDelete={() => props.onItemClick(item)}\n selected={item === props.selectedItem}\n />\n ))}\n </Card.Group>\n <Button\n basic\n circular\n disabled={pages <= 1}\n icon='arrow right'\n onClick={onPageChange.bind(this, 1)}\n />\n </div>\n </div>\n </Transition>\n <div\n className='bottom-container'\n >\n <div />\n <div>{ pagination }</div>\n <div>\n { props.collapsable && (\n <Button\n as='a'\n basic\n circular\n className='link'\n compact\n content={collapsed ? i18n.t('Common.buttons.show') : i18n.t('Common.buttons.hide')}\n onClick={() => setCollapsed((prevCollapsed) => !prevCollapsed)}\n />\n )}\n </div>\n </div>\n </Segment>\n );\n};\n\nSelectizeImageHeader.defaultProps = {\n collapsable: true,\n onItemClick: () => {},\n perPage: DEFAULT_PER_PAGE,\n renderExtra: undefined\n};\n\nexport default SelectizeImageHeader;\n","// @flow\n\nimport { Element } from '@performant-software/shared-components';\nimport type { EditContainerProps } from '@performant-software/shared-components/types';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState\n} from 'react';\nimport {\n Button,\n Form,\n Grid,\n Menu,\n MenuProps,\n Message,\n Ref,\n Sticky\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport Toaster from './Toaster';\nimport './SimpleEditPage.css';\n\ntype Props = EditContainerProps & {\n /**\n * Additional class attribute to apply to the root DOM element.\n */\n className?: string,\n\n /**\n * Sets the default visible tab. If no value is provided, the first tab will be visible.\n */\n defaultTab?: string,\n\n /**\n * If `false`, the save button will be hidden.\n */\n editable?: boolean,\n\n /**\n * Props to provide to the Semantic UI `Menu` component.\n */\n menuProps?: typeof MenuProps,\n\n /**\n * Callback fired when the \"Cancel\" button is clicked.\n */\n onCancel: () => void,\n\n /**\n * Callback fired when a tab is clicked.\n *\n * @param tab\n */\n onTabClick?: (tab: string) => void,\n\n /**\n * If `true`, the saved toaster will display when the component is mounted.\n */\n saved?: boolean,\n\n /**\n * If `true`, the tabs menu will \"stick\" to the top of the window.\n */\n stickyMenu?: boolean\n};\n\n/**\n * This component can be used to render the layout for a form/page with edit capabilities. Use in conjunction with the\n * `withEditPage` higher-order component for a fully fledged record editing environment.\n */\nconst SimpleEditPage: any = (props: Props) => {\n const [currentTab, setCurrentTab] = useState();\n const [saved, setSaved] = useState(false);\n\n const contentRef = useRef();\n\n // $FlowIgnore\n const tabs = Element.findByType(props.children, SimpleEditPage.Tab);\n const tab = useMemo(() => _.find(tabs, (nextTab) => nextTab.key === currentTab), [currentTab, tabs]);\n\n /**\n * Memo-izes the class name variable.\n *\n * @type {string}\n */\n const className = useMemo(() => {\n const classNames = ['simple-edit-page'];\n\n if (props.className) {\n classNames.push(props.className);\n }\n\n return classNames.join(' ');\n }, [props.className]);\n\n /**\n * Sets the current tab.\n *\n * @type {(function(*): void)|*}\n */\n const onTabClick = useCallback((item) => {\n const { key } = item;\n setCurrentTab(key);\n\n if (props.onTabClick) {\n props.onTabClick(key);\n }\n }, [props.onTabClick]);\n\n /**\n * Renders the tab menu component.\n *\n * @type {(function(): (*))|*}\n */\n const renderTabs = useCallback(() => {\n const menu = (\n <Menu\n {...props.menuProps}\n >\n { tabs?.length > 1 && _.map(tabs, (item) => (\n <Menu.Item\n active={item.key === currentTab}\n disabled={props.loading || props.saving}\n key={item.key}\n name={item.props.name}\n onClick={() => onTabClick(item)}\n />\n ))}\n <Menu.Menu\n position='right'\n >\n <Menu.Item\n className='button-container'\n >\n { props.editable && (\n <Button\n content={i18n.t('Common.buttons.save')}\n disabled={props.loading || props.saving}\n onClick={props.onSave}\n primary\n />\n )}\n <Button\n basic\n content={i18n.t('Common.buttons.cancel')}\n disabled={props.loading || props.saving}\n onClick={props.onCancel}\n />\n </Menu.Item>\n </Menu.Menu>\n </Menu>\n );\n\n if (props.stickyMenu) {\n return (\n <Sticky\n context={contentRef}\n offset={20}\n >\n { menu }\n </Sticky>\n );\n }\n\n return menu;\n });\n\n useEffect(() => {\n // Sets the default tab to the first tab in the list, or the tab on the URL state\n let defaultTab;\n\n if (props.defaultTab) {\n defaultTab = { key: props.defaultTab };\n } else {\n defaultTab = _.first(tabs);\n }\n\n if (defaultTab) {\n onTabClick(defaultTab);\n }\n\n // Sets the saved indicator based on the URL state\n if (props.saved) {\n setSaved(true);\n }\n }, []);\n\n return (\n <Grid\n className={className}\n >\n <Grid.Row>\n <Grid.Column>\n { renderTabs() }\n </Grid.Column>\n </Grid.Row>\n <Grid.Row>\n <Grid.Column>\n <Ref\n innerRef={contentRef}\n >\n <div>\n <Form\n error={!_.isEmpty(props.errors)}\n loading={props.loading || props.saving}\n noValidate\n >\n <Message\n error\n header={i18n.t('Common.errors.save')}\n list={props.errors}\n />\n { tab && tab.props.children }\n </Form>\n { saved && (\n <Toaster\n onDismiss={() => setSaved(false)}\n type={Toaster.MessageTypes.positive}\n >\n <Message.Header\n content={i18n.t('Common.messages.save.header')}\n />\n <Message.Content\n content={i18n.t('Common.messages.save.content')}\n />\n </Toaster>\n )}\n </div>\n </Ref>\n </Grid.Column>\n </Grid.Row>\n </Grid>\n );\n};\n\nSimpleEditPage.defaultProps = {\n editable: true,\n menuProps: {\n pointing: true,\n secondary: true\n }\n};\n\nconst Tab = (props: any) => props.children;\nTab.displayName = 'Tab';\n\n// $FlowIgnore\nconst SimpleEditPageStatic = Object.assign(SimpleEditPage, { Tab });\n\nexport default SimpleEditPageStatic;\n","// @flow\n\nimport { Element } from '@performant-software/shared-components';\nimport React, { Component, type Node } from 'react';\nimport { Header, Menu, Modal } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport ModalContext from '../context/ModalContext';\nimport './TabbedModal.css';\n\ntype Props = {\n children: Node,\n className?: string,\n header: string,\n inlineTabs?: boolean,\n renderHeader?: () => Node\n};\n\ntype State = {\n tab: any\n};\n\nclass TabbedModal extends Component<Props, State> {\n static defaultProps: any;\n static Tab: any;\n\n /**\n * Constructs a new TabbedModal component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n tab: null\n };\n }\n\n /**\n * Parses the child components and sets the actions and tabs list on the state. The current tab is set to the first\n * child in the list of tabs.\n */\n componentDidMount() {\n const tab = _.first(Element.findByType(this.props.children, TabbedModal.Tab));\n this.setState({ tab: tab.props.name });\n }\n\n /**\n * Returns the header classes.\n *\n * @returns {string}\n */\n getHeaderClasses() {\n const classes = ['modal-header'];\n\n if (this.props.inlineTabs) {\n classes.push('inline-header');\n }\n\n return classes.join(' ');\n }\n\n /**\n * Returns the modal classes.\n *\n * @returns {string}\n */\n getModalClasses() {\n const classes = ['tabbed-modal'];\n\n if (this.props.className) {\n classes.push(this.props.className);\n }\n\n return classes.join(' ');\n }\n\n /**\n * Renders the TabbedModal component.\n *\n * @returns {*}\n */\n render() {\n const tabs = Element.findByType(this.props.children, TabbedModal.Tab);\n const tab = _.find(tabs, (t) => t.props.name === this.state.tab);\n\n return (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n className={this.getModalClasses()}\n mountNode={mountNode}\n {..._.omit(this.props, 'header', 'renderHeader', 'inlineTabs', 'className')}\n >\n <Modal.Header\n className={this.getHeaderClasses()}\n >\n { this.renderHeader() }\n <Menu\n float='right'\n secondary\n >\n { _.map(Element.findByType(this.props.children, TabbedModal.Tab), this.renderTab.bind(this)) }\n </Menu>\n </Modal.Header>\n <Modal.Content>\n { tab && (\n <div\n key={tab.props.name}\n >\n { tab.props.children }\n </div>\n )}\n </Modal.Content>\n { Element.findByType(this.props.children, Modal.Actions) }\n </Modal>\n )}\n </ModalContext.Consumer>\n );\n }\n\n /**\n * Renders the header.\n *\n * @returns {*}\n */\n renderHeader() {\n if (this.props.renderHeader) {\n return this.props.renderHeader();\n }\n\n return (\n <Header content={this.props.header} />\n );\n }\n\n /**\n * Renders the passed tab.\n *\n * @param tab\n *\n * @returns {*}\n */\n renderTab(tab: TabbedModal.Tab) {\n const { name } = tab.props;\n\n return (\n <Menu.Item\n active={this.state.tab === name}\n key={name}\n name={name}\n onClick={() => this.setState({ tab: name })}\n >\n { name }\n </Menu.Item>\n );\n }\n}\n\nconst Tab = (props) => props.children;\nTab.displayName = 'Tab';\n\nTabbedModal.Tab = Tab;\n\nTabbedModal.defaultProps = {\n className: undefined,\n inlineTabs: true,\n renderHeader: undefined\n};\n\nexport default TabbedModal;\n","// @flow\n\nimport React from 'react';\nimport { Menu } from 'semantic-ui-react';\nimport _ from 'underscore';\n\ntype Tab = {\n active: boolean,\n key: string,\n label: string,\n visible: boolean\n};\n\ntype Props = {\n onTabClick: (tab: Tab) => void,\n tabs: Array<Tab>\n}\n\nconst TabsMenu = (props: Props) => (\n <Menu\n pointing\n secondary\n >\n { _.map(_.where(props.tabs, { visible: true }), (tab) => (\n <Menu.Item\n active={tab.active}\n key={tab.key}\n name={tab.label}\n onClick={props.onTabClick.bind(this, tab)}\n />\n ))}\n </Menu>\n);\n\nexport default TabsMenu;\n","// @flow\n\nimport React from 'react';\nimport { Icon, Label } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport './TagsList.css';\n\ntype Props = {\n config?: {\n [key: string]: {\n background: string,\n color: string\n }\n },\n onDelete?: (tag: string) => void,\n tags: Array<string>\n};\n\nconst TagsList = (props: Props) => (\n <div\n className='tags-list'\n >\n { _.map(props.tags || [], (tag) => (\n <Label\n style={{\n backgroundColor: props.config && props.config[tag] && props.config[tag].background,\n color: props.config && props.config[tag] && props.config[tag].color,\n marginRight: '10px'\n }}\n >\n { tag }\n { props.onDelete && (\n <Icon\n name='delete'\n onClick={props.onDelete.bind(this, tag)}\n />\n )}\n </Label>\n ))}\n </div>\n);\n\nexport default TagsList;\n","// @flow\n\nimport React, { useEffect, useState } from 'react';\nimport { Image, Loader } from 'semantic-ui-react';\nimport LazyImage from './LazyImage';\n\ntype Props = {\n src: ?string,\n style?: any\n};\n\nconst Thumbnail = (props: Props) => {\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n if (!loading) {\n setLoading(true);\n }\n }, [props.src]);\n\n return (\n <div>\n <Loader\n active={props.src && loading}\n />\n { props.src && (\n <Image\n {...props}\n onLoad={() => setLoading(false)}\n style={{\n ...props.style,\n visibility: loading ? 'hidden' : 'visible'\n }}\n />\n )}\n { !props.src && (\n <LazyImage />\n )}\n </div>\n );\n};\n\nThumbnail.defaultProps = {\n style: {}\n};\n\nexport default Thumbnail;\n","// @flow\n\nimport { Browser } from '@performant-software/shared-components';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { withTranslation } from 'react-i18next';\nimport {\n Button,\n Grid,\n Input,\n Label,\n Modal,\n Segment\n} from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport ModalContext from '../context/ModalContext';\nimport './VideoFrameSelector.css';\n\ntype Props = {\n button: any,\n defaultInterval: number,\n onSelect: (file: File) => void,\n src: string,\n title: string\n};\n\nconst INTERVAL_STEP = 1;\nconst MIN_INTERVAL = 1;\nconst MAX_INTERVAL = 300;\n\nconst VideoFrameSelector = (props: Props) => {\n const [duration, setDuration] = useState(0);\n const [interval, setInterval] = useState(props.defaultInterval);\n const [time, setTime] = useState(0);\n const [modal, setModal] = useState(false);\n\n const videoRef = useRef(null);\n\n useEffect(() => {\n if (videoRef.current) {\n videoRef.current.currentTime = time;\n }\n }, [time]);\n\n return (\n <>\n <Button\n {...props.button}\n onClick={() => setModal(true)}\n />\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n centered={false}\n className='video-frame-selector'\n mountNode={mountNode}\n open={modal}\n size='small'\n >\n <Modal.Header\n content={props.title}\n />\n <Modal.Content>\n <Segment>\n <video\n crossOrigin='anonymous'\n onLoadedMetadata={() => videoRef.current && setDuration(videoRef.current.duration)}\n ref={videoRef}\n src={props.src}\n />\n </Segment>\n <Grid\n columns={2}\n >\n <Grid.Column>\n <div>\n <Label\n content={i18n.t('VideoFrameSelector.labels.interval', { count: interval })}\n />\n </div>\n <Input\n aria-label='Interval Selector'\n min={MIN_INTERVAL}\n max={MAX_INTERVAL}\n name='duration'\n onChange={(e, { value }) => setInterval(Number(value))}\n step={INTERVAL_STEP}\n type='range'\n value={interval}\n />\n </Grid.Column>\n <Grid.Column\n textAlign='right'\n >\n <Button\n aria-label='Previous Frame'\n basic\n disabled={time === 0}\n icon='arrow left'\n onClick={() => setTime(Math.max(time - interval, 0))}\n />\n <Button\n aria-label='Next Frame'\n basic\n disabled={time === duration}\n icon='arrow right'\n onClick={() => setTime(Math.min(time + interval, duration))}\n />\n </Grid.Column>\n </Grid>\n </Modal.Content>\n <Modal.Actions>\n <Button\n content={i18n.t('Common.buttons.ok')}\n primary\n onClick={() => {\n const video = videoRef.current;\n\n if (video && Browser.isBrowser()) {\n const canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n\n canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);\n\n canvas.toBlob((blob) => {\n const file = new File([blob], 'test.png', {\n lastModified: new Date().getTime(),\n type: blob.type\n });\n\n props.onSelect(file);\n setModal(false);\n });\n }\n }}\n />\n <Button\n basic\n content={i18n.t('Common.buttons.cancel')}\n onClick={() => setModal(false)}\n />\n </Modal.Actions>\n </Modal>\n )}\n </ModalContext.Consumer>\n </>\n );\n};\n\nVideoFrameSelector.defaultProps = {\n button: {\n basic: true,\n content: i18n.t('VideoFrameSelector.buttons.select'),\n icon: 'image'\n },\n defaultInterval: 15,\n title: i18n.t('VideoFrameSelector.title'),\n};\n\nexport default withTranslation()(VideoFrameSelector);\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-syntax-highlighter\");","// @flow\n\nimport React, { type ComponentType, useState } from 'react';\nimport SyntaxHighlighter from 'react-syntax-highlighter';\nimport { Button, Modal } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport ModalContext from '../context/ModalContext';\n\ntype Props = {\n highlighter?: any,\n opener: {\n component: ComponentType<any>,\n props: any\n },\n style: any,\n xml: string\n};\n\nconst ViewXML = (props: Props) => {\n const [showModal, setShowModal] = useState(false);\n const OpenerComponent = props.opener.component;\n const openerProps = props.opener.props;\n\n return (\n <ModalContext.Consumer>\n { (mountNode) => (\n <>\n <OpenerComponent\n {...openerProps}\n className='view-xml-trigger'\n onClick={() => setShowModal(true)}\n />\n <Modal\n className='view-xml-modal'\n closeIcon\n centered={false}\n mountNode={mountNode}\n open={showModal}\n onClose={() => setShowModal(false)}\n >\n <Modal.Header\n content={i18n.t('ViewXML.title')}\n />\n <Modal.Content>\n <SyntaxHighlighter\n language='xml'\n style={props.highlighter}\n >\n { props.xml }\n </SyntaxHighlighter>\n </Modal.Content>\n <Modal.Actions>\n <Button\n basic\n content={i18n.t('Common.buttons.close')}\n onClick={() => setShowModal(false)}\n />\n </Modal.Actions>\n </Modal>\n </>\n )}\n </ModalContext.Consumer>\n );\n};\n\nViewXML.defaultProps = {\n opener: {\n component: Button,\n props: {\n content: i18n.t('ViewXML.buttons.view')\n }\n },\n style: {\n maxHeight: '70vh'\n }\n};\n\nexport default ViewXML;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0,\n\t44: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunk_performant_software_semantic_components\"] = self[\"webpackChunk_performant_software_semantic_components\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [44], () => (__webpack_require__(923)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","require","NestedAccordion","props","state","activeItems","prevProps","defaultActive","this","length","isActive","some","active","_","multipleItemTypes","setState","id","item","classNames","showToggle","push","join","properties","type","isItemActive","toggleOnClick","onItemToggle","onItemClick","toggleItem","Accordion","className","fluid","inverted","panels","rootItems","renderPanel","bind","styled","children","getChildItems","key","onClick","style","backgroundColor","undefined","renderToggle","renderItem","renderRight","renderContent","Button","compact","getButtonClass","icon","e","stopPropagation","i","Component","defaultProps","resources","en","translation","i18n","i18next","init","debug","fallbackLng","lng","interpolation","escapeValue","Toaster","useState","visible","setVisible","timeout","useEffect","onDismiss","Transition","animation","duration","transitionOnMount","Message","info","MessageTypes","negative","positive","warning","SORT_ASCENDING","SORT_DESCENDING","WrappedComponent","initializeState","polling","pollingInterval","setInterval","fetchData","saved","clearInterval","items","page","setSession","loading","perPage","search","sortColumn","sortDirection","params","filters","per_page","sort_by","sort_direction","onLoad","then","data","collectionName","list","pages","count","defaults","f","filter","onCreateFilter","session","restoreSession","getDefaultFilters","defaultPerPage","perPageOptions","defaultSearch","defaultSort","defaultSortDirection","error","value","ObjectUtils","onSearchChange","searchRef","inputRef","current","focus","onSearch","uid","uuid","selectedItem","onDelete","afterDelete","onError","Promise","resolve","onDeleteAll","afterDeleteAll","resolveErrors","onChange","activePage","onSave","direction","component","showLabels","isFilterActive","onFilterChange","onPageChange","onPerPageChange","onSort","onInit","renderSearch","content","searchable","Input","Icon","link","name","onClearSearch","input","ref","onKeyDown","Timer","onKeyUp","size","getSessionKey","sessionStorage","getItem","JSON","parse","setItem","stringify","DropdownButton","dropdownRef","useRef","basic","color","text","disabled","handleClick","Dropdown","floating","options","scrolling","selectOnBlur","trigger","EditModal","useEditContainer","OuterComponent","showToaster","setShowToaster","hasErrors","errors","showLoading","Dimmer","Loader","Modal","saving","primary","inline","onClose","AssociatedDropdown","modalAdd","modalEdit","searchQuery","clearTimeout","onSelection","option","map","renderOption","onBlur","onOptionSelection","onOpen","placeholder","searchInput","selection","upward","renderEditButton","renderAddButton","renderClearButton","renderModal","modal","required","onClear","onInitialize","record","setTimeout","date","iconPosition","readOnly","display","toLocaleDateString","locale","formatOptions","preventDefault","React","FuzzyDate","getInitialState","calendar","Calendar","initializeDate","startDate","endDate","dateComponent","convertToDate","format","accuracy","description","range","parseDate","setDisplay","onAccuracyChange","getDefaultDate","month","getDefaultMonth","setEndDate","property","toDate","year","parseInt","onEdit","mountNode","as","Form","open","title","label","Checkbox","checked","radio","renderYear","renderMonth","renderDate","onRangeChange","TextArea","onDescriptionChange","daysInMonth","onDateChange","onMonthChange","listMonths","m","onYearChange","getDisplayDate","addYear","addMonth","addDate","Browser","navigator","language","FilterTypes","boolean","integer","relationship","select","string","FilterOperators","equal","notEqual","contain","notContain","empty","notEmpty","greaterThan","lessThan","FilterOperatorOptions","OperatorsByType","getOperatorsByType","useCallback","operators","onDefaultSort","renderInput","operator","onSaveChildAssociation","renderSearchQuery","useMemo","centered","noValidate","Grid","columns","verticalAlign","Header","textAlign","onReset","marginLeft","width","onDeleteChildAssociation","getContent","Label","onRemove","modalDelete","modalDeleteAll","modalFilter","location","buttons","addButton","deleteButton","selectable","render","renderDeleteAllButton","button","include","copy","onCopy","renderHeader","actions","getActions","renderEmptyMessage","renderFooter","renderEditModal","renderDeleteModal","renderDeleteAllModal","renderFilterModal","action","onEditButton","onCopyButton","onDeleteButton","onAddButton","secondary","index","accept","onDeleteAllButton","Confirm","header","onCancel","onConfirm","Trans","i18nKey","onFilterButton","onSaveFilter","getButtons","hasPages","showCount","showRecordCount","renderRecordCount","renderPagination","renderListHeader","hasLabels","renderButton","Menu","borderless","renderFilterButton","renderPerPage","onRemoveFilter","Pagination","firstItem","lastItem","totalPages","Number","toLocaleString","onColumnClick","useList","renderActions","renderCheckbox","el","onRowSelect","selectedRows","find","r","useDataList","getRootItems","sortDropdown","sortValue","sort","renderSort","fontSize","AccordionList","onAddItem","loaded","lazyLoad","selectedPage","parentId","pagination","pageCount","autoFocus","renderHeaderAddButton","b","renderSubHeader","renderAddModal","canAddItem","onSelectAll","selectedRowIds","toBeSelected","reduce","tbs","includes","renderSelectAll","canDeleteItem","canEditItem","canCopyItem","hideAddRootButton","recordCount","selected","renderCopyButton","renderDeleteButton","renderSelectCheckbox","Segment","isSelected","AccordionSelector","selectedItems","isSelectable","multiple","onItemSelection","withTranslation","vertical","onRight","onLeft","setError","path","src","controls","hiddenFields","noEditFields","apiCheckCache","cacheTimes","okToUseCache","localStorage","Date","now","getItemTypeMeta","itemType","retryOnFailure","all","api","itemTypes","get","cache","itemTypeFields","itemTypeCreatorTypes","itemTypeR","itemTypeFieldsR","creatorTypesR","getData","removeItem","getFieldsAndItem","fields","titleField","BibliographyTypes","field","localized","itf","concat","dateIndex","findIndex","splice","matches","extra","match","replace","beforeIndex","publisher","readonly","processing","isUrl","onUpdate","attribute","creator","onUpdateAttributes","attributes","creatorTypes","ct","creatorType","nameType","split","firstName","lastName","onAdd","allowDelete","defaultCreatorType","onAddCreator","onDeleteCreator","v","onUpdateCreator","onUpdateCreatorType","creators","setCreators","setFields","renderField","onTextInputChange","onSetState","BibliographyUtils","it","bibliographyData","createContext","setLoading","setSearchQuery","translateUrl","useContext","ZoteroTranslateContext","onLoadItems","response","ok","onFind","translator","ZoteroTranslationClient","translateURL","persist","add","translateIdentifier","sortRef","defaultValue","useCitationStyles","onStyleChange","styles","xml","Sort","SortOptions","BibliographyListComponent","List","divided","relaxed","padded","Citation","actionIndex","setLocale","setStyle","setSort","createItem","getSortProperty","author","newItems","_destroy","reverse","fetch","resp","results","BibliographyModal","setName","n","Breadcrumb","to","url","isNumeric","str","test","pathname","slice","hasMore","labels","ColorButton","cursor","height","selectedColor","SketchPicker","disableAlpha","onChangeComplete","CurrentFacetLabels","onShowMore","CurrentFacetsModal","CurrentFacets","useCurrentRefinements","setModal","facets","group","refinements","refinement","refine","filteredFacets","facet","limit","onMouseDown","role","DIRECTION_VERTICAL","drop","useDrop","hover","monitor","dragIndex","hoverIndex","hoverMiddle","hoverClient","hoverBoundingRect","getBoundingClientRect","clientOffset","getClientOffset","bottom","top","right","left","y","x","onDrag","useDrag","begin","onDragStart","end","onDragEnd","collect","isDragging","drag","opacity","Ref","innerRef","DataTable","resize","activePanel","initializeColumnRefs","onPreventClick","onMouseMove","onColumnResize","onMouseUp","afterColumnResize","document","addEventListener","columnRefs","c","createRef","removeEventListener","columnCount","columnRef","offset","pageX","allSelected","isRowSelected","Table","tableProps","renderSelectHeader","renderHeaderCell","renderActionsHeader","renderEmptyTableRow","renderLoading","actionButton","popup","Popup","hideOnScroll","mouseEnterDelay","position","renderActionButton","column","hidden","renderEmptyRow","colSpan","getColumnCount","sorted","offsetWidth","renderCell","expandableRows","target","nodeName","expandPanel","anchoredColumns","closeOnBlur","onColumnCheckbox","DropdownMenu","setOpen","onMouseEnter","onMouseLeave","setAttribute","renderDropdownItem","renderMenuItem","renderDropdown","contextRef","renderMenu","fixed","activeSort","setActiveSort","onSortChange","newSort","sorts","celled","DataView","activeItem","setActiveItem","selectedRecord","setSelectedRecord","setColumns","menu","setMenu","paddingLeft","setPaddingLeft","setKey","menuRef","substr","lastIndexOf","mergeColumns","keys","flatten","uniq","cols","col","columnValue","trim","toUpperCase","replaceAll","sortable","resolveValue","axios","itemKey","Boolean","toString","menuItems","headers","layout","closeIcon","doubling","ListTable","prevColumns","Hooks","sortableColumn","configurable","DatabaseView","selectedTable","setSelectedTable","tables","setTables","service","getColumns","getTables","column_name","dataType","data_type","table_name","table","overflow","MAX_SAFE_INTEGER","DatePicker","setCalendar","calendarWrapper","onDocumentClick","event","calendarInstance","contains","zIndex","closeOnSelection","next2AriaLabel","next2Label","nextAriaLabel","nextLabel","prev2AriaLabel","prev2Label","prevAriaLabel","prevLabel","DescriptorField","popupContent","hoverable","delayInterval","renderPopup","wide","download","filename","href","EditPageClass","currentTab","tab","renderButtons","renderComponent","renderToaster","EmbeddedList","getItems","orderBy","sortProperty","ordered","Facet","setActive","useImperativeHandle","collapse","expand","prevActive","Divider","useClearRefinements","canRefine","OPERATOR_OR","FacetList","forwardRef","useRefinementList","defaultOperator","setOperator","canToggleShowMore","isShowingMore","searchForItems","toggleShowMore","query","setQuery","instance","onToggleOperator","prevOperator","isRefined","circular","toggleable","toggle","FacetSlider","useRangeSlider","start","min","max","valueView","setValueView","allowCross","onAfterChange","FacetToggle","useToggleRefinement","FileInputButton","buttonProps","fileInputRef","click","fileList","array","toArray","files","fileInput","filePattern","fileTypes","RegExp","dataTransfer","validate","onFilesAdded","onClickDropzone","onDragLeave","onDragOver","onDrop","onDropFiles","tabIndex","maxSize","validFiles","file","valid","exec","Status","ColorsByStatus","IconsByStatus","TextByStatus","status","complete","completed","total","percent","percentView","minimumFractionDigits","uploading","Progress","Strategy","FileUploadModal","setItems","uploadCount","setUploadCount","setUploading","statuses","setStatuses","hasUploadErrors","onAddFiles","prevItems","onAddFile","onAssociationInputChange","idAttribute","onBatchUpload","onComplete","closeOnComplete","setStatus","prevStatuses","onSingleUpload","prevCount","validateItem","onValidate","reject","newItem","onUpload","strategy","renderMessageItem","renderStatus","HeaderComponent","headerComponent","UploadItem","itemComponent","showPageLoader","onSetItems","Item","isError","isRequired","GoogleMap","Map","defaultCenter","center","setCenter","setMap","zoom","defaultZoom","latLng","lat","bounds","getBounds","mapContainerClassName","mapContainerStyle","containerStyle","Marker","draggable","searchBox","setSearchBox","onPlacesChanged","place","getPlaces","geometry","formatted_address","onLocationSelection","result","StandaloneSearchBox","s","HorizontalCards","marginWidth","setMarginWidth","pageWidth","setPageWidth","scrollPage","setScrollPage","scrollPages","setScrollPages","cardStyle","flex","getClassName","defaultClassName","initialize","clientWidth","scrollWidth","Math","ceil","child","firstChild","window","getComputedStyle","leftMargin","parseFloat","rightMargin","marginRight","increment","nextPage","scrollTo","behavior","renderImage","image","Image","alt","objectFit","Card","cardsClassName","card","cardClassName","inlineImage","renderMeta","renderDescription","renderExtra","IIIFViewer","currentIndex","setCurrentIndex","images","onIndexChange","newIndex","body","caption","Views","grid","ItemsClass","asProps","renderList","renderGrid","renderEmptyList","getItemProps","resolveColor","resolveIcon","view","renderCard","listItem","resolveName","renderAdditionalContent","defaultView","hideToggle","isHidden","getSortValue","useItemsToggle","ItemCollection","endIndex","onBottomReached","InfiniteScroll","context","scrollOffset","ItemList","htmlFor","KeyboardField","showKeyboard","renderLabel","onInputChange","hide","show","Keyboard","onKeyboardChange","keyboardClass","onRemoveItem","onUpdateItem","withBatchEdit","LazyLoader","LazyAudio","dimmer","setDimmer","preview","setLoaded","dimmable","Visibility","fireOnMount","onTopVisible","pdfjs","LazyDocument","getClassNames","defaultClass","pdf","Document","onLoadError","console","log","message","Page","pageNumber","PhotoViewer","LazyImage","VideoPlayer","embedRef","placeholderAlt","querySelector","video","embedded","Embed","autoPlay","iframe","allow","LazyVideo","onLoadedData","ContentTypes","WebContentTypes","LazyMedia","contentType","setContentType","setPreview","source","setSource","fileExtension","pop","startsWith","URL","createObjectURL","renderChildren","renderMedia","downloadUrl","renderMessage","components","bold","default","values","manifest","manifestId","showIIIFBadge","dimmed","LoginModal","loginFailed","onUsernameChange","onPasswordChange","onLogin","MasonryLayout","columnWrapper","columnIndex","marginBottom","gap","MasonryTile","dimmerActive","setDimmerActive","setHeight","random","subheader","subtitle","renderEmpty","PlayButton","setVideo","mountOnShow","onPrevious","onNext","stackable","transform","ModalDropdown","modalVisible","RemoteDropdown","dropdown","Array","isArray","getValues","getOption","allowAdditions","renderAddOption","renderLoadMoreOption","getOptions","close","clearable","getSearchOptions","useSearchBox","clear","isSearchStalled","setSearch","SearchPagination","usePagination","currentRefinement","nbPages","scrollToTop","scroll","SearchResults","useHits","hits","useHitsPerPage","useSortBy","endsWith","useStats","nbHits","seconds","processingTimeMS","toFixed","Section","SelectizeGrid","renderCheckmark","renderItems","onSelect","Selectize","setSelectedItem","setSelectedItems","allowMultiple","allowedCount","SelectizeCard","raised","meta","SelectizeImageHeader","setPage","setPages","collapsed","setCollapsed","records","startIndex","itemsPerRow","collapsable","prevCollapsed","SimpleEditPage","setCurrentTab","setSaved","contentRef","tabs","Element","Tab","nextTab","onTabClick","renderTabs","menuProps","editable","stickyMenu","Sticky","defaultTab","pointing","displayName","Object","assign","TabbedModal","classes","inlineTabs","t","getModalClasses","getHeaderClasses","float","renderTab","tags","tag","config","background","Thumbnail","visibility","VideoFrameSelector","setDuration","defaultInterval","interval","time","setTime","videoRef","currentTime","crossOrigin","onLoadedMetadata","step","canvas","createElement","videoWidth","videoHeight","getContext","drawImage","toBlob","blob","File","lastModified","getTime","ViewXML","showModal","setShowModal","OpenerComponent","opener","openerProps","highlighter","maxHeight","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","every","getter","__esModule","d","a","definition","o","defineProperty","enumerable","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","self","forEach","__webpack_exports__"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://@performant-software/semantic-components/webpack/runtime/chunk loaded","webpack://@performant-software/semantic-components/external commonjs2 \"react\"","webpack://@performant-software/semantic-components/external commonjs \"underscore\"","webpack://@performant-software/semantic-components/external commonjs \"semantic-ui-react\"","webpack://@performant-software/semantic-components/./src/components/NestedAccordion.js","webpack://@performant-software/semantic-components/external commonjs \"@performant-software/shared-components\"","webpack://@performant-software/semantic-components/external commonjs \"react-uuid\"","webpack://@performant-software/semantic-components/external commonjs \"i18next\"","webpack://@performant-software/semantic-components/./src/i18n/i18n.js","webpack://@performant-software/semantic-components/./src/components/Toaster.js","webpack://@performant-software/semantic-components/./src/components/DataList.js","webpack://@performant-software/semantic-components/external commonjs \"react-i18next\"","webpack://@performant-software/semantic-components/./src/components/DropdownButton.js","webpack://@performant-software/semantic-components/./src/components/EditModal.js","webpack://@performant-software/semantic-components/./src/components/AssociatedDropdown.js","webpack://@performant-software/semantic-components/./src/components/DateInput.js","webpack://@performant-software/semantic-components/./src/context/ModalContext.js","webpack://@performant-software/semantic-components/./src/components/FuzzyDate.js","webpack://@performant-software/semantic-components/./src/components/ListFilters.js","webpack://@performant-software/semantic-components/./src/components/FilterLabels.js","webpack://@performant-software/semantic-components/./src/components/List.js","webpack://@performant-software/semantic-components/./src/components/AccordionDataList.js","webpack://@performant-software/semantic-components/./src/components/AccordionList.js","webpack://@performant-software/semantic-components/./src/components/SelectizeHeader.js","webpack://@performant-software/semantic-components/./src/components/AccordionSelector.js","webpack://@performant-software/semantic-components/./src/components/ArrowButtons.js","webpack://@performant-software/semantic-components/./src/components/AudioPlayer.js","webpack://@performant-software/semantic-components/external commonjs \"zotero-api-client\"","webpack://@performant-software/semantic-components/./src/utils/Bibliography.js","webpack://@performant-software/semantic-components/./src/components/CreatorField.js","webpack://@performant-software/semantic-components/./src/components/Creators.js","webpack://@performant-software/semantic-components/./src/components/BibliographyForm.js","webpack://@performant-software/semantic-components/./src/components/BibliographyModal.js","webpack://@performant-software/semantic-components/external commonjs \"zotero-translation-client\"","webpack://@performant-software/semantic-components/./src/context/ZoteroTranslateContext.js","webpack://@performant-software/semantic-components/./src/components/BibliographySearchInput.js","webpack://@performant-software/semantic-components/./src/constants/Sort.js","webpack://@performant-software/semantic-components/./src/components/SortSelector.js","webpack://@performant-software/semantic-components/./src/components/StyleSelector.js","webpack://@performant-software/semantic-components/./src/components/BibliographyList.js","webpack://@performant-software/semantic-components/./src/components/BooleanIcon.js","webpack://@performant-software/semantic-components/./src/components/BreadcrumbItem.js","webpack://@performant-software/semantic-components/./src/components/Breadcrumbs.js","webpack://@performant-software/semantic-components/./src/components/CancelButton.js","webpack://@performant-software/semantic-components/./src/components/ColorButton.js","webpack://@performant-software/semantic-components/external commonjs \"react-color\"","webpack://@performant-software/semantic-components/./src/components/ColorPickerModal.js","webpack://@performant-software/semantic-components/./src/components/CurrentFacetLabels.js","webpack://@performant-software/semantic-components/./src/components/CurrentFacetsModal.js","webpack://@performant-software/semantic-components/./src/components/CurrentFacets.js","webpack://@performant-software/semantic-components/./src/components/ColumnResize.js","webpack://@performant-software/semantic-components/external commonjs \"react-dnd\"","webpack://@performant-software/semantic-components/./src/components/Draggable.js","webpack://@performant-software/semantic-components/./src/components/DataTable.js","webpack://@performant-software/semantic-components/./src/components/DataTableColumnSelector.js","webpack://@performant-software/semantic-components/external commonjs \"axios\"","webpack://@performant-software/semantic-components/./src/components/DropdownMenu.js","webpack://@performant-software/semantic-components/./src/components/MenuBar.js","webpack://@performant-software/semantic-components/./src/components/MenuSidebar.js","webpack://@performant-software/semantic-components/./src/components/DataView.js","webpack://@performant-software/semantic-components/./src/components/ListTable.js","webpack://@performant-software/semantic-components/./src/components/DatabaseView.js","webpack://@performant-software/semantic-components/external commonjs \"react-calendar\"","webpack://@performant-software/semantic-components/./src/components/DatePicker.js","webpack://@performant-software/semantic-components/./src/components/DescriptorField.js","webpack://@performant-software/semantic-components/./src/components/DownloadButton.js","webpack://@performant-software/semantic-components/./src/components/SaveButton.js","webpack://@performant-software/semantic-components/./src/components/EditPage.js","webpack://@performant-software/semantic-components/./src/components/EmbeddedList.js","webpack://@performant-software/semantic-components/./src/components/Facet.js","webpack://@performant-software/semantic-components/./src/components/FacetClearButton.js","webpack://@performant-software/semantic-components/./src/components/LinkButton.js","webpack://@performant-software/semantic-components/./src/components/FacetList.js","webpack://@performant-software/semantic-components/external commonjs \"rc-slider\"","webpack://@performant-software/semantic-components/external commonjs \"rc-slider/assets/index.css\"","webpack://@performant-software/semantic-components/./src/components/FacetSlider.js","webpack://@performant-software/semantic-components/./src/components/FacetToggle.js","webpack://@performant-software/semantic-components/./src/components/FileInputButton.js","webpack://@performant-software/semantic-components/./src/components/FileUpload.js","webpack://@performant-software/semantic-components/./src/components/FileUploadStatus.js","webpack://@performant-software/semantic-components/./src/components/FileUploadProgress.js","webpack://@performant-software/semantic-components/./src/components/FileUploadModal.js","webpack://@performant-software/semantic-components/external commonjs \"@react-google-maps/api\"","webpack://@performant-software/semantic-components/./src/components/GoogleMap.js","webpack://@performant-software/semantic-components/./src/components/GooglePlacesSearch.js","webpack://@performant-software/semantic-components/./src/components/HorizontalCards.js","webpack://@performant-software/semantic-components/./src/components/IIIFModal.js","webpack://@performant-software/semantic-components/./src/components/ImageCarousel.js","webpack://@performant-software/semantic-components/./src/components/ItemsToggle.js","webpack://@performant-software/semantic-components/./src/components/Items.js","webpack://@performant-software/semantic-components/./src/components/ItemCollection.js","webpack://@performant-software/semantic-components/./src/components/ItemList.js","webpack://@performant-software/semantic-components/./src/components/LinkLabel.js","webpack://@performant-software/semantic-components/./src/components/KeyboardField.js","webpack://@performant-software/semantic-components/./src/hooks/BatchEdit.js","webpack://@performant-software/semantic-components/./src/components/KeyValuePairs.js","webpack://@performant-software/semantic-components/./src/components/LazyLoader.js","webpack://@performant-software/semantic-components/./src/components/LazyAudio.js","webpack://@performant-software/semantic-components/external commonjs \"react-pdf\"","webpack://@performant-software/semantic-components/external commonjs \"react-pdf/dist/esm/Page/AnnotationLayer.css\"","webpack://@performant-software/semantic-components/external commonjs \"react-pdf/dist/esm/Page/TextLayer.css\"","webpack://@performant-software/semantic-components/./src/components/LazyDocument.js","webpack://@performant-software/semantic-components/./src/components/PhotoViewer.js","webpack://@performant-software/semantic-components/./src/components/LazyImage.js","webpack://@performant-software/semantic-components/./src/components/VideoPlayer.js","webpack://@performant-software/semantic-components/./src/components/LazyVideo.js","webpack://@performant-software/semantic-components/./src/components/LazyMedia.js","webpack://@performant-software/semantic-components/./src/components/LazyIIIF.js","webpack://@performant-software/semantic-components/./src/components/ListLoader.js","webpack://@performant-software/semantic-components/./src/components/LoginModal.js","webpack://@performant-software/semantic-components/./src/components/MasonryGrid.js","webpack://@performant-software/semantic-components/./src/components/PlayButton.js","webpack://@performant-software/semantic-components/./src/components/VideoPlayerButton.js","webpack://@performant-software/semantic-components/./src/components/MediaGallery.js","webpack://@performant-software/semantic-components/./src/components/MediaGrid.js","webpack://@performant-software/semantic-components/./src/components/MediaList.js","webpack://@performant-software/semantic-components/./src/components/ModalDropdown.js","webpack://@performant-software/semantic-components/./src/components/RemoteDropdown.js","webpack://@performant-software/semantic-components/./src/components/SearchBox.js","webpack://@performant-software/semantic-components/./src/components/SearchPagination.js","webpack://@performant-software/semantic-components/./src/components/SearchResults.js","webpack://@performant-software/semantic-components/./src/components/SearchResultsPerPage.js","webpack://@performant-software/semantic-components/./src/components/SearchResultsSort.js","webpack://@performant-software/semantic-components/./src/components/SearchStats.js","webpack://@performant-software/semantic-components/./src/components/Section.js","webpack://@performant-software/semantic-components/./src/components/Selectize.js","webpack://@performant-software/semantic-components/./src/components/SelectizeImageHeader.js","webpack://@performant-software/semantic-components/./src/components/SimpleEditPage.js","webpack://@performant-software/semantic-components/./src/components/TabbedModal.js","webpack://@performant-software/semantic-components/./src/components/TabsMenu.js","webpack://@performant-software/semantic-components/./src/components/TagsList.js","webpack://@performant-software/semantic-components/./src/components/Thumbnail.js","webpack://@performant-software/semantic-components/./src/components/VideoFrameSelector.js","webpack://@performant-software/semantic-components/external commonjs \"react-syntax-highlighter\"","webpack://@performant-software/semantic-components/./src/components/ViewXML.js","webpack://@performant-software/semantic-components/webpack/bootstrap","webpack://@performant-software/semantic-components/webpack/runtime/compat get default export","webpack://@performant-software/semantic-components/webpack/runtime/define property getters","webpack://@performant-software/semantic-components/webpack/runtime/hasOwnProperty shorthand","webpack://@performant-software/semantic-components/webpack/runtime/make namespace object","webpack://@performant-software/semantic-components/webpack/runtime/jsonp chunk loading","webpack://@performant-software/semantic-components/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"underscore\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"semantic-ui-react\");","// @flow\n\nimport React, { Component, type Element } from 'react';\nimport {\n Accordion,\n Button\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport './NestedAccordion.css';\n\ntype Props = {\n defaultActive?: Array<number> | Array<any>,\n getChildItems: (item: any) => Array<any>,\n inverted?: boolean,\n isItemActive?: (item: any) => boolean,\n multipleItemTypes?: boolean,\n onItemClick?: (item: any) => void,\n onItemToggle?: (item: any) => void,\n renderItem: (item: any) => string | Element<any>,\n renderRight?: (item: any) => string | Element<any>,\n rootItems: Array<any>,\n showToggle: (item: any) => boolean,\n styled?: boolean,\n toggleOnClick?: boolean\n};\n\ntype State = {\n activeItems: Array<any>\n};\n\nclass NestedAccordion extends Component<Props, State> {\n static defaultProps: any;\n\n /**\n * Constructs a new NestedAccordion component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n activeItems: []\n };\n }\n\n /**\n * Sets the activeItems on the state if the defaultActive prop changes.\n *\n * @param prevProps\n */\n componentDidUpdate(prevProps: Props) {\n if (prevProps.defaultActive !== this.props.defaultActive\n && this.props.defaultActive\n && this.props.defaultActive.length) {\n const isActive = this.props.defaultActive.some(\n (active) => typeof active !== 'object' || !_.has(active, 'id') || !_.has(active, 'type')\n );\n if (this.props.multipleItemTypes && !isActive) {\n this.setState({ activeItems: this.props.defaultActive });\n } else {\n this.setState({ activeItems: _.map(this.props.defaultActive, (id) => ({ id })) });\n }\n }\n }\n\n /**\n * Returns the toggle button class names.\n *\n * @param item\n *\n * @returns {string}\n */\n getButtonClass(item: any) {\n const classNames = ['accordion-button'];\n\n if (this.props.showToggle && !this.props.showToggle(item)) {\n classNames.push('hidden');\n }\n\n return classNames.join(' ');\n }\n\n /**\n * Returns true if the passed item is active.\n *\n * @param item\n *\n * @returns {boolean}\n */\n isActive(item: any) {\n let properties = { id: item.id };\n if (this.props.multipleItemTypes && _.has(item, 'type')) {\n properties = { id: item.id, type: item.type };\n }\n return !!_.findWhere(this.state.activeItems, properties);\n }\n\n /**\n * Returns true if the passed item is active.\n *\n * @param item\n *\n * @returns {*}\n */\n isItemActive(item: any) {\n return this.props.isItemActive && this.props.isItemActive(item);\n }\n\n /**\n * Calls the onItemClick prop. Optionally toggles the item active.\n *\n * @param item\n */\n onItemClick(item: any) {\n if (this.props.toggleOnClick) {\n this.onItemToggle(item);\n }\n\n if (this.props.onItemClick) {\n this.props.onItemClick(item);\n }\n }\n\n /**\n * Toggles the passed item and calls the onItemToggle property.\n *\n * @param item\n */\n onItemToggle(item: any) {\n if (this.props.onItemToggle) {\n this.props.onItemToggle(item);\n }\n\n this.toggleItem(item);\n }\n\n /**\n * Renders the NestedAccordion component.\n *\n * @returns {*}\n */\n render() {\n return (\n <Accordion\n className='nested-accordion'\n fluid\n inverted={this.props.inverted}\n panels={_.map(this.props.rootItems, this.renderPanel.bind(this))}\n styled={this.props.styled}\n />\n );\n }\n\n /**\n * Renders the content for the passed item if the item has child elements.\n *\n * @param item\n *\n * @returns {null|*}\n */\n renderContent(item: any) {\n const children = this.props.getChildItems(item);\n if (!(children && children.length)) {\n return null;\n }\n\n return (\n <Accordion.Content\n active={this.isActive(item)}\n >\n <div>\n <Accordion.Accordion\n panels={_.map(children, this.renderPanel.bind(this))}\n />\n </div>\n </Accordion.Content>\n );\n }\n\n /**\n * Renders the title and content (panel) for the passed item.\n *\n * @param item\n *\n * @returns {*}\n */\n renderPanel(item: any) {\n return (\n <div key={_.has(item, 'type') ? `${item.type}-${item.id}` : item.id}>\n <Accordion.Title\n active={this.isActive(item)}\n onClick={this.onItemClick.bind(this, item)}\n style={{\n backgroundColor: this.isItemActive(item) ? 'rgba(255, 255, 255, 0.08)' : undefined\n }}\n >\n <div\n className='container'\n >\n <div>\n { this.renderToggle(item) }\n <div\n className='item-container'\n >\n { this.props.renderItem(item) }\n </div>\n </div>\n { this.props.renderRight && (\n <div\n className='right-container'\n >\n { this.props.renderRight(item) }\n </div>\n )}\n </div>\n </Accordion.Title>\n { this.renderContent(item) }\n </div>\n );\n }\n\n /**\n * Renders the open/close toggle for the passed item.\n *\n * @param item\n *\n * @returns {null|*}\n */\n renderToggle(item: any) {\n return (\n <Button\n aria-label='Open'\n compact\n className={this.getButtonClass(item)}\n icon='dropdown'\n inverted={this.props.inverted}\n onClick={(e) => {\n // Since the containing row also has an onclick, we'll want to prevent that from being triggered.\n e.stopPropagation();\n this.onItemToggle(item);\n }}\n />\n );\n }\n\n /**\n * Toggles the passed item as active.\n *\n * @param item\n */\n toggleItem(item: any) {\n this.setState((state) => ({\n activeItems: this.isActive(item)\n ? _.filter(state.activeItems, (i) => {\n if (this.props.multipleItemTypes && _.has(item, 'type') && _.has(i, 'type')) {\n return i.id !== item.id || i.type !== item.type;\n }\n return i.id !== item.id;\n })\n : [...state.activeItems, item]\n }));\n }\n}\n\nNestedAccordion.defaultProps = {\n defaultActive: [],\n inverted: false,\n isItemActive: undefined,\n multipleItemTypes: false,\n onItemClick: () => {},\n renderRight: () => {},\n styled: true,\n toggleOnClick: false\n};\n\nexport default NestedAccordion;\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@performant-software/shared-components\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-uuid\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"i18next\");","import i18next from 'i18next';\n\nimport en from './en.json';\n\nconst resources = {\n en: {\n translation: en\n }\n};\n\nconst i18n = i18next.createInstance();\n\ni18n\n .init({\n debug: true,\n fallbackLng: 'en',\n lng: 'en',\n interpolation: {\n escapeValue: false,\n },\n resources\n });\n\nexport default i18n;\n","// @flow\n\nimport React, { type Element, useEffect, useState } from 'react';\nimport { Message, Transition } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport './Toaster.css';\n\ntype Props = {\n children: Array<Element<any>>,\n onDismiss?: () => void,\n timeout: number,\n type: string\n};\n\nconst TRANSITION_DURATION = 700;\n\nconst Toaster = (props: Props) => {\n const [visible, setVisible] = useState(true);\n\n /*\n * If a timeout is provided, automatically hide the message after <code>timeout</code> milliseconds.\n */\n if (props.timeout && props.timeout > 0) {\n _.delay(() => {\n setVisible(false);\n }, props.timeout);\n }\n\n /*\n * If the toaster visibility has change to \"false\", call the onDismiss prop. We'll delay the call\n * by <code>TRANSITION_DURATION</code> milliseconds in order for the transition to run.\n */\n useEffect(() => {\n if (!visible && props.onDismiss) {\n _.delay(props.onDismiss.bind(this), TRANSITION_DURATION);\n }\n }, [visible]);\n\n return (\n <Transition\n animation='slide down'\n duration={TRANSITION_DURATION}\n transitionOnMount\n visible={visible}\n >\n <Message\n className='toaster'\n info={props.type === Toaster.MessageTypes.info}\n negative={props.type === Toaster.MessageTypes.negative}\n onDismiss={() => setVisible(false)}\n positive={props.type === Toaster.MessageTypes.positive}\n warning={props.type === Toaster.MessageTypes.negative}\n >\n { props.children }\n </Message>\n </Transition>\n );\n};\n\nToaster.MessageTypes = {\n info: 'info',\n negative: 'negative',\n positive: 'positive',\n warning: 'warning'\n};\n\nToaster.defaultProps = {\n onDismiss: undefined,\n timeout: 3000,\n type: Toaster.MessageTypes.info\n};\n\nexport default Toaster;\n","// @flow\n\nimport { Object as ObjectUtils, Timer } from '@performant-software/shared-components';\nimport React, { Component, type ComponentType } from 'react';\nimport uuid from 'react-uuid';\nimport _ from 'underscore';\nimport { Icon, Input, Message } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport Toaster from './Toaster';\n\ntype Props = {\n /**\n * Name of the collection to retrieve from the API response.\n */\n collectionName: string,\n\n /**\n * The default number of records to display on a single page.\n */\n defaultPerPage?: number,\n\n /**\n * The default value for the search input element.\n */\n defaultSearch?: string,\n\n /**\n * The default value to use for sorting the list.\n */\n defaultSort?: string,\n\n /**\n * The default direction in which to sort the list.\n */\n defaultSortDirection?: string,\n\n /**\n * If provided, the passed <code>component</code> will be rendered when the filter button is clicked.\n * <br />\n * <br />\n *\n * Values passed in the <code>defaults</code> and <code>props</code> properties will be made available in the\n * passed component.\n * <br />\n * <br />\n *\n * The <code>onChange</code> callback will fire when the filters are modified. This action will also reload the list,\n * passing the new filters the <code>onLoad</code> callback.\n */\n filters?: {\n component: ComponentType<any>,\n defaults?: any,\n props?: any,\n onChange?: (filter: any) => Promise<any>,\n showLabels?: boolean\n },\n\n /**\n * Callback fired when the \"delete\" action is clicked.\n * @param item\n */\n onDelete?: (item: any) => Promise<any>,\n\n /**\n * Callback fired when the \"delete all\" action is clicked. This action is typically renedered in the header and will\n * apply to every item in the list.\n */\n onDeleteAll?: () => Promise<any>,\n\n /**\n * Callback fired when loading the list of items from an API. This callback is fired any time the list changes.\n */\n onLoad: (params: any) => Promise<any>,\n\n /**\n * Callback fired when an item is saved via the add/edit modal.\n */\n onSave?: (item: any) => Promise<any>,\n\n /**\n * The numeric list of options to allow the user to select for the number of records to display per page.\n */\n perPageOptions?: Array<number>,\n\n /**\n * If provided, the <code>onLoad</code> callback will fire after a timeout of the passed number of milliseconds. This\n * can be useful in order to show progress (file upload, download, etc) that must be retrieved from the server.\n */\n polling?: number,\n\n /**\n * Callback fired when an error occurs. The passed error can take any form and is up to the consuming component to\n * interpret. The return value should be an array of user-friendly error messages.\n */\n resolveErrors?: (error: any) => Array<string>,\n\n /**\n * Used to inform the list that an external save has taken place. When set to <code>true</code>, a success toaster\n * will display.\n */\n saved?: boolean,\n\n /**\n * If <code>true</code>, this component will render a search input element in the list header.\n */\n searchable?: boolean,\n\n /**\n * If provided, list properties (page number, columns, filters, etc) will be stored in the passed storage element\n * and rehydrated each time the component is mounted. This is useful in order to persist filters, searches, and\n * other properties when a user navigates away from the list.\n */\n session?: {\n key: string,\n storage: typeof sessionStorage\n }\n};\n\ntype State = {\n count: number,\n error: ?any,\n filters: any,\n items: Array<any>,\n loading: boolean,\n page: number,\n pages: number,\n perPage: number,\n saved: boolean,\n search: ?string,\n sortColumn: ?string,\n sortDirection: ?string\n};\n\nconst SESSION_KEY = 'DataList';\nconst SESSION_DEFAULT = '{}';\n\nconst SORT_ASCENDING = 'ascending';\nconst SORT_DESCENDING = 'descending';\n\n/**\n * Returns a function to wrap the passed component as a DataList. The DataList component is intended to be used to load\n * records from an API and display them using the wrapped component. This HOC will handle calling the API, pagination,\n * storing search, filters, and sorting.\n *\n * @param WrappedComponent\n */\nconst useDataList = (WrappedComponent: ComponentType<any>) => (\n class extends Component<Props, State> {\n // Default props\n static defaultProps = {\n filters: {},\n searchable: true\n };\n\n // Polling\n pollingInterval: any;\n\n /**\n * Constructs a new DataList component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = this.initializeState(props);\n }\n\n /**\n * Sets up the polling interval.\n */\n componentDidMount() {\n if (this.props.polling) {\n this.pollingInterval = setInterval(this.fetchData.bind(this), this.props.polling);\n }\n }\n\n /**\n * Sets the saved prop on the state (if changed) and fetches the data. This can provide as a way to manually toggle\n * a save event outside of the DataList context.\n *\n * @param prevProps\n */\n componentDidUpdate(prevProps: Props) {\n if (prevProps.saved !== this.props.saved && this.props.saved) {\n this.setState({ saved: this.props.saved }, this.fetchData.bind(this));\n }\n }\n\n /**\n * Tears down the polling interval.\n */\n componentWillUnmount() {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n }\n\n /**\n * Resets the page number and reloads the data.\n *\n * @returns {void|any|Promise<State>}\n */\n afterDelete() {\n if (this.state.items.length === 1) {\n return this.setState((state) => ({\n page: (state.page - 1) > 1 ? state.page - 1 : 1\n }), this.fetchData.bind(this));\n }\n\n return this.fetchData();\n }\n\n /**\n * Resets the page number and reloads the data.\n */\n afterDeleteAll() {\n this.setState({ page: 1 }, this.fetchData.bind(this));\n }\n\n /**\n * Calls the onLoad prop to populate the array of items in the state.\n */\n fetchData() {\n // Store the session information before fetching the data.\n this.setSession();\n\n // Set the loading indicator and fetch the data.\n this.setState({ loading: true }, () => {\n const {\n page,\n perPage,\n search,\n sortColumn,\n sortDirection\n } = this.state;\n\n const params = {\n ...this.state.filters,\n page,\n search,\n per_page: perPage,\n sort_by: sortColumn,\n sort_direction: sortDirection\n };\n\n this.props\n .onLoad(params)\n .then(({ data }) => {\n const items = data[this.props.collectionName];\n const { pages, count } = data.list;\n\n this.setState({\n count,\n items,\n page,\n pages,\n loading: false\n });\n });\n });\n }\n\n /**\n * Returns the default filters from the \"filter\" prop. This method will merge the default filter with the actual\n * filter and assign a UID value.\n *\n * @param props\n *\n * @returns {{filters: []}}\n */\n getDefaultFilters(props) {\n const filters = [];\n\n if (props.filters && props.filters.defaults) {\n _.each(props.filters.defaults.filters, (f) => {\n const filter = _.findWhere(props.filters.props.filters, { key: f.key });\n\n if (filter) {\n filters.push(this.onCreateFilter({ ...filter, ...f }));\n }\n });\n }\n\n return { filters };\n }\n\n /**\n * Returns the session storage key for the current list.\n *\n * @returns {string|null}\n */\n getSessionKey() {\n if (!this.props.session) {\n return null;\n }\n\n return `${SESSION_KEY}.${this.props.session.key}`;\n }\n\n /**\n * Initializes the state based on the passed props.\n *\n * @param props\n\n * @returns {{search: string, sortColumn: string, sortDirection: string, pages: number, perPage: (number|*),\n * saved: boolean, count: number, filters: (*|{}), page: number, error: null, loading: boolean, items: *[]}}\n */\n initializeState(props: Props) {\n const session = this.restoreSession();\n\n const filters = session.filters || this.getDefaultFilters(props);\n const page = session.page || 1;\n const perPage = session.perPage || props.defaultPerPage || _.first(props.perPageOptions);\n const search = session.search || props.defaultSearch || null;\n const sortColumn = session.sortColumn || props.defaultSort || null;\n const sortDirection = session.sortDirection || props.defaultSortDirection || null;\n\n return {\n count: 0,\n error: null,\n filters,\n items: [],\n loading: false,\n page,\n pages: 1,\n perPage,\n saved: props.saved || false,\n search,\n sortColumn,\n sortDirection\n };\n }\n\n /**\n * Returns true if any filters have been set.\n *\n * @returns {boolean}\n */\n isFilterActive() {\n let isActive = false;\n\n _.each(_.values(this.state.filters), (value) => {\n if (!ObjectUtils.isEmpty(value)) {\n isActive = true;\n }\n });\n\n return isActive;\n }\n\n /**\n * Clears the existing search.\n *\n * @param e\n */\n onClearSearch(e) {\n // Clear the current search\n this.onSearchChange(e, { value: '' });\n\n // Focus on the search input\n this.searchRef?.inputRef?.current?.focus();\n\n // Set the timer to execute a new search\n this.onSearch();\n }\n\n /**\n * Returns the passed filter with a \"uid\" property assigned.\n *\n * @param filter\n *\n * @returns {*&{uid: string}}\n */\n onCreateFilter(filter) {\n return {\n ...filter,\n uid: uuid()\n };\n }\n\n /**\n * Calls the onDelete prop.\n *\n * @param selectedItem\n *\n * @returns {Q.Promise<any> | Promise<R> | Promise<any> | void | *}\n */\n onDelete(selectedItem: any) {\n if (!this.props.onDelete) {\n return Promise.resolve();\n }\n\n return this.props\n .onDelete(selectedItem)\n .then(this.afterDelete.bind(this))\n .catch(this.onError.bind(this));\n }\n\n /**\n * Calls the onDeleteAll prop.\n *\n * @returns {Q.Promise<any> | Promise<R> | Promise<any> | void | *}\n */\n onDeleteAll() {\n if (!this.props.onDeleteAll) {\n return Promise.resolve();\n }\n\n return this.props\n .onDeleteAll()\n .then(this.afterDeleteAll.bind(this));\n }\n\n /**\n * Sets the error on the state if the component is configured to display errors.\n *\n * @param error\n *\n * @returns {*|void|Promise<State>}\n */\n onError(error: any) {\n return this.props.resolveErrors && this.setState({ error });\n }\n\n /**\n * Updates the state with the passed filters.\n *\n * @param filters\n *\n * @returns {Promise<R>}\n */\n onFilterChange(filters: any) {\n return new Promise<void>((resolve) => {\n // Call the custom onChange prop\n if (this.props.filters && this.props.filters.onChange) {\n this.props.filters.onChange(filters);\n }\n\n // Set the filters and re-fetch the data\n this.setState({ filters, page: 1 }, () => {\n this.fetchData();\n resolve();\n });\n });\n }\n\n /**\n * Sets the new active page and reloads the data.\n *\n * @param e\n * @param activePage\n */\n onPageChange(e: Event, { activePage }: { activePage: number }) {\n this.setState({ page: activePage }, this.fetchData.bind(this));\n }\n\n /**\n * Sets the perPage value and reloads the data.\n *\n * @param e\n * @param value\n */\n onPerPageChange(e: Event, { value }: { value: number }) {\n this.setState({ perPage: value }, this.fetchData.bind(this));\n }\n\n /**\n * Calls the onSave prop and reloads the data.\n *\n * @param item\n *\n * @returns {Q.Promise<any> | Promise<R> | Promise<any> | void | *}\n */\n onSave(item: any) {\n if (!this.props.onSave) {\n return Promise.resolve();\n }\n\n return Promise.resolve(this.props.onSave(item))\n .then(() => this.setState({ saved: true }, this.fetchData.bind(this)));\n }\n\n /**\n * Resets the page and reloads the data.\n */\n onSearch() {\n this.setState({ page: 1 }, this.fetchData.bind(this));\n }\n\n /**\n * Updates the search value on the state.\n *\n * @param e\n * @param value\n */\n onSearchChange(e: Event, { value }: { value: any }) {\n this.setState({ search: value });\n }\n\n /**\n * Updates the sortColumn and sortDirection props on the state.\n *\n * @param sortColumn\n * @param direction\n * @param page\n */\n onSort(sortColumn: string, direction?: string, page?: number = 1) {\n let sortDirection = direction;\n\n if (!sortDirection) {\n sortDirection = this.state.sortColumn === sortColumn && this.state.sortDirection === SORT_ASCENDING\n ? SORT_DESCENDING : SORT_ASCENDING;\n }\n\n this.setState({ sortColumn, sortDirection, page }, this.fetchData.bind(this));\n }\n\n /**\n * When no columns are sortable, load data as is\n *\n */\n onInit(page?: number = 1) {\n this.setState({ sortColumn: '', sortDirection: '', page }, this.fetchData.bind(this));\n }\n\n /**\n * Renders the DataList component.\n *\n * @returns {*}\n */\n render() {\n const { filters = {} } = this.props;\n const { component, props, showLabels } = filters;\n\n return (\n <>\n <WrappedComponent\n {...this.props}\n count={this.state.count}\n filters={{\n active: this.isFilterActive(),\n component,\n onChange: this.onFilterChange.bind(this),\n showLabels,\n props: {\n ...props,\n onCreateFilter: this.onCreateFilter.bind(this),\n item: this.state.filters\n }\n }}\n items={this.state.items}\n loading={this.state.loading}\n page={this.state.page}\n pages={this.state.pages}\n perPage={this.state.perPage}\n onDelete={this.onDelete.bind(this)}\n onDeleteAll={this.onDeleteAll.bind(this)}\n onPageChange={this.onPageChange.bind(this)}\n onPerPageChange={this.onPerPageChange.bind(this)}\n onSave={this.onSave.bind(this)}\n onSort={this.onSort.bind(this)}\n onInit={this.onInit.bind(this)}\n renderSearch={this.renderSearch.bind(this)}\n sortColumn={this.state.sortColumn}\n sortDirection={this.state.sortDirection}\n />\n {this.state.saved && (\n <Toaster\n onDismiss={() => this.setState({ saved: false })}\n type={Toaster.MessageTypes.positive}\n >\n <Message.Header\n content={i18n.t('Common.messages.save.header')}\n />\n <Message.Content\n content={i18n.t('Common.messages.save.content')}\n />\n </Toaster>\n )}\n {this.state.error && (\n <Toaster\n onDismiss={() => this.setState({ error: false })}\n timeout={0}\n type={Toaster.MessageTypes.negative}\n >\n <Message.Header\n content={i18n.t('Common.messages.error.header')}\n />\n <Message.List\n items={this.props.resolveErrors && this.props.resolveErrors(this.state.error)}\n />\n </Toaster>\n )}\n </>\n );\n }\n\n /**\n * Renders the search input component.\n *\n * @returns {null|*}\n */\n renderSearch() {\n if (!this.props.searchable) {\n return null;\n }\n\n return (\n <Input\n aria-label='Search'\n type='text'\n icon={(\n <Icon\n link={!_.isEmpty(this.state.search)}\n name={_.isEmpty(this.state.search) ? 'search' : 'times'}\n onClick={this.onClearSearch.bind(this)}\n />\n )}\n input={{\n 'aria-label': 'search'\n }}\n ref={(ref) => {\n this.searchRef = ref;\n }}\n loading={this.state.loading}\n onKeyDown={Timer.clearSearchTimer.bind(this)}\n onKeyUp={Timer.setSearchTimer.bind(this, this.onSearch.bind(this))}\n onChange={this.onSearchChange.bind(this)}\n size='small'\n value={this.state.search}\n />\n );\n }\n\n /**\n * Restores the DataList session object.\n */\n restoreSession() {\n const key = this.getSessionKey();\n\n if (!key) {\n return {};\n }\n\n const session = sessionStorage.getItem(key) || SESSION_DEFAULT;\n return JSON.parse(session);\n }\n\n /**\n * Sets the DataList session object.\n */\n setSession() {\n const key = this.getSessionKey();\n\n if (!key) {\n return;\n }\n\n const {\n filters,\n page,\n perPage,\n search,\n sortColumn,\n sortDirection\n } = this.state;\n\n sessionStorage.setItem(key, JSON.stringify({\n filters,\n page,\n perPage,\n search,\n sortColumn,\n sortDirection\n }));\n }\n }\n);\n\nexport default useDataList;\n\nexport {\n SORT_ASCENDING,\n SORT_DESCENDING\n};\n\nexport type {\n Props\n};\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-i18next\");","// @flow\n\nimport React, { useRef } from 'react';\nimport { Button, Dropdown } from 'semantic-ui-react';\nimport './DropdownButton.css';\n\ntype Option = {\n key: any,\n value: any,\n text: string\n};\n\ntype Props = {\n basic?: boolean,\n color?: string,\n direction?: string,\n disabled?: boolean,\n icon?: string,\n options: Array<Option>,\n onChange: (e: Event, { value: any }) => void,\n scrolling?: boolean,\n selectOnBlur?: boolean,\n text: string,\n value: any\n};\n\nconst DropdownButton = (props: Props) => {\n const dropdownRef = useRef();\n\n return (\n <Button.Group\n basic={props.basic}\n className='dropdown-button'\n color={props.color}\n >\n <Button\n aria-label='Select'\n content={props.text}\n disabled={props.disabled}\n icon={props.icon}\n onClick={(e) => dropdownRef.current && dropdownRef.current.handleClick(e)}\n />\n <Dropdown\n aria-label='Select'\n className='button icon'\n direction={props.direction}\n disabled={props.disabled}\n floating\n onChange={props.onChange.bind(this)}\n options={props.options}\n ref={dropdownRef}\n scrolling={props.scrolling}\n selectOnBlur={props.selectOnBlur}\n trigger={<></>}\n value={props.value}\n />\n </Button.Group>\n );\n};\n\nDropdownButton.defaultProps = {\n color: undefined,\n icon: undefined,\n selectOnBlur: false\n};\n\nexport default DropdownButton;\n","// @flow\n\nimport { useEditContainer, type EditContainerProps } from '@performant-software/shared-components';\nimport React, { type ComponentType, useState } from 'react';\nimport {\n Button,\n Dimmer,\n Loader,\n Message,\n Modal\n} from 'semantic-ui-react';\nimport Toaster from './Toaster';\nimport i18n from '../i18n/i18n';\nimport './EditModal.css';\n\ntype Props = EditContainerProps & {\n /**\n * The form component to render.\n */\n component: ComponentType<any>,\n\n /**\n * Callback fired when the close button is clicked.\n */\n onClose: () => void,\n\n /**\n * Callback fired when the save button is clicked.\n */\n onSave: () => Promise<any>,\n\n /**\n * If <code>true</code>, a loading indicator will display.\n */\n showLoading: boolean\n};\n\n/**\n * The <code>EditModal</code> component can be used to edit the details of a single record within a modal view. This\n * component uses the <code>EditContainer</code> higher-order component to facilitate all of the editing functionality.\n * This component is responsible for rendering the container in which the editable form is rendered.\n */\nconst EditModal = useEditContainer((props: Props) => {\n const OuterComponent = props.component;\n\n const [showToaster, setShowToaster] = useState(false);\n const hasErrors = !!(props.errors && props.errors.length);\n\n return (\n <OuterComponent\n {...props}\n >\n { props.showLoading && props.loading && (\n <Dimmer\n active={props.loading}\n inverted\n >\n <Loader\n content={i18n.t('Common.messages.loading')}\n />\n </Dimmer>\n )}\n { showToaster && hasErrors && (\n <Toaster\n onDismiss={() => setShowToaster(false)}\n timeout={0}\n type={Toaster.MessageTypes.negative}\n >\n <Message.Header\n content={i18n.t('Common.messages.error.header')}\n />\n <Message.List\n items={props.errors}\n />\n </Toaster>\n )}\n <Modal.Actions\n className='edit-modal-actions'\n >\n <Button\n disabled={props.saving}\n onClick={() => {\n setShowToaster(true);\n return props.onSave();\n }}\n primary\n size='medium'\n type='submit'\n >\n { i18n.t('Common.buttons.save') }\n { props.saving && (\n <Loader\n active\n className='saving'\n inline\n size='tiny'\n />\n )}\n </Button>\n <Button\n basic\n disabled={props.saving}\n onClick={props.onClose.bind(this)}\n size='medium'\n type='button'\n >\n { i18n.t('Common.buttons.cancel') }\n </Button>\n </Modal.Actions>\n </OuterComponent>\n );\n});\n\nEditModal.defaultProps = {\n showLoading: true\n};\n\nexport default EditModal;\n","// @flow\n\nimport { Timer } from '@performant-software/shared-components';\nimport React, { Component } from 'react';\nimport { Button, Dropdown, Message } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport EditModal from './EditModal';\nimport i18n from '../i18n/i18n';\nimport Toaster from './Toaster';\nimport './AssociatedDropdown.css';\n\ntype Option = {\n key: number | string,\n value: number | string,\n text: string\n};\n\ntype Props = {\n className?: string,\n collectionName: string,\n modal?: {\n component: Component<{}>,\n props: any,\n onSave: (item: any) => Promise<any>,\n state: any\n },\n onSearch: (search: string) => Promise<any>,\n onSelection: (item: any) => void,\n placeholder?: string,\n renderOption: (option: any) => Option,\n required?: boolean,\n searchQuery: string,\n value: ?number,\n upward?: boolean\n};\n\ntype State = {\n items: Array<any>,\n loading: boolean,\n modalAdd: boolean,\n options: Array<Option>,\n saved: boolean,\n searchQuery: string,\n value: ?number | ?string\n};\n\nconst TIMEOUT = 500;\n\nclass AssociatedDropdown extends Component<Props, State> {\n static defaultProps: any;\n\n timeout: ?TimeoutID;\n\n /**\n * Constructs a new AssociatedDropdown component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n items: [],\n loading: false,\n modalAdd: false,\n modalEdit: false,\n options: [],\n saved: false,\n searchQuery: props.searchQuery || '',\n value: props.value || ''\n };\n\n this.timeout = null;\n }\n\n /**\n * Sets the new search query and value on the state.\n *\n * @param prevProps\n */\n componentDidUpdate(prevProps: Props) {\n if (prevProps.value !== this.props.value) {\n const { searchQuery, value } = this.props;\n this.setState({ searchQuery, value });\n }\n }\n\n /**\n * Clears the search timer.\n */\n clearSearchTimer() {\n clearTimeout(this.timeout);\n }\n\n /**\n * Clears the search query value if an option was not selected.\n */\n onBlur() {\n this.setState((state) => {\n let searchQuery = '';\n\n if (state.value) {\n searchQuery = this.props.searchQuery;\n }\n\n return { searchQuery };\n });\n }\n\n /**\n * Clears the search query and value.\n */\n onClear() {\n this.setState({ searchQuery: '', value: '' }, () => {\n this.props.onSelection(this.state.value);\n });\n }\n\n /**\n * Clears the search query and executes the search.\n */\n onOpen() {\n this.setState({ searchQuery: '' }, this.onSearch.bind(this));\n }\n\n /**\n * Resets the search query and value on the state.\n *\n * @param e\n * @param value\n */\n onOptionSelection(e: Event, { value }: { value: any }) {\n this.setState((state) => {\n const option = _.findWhere(state.options, { value }) || {};\n this.setState({ searchQuery: option.text, value: option.value });\n });\n\n const item = _.findWhere(this.state.items, { id: value });\n this.props.onSelection(item);\n }\n\n /**\n * Executes the search to load the options.\n */\n onSearch() {\n this.setState({ loading: true }, this.search.bind(this));\n }\n\n /**\n * Sets the search query on the state.\n *\n * @param e\n * @param searchQuery\n */\n onSearchChange(e: Event, { searchQuery }: { searchQuery: string }) {\n this.setState({ searchQuery });\n }\n\n search() {\n this.props\n .onSearch(this.state.searchQuery)\n .then(({ data }) => {\n const items = data[this.props.collectionName];\n const options = items.map(this.props.renderOption.bind(this));\n\n this.setState({ items, options, loading: false });\n });\n }\n\n /**\n * Renders the AssociatedDropdown component.\n *\n * @returns {*}\n */\n render() {\n return (\n <div\n className='association-dropdown'\n >\n <div className='dropdown-container'>\n <Dropdown\n className={`inline-dropdown ${this.props.className || ''}`}\n disabled={this.state.loading}\n loading={this.state.loading}\n onBlur={this.onBlur.bind(this)}\n onChange={this.onOptionSelection.bind(this)}\n onOpen={this.onOpen.bind(this)}\n onSearchChange={this.onSearchChange.bind(this)}\n options={this.state.options}\n placeholder={this.props.placeholder}\n search={() => this.state.options}\n searchInput={{\n 'aria-label': this.props.collectionName,\n className: 'dropdown-search-input',\n onKeyDown: Timer.clearSearchTimer.bind(this),\n onKeyUp: Timer.setSearchTimer.bind(this, this.onSearch.bind(this))\n }}\n searchQuery={this.state.searchQuery}\n selectOnBlur={false}\n selection\n upward={this.props.upward}\n value={this.state.value}\n />\n </div>\n <Button.Group\n className='buttons'\n >\n { this.renderEditButton() }\n { this.renderAddButton() }\n { this.renderClearButton() }\n </Button.Group>\n { this.renderModal() }\n { this.state.saved && (\n <Toaster\n onDismiss={() => this.setState({ saved: false })}\n type={Toaster.MessageTypes.positive}\n >\n <Message.Header\n content={i18n.t('Common.messages.save.header')}\n />\n <Message.Content\n content={i18n.t('Common.messages.save.content')}\n />\n </Toaster>\n )}\n </div>\n );\n }\n\n /**\n * Renders the add button (if applicable).\n *\n * @returns {null|*}\n */\n renderAddButton() {\n if (!this.props.modal) {\n return null;\n }\n\n return (\n <Button\n basic\n content={i18n.t('Common.buttons.add')}\n icon='plus'\n onClick={() => this.setState({ modalAdd: true })}\n type='button'\n />\n );\n }\n\n /**\n * Renders the clear button.\n *\n * @returns {*}\n */\n renderClearButton() {\n if (this.props.required) {\n return null;\n }\n\n return (\n <Button\n basic\n content={i18n.t('Common.buttons.clear')}\n icon='times'\n onClick={this.onClear.bind(this)}\n type='button'\n />\n );\n }\n\n /**\n * Renders the edit button (if applicable).\n *\n * @returns {null|*}\n */\n renderEditButton() {\n if (!this.props.modal || !this.props.modal.props || !this.props.modal.props.onInitialize || !this.state.value) {\n return null;\n }\n\n return (\n <Button\n basic\n content={i18n.t('Common.buttons.edit')}\n icon='pencil'\n onClick={() => this.setState({ modalEdit: true })}\n type='button'\n />\n );\n }\n\n /**\n * Renders the add association button.\n *\n * @returns {null|*}\n */\n renderModal() {\n if (!((this.state.modalAdd || this.state.modalEdit) && this.props.modal)) {\n return null;\n }\n\n const { component, props, onSave } = this.props.modal;\n\n // If we're editing the existing record, pass the ID to the modal in order to retrieve the full record.\n let item;\n\n if (this.state.modalEdit) {\n item = {\n id: this.state.value\n };\n }\n\n return (\n <EditModal\n component={component}\n item={item}\n onClose={() => this.setState({ modalAdd: false, modalEdit: false })}\n onSave={(data) => onSave(data)\n .then((record) => {\n this.props.onSelection(record);\n this.setState({ modalAdd: false, modalEdit: false, saved: true });\n })}\n {...props}\n />\n );\n }\n\n /**\n * Sets the search timer.\n */\n setSearchTimer() {\n clearTimeout(this.timeout);\n this.timeout = setTimeout(this.onSearch.bind(this), TIMEOUT);\n }\n}\n\nAssociatedDropdown.defaultProps = {\n className: '',\n modal: null,\n placeholder: null,\n required: false,\n upward: false\n};\n\nexport default AssociatedDropdown;\n","// @flow\n\nimport React from 'react';\nimport { Icon, Input } from 'semantic-ui-react';\nimport './DateInput.css';\n\ntype Props = {\n /**\n * Display date, which will override the default date formatting.\n */\n display?: string,\n /**\n * An object containing date-time formatting options used by JavaScript Date objects.\n */\n formatOptions?: DateTimeFormatOptions,\n /**\n * Locale identifier (Unicode CLDR) for formatting dates and times.\n */\n locale?: string,\n /**\n * Callback fired when the date in the input field is changed.\n */\n onChange: (date: ?Date) => void,\n /**\n * Callback fired when the date input field is clicked, typically opening the actual method of\n * input (such as the <code>DatePicker</code> component).\n */\n onClick: () => void,\n /**\n * Current value of the date input form field, as a JavaScript Date object, or null.\n */\n value?: ?Date\n}\n\n/**\n * This input component is used to display and clear a date. It must be used with an additional\n * component, such as `DatePicker`, to actually input the date.\n */\nconst DateInput = (props: Props) => {\n const formatDate = () => {\n let date = '';\n\n if (props.display) {\n date = props.display;\n } else if (props.value) {\n date = props.value.toLocaleDateString(props.locale, props.formatOptions);\n }\n\n return date;\n };\n\n return (\n <Input\n aria-label='Date Input'\n className='date-input icon'\n icon='calendar alternate outline'\n iconPosition='left'\n >\n <Icon\n className='left icon'\n name='calendar alternate outline'\n />\n <input\n onClick={props.onClick.bind(this)}\n readOnly\n type='text'\n value={formatDate()}\n />\n <Icon\n className='right icon'\n name='times'\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n props.onChange(null);\n }}\n />\n </Input>\n );\n};\n\nexport default DateInput;\n","import React from 'react';\n\nconst ModalContext = React.createContext();\n\nexport default ModalContext;\n","// @flow\n\nimport { Calendar, Browser } from '@performant-software/shared-components';\nimport React, { Component } from 'react';\nimport {\n Button,\n Checkbox,\n Dropdown,\n Form,\n Input,\n Modal,\n TextArea\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport DateField from './DateInput';\nimport ModalContext from '../context/ModalContext';\nimport './FuzzyDate.css';\n\ntype DateInput = {\n accuracy: number,\n description: string,\n endDate: string,\n range: boolean,\n startDate: string\n};\n\ntype DateOutput = {\n accuracy: number,\n description: string,\n endDate?: Date,\n range: boolean,\n startDate?: Date\n};\n\ntype DateComponent = {\n date: number,\n month: number,\n year: number\n};\n\ntype Props = {\n calendar?: string,\n date: DateInput,\n description?: boolean,\n locale?: string,\n onChange: (data: DateOutput) => void,\n title?: string\n};\n\ntype State = {\n accuracy: number,\n calendar: Calendar,\n description: string,\n display: string,\n endDate: DateComponent,\n modal: boolean,\n range: boolean,\n startDate: DateComponent\n};\n\nconst ACCURACY_DATE = 2;\nconst ACCURACY_MONTH = 1;\nconst ACCURACY_YEAR = 0;\n\nconst INTEGER_BASE = 10;\n\nconst MAX_YEAR_LENGTH = 6;\n\nclass FuzzyDate extends Component<Props, State> {\n static defaultProps: any;\n\n /**\n * Constructs a new FuzzyDate component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n ...this.getInitialState(),\n calendar: new Calendar(props.locale, props.calendar)\n };\n }\n\n /**\n * Initializes the FuzzyDate component.\n */\n componentDidMount() {\n this.initializeDate();\n }\n\n /**\n * Sets the state based on prop changes.\n *\n * @param prevProps\n */\n componentDidUpdate(prevProps: Props) {\n if (this.props.locale !== prevProps.locale || this.props.calendar !== prevProps.calendar) {\n this.setState({\n calendar: new Calendar(this.props.locale, this.props.calendar)\n });\n }\n\n if (this.props.date\n && (this.props.date.startDate !== prevProps.date.startDate\n || this.props.date.endDate !== prevProps.date.endDate)) {\n this.initializeDate();\n }\n }\n\n /**\n * Returns the display string for the passed date component.\n *\n * @param dateComponent\n *\n * @returns {*}\n */\n getDisplayDate(dateComponent: DateComponent) {\n const date = this.state.calendar.convertToDate(dateComponent);\n return this.state.calendar.format(date, this.state.accuracy);\n }\n\n /**\n * Returns the initial state object.\n *\n * @returns {{endDate: {}, display: string, accuracy: number, description: string, range: boolean,\n * modal: boolean, startDate: {}}}\n */\n getInitialState() {\n return {\n accuracy: ACCURACY_YEAR,\n description: '',\n display: '',\n endDate: {},\n modal: false,\n range: false,\n startDate: {}\n };\n }\n\n /**\n * Initializes the date.\n */\n initializeDate() {\n if (this.props.date) {\n const { accuracy = ACCURACY_YEAR, description = '', range = false } = this.props.date;\n\n let startDate = {};\n let endDate = {};\n\n if (this.props.date.startDate) {\n startDate = this.state.calendar.parseDate(this.props.date.startDate);\n }\n\n if (this.props.date.endDate) {\n endDate = this.state.calendar.parseDate(this.props.date.endDate);\n }\n\n this.setState({\n accuracy,\n description,\n range,\n startDate,\n endDate\n }, this.setDisplay.bind(this));\n } else {\n this.onAccuracyChange(null, { value: ACCURACY_YEAR });\n }\n }\n\n /**\n * Sets the accuracy value on the state. The start and end date values are also adjusted based on the accuracy.\n *\n * @param e\n * @param value\n */\n onAccuracyChange(e: ?Event, { value }: { value: number }) {\n const accuracy = value;\n\n this.setState((state) => {\n let endDate = { ...state.endDate };\n let startDate = { ...state.startDate };\n\n if (accuracy === ACCURACY_MONTH) {\n endDate = { ...endDate, date: state.calendar.getDefaultDate() };\n startDate = { ...startDate, date: state.calendar.getDefaultDate() };\n } else if (value === ACCURACY_YEAR) {\n endDate = { ...endDate, date: state.calendar.getDefaultDate(), month: state.calendar.getDefaultMonth() };\n startDate = { ...startDate, date: state.calendar.getDefaultDate(), month: state.calendar.getDefaultMonth() };\n }\n\n return {\n accuracy,\n endDate,\n startDate\n };\n }, this.setEndDate.bind(this));\n }\n\n /**\n * Clears the input date(s).\n */\n onClear() {\n this.setState(this.getInitialState(), this.onSave.bind(this));\n }\n\n /**\n * Closes the edit modal.\n */\n onClose() {\n this.setState({ modal: false }, this.initializeDate.bind(this));\n }\n\n /**\n * Sets the date value on the state.\n *\n * @param property\n * @param e\n * @param value\n */\n onDateChange(property: string, e: ?Event, { value }: { value: string }) {\n this.setState((state) => ({\n [property]: {\n ...state[property],\n date: value\n }\n }), this.setEndDate.bind(this));\n }\n\n /**\n * Sets the date description on the state.\n *\n * @param e\n * @param value\n */\n onDescriptionChange(e: Event, { value }: { value: string }) {\n this.setState({ description: value });\n }\n\n /**\n * Opens the edit modal.\n */\n onEdit() {\n this.setState({ modal: true });\n }\n\n /**\n * Sets the month value on the state.\n *\n * @param property\n * @param e\n * @param value\n */\n onMonthChange(property: string, e: ?Event, { value }: { value: string }) {\n this.setState((state) => ({\n [property]: {\n ...state[property],\n month: value\n }\n }), this.setEndDate.bind(this));\n }\n\n /**\n * Sets the range value on the set.\n */\n onRangeChange() {\n this.setState((state) => ({ range: !state.range }), this.setEndDate.bind(this));\n }\n\n /**\n * Sets the display value and closes the edit modal.\n */\n onSave() {\n // Set the display value\n this.setDisplay();\n\n // Convert the state date and end date to Date objects can call the onChange prop\n let startDate;\n let endDate;\n\n if (!_.isEmpty(this.state.startDate)) {\n startDate = this.state.calendar.convertToDate(this.state.startDate).toDate();\n }\n\n if (!_.isEmpty(this.state.endDate)) {\n endDate = this.state.calendar.convertToDate(this.state.endDate).toDate();\n }\n\n const { accuracy, description, range } = this.state;\n\n this.props.onChange({\n accuracy,\n description,\n range,\n startDate,\n endDate\n });\n\n // Close the modal\n this.setState({ modal: false });\n }\n\n /**\n * Sets the year value on the state.\n *\n * @param property\n * @param e\n * @param value\n */\n onYearChange(property: string, e: ?Event, { value }: { value: string }) {\n if (value && value.length > MAX_YEAR_LENGTH) {\n return;\n }\n\n this.setState((state) => ({\n [property]: {\n ...state[property],\n year: parseInt(value, INTEGER_BASE)\n }\n }), this.setEndDate.bind(this));\n }\n\n /**\n * Renders the FuzzyDate component.\n *\n * @returns {*}\n */\n render() {\n return (\n <>\n <DateField\n display={this.state.display}\n onClick={this.onEdit.bind(this)}\n onChange={this.onClear.bind(this)}\n />\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n as={Form}\n className='fuzzy-date-modal'\n mountNode={mountNode}\n open={this.state.modal}\n onClose={this.onClose.bind(this)}\n >\n <Modal.Header\n content={this.props.title || i18n.t('FuzzyDate.title')}\n />\n <Modal.Content>\n <Form.Input\n className='accuracy-container'\n label={i18n.t('FuzzyDate.labels.accuracy')}\n >\n <Checkbox\n checked={this.state.accuracy === ACCURACY_YEAR}\n id='accuracy-year'\n label={i18n.t('FuzzyDate.accuracy.year')}\n name='accuracy'\n onChange={this.onAccuracyChange.bind(this)}\n radio\n value={ACCURACY_YEAR}\n />\n <Checkbox\n checked={this.state.accuracy === ACCURACY_MONTH}\n id='accuracy-month'\n label={i18n.t('FuzzyDate.accuracy.month')}\n name='accuracy'\n onChange={this.onAccuracyChange.bind(this)}\n radio\n value={ACCURACY_MONTH}\n />\n <Checkbox\n checked={this.state.accuracy === ACCURACY_DATE}\n id='accuracy-date'\n label={i18n.t('FuzzyDate.accuracy.date')}\n name='accuracy'\n onChange={this.onAccuracyChange.bind(this)}\n radio\n value={ACCURACY_DATE}\n />\n </Form.Input>\n <Form.Group>\n { this.renderYear('startDate') }\n { this.renderMonth('startDate') }\n { this.renderDate('startDate') }\n { !this.state.range && (\n <div\n className='button-container'\n >\n <Button\n basic\n content={i18n.t('FuzzyDate.buttons.addRange')}\n icon='plus'\n onClick={this.onRangeChange.bind(this)}\n />\n </div>\n )}\n </Form.Group>\n { this.state.range && (\n <Form.Group>\n { this.renderYear('endDate') }\n { this.renderMonth('endDate') }\n { this.renderDate('endDate') }\n <div\n className='button-container'\n >\n <Button\n basic\n content={i18n.t('FuzzyDate.buttons.removeRange')}\n icon='times'\n onClick={this.onRangeChange.bind(this)}\n />\n </div>\n </Form.Group>\n )}\n { this.props.description && (\n <Form.Input\n id='description'\n label={i18n.t('FuzzyDate.labels.description')}\n >\n <TextArea\n id='description'\n onChange={this.onDescriptionChange.bind(this)}\n value={this.state.description}\n />\n </Form.Input>\n )}\n </Modal.Content>\n <Modal.Actions>\n <Button\n onClick={this.onSave.bind(this)}\n primary\n size='medium'\n type='submit'\n >\n { i18n.t('Common.buttons.save') }\n </Button>\n <Button\n basic\n onClick={this.onClose.bind(this)}\n size='medium'\n type='button'\n >\n { i18n.t('Common.buttons.cancel') }\n </Button>\n </Modal.Actions>\n </Modal>\n )}\n </ModalContext.Consumer>\n </>\n );\n }\n\n /**\n * Renders the date dropdown for the passed property.\n *\n * @param property\n *\n * @returns {null|*}\n */\n renderDate(property: string) {\n if (this.state.accuracy !== ACCURACY_DATE) {\n return null;\n }\n\n const date = this.state[property];\n const daysInMonth = this.state.calendar.daysInMonth(date.year, date.month);\n\n return (\n <Form.Input\n id='date-dropdown'\n label={i18n.t('FuzzyDate.labels.date')}\n >\n <Dropdown\n id='date-dropdown'\n onChange={this.onDateChange.bind(this, property)}\n options={_.range(1, daysInMonth + 1).map((i) => ({ key: i, value: i, text: i }))}\n selection\n value={date.date || this.state.calendar.getDefaultDate()}\n />\n </Form.Input>\n );\n }\n\n /**\n * Renders the month dropdown for the passed property.\n *\n * @param property\n *\n * @returns {null|*}\n */\n renderMonth(property: string) {\n if (this.state.accuracy !== ACCURACY_DATE && this.state.accuracy !== ACCURACY_MONTH) {\n return null;\n }\n\n return (\n <Form.Input\n id='month-dropdown'\n label={i18n.t('FuzzyDate.labels.month')}\n >\n <Dropdown\n id='month-dropdown'\n onChange={this.onMonthChange.bind(this, property)}\n options={_.map(this.state.calendar.listMonths(), (m, i) => ({ key: i, value: i, text: m }))}\n selection\n value={this.state[property].month || this.state.calendar.getDefaultMonth()}\n />\n </Form.Input>\n );\n }\n\n /**\n * Renders the year dropdown for the passed property.\n *\n * @param property\n *\n * @returns {*}\n */\n renderYear(property: string) {\n return (\n <Form.Input\n id='year'\n label={i18n.t('FuzzyDate.labels.year')}\n >\n <Input\n id='year'\n onChange={this.onYearChange.bind(this, property)}\n type='number'\n value={this.state[property].year || ''}\n />\n </Form.Input>\n );\n }\n\n /**\n * Sets the display value.\n */\n setDisplay() {\n const display = [];\n\n if (this.state.startDate && !_.isEmpty(this.state.startDate)) {\n display.push(this.getDisplayDate(this.state.startDate));\n }\n\n if (this.state.range && this.state.endDate && !_.isEmpty(this.state.endDate)) {\n display.push(' - ');\n display.push(this.getDisplayDate(this.state.endDate));\n }\n\n this.setState({\n display: display.join(' ')\n });\n }\n\n /**\n * Sets the end date value.\n */\n setEndDate() {\n if (this.state.range || !this.state.startDate || _.isEmpty(this.state.startDate)) {\n return;\n }\n\n this.setState((state) => {\n let endDate = state.calendar.convertToDate(state.startDate);\n\n if (state.accuracy === ACCURACY_YEAR) {\n endDate = state.calendar.addYear(endDate, 1);\n } else if (state.accuracy === ACCURACY_MONTH) {\n endDate = state.calendar.addMonth(endDate, 1);\n } else if (state.accuracy === ACCURACY_DATE) {\n endDate = state.calendar.addDate(endDate, 1);\n }\n\n return {\n endDate: state.calendar.parseDate(endDate)\n };\n });\n }\n}\n\nFuzzyDate.defaultProps = {\n calendar: Calendar.Calendars.gregorian,\n description: true,\n locale: Browser.isBrowser() && navigator.language,\n title: undefined\n};\n\nexport default FuzzyDate;\n","// @flow\n\nimport { type EditContainerProps } from '@performant-software/shared-components';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n type Element\n} from 'react';\nimport {\n Button,\n Checkbox,\n Dropdown,\n Form,\n Grid,\n Header,\n Input,\n Modal\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport AssociatedDropdown from './AssociatedDropdown';\nimport DropdownButton from './DropdownButton';\nimport FuzzyDate from './FuzzyDate';\nimport ModalContext from '../context/ModalContext';\n\ntype Option = {\n key: string | number,\n icon?: string,\n text: string,\n value: any\n};\n\ntype Filter = {\n collectionName?: 'string',\n key: string,\n label: string,\n onSearch?: (search: string) => Promise<any>,\n operator: ?string,\n options?: Array<Option>,\n renderOption?: (item: any) => Option,\n renderSearchQuery?: (item: any) => Element<any> | string,\n searchQuery?: string,\n type: string,\n value: ?any\n};\n\ntype Props = EditContainerProps & {\n filters: Array<Filter>,\n item: {\n filters: Array<Filter>,\n onSort: (filter: Filter) => any\n },\n onCreateFilter: (filter: Filter) => any\n};\n\nconst FilterTypes = {\n boolean: 'boolean',\n date: 'date',\n integer: 'integer',\n relationship: 'relationship',\n select: 'select',\n string: 'string',\n text: 'text'\n};\n\nconst FilterOperators = {\n equal: 'equal',\n notEqual: 'not_equal',\n contain: 'contain',\n notContain: 'not_contain',\n empty: 'empty',\n notEmpty: 'not_empty',\n greaterThan: 'greater_than',\n lessThan: 'less_than'\n};\n\nconst FilterOperatorOptions = [{\n key: FilterOperators.equal,\n value: FilterOperators.equal,\n text: i18n.t('ListFilters.operators.equal')\n}, {\n key: FilterOperators.notEqual,\n value: FilterOperators.notEqual,\n text: i18n.t('ListFilters.operators.notEqual')\n}, {\n key: FilterOperators.contain,\n value: FilterOperators.contain,\n text: i18n.t('ListFilters.operators.contain')\n}, {\n key: FilterOperators.notContain,\n value: FilterOperators.notContain,\n text: i18n.t('ListFilters.operators.notContain')\n}, {\n key: FilterOperators.empty,\n value: FilterOperators.empty,\n text: i18n.t('ListFilters.operators.empty')\n}, {\n key: FilterOperators.notEmpty,\n value: FilterOperators.notEmpty,\n text: i18n.t('ListFilters.operators.notEmpty')\n}, {\n key: FilterOperators.greaterThan,\n value: FilterOperators.greaterThan,\n text: i18n.t('ListFilters.operators.greaterThan')\n}, {\n key: FilterOperators.lessThan,\n value: FilterOperators.lessThan,\n text: i18n.t('ListFilters.operators.lessThan')\n}];\n\nconst OperatorsByType = {\n [FilterTypes.boolean]: [\n FilterOperators.equal\n ],\n [FilterTypes.date]: [\n FilterOperators.equal\n ],\n [FilterTypes.relationship]: [\n FilterOperators.equal,\n FilterOperators.notEqual,\n FilterOperators.empty,\n FilterOperators.notEmpty\n ],\n [FilterTypes.select]: [\n FilterOperators.equal,\n FilterOperators.notEqual,\n FilterOperators.empty,\n FilterOperators.notEmpty\n ],\n [FilterTypes.string]: [\n FilterOperators.equal,\n FilterOperators.notEqual,\n FilterOperators.contain,\n FilterOperators.notContain,\n FilterOperators.empty,\n FilterOperators.notEmpty\n ],\n [FilterTypes.text]: [\n FilterOperators.contain,\n FilterOperators.notContain,\n FilterOperators.empty,\n FilterOperators.notEmpty\n ]\n};\n\nconst ListFilters = (props: Props) => {\n /**\n * Returns the available operators for the passed filter type.\n *\n * @type {function(string): *}\n */\n const getOperatorsByType = useCallback((type: string) => {\n const operators = OperatorsByType[type];\n return _.filter(FilterOperatorOptions, (option) => !operators || _.contains(operators, option.key));\n }, []);\n\n /**\n * Default sort function.\n *\n * @param filter\n */\n const onDefaultSort = (filter) => filter.label;\n\n /**\n * Renders the input element for the passed filter.\n *\n * @type {(function(Filter): (null|*))|*}\n */\n const renderInput = useCallback((filter: Filter) => {\n // No need to render an input for \"empty\" or \"not empty\" operators\n if (filter.operator === FilterOperators.empty || filter.operator === FilterOperators.notEmpty) {\n return null;\n }\n\n // Render a checkbox for boolean types\n if (filter.type === FilterTypes.boolean) {\n return (\n <Checkbox\n onChange={() => props.onSaveChildAssociation('filters', { ...filter, value: !filter.value })}\n checked={filter.value}\n />\n );\n }\n\n // Render a text input for string, text, and integer types\n if (filter.type === FilterTypes.string || filter.type === FilterTypes.text || filter.type === FilterTypes.integer) {\n return (\n <Input\n onChange={(e, { value }) => props.onSaveChildAssociation('filters', { ...filter, value })}\n value={filter.value}\n />\n );\n }\n\n // Render a fuzzy date input for date types\n if (filter.type === FilterTypes.date) {\n return (\n <FuzzyDate\n date={filter.value || {}}\n description={false}\n onChange={(value) => {\n props.onSaveChildAssociation('filters', {\n ...filter,\n value\n });\n }}\n title={filter.label}\n />\n );\n }\n\n // Render a dropdown\n if (filter.type === FilterTypes.select) {\n return (\n <Dropdown\n onChange={(e, { value }) => props.onSaveChildAssociation('filters', { ...filter, value })}\n options={filter.options}\n selectOnBlur={false}\n selection\n value={filter.value}\n />\n );\n }\n\n // Render an AssociatedDropdown for relationship types\n if (filter.type === FilterTypes.relationship) {\n const {\n collectionName,\n onSearch,\n renderOption,\n renderSearchQuery,\n searchQuery,\n value\n } = filter;\n\n if (!(collectionName && onSearch && renderOption)) {\n return null;\n }\n\n return (\n <AssociatedDropdown\n collectionName={collectionName}\n onSearch={onSearch}\n onSelection={(item) => {\n props.onSaveChildAssociation('filters', {\n ...filter,\n searchQuery: renderSearchQuery && renderSearchQuery(item),\n value: item.id\n });\n }}\n renderOption={renderOption}\n required\n searchQuery={searchQuery || ''}\n value={value || null}\n />\n );\n }\n\n return null;\n }, [props.item.filters, props.onSaveChildAssociation]);\n\n /**\n * Sort the filters according to the onSort prop if provided.\n *\n * @type {unknown}\n */\n const filters = useMemo(() => _.sortBy(\n props.filters,\n props.item.onSort || onDefaultSort\n ), [props.filters, props.item.onSort]);\n\n /**\n * Since the filters may be restored from the session storage, complex object and functions are not serialized. Here\n * we'll default any properties for existing filters that could not be serialized when the component is mounted.\n */\n useEffect(() => {\n _.each(props.item.filters, (filter) => {\n const defaults = _.findWhere(props.filters, { key: filter.key });\n\n if (filter.type === FilterTypes.boolean) {\n defaults.value = false;\n }\n\n props.onSaveChildAssociation('filters', _.defaults(filter, defaults));\n });\n }, []);\n\n return (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n as={Form}\n centered={false}\n className='list-filters-modal'\n mountNode={mountNode}\n noValidate\n open\n size='small'\n >\n <Modal.Header>\n <Grid\n columns={2}\n >\n <Grid.Column\n verticalAlign='middle'\n >\n <Header\n content={i18n.t('ListFilters.title')}\n />\n </Grid.Column>\n <Grid.Column\n textAlign='right'\n >\n <DropdownButton\n color='green'\n icon='plus'\n options={_.map(filters, (filter) => ({\n key: filter.key,\n value: filter.key,\n text: filter.label\n }))}\n onChange={(e, { value }) => {\n const filter = _.findWhere(props.filters, { key: value });\n props.onSaveChildAssociation('filters', props.onCreateFilter({\n ...filter,\n operator: FilterOperators.equal\n }));\n }}\n scrolling\n text={i18n.t('ListFilters.buttons.add')}\n value=''\n />\n <Button\n color='red'\n content={i18n.t('ListFilters.buttons.reset')}\n icon='repeat'\n onClick={() => props.onReset()}\n style={{\n marginLeft: '1em'\n }}\n />\n </Grid.Column>\n </Grid>\n </Modal.Header>\n <Modal.Content>\n { !_.isEmpty(props.item.filters) && (\n <Grid>\n { _.map(props.item.filters, (filter) => (\n <Grid.Row\n columns={4}\n key={filter.key}\n verticalAlign='middle'\n >\n <Grid.Column>\n <Header\n content={filter.label}\n />\n </Grid.Column>\n <Grid.Column\n width={5}\n >\n <Dropdown\n options={getOperatorsByType(filter.type)}\n onChange={(e, { value }) => props.onSaveChildAssociation('filters', {\n ..._.omit(filter, 'value'),\n operator: value,\n })}\n selection\n value={filter.operator}\n />\n </Grid.Column>\n <Grid.Column\n width={5}\n >\n { renderInput(filter) }\n </Grid.Column>\n <Grid.Column\n width={1}\n >\n <Button\n basic\n icon='times'\n onClick={() => props.onDeleteChildAssociation('filters', filter)}\n />\n </Grid.Column>\n </Grid.Row>\n ))}\n </Grid>\n )}\n </Modal.Content>\n { props.children }\n </Modal>\n )}\n </ModalContext.Consumer>\n );\n};\n\nexport default ListFilters;\n\nexport {\n FilterTypes,\n FilterOperators,\n FilterOperatorOptions\n};\n\nexport type {\n Filter\n};\n","// @flow\n\nimport React, { useCallback } from 'react';\nimport { Button, Label } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport { FilterOperatorOptions, type Filter } from './ListFilters';\nimport './FilterLabels.css';\n\ntype Props = {\n filters: Array<Filter>,\n onClear?: () => void,\n onClick: (filter: Filter) => void\n};\n\nconst FilterLabels = (props: Props) => {\n /**\n * Returns the content string for the passed filter.\n *\n * @type {function(*): string}\n */\n const getContent = useCallback((filter) => {\n // Content will always container the label\n const content = [filter.label];\n\n // If an option can be found, use the text from the operator\n const option = _.findWhere(FilterOperatorOptions, { key: filter.operator });\n if (option) {\n content.push(option.text);\n }\n\n // Append the value in quotes, if present\n if (filter.value) {\n content.push(`\"${filter.value}\"`);\n }\n\n return content.join(' ');\n }, []);\n\n return (\n <Label.Group\n className='filter-labels'\n >\n { _.map(props.filters, (filter) => (\n <Label\n basic\n content={getContent(filter)}\n onRemove={() => props.onClick(filter)}\n />\n ))}\n { props.onClear && (\n <Label\n as={Button}\n color='red'\n content={i18n.t('FilterLabels.buttons.clear')}\n icon='times'\n onClick={props.onClear}\n />\n )}\n </Label.Group>\n );\n};\n\nexport default FilterLabels;\n","// @flow\n\nimport React, { Component, type ComponentType, type Element } from 'react';\nimport { Trans } from 'react-i18next';\nimport {\n Button,\n Confirm,\n Grid,\n Header,\n Icon,\n Menu,\n Pagination\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport DropdownButton from './DropdownButton';\nimport EditModal from './EditModal';\nimport FilterLabels from './FilterLabels';\nimport './List.css';\n\ntype Action = {\n accept: (item: any) => boolean,\n color?: string,\n icon?: string,\n name: string,\n onClick?: (item: any) => void,\n popup: {\n content: string,\n title: string\n },\n render?: (item: any, index: number) => Element<any>,\n title?: string\n};\n\ntype ListButton = {\n accept?: () => boolean,\n render: (index?: number) => Element<any>\n};\n\ntype Props = {\n /**\n * A list of actions to render for each element in the row. Actions with the names \"edit\" and \"delete\" will be\n * handled specially by the <code>List</code> higher-order component.\n */\n actions?: Array<Action>,\n\n /**\n * If provided, a button will display in the list header allowing the addition of items to the list. When clicked,\n * the <code>modal</code> prop will be rendered.\n */\n addButton?: {\n basic: boolean,\n color: string,\n content?: string,\n inverted?: boolean,\n location: string,\n onClick?: () => void,\n secondary?: boolean\n },\n\n /**\n * A list of arbitrary buttons to the display in the list header. All actions will be handled by the consuming\n * component.\n * <br />\n * <br />\n *\n * In addition to the props listed here for each button, buttons will also accept any of the Semantic UI\n * <a href=\"https://react.semantic-ui.com/elements/button/\" target=\"_blank\">Button</a> props.\n */\n buttons?: Array<ListButton>,\n\n /**\n * The number of total records in the list (not just the current page).\n */\n count?: number,\n\n /**\n * CSS class name to append to the <code>div</code> container.\n */\n className?: string,\n\n /**\n * If provided, a \"delete all\" button will be rendered in the list header.\n */\n deleteButton?: {\n color: string,\n location: string,\n onClick?: () => void\n },\n\n /**\n * If provided, the passed <code>component</code> will be rendered when the filter button is clicked.\n * <br />\n * <br />\n *\n * Values passed in the <code>defaults</code> and <code>props</code> properties will be made available in the\n * passed component.\n * <br />\n * <br />\n *\n * The <code>onChange</code> callback will fire when the filters are modified. This action will also reload the list,\n * passing the new filters the <code>onLoad</code> callback.\n */\n filters?: {\n active: boolean,\n component: Component<{}>,\n props?: any,\n state?: any,\n onChange: (params: any) => Promise<any>,\n showLabels?: boolean\n },\n\n /**\n * If provided, the passed modal will be rendered when the \"add\" button is clicked.\n */\n modal?: {\n component: ComponentType<any>,\n props: any,\n state: any\n },\n\n /**\n * If provided, this callback is fired when the \"copy\" action is clicked for an item. The consuming component\n * should generate a copy of the selected item and return that value. The return value is then set at the\n * current item in the edit modal.\n */\n onCopy?: (item: any) => any,\n\n /**\n * Callback fired when the \"delete\" action is clicked for an item.\n */\n onDelete?: (item: any) => void,\n\n /**\n * Callback fired when the delete all button is clicked. This prop expects a Promise as the return value.\n */\n onDeleteAll?: () => Promise<any>,\n\n /**\n * Callback fired when the page is changed via the pagination component.\n */\n onPageChange?: () => void,\n\n /**\n * Callback fired when the per page value is changed.\n */\n onPerPageChange?: () => void,\n\n /**\n * Callback fired when the save button is clicked in the add/edit modal. This function expects a Promise as the\n * return value.\n */\n onSave?: (item: any) => Promise<any>,\n\n /**\n * Current page number.\n */\n page?: number,\n\n /**\n * Number of pages in the list.\n */\n pages?: number,\n\n /**\n * The number of records to display per page.\n */\n perPage?: number,\n\n /**\n * The options to display in the dropdown for the per page selector.\n */\n perPageOptions?: Array<number>,\n\n /**\n * Custom render function for the modal that appears on the \"delete\" action.\n */\n renderDeleteModal?: ({ selectedItem: any, onCancel: () => void, onConfirm: () => void }) => Element<any>,\n\n /**\n * If provided, this function will return a JSX element that will prepend to the list header.\n */\n renderListHeader?: () => ?Element<any>,\n\n /**\n * If provided, this function will return a JSX element that will replace the default search input.\n */\n renderSearch?: () => Element<any>,\n\n /**\n * If set to <code>true</code>, checkboxes will render as the first table column, allowing each row to be selectable.\n * The consuming component is responsible for tracking the selected items.\n */\n selectable?: boolean,\n\n /**\n * If <code>true</code>, the total number of records will display in the list header.\n */\n showRecordCount?: boolean\n};\n\ntype State = {\n modalDelete: boolean,\n modalDeleteAll: boolean,\n modalEdit: boolean,\n modalFilter: boolean,\n selectedItem: any\n};\n\nconst BUTTON_KEY_ADD = 'add';\nconst BUTTON_KEY_DELETE_ALL = 'delete-all';\n\n/**\n * Renders a function to wrap the passed component in a List. This component will be used as the presentation for the\n * list, additional logic will be defined elsewhere. This component will render list header buttons, pagination,\n * search input, add/edit/delete modals, filter button, filter modal.\n *\n * @param WrappedComponent\n */\nconst useList = (WrappedComponent: ComponentType<any>) => (\n class extends Component<Props, State> {\n // Default props\n static defaultProps = {\n actions: [],\n addButton: {\n basic: true,\n color: 'green',\n location: 'top'\n },\n buttons: [],\n className: '',\n filters: undefined,\n modal: undefined,\n page: 1,\n pages: 1,\n onColumnClick: () => {},\n onCopy: undefined,\n onPageChange: () => {},\n renderDeleteModal: undefined,\n renderSearch: undefined,\n sortColumn: undefined,\n sortDirection: undefined\n };\n\n /**\n * Constructs a new List component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n modalDelete: false,\n modalDeleteAll: false,\n modalEdit: false,\n modalFilter: false,\n selectedItem: null\n };\n }\n\n /**\n * Renders the list of buttons for the passed location.\n *\n * @param location\n */\n getButtons(location: string) {\n const buttons = [];\n\n const {\n addButton = {},\n deleteButton = {},\n modal,\n selectable\n } = this.props;\n\n // Add the add button to the list if the location specified is the passed location.\n if (addButton.location === location && (addButton.onClick || modal) && !selectable) {\n buttons.push({\n render: this.renderAddButton.bind(this)\n });\n }\n\n // Add the delete all button to the list if the location specified is the passed location.\n if (deleteButton.location === location && this.props.onDeleteAll && !selectable) {\n buttons.push({\n render: this.renderDeleteAllButton.bind(this)\n });\n }\n\n // Resolve the array of other buttons\n buttons.push(..._.filter(this.props.buttons, (button) => {\n let include = false;\n\n /*\n * Include the button if the buttons specifies the passed location.\n * Include the button if no location is specified, but the add button is at the passed location.\n * Finally, include the button if the passed location is the top location.\n */\n if ((button.location || 'top') === location) {\n include = true;\n } else if (!button.location && addButton && addButton.location === location) {\n include = true;\n }\n\n return include;\n }));\n\n return buttons;\n }\n\n /**\n * Displays the add/edit modal.\n */\n onAddButton() {\n return this.props.addButton && this.props.addButton.onClick\n ? this.props.addButton.onClick()\n : this.setState({ modalEdit: true });\n }\n\n /**\n * Copies the selected item and displays the add/edit modal.\n *\n * @param selectedItem\n */\n onCopyButton(selectedItem: any) {\n const copy = this.props.onCopy\n ? this.props.onCopy(selectedItem)\n : _.omit(selectedItem, 'id', 'uid');\n\n this.setState({ selectedItem: copy, modalEdit: true });\n }\n\n /**\n * Deletes the currently selected item and clears the state.\n *\n * @returns {*}\n */\n onDelete() {\n const { selectedItem } = this.state;\n this.setState({ selectedItem: null, modalDelete: false });\n\n return this.props.onDelete(selectedItem);\n }\n\n /**\n * Deletes all items in the current list and resets the state.\n *\n * @returns {*}\n */\n onDeleteAll() {\n this.setState({ modalDeleteAll: false });\n return this.props.onDeleteAll && this.props.onDeleteAll();\n }\n\n /**\n * Displays the delete all confirmation modal.\n */\n onDeleteAllButton() {\n this.setState({ modalDeleteAll: true });\n }\n\n /**\n * Displays the delete confirmation modal for the selected item.\n *\n * @param selectedItem\n */\n onDeleteButton(selectedItem: any) {\n this.setState({ selectedItem, modalDelete: true });\n }\n\n /**\n * Displays the add/edit modal for the selected item.\n *\n * @param selectedItem\n */\n onEditButton(selectedItem: any) {\n this.setState({ selectedItem, modalEdit: true });\n }\n\n /**\n * Opens the filters modal.\n */\n onFilterButton() {\n this.setState({ modalFilter: true });\n }\n\n /**\n * Calls the filter onChange function with the passed filter removed.\n *\n * @param filter\n *\n * @returns {*}\n */\n onRemoveFilter(filter) {\n const { onChange, props: { item } } = this.props.filters;\n return onChange({ filters: _.filter(item.filters, (f) => f.uid !== filter.uid) });\n }\n\n /**\n * Saves the passed item and closes the add/edit modal.\n *\n * @param item\n *\n * @returns {*}\n */\n onSave(item: any) {\n return this.props\n .onSave(item)\n .then(() => this.setState({ modalEdit: false, selectedItem: null }));\n }\n\n /**\n * Calls the filters onChange prop and closes the modal.\n *\n * @param filters\n *\n * @returns {Q.Promise<any> | Promise<R> | Promise<any> | void | *}\n */\n onSaveFilter(filters: any) {\n if (!this.props.filters) {\n return null;\n }\n\n return this.props.filters\n .onChange(filters)\n .then(() => this.setState({ modalFilter: false }));\n }\n\n /**\n * Renders the DataTable component.\n *\n * @returns {*}\n */\n render() {\n return (\n <div\n className={`list ${this.props.className}`}\n >\n { this.renderHeader() }\n <WrappedComponent\n {...this.props}\n actions={this.getActions()}\n renderEmptyMessage={this.renderEmptyMessage.bind(this)}\n />\n { this.renderFooter() }\n { this.renderEditModal() }\n { this.renderDeleteModal() }\n { this.renderDeleteAllModal() }\n { this.renderFilterModal() }\n </div>\n );\n }\n\n /**\n * Returns the list of actions with pre-populated defaults for edit, copy, and delete.\n *\n * @returns {*}\n */\n getActions() {\n return _.map(this.props.actions, (action) => {\n let defaults = {};\n\n if (action.name === 'edit') {\n defaults = {\n icon: 'edit outline',\n onClick: this.onEditButton.bind(this)\n };\n } else if (action.name === 'copy') {\n defaults = {\n icon: 'copy outline',\n onClick: this.onCopyButton.bind(this)\n };\n } else if (action.name === 'delete') {\n defaults = {\n icon: 'times circle outline',\n onClick: this.onDeleteButton.bind(this)\n };\n }\n\n return _.defaults(action, defaults);\n });\n }\n\n /**\n * Renders the add button.\n *\n * @returns {*}\n */\n renderAddButton() {\n if (!this.props.addButton) {\n return null;\n }\n\n return (\n <Button\n basic={this.props.addButton.basic !== false}\n color={this.props.addButton.color}\n key={BUTTON_KEY_ADD}\n inverted={this.props.addButton.inverted}\n onClick={this.onAddButton.bind(this)}\n secondary={this.props.addButton.secondary}\n >\n <Icon name='plus' />\n { this.props.addButton.content || i18n.t('List.buttons.add') }\n </Button>\n );\n }\n\n /**\n * Renders the passed button. If a render function is provided, call the render function. Otherwise, assume\n * button props.\n *\n * @param button\n * @param index\n *\n * @returns {*}\n */\n renderButton(button: any, index: number) {\n if (button.render) {\n return button.render(index);\n }\n\n if (button.accept && !button.accept()) {\n return null;\n }\n\n return (\n <Button\n key={index}\n {...button}\n />\n );\n }\n\n /**\n * Renders the delete all button.\n *\n * @returns {null|*}\n */\n renderDeleteAllButton() {\n if (!this.props.deleteButton) {\n return null;\n }\n\n return (\n <Button\n basic\n color={this.props.deleteButton.color}\n key={BUTTON_KEY_DELETE_ALL}\n onClick={this.onDeleteAllButton.bind(this)}\n >\n <Icon name='times' />\n { i18n.t('List.buttons.deleteAll') }\n </Button>\n );\n }\n\n /**\n * Renders the delete all modal if visible.\n *\n * @returns {null|*}\n */\n renderDeleteAllModal() {\n if (!this.state.modalDeleteAll) {\n return null;\n }\n\n return (\n <Confirm\n content={i18n.t('List.deleteAllContent')}\n header={<Header icon='trash alternate outline' content={i18n.t('List.deleteAllHeader')} />}\n onCancel={() => this.setState({ modalDeleteAll: false })}\n onConfirm={this.onDeleteAll.bind(this)}\n open\n />\n );\n }\n\n /**\n * Renders the delete modal if visible.\n *\n * @returns {null|*}\n */\n renderDeleteModal() {\n if (!this.state.modalDelete) {\n return null;\n }\n\n const { selectedItem } = this.state;\n const onCancel = () => this.setState({ selectedItem: null, modalDelete: false });\n const onConfirm = this.onDelete.bind(this);\n\n if (this.props.renderDeleteModal) {\n return this.props.renderDeleteModal({ selectedItem, onConfirm, onCancel });\n }\n\n return (\n <Confirm\n content={i18n.t('List.deleteContent')}\n header={<Header icon='trash alternate outline' content={i18n.t('List.deleteHeader')} />}\n onCancel={onCancel}\n onConfirm={onConfirm}\n open\n />\n );\n }\n\n /**\n * Renders the edit modal if visible.\n *\n * @returns {null|*}\n */\n renderEditModal() {\n if (!this.props.modal || !this.state.modalEdit) {\n return null;\n }\n\n const { component, props } = this.props.modal;\n\n return (\n <EditModal\n component={component}\n onClose={() => this.setState({ selectedItem: null, modalEdit: false })}\n onSave={this.onSave.bind(this)}\n item={this.state.selectedItem}\n {...props}\n />\n );\n }\n\n /**\n * Renders the empty message text/component. The message content is based on whether or not records can be added\n * to this data table.\n *\n * @returns {*}\n */\n renderEmptyMessage() {\n const { addButton = {}, modal } = this.props;\n if (!(addButton.onClick || modal)) {\n return i18n.t('List.emptyList');\n }\n\n return (\n <Trans i18nKey='List.emptyListAdd'>\n You haven't added any yet. Click\n <div className='empty-button'>\n { this.renderAddButton() }\n </div>\n to get started.\n </Trans>\n );\n }\n\n /**\n * Renders the filter button component.\n *\n * @returns {null|*}\n */\n renderFilterButton() {\n if (!(this.props.filters && this.props.filters.component)) {\n return null;\n }\n\n return (\n <Button\n active={this.props.filters.active}\n aria-label='Filter'\n basic\n icon='filter'\n onClick={this.onFilterButton.bind(this)}\n />\n );\n }\n\n /**\n * Renders the filter modal if visible.\n *\n * @returns {null|*}\n */\n renderFilterModal() {\n if (!this.props.filters || !this.state.modalFilter) {\n return null;\n }\n\n const { component, props } = this.props.filters;\n\n return (\n <EditModal\n {...props}\n component={component}\n onClose={() => this.setState({ modalFilter: false })}\n onSave={this.onSaveFilter.bind(this)}\n />\n );\n }\n\n /**\n * Renders the list footer.\n *\n * @returns {null|*}\n */\n renderFooter() {\n let renderFooter = false;\n\n const buttons = this.getButtons('bottom');\n if (buttons && buttons.length) {\n renderFooter = true;\n }\n\n const hasPages = this.props.pages && this.props.pages > 1;\n if (hasPages) {\n renderFooter = true;\n }\n\n const showCount = this.props.count && this.props.showRecordCount;\n if (showCount) {\n renderFooter = true;\n }\n\n if (!renderFooter) {\n return null;\n }\n\n return (\n <div className='footer'>\n <Grid\n columns={2}\n >\n <Grid.Column\n textAlign='left'\n >\n { showCount ? this.renderRecordCount() : '' }\n { _.map(buttons, (button) => button.render()) }\n </Grid.Column>\n <Grid.Column\n textAlign='right'\n >\n { hasPages ? this.renderPagination() : ''}\n </Grid.Column>\n </Grid>\n </div>\n );\n }\n\n /**\n * Renders the table header.\n *\n * @returns {null|*}\n */\n renderHeader() {\n let renderHeader = false;\n\n const buttons = this.getButtons('top');\n\n if (buttons && buttons.length) {\n renderHeader = true;\n }\n\n const {\n filters,\n perPageOptions,\n renderListHeader,\n renderSearch\n } = this.props;\n\n if (filters || perPageOptions || renderListHeader || renderSearch) {\n renderHeader = true;\n }\n\n const hasLabels = filters && filters.showLabels && !_.isEmpty(filters.props.item.filters);\n\n if (!renderHeader) {\n return null;\n }\n\n return (\n <div\n className='header'\n >\n <Grid\n className={hasLabels ? 'filter-labels' : undefined}\n verticalAlign='top'\n >\n <Grid.Row\n columns={2}\n >\n <Grid.Column\n textAlign='left'\n >\n { _.map(buttons, this.renderButton.bind(this)) }\n </Grid.Column>\n <Grid.Column\n textAlign='right'\n >\n <Menu\n compact\n borderless\n secondary\n className='flex-end-menu'\n >\n { renderListHeader && (\n <Menu.Menu className='list-header-menu'>\n { renderListHeader() }\n </Menu.Menu>\n )}\n <Menu.Menu>\n { filters && this.renderFilterButton() }\n </Menu.Menu>\n { perPageOptions && (\n <Menu.Menu className='per-page-menu'>\n { this.renderPerPage() }\n </Menu.Menu>\n )}\n <Menu.Menu>\n { renderSearch && renderSearch() }\n </Menu.Menu>\n </Menu>\n </Grid.Column>\n </Grid.Row>\n { hasLabels && (\n <Grid.Row\n columns={1}\n >\n <Grid.Column>\n <FilterLabels\n filters={filters.props.item.filters}\n onClear={() => filters.onChange({ filters: [] })}\n onClick={(filter) => this.onRemoveFilter(filter)}\n />\n </Grid.Column>\n </Grid.Row>\n )}\n </Grid>\n </div>\n );\n }\n\n /**\n * Renders the pagination component.\n *\n * @returns {null|*}\n */\n renderPagination() {\n return (\n <Pagination\n activePage={this.props.page}\n firstItem={null}\n lastItem={null}\n onPageChange={this.props.onPageChange.bind(this)}\n size='mini'\n totalPages={this.props.pages}\n />\n );\n }\n\n /**\n * Renders the per page selector.\n *\n * @returns {JSX.Element}\n */\n renderPerPage() {\n const { perPage } = this.props;\n\n return (\n <DropdownButton\n basic\n icon='list'\n onChange={this.props.onPerPageChange.bind(this)}\n options={_.map(this.props.perPageOptions, (count) => ({\n key: count,\n value: count,\n text: count\n }))}\n text={i18n.t('List.labels.perPage', { perPage })}\n value={perPage}\n />\n );\n }\n\n /**\n * Renders the record count component.\n *\n * @returns {null|*}\n */\n renderRecordCount() {\n const { count } = this.props;\n return (\n <p className='record-count'>\n {`${Number(count).toLocaleString()} ${i18n.t('List.record', { count })}`}\n </p>\n );\n }\n }\n);\n\nexport default useList;\n\nexport type {\n Action,\n Props\n};\n","// @flow\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n type Element\n} from 'react';\nimport _ from 'underscore';\nimport { Button, Checkbox, Dropdown } from 'semantic-ui-react';\nimport NestedAccordion from './NestedAccordion';\nimport useDataList, { SORT_ASCENDING } from './DataList';\nimport useList, { type Props as ListProps } from './List';\nimport './AccordionDataList.css';\n\ntype Sort = {\n key: any,\n value: any,\n text: string,\n direction?: string\n};\n\ntype Props = ListProps & {\n getChildItems: (items: ?Array<any>, item: any) => Array<any>,\n getRootItems: (items: ?Array<any>) => Array<any>,\n page: number,\n onInit: () => void,\n onSort: (column: string, direction: ?string, page?: number) => void,\n selectable: boolean,\n sort?: Array<Sort>,\n sortColumn?: string,\n sortDirection?: string\n};\n\ntype AccordionProps = ListProps & {\n getChildItems: (items: Array<any>, item: any) => Array<any>,\n onItemToggle: (item: any) => void,\n onRowSelect: (?any, ?any, ?any) => void,\n renderItem: (item: any) => Element<any>,\n rootItems: Array<any>,\n selectable: boolean,\n selectedRows: Array<{id: number}>,\n showToggle: (item: any) => boolean\n};\n\nconst Accordion = useList((props: AccordionProps) => {\n /**\n * Renders the actions for the passed item.\n *\n * @type {(function(*=): (null|*))|*}\n */\n const renderActions = useCallback((item) => {\n const actions = _.filter(props.actions, (action) => !action.accept || action.accept(item));\n\n if (_.isEmpty(actions)) {\n return null;\n }\n\n return (\n <Button.Group>\n { _.map(actions, (action, index) => (\n <Button\n aria-label={action.name}\n basic\n color={action.color}\n icon={action.icon}\n key={`${action.name}-${index}`}\n onClick={action.onClick && action.onClick.bind(this, item)}\n title={action.title}\n />\n ))}\n </Button.Group>\n );\n }, [props.actions]);\n\n /**\n * Renders the checkbox for the passed item.\n *\n * @type {(function(*=): (null|*))|*}\n */\n const renderCheckbox = useCallback((item) => {\n if (!props.selectable) {\n return null;\n }\n\n return (\n <Checkbox\n key={`select-checkbox-${item.id}`}\n className='row-select-checkbox'\n onClick={(e, el) => props.onRowSelect(el, item, e)}\n checked={!!props.selectedRows.find((r) => r.id === item.id)}\n />\n );\n }, [props.onRowSelect, props.selectable, props.selectedRows]);\n\n return (\n <div\n className={['accordion-data-list', props.className || ''].join(' ')}\n >\n <NestedAccordion\n getChildItems={props.getChildItems}\n onItemToggle={(item) => props.onItemToggle && props.onItemToggle(item)}\n renderItem={(item) => props.renderItem(item)}\n renderRight={(item) => (\n <>\n { renderActions(item) }\n { renderCheckbox(item) }\n </>\n )}\n rootItems={props.rootItems}\n showToggle={(item) => props.showToggle(item)}\n />\n </div>\n );\n});\n\nconst AccordionDataList = (props: Props) => {\n const rootItems = useMemo(() => props.getRootItems(props.items), [props.items]);\n const getChildItems = useCallback((item) => props.getChildItems(props.items, item), [props.items]);\n const sortDropdown = useRef<?typeof Dropdown>();\n\n /**\n * Sets the current sort value.\n *\n * @type {unknown}\n */\n const sortValue = useMemo(() => {\n const sort = _.find(props.sort, { value: props.sortColumn });\n return sort && sort.text;\n }, [props.sort, props.sortColumn]);\n\n /**\n * Toggles the sort property.\n *\n * @type {(function(*): void)|*}\n */\n const onSort = useCallback((sort) => {\n if (!props.onSort) {\n return;\n }\n\n let sortDirection;\n\n if (sort.value !== props.sortColumn) {\n sortDirection = sort.direction;\n }\n\n props.onSort(sort.value, sortDirection);\n }, [props.onSort, props.sortColumn]);\n\n /**\n * Renders the sort dropdown.\n *\n * @type {(function(): (null|*))|*}\n */\n const renderSort = useCallback(() => {\n if (_.isEmpty(props.sort)) {\n return null;\n }\n\n return (\n <Button.Group\n basic\n style={{\n fontSize: 'inherit'\n }}\n >\n <Button\n aria-label='Sort by'\n content={sortValue}\n icon={props.sortDirection === SORT_ASCENDING ? 'sort alphabet up' : 'sort alphabet down'}\n onClick={(e) => sortDropdown.current && sortDropdown.current.handleClick(e)}\n />\n <Dropdown\n aria-label='Sort by toggle'\n className='button icon'\n floating\n options={_.map(props.sort, (sort) => ({\n ...sort,\n onClick: () => onSort(sort)\n }))}\n ref={sortDropdown}\n trigger={<></>}\n value={props.sortColumn}\n />\n </Button.Group>\n );\n }, [props.sort, props.sortColumn, props.sortDirection]);\n\n /**\n * Sorts the first column on component mount. If no sort properties are defined, the onInit prop is called.\n */\n useEffect(() => {\n if (_.isEmpty(props.sort)) {\n return props.onInit();\n }\n\n const { page } = props;\n let { sortColumn = '', sortDirection = SORT_ASCENDING } = props;\n\n if (!sortColumn) {\n const defaultSort = _.first(props.sort);\n\n if (defaultSort) {\n sortColumn = defaultSort.value;\n\n if (defaultSort.direction) {\n sortDirection = defaultSort.direction;\n }\n }\n }\n\n return props.onSort(sortColumn, sortDirection, page);\n }, []);\n\n return (\n <Accordion\n {...props}\n renderListHeader={renderSort}\n rootItems={rootItems}\n getChildItems={getChildItems}\n />\n );\n};\n\nexport default useDataList(AccordionDataList);\n","// @flow\n\nimport { Object as ObjectUtils, Timer } from '@performant-software/shared-components';\nimport React, { Component } from 'react';\nimport {\n Button,\n Checkbox,\n Confirm,\n Grid,\n Header,\n Input,\n Message,\n Pagination\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport EditModal from './EditModal';\nimport NestedAccordion from './NestedAccordion';\nimport Toaster from './Toaster';\nimport './AccordionList.css';\n\ntype Props = {\n buttons: Array<Object>,\n canAddItem?: (item: any) => boolean,\n canCopyItem?: (item: any) => boolean,\n canDeleteItem?: (item: any) => boolean,\n canEditItem?: (item: any) => boolean,\n className?: string,\n collectionName: string,\n getChildItems: (items: Array<any>, item: any) => Array<any>,\n getRootItems: (items: Array<any>) => Array<any>,\n hideAddRootButton: boolean,\n lazyLoad: boolean,\n modal?: {\n component: Component<{}>,\n onAddItem: (item: any) => any,\n props: any,\n state: any,\n },\n onCopy: (item: any) => any,\n onDelete: (item: any) => Promise<any>,\n onRowSelect: (?any, ?any, ?any) => void,\n onSave: (item: any) => Promise<any>,\n onSearch: (?number | ?string, ?number | ?string) => Promise<any>,\n onSelectAll: (?any, ?any, ?any, ?any) => void,\n pagination: boolean,\n renderItem: (item: any) => string | Component<{}>,\n selectable: boolean,\n selectedRows: Array<{id: number}>,\n showRecordCount: boolean,\n showToggle: (item: any) => boolean,\n};\n\ntype State = {\n count: number,\n items: Array<any>,\n modalAdd: boolean,\n modalDelete: boolean,\n page: ?number,\n pages: ?number,\n saved: boolean,\n searchQuery: string,\n selectedItem: ?any\n};\n\nclass AccordionList extends Component<Props, State> {\n static defaultProps: any;\n\n /**\n * Constructs a new AccordionList component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n count: 0,\n items: [],\n modalAdd: false,\n modalDelete: false,\n page: 1,\n pages: 1,\n saved: false,\n searchQuery: '',\n selectedItem: null\n };\n }\n\n /**\n * Executes the initial search.\n */\n componentDidMount() {\n this.onSearch();\n }\n\n /**\n * Displays the add modal for the selected item.\n *\n * @param item\n */\n onAddButton(item: any) {\n let selectedItem = item;\n if (this.props.modal && this.props.modal.onAddItem) {\n selectedItem = this.props.modal.onAddItem(item);\n }\n\n this.setState({ modalAdd: true, selectedItem });\n }\n\n /**\n * Deletes the currently selected item.\n *\n * @returns {*}\n */\n onDelete() {\n const item = this.state.selectedItem;\n\n return this.props\n .onDelete(item)\n .then(() => {\n this.setState((state) => ({\n modalDelete: false,\n selectedItem: null,\n items: _.reject(state.items, (i) => i === item)\n }));\n });\n }\n\n /**\n * Displays the delete modal and sets the selected item.\n *\n * @param item\n */\n onDeleteButton(item: any) {\n this.setState({ modalDelete: true, selectedItem: item });\n }\n\n /**\n * Displays the edit modal and sets the selected item.\n *\n * @param item\n */\n onEditButton(item: any) {\n this.setState({ modalAdd: true, selectedItem: item });\n }\n\n /**\n * Copies the selected item and displays the add/edit modal.\n *\n * @param selectedItem\n */\n onCopyButton(selectedItem: any) {\n let copy;\n if (this.props.onCopy) {\n copy = this.props.onCopy(selectedItem);\n if (ObjectUtils.isPromise(copy)) {\n copy.then((item) => {\n this.setState({ selectedItem: item, modalAdd: true });\n });\n } else {\n copy = _.omit(selectedItem, 'id', 'uid');\n this.setState({ selectedItem: copy, modalAdd: true });\n }\n }\n }\n\n /**\n * Lazy-loads the children of the passed item and sets them on the state..\n *\n * @param item\n */\n onItemToggle(item: any) {\n if (!item.loaded && this.props.lazyLoad) {\n this.onSearch(item.id).then(() => {\n // Set the \"loaded\" property on item to prevent multiple API calls\n this.setState((state) => ({\n items: _.map(state.items, (i) => (i.id === item.id ? { ...i, loaded: true } : i))\n }));\n });\n }\n }\n\n /**\n * Changes active page and fetches new set of paginated data.\n */\n onPageChange(e: any, selectedPage: any) {\n this.setState({ page: selectedPage.activePage }, () => this.onSearch());\n }\n\n /**\n * Saves the passed item.\n *\n * @param item\n *\n * @returns {*}\n */\n onSave(item: any) {\n return this.props\n .onSave(item)\n .then((saved) => {\n this.setState((state) => ({\n modalAdd: false,\n selectedItem: false,\n saved: true,\n items: item.id ? _.map(state.items, (i) => (i.id === saved.id ? saved : i)) : [...state.items, saved]\n }));\n });\n }\n\n /**\n * Executes the search and sets the returned items on the state.\n *\n * @param parentId\n *\n * @returns {*}\n */\n onSearch(parentId?: number) {\n if (this.props.lazyLoad) {\n return this.props\n .onSearch(parentId, this.state.searchQuery)\n .then(({ data }) => {\n const items = data[this.props.collectionName];\n this.setState((state) => (parentId\n ? { items: [...state.items || [], ...items] }\n : { items }));\n });\n }\n // for models that use a join table or a relationship\n // structure other than nestable node levels/ancestors\n return this.props\n .onSearch(this.state.searchQuery, this.state.page)\n .then(({ data }) => {\n const items = data[this.props.collectionName];\n this.setState({ items });\n if (this.props.showRecordCount) {\n this.setState({ count: data.list.count });\n }\n if (this.props.pagination) {\n const pageCount = data.list.pages;\n this.setState({ pages: pageCount });\n }\n });\n }\n\n /**\n * Sets the search query on the state.\n *\n * @param e\n * @param value\n */\n onSearchChange(e: Event, { value }: any) {\n this.setState({ searchQuery: value });\n }\n\n /**\n * Renders the AccordionList component.\n *\n * @returns {*}\n */\n render() {\n return (\n <div\n className={['accordion-list', this.props.className || ''].join(' ')}\n >\n <Header\n className='accordion-header'\n >\n <Input\n aria-label='Search'\n autoFocus\n className='search'\n icon='search'\n onKeyDown={Timer.clearSearchTimer.bind(this)}\n onKeyUp={Timer.setSearchTimer.bind(this, this.onSearch.bind(this))}\n onChange={this.onSearchChange.bind(this)}\n size='mini'\n type='text'\n value={this.state.searchQuery}\n />\n { this.renderHeaderAddButton() }\n { this.props.buttons.map((b) => b.render()) }\n </Header>\n { this.renderSubHeader() }\n <NestedAccordion\n getChildItems={this.props.getChildItems.bind(this, this.state.items)}\n onItemToggle={this.onItemToggle.bind(this)}\n renderItem={this.props.renderItem.bind(this)}\n renderRight={this.renderRight.bind(this)}\n rootItems={this.props.getRootItems(this.state.items)}\n showToggle={this.props.showToggle.bind(this)}\n />\n { this.renderFooter() }\n { this.renderAddModal() }\n <Confirm\n content={i18n.t('AccordionList.deleteContent')}\n header={i18n.t('AccordionList.deleteHeader')}\n open={this.state.modalDelete}\n onCancel={() => this.setState({ modalDelete: false, selectedItem: null })}\n onConfirm={this.onDelete.bind(this)}\n />\n { this.state.saved && (\n <Toaster\n onDismiss={() => this.setState({ saved: false })}\n type={Toaster.MessageTypes.positive}\n >\n <Message.Header\n content={i18n.t('Common.messages.save.header')}\n />\n <Message.Content\n content={i18n.t('Common.messages.save.content')}\n />\n </Toaster>\n )}\n </div>\n );\n }\n\n /**\n * Renders the add button for the passed item (if applicable).\n *\n * @param item\n *\n * @returns {null|*}\n */\n renderAddButton(item: any) {\n if (this.props.canAddItem && !this.props.canAddItem(item)) {\n return null;\n }\n\n return (\n <Button\n aria-label='Add'\n basic\n compact\n icon='plus'\n onClick={this.onAddButton.bind(this, item)}\n />\n );\n }\n\n renderSelectAll() {\n if (!this.props.selectable && !this.props.onSelectAll) {\n return null;\n }\n\n const selectedRowIds = this.props.selectedRows.map((r) => r.id);\n const itemsOnPage = this.state.items ? this.state.items : [];\n const toBeSelected = itemsOnPage.reduce((tbs, item) => (\n selectedRowIds.includes(item.id) ? tbs : [...tbs, item]), []);\n\n return (\n <Checkbox\n aria-label='Select All'\n onClick={(e, el) => this.props.onSelectAll(el, toBeSelected, this.state.items, e)}\n checked={!toBeSelected.length}\n />\n );\n }\n\n renderSubHeader() {\n return (\n <div className='sub-header'>\n { this.renderSelectAll() }\n </div>\n );\n }\n\n /**\n * Renders the add modal.\n *\n * @returns {null|*}\n */\n renderAddModal() {\n if (!(this.state.modalAdd && this.props.modal)) {\n return null;\n }\n const { component, props } = this.props.modal;\n\n return (\n <EditModal\n component={component}\n item={this.state.selectedItem}\n onClose={() => this.setState({ modalAdd: false, selectedItem: null })}\n onSave={this.onSave.bind(this)}\n {...props}\n />\n );\n }\n\n /**\n * Renders the delete button for the passed item (if applicable).\n *\n * @param item\n *\n * @returns {null|*}\n */\n renderDeleteButton(item: any) {\n if (this.props.canDeleteItem && !this.props.canDeleteItem(item)) {\n return null;\n }\n\n return (\n <Button\n aria-label='Delete'\n basic\n compact\n icon='trash'\n onClick={this.onDeleteButton.bind(this, item)}\n />\n );\n }\n\n /**\n * Renders the edit button for the passed item (if applicable).\n *\n * @param item\n *\n * @returns {null|*}\n */\n renderEditButton(item: any) {\n if (this.props.canEditItem && !this.props.canEditItem(item)) {\n return null;\n }\n\n return (\n <Button\n aria-label='Edit'\n basic\n compact\n icon='edit'\n onClick={this.onEditButton.bind(this, item)}\n />\n );\n }\n\n /**\n * Renders the copy button for the passed item (if applicable).\n *\n * @param item\n *\n * @returns {null|*}\n */\n renderCopyButton(item: any) {\n if (this.props.canCopyItem && !this.props.canCopyItem(item)) {\n return null;\n }\n\n return (\n <Button\n aria-label='Copy'\n basic\n compact\n icon='copy'\n onClick={() => this.onCopyButton(item)}\n />\n );\n }\n\n /**\n * Renders the header add button.\n *\n * @returns {null|*}\n */\n renderHeaderAddButton() {\n if (!this.props.modal || this.props.hideAddRootButton) {\n return null;\n }\n\n return (\n <Button\n basic\n className='add-button'\n content={i18n.t('Common.buttons.add')}\n icon='plus'\n onClick={() => this.setState({ modalAdd: true })}\n />\n );\n }\n\n /**\n * Renders the record count component.\n *\n * @returns {null|*}\n */\n renderRecordCount() {\n const recordCount = this.state.count;\n if (!recordCount) {\n return null;\n }\n\n return (\n <span className='record-count'>\n {`${Number(recordCount).toLocaleString()} ${i18n.t('AccordionList.record', { count: recordCount })}`}\n </span>\n );\n }\n\n /**\n * Renders the pagination button row.\n *\n * @returns {null|*}\n */\n renderPagination() {\n if (!this.props.pagination) {\n return null;\n }\n\n return (\n <Pagination\n activePage={this.state.page}\n onPageChange={this.onPageChange.bind(this)}\n size='mini'\n totalPages={this.state.pages}\n />\n );\n }\n\n /**\n * Renders the footer.\n *\n * @returns {null|*}\n */\n renderFooter() {\n if (this.props.pagination || this.props.showRecordCount) {\n return (\n <div className='footer'>\n <Grid\n columns={2}\n >\n <Grid.Column\n textAlign='left'\n >\n { this.renderRecordCount() }\n </Grid.Column>\n <Grid.Column\n textAlign='right'\n >\n { this.renderPagination() }\n </Grid.Column>\n </Grid>\n </div>\n );\n }\n return null;\n }\n\n /**\n * Renders the select checkbox for the passed item.\n *\n * @returns {null|*}\n */\n renderSelectCheckbox(item: {id: number}) {\n if (!this.props.selectable) {\n return null;\n }\n const selected = this.props.selectedRows.find((r) => r.id === item.id);\n return (\n <Checkbox\n aria-label='Select'\n key={`select-checkbox-${item.id}`}\n className='row-select-checkbox'\n onClick={(e, el) => this.props.onRowSelect(el, item, e)}\n checked={!!selected}\n />\n );\n }\n\n /**\n * Renders the right side of the passed item.\n *\n * @param item\n *\n * @returns {*}\n */\n renderRight(item: any) {\n return (\n <>\n <Button.Group>\n { this.renderAddButton(item) }\n { this.renderEditButton(item) }\n { this.renderCopyButton(item) }\n { this.renderDeleteButton(item) }\n </Button.Group>\n { this.renderSelectCheckbox(item) }\n </>\n );\n }\n}\n\nAccordionList.defaultProps = {\n buttons: [],\n canAddItem: () => true,\n canDeleteItem: () => true,\n canEditItem: () => true,\n canCopyItem: () => false,\n className: '',\n lazyLoad: true,\n modal: undefined,\n pagination: false\n};\n\nexport default AccordionList;\n","// @flow\n\nimport React, { type Element } from 'react';\nimport { Button, Segment } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport './SelectizeHeader.css';\n\ntype Props = {\n isSelected: (item: any) => boolean,\n items: Array<any>,\n onItemClick: (item: any) => void,\n renderItem: (item: any) => string | Element<any>\n};\n\nconst SelectizeHeader = (props: Props) => {\n if (!(props.items && props.items.length)) {\n return null;\n }\n\n return (\n <Segment\n className='selectize-header'\n textAlign='left'\n >\n { _.map(props.items, (item, index) => (\n <Button\n className='selected'\n content={props.renderItem(item)}\n icon={props.isSelected(item) ? 'times circle outline' : undefined}\n key={index}\n onClick={props.onItemClick.bind(this, item)}\n primary\n size='small'\n />\n ))}\n </Segment>\n );\n};\n\nexport default SelectizeHeader;\n","// @flow\n\nimport { Timer } from '@performant-software/shared-components';\nimport React, { Component, type ComponentType, type Element } from 'react';\nimport { withTranslation } from 'react-i18next';\nimport {\n Button,\n Grid,\n Header,\n Icon,\n Input,\n Message,\n Modal\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport EditModal from './EditModal';\nimport ModalContext from '../context/ModalContext';\nimport NestedAccordion from './NestedAccordion';\nimport SelectizeHeader from './SelectizeHeader';\nimport Toaster from './Toaster';\nimport './AccordionSelector.css';\n\ntype Props = {\n collectionName: string,\n getChildItems: (items: Array<any>, item: any) => Array<any>,\n getRootItems: (items: Array<any>) => Array<any>,\n isSelectable?: (item: any) => boolean,\n modal?: {\n component: ComponentType<{}>,\n onSave: (item: any) => Promise<any>,\n props: any,\n state: any,\n },\n multiple?: boolean,\n onClose: () => void,\n onSave: (selectedItems: Array<any>) => void,\n onSearch: (parentId: ?number, search: ?string) => any,\n open?: boolean,\n renderItem: (item: any) => string | Element<any>,\n selectedItems?: Array<any>,\n showToggle: (item: any) => boolean,\n title?: string\n};\n\ntype State = {\n items: Array<any>,\n modalAdd: boolean,\n saved: boolean,\n searchQuery: string,\n selectedItem: ?any,\n selectedItems: Array<any>\n};\n\nclass AccordionSelector extends Component<Props, State> {\n static defaultProps: any;\n\n /**\n * Constructs a new AccordionSelector component.\n *\n * @param props\n */\n constructor(props) {\n super(props);\n\n this.state = {\n items: [],\n modalAdd: false,\n saved: false,\n searchQuery: '',\n selectedItem: null,\n selectedItems: props.selectedItems\n };\n }\n\n /**\n * Executes the initial search when the modal is opened.\n */\n componentDidUpdate(prevProps) {\n if (this.props.open && !prevProps.open) {\n this.onSearch();\n }\n\n if (this.props.selectedItems !== prevProps.selectedItems) {\n this.setState({ selectedItems: this.props.selectedItems });\n }\n }\n\n /**\n * Returns true if the passed item is selected.\n *\n * @param item\n *\n * @returns {boolean}\n */\n isSelected(item) {\n return !!_.findWhere(this.state.selectedItems, { id: item.id });\n }\n\n /**\n * Toggles selection for the passed item.\n *\n * @param item\n */\n onItemClick(item) {\n if (this.props.isSelectable && !this.props.isSelectable(item)) {\n return;\n }\n\n this.setState((state) => {\n let selectedItems;\n\n if (this.isSelected(item)) {\n selectedItems = _.filter(state.selectedItems, (i) => i.id !== item.id);\n } else if (!this.props.multiple) {\n selectedItems = [item];\n } else {\n selectedItems = [\n ...state.selectedItems,\n item\n ];\n }\n\n return { selectedItems };\n });\n }\n\n /**\n * Toggles selection for the passed item.\n *\n * @param item\n */\n onItemSelection(item) {\n if (this.state.selectedItem === item) {\n this.setState({ selectedItem: null }, this.onItemClick.bind(this, item));\n } else {\n this.setState({ selectedItem: item });\n }\n }\n\n /**\n * Lazy-loads the children for the passed item.\n *\n * @param item\n */\n onItemToggle(item) {\n if (!item.loaded) {\n this.onSearch(item.id).then(() => {\n // Set the \"loaded\" property on item to prevent multiple API calls\n this.setState((state) => ({\n items: _.map(state.items, (i) => (i.id === item.id ? { ...i, loaded: true } : i))\n }));\n });\n }\n }\n\n /**\n * Executes the search.\n *\n * @param parentId\n *\n * @returns {*}\n */\n onSearch(parentId = null) {\n return this.props\n .onSearch(parentId, this.state.searchQuery)\n .then(({ data }) => {\n const items = data[this.props.collectionName];\n this.setState((state) => (parentId ? { items: [...state.items || [], ...items] } : { items }));\n });\n }\n\n /**\n * Sets the search query value on the state.\n *\n * @param e\n * @param value\n */\n onSearchChange(e, { value }) {\n this.setState({ searchQuery: value });\n }\n\n /**\n * Renders the AccordionSelector modal.\n *\n * @returns {*}\n */\n render() {\n return (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n className='accordion-selector'\n mountNode={mountNode}\n open={this.props.open}\n size='small'\n >\n <Modal.Header>\n <Grid\n columns={2}\n verticalAlign='middle'\n >\n <Grid.Column\n textAlign='left'\n width={7}\n >\n <Header\n content={this.props.title\n ? this.props.title\n : i18n.t('AccordionSelector.title')}\n />\n </Grid.Column>\n <Grid.Column\n textAlign='right'\n width={9}\n >\n <Input\n aria-label='Search'\n autoFocus\n icon='search'\n onKeyDown={Timer.clearSearchTimer.bind(this)}\n onKeyUp={Timer.setSearchTimer.bind(this, this.onSearch.bind(this))}\n onChange={this.onSearchChange.bind(this)}\n size='mini'\n type='text'\n value={this.state.searchQuery}\n />\n { this.renderAddButton() }\n </Grid.Column>\n </Grid>\n </Modal.Header>\n <Modal.Content>\n <SelectizeHeader\n isSelected={(item) => this.state.selectedItem === item}\n items={this.state.selectedItems}\n onItemClick={this.onItemSelection.bind(this)}\n renderItem={this.props.renderItem.bind(this)}\n />\n <NestedAccordion\n getChildItems={this.props.getChildItems.bind(this, this.state.items)}\n onItemClick={this.onItemClick.bind(this)}\n onItemToggle={this.onItemToggle.bind(this)}\n renderItem={this.props.renderItem.bind(this)}\n renderRight={this.renderRight.bind(this)}\n rootItems={this.props.getRootItems(this.state.items)}\n showToggle={this.props.showToggle.bind(this)}\n />\n { this.renderAddModal() }\n { this.state.saved && (\n <Toaster\n onDismiss={() => this.setState({ saved: false })}\n type={Toaster.MessageTypes.positive}\n >\n <Message.Header\n content={i18n.t('Common.messages.save.header')}\n />\n <Message.Content\n content={i18n.t('Common.messages.save.content')}\n />\n </Toaster>\n )}\n </Modal.Content>\n <Modal.Actions>\n <Button\n onClick={this.props.onSave.bind(this, this.state.selectedItems)}\n primary\n size='medium'\n type='submit'\n >\n { i18n.t('Common.buttons.save') }\n </Button>\n <Button\n basic\n onClick={this.props.onClose.bind(this)}\n size='medium'\n type='button'\n >\n { i18n.t('Common.buttons.cancel') }\n </Button>\n </Modal.Actions>\n </Modal>\n )}\n </ModalContext.Consumer>\n );\n }\n\n /**\n * Renders the add button.\n *\n * @returns {null|*}\n */\n renderAddButton() {\n if (!this.props.modal) {\n return null;\n }\n\n return (\n <Button\n basic\n className='add-button'\n content={i18n.t('Common.buttons.add')}\n icon='plus'\n onClick={() => this.setState({ modalAdd: true })}\n />\n );\n }\n\n /**\n * Renders the add modal.\n *\n * @returns {null|*}\n */\n renderAddModal() {\n if (!(this.state.modalAdd && this.props.modal)) {\n return null;\n }\n\n const { component, props, onSave } = this.props.modal;\n\n return (\n <EditModal\n component={component}\n onClose={() => this.setState({ modalAdd: false, selectedItem: null })}\n onSave={(item) => onSave(item)\n .then((saved) => this.setState({\n modalAdd: false,\n saved: true,\n searchQuery: '',\n selectedItems: [saved]\n }, this.onSearch.bind(this)))}\n {...props}\n />\n );\n }\n\n /**\n * Renders the right column for the passed item.\n *\n * @param item\n *\n * @returns {null|*}\n */\n renderRight(item) {\n if (!this.isSelected(item)) {\n return null;\n }\n\n return (\n <Icon\n color='green'\n name='check'\n />\n );\n }\n}\n\nAccordionSelector.defaultProps = {\n isSelectable: undefined,\n modal: undefined,\n multiple: false,\n open: false,\n selectedItems: [],\n title: undefined\n};\n\nexport default withTranslation()(AccordionSelector);\n","// @flow\n\nimport React from 'react';\nimport { Button } from 'semantic-ui-react';\nimport './ArrowButtons.css';\n\ntype Props = {\n /**\n * Callback for left arrow click\n */\n onLeft: () => void,\n\n /**\n * Callback for right arrow click\n */\n onRight: () => void,\n};\n\n/**\n * A component used to move items from left to right or right to left.\n */\nconst ArrowButtons = (props: Props) => (\n <Button.Group\n className='arrow-buttons'\n vertical\n >\n <Button\n aria-label='Move Right'\n basic\n icon='arrow right'\n onClick={props.onRight.bind(this)}\n />\n <Button\n aria-label='Move Left'\n basic\n icon='arrow left'\n onClick={props.onLeft.bind(this)}\n />\n </Button.Group>\n);\n\nexport default ArrowButtons;\n","// @flow\n\nimport React, { useState } from 'react';\nimport { Button, Message, Modal } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport ModalContext from '../context/ModalContext';\nimport './AudioPlayer.css';\n\ntype Props = {\n centered?: boolean,\n onClose: () => void,\n open: boolean,\n src: string\n};\n\nconst AudioPlayer = (props: Props) => {\n const [error, setError] = useState(false);\n\n return (\n <ModalContext.Consumer>\n {(mountNode) => (\n <Modal\n centered={props.centered}\n className='audio-player'\n mountNode={mountNode}\n open={props.open}\n >\n <Modal.Content>\n { error && (\n <Message\n content={i18n.t('AudioPlayer.errors.path.content', { path: props.src })}\n header={i18n.t('AudioPlayer.errors.path.header')}\n icon='exclamation circle'\n />\n )}\n <audio\n controls\n onError={() => setError(true)}\n src={props.src}\n />\n </Modal.Content>\n <Modal.Actions>\n <Button\n content={i18n.t('Common.buttons.close')}\n onClick={props.onClose}\n />\n </Modal.Actions>\n </Modal>\n )}\n </ModalContext.Consumer>\n );\n};\n\nexport default AudioPlayer;\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"zotero-api-client\");","// @flow\n\nimport _ from 'underscore';\nimport api from 'zotero-api-client';\nimport BibliographyTypes from '../resources/BibliographyTypes.json';\n\nconst hiddenFields = [\n 'mimeType',\n 'linkMode',\n 'charset',\n 'md5',\n 'mtime',\n 'version',\n 'key',\n 'collections',\n 'relations',\n 'parentItem',\n 'contentType',\n 'filename',\n 'tags',\n 'creator',\n 'abstractNote',\n 'notes',\n 'rights',\n 'extra'\n];\n\nconst noEditFields = [\n 'modified',\n 'filename',\n 'dateAdded',\n 'dateModified'\n];\n\n/**\n * Checks the API cache for the passed key.\n *\n * @param key\n *\n * @returns {boolean}\n */\nconst apiCheckCache = (key) => {\n let cacheTimes = {};\n let okToUseCache = false;\n\n try {\n cacheTimes = JSON.parse(localStorage.getItem('zotero-bib-api-cache')) || {};\n } catch (e) {\n // ignore\n }\n\n if (key in cacheTimes) {\n okToUseCache = (Date.now() - cacheTimes[key]) < 24 * 60 * 60 * 1000;\n }\n\n if (!okToUseCache) {\n cacheTimes[key] = Date.now();\n localStorage.setItem('zotero-bib-api-cache', JSON.stringify(cacheTimes));\n }\n\n return okToUseCache;\n};\n\n/**\n * Returns the fields for the passed item. This function was largely copied directly from zotero/bib-web.\n *\n * @param item\n * @param itemTypeFields\n * @param itemTypes\n *\n * @returns {{item, fields: Array<T|unknown>}|{item, fields: *[]}}\n */\nconst getFieldsAndItem = (item, itemTypeFields, itemTypes) => {\n if (!item || !itemTypeFields || !itemTypes) {\n return { item, fields: [] };\n }\n\n const titleField = (item.itemType in BibliographyTypes && BibliographyTypes[item.itemType]?.title) || 'title';\n let fields = [\n { field: 'itemType', localized: 'Item Type' },\n itemTypeFields.find((itf) => itf.field === titleField),\n { field: 'creators', localized: 'Creators' },\n ...itemTypeFields.filter((itf) => itf.field !== titleField)\n ]\n .filter((f) => f && !hiddenFields.includes(f.field))\n .concat([\n itemTypeFields.find((itf) => itf.field === 'abstractNote'),\n itemTypeFields.find((itf) => itf.field === 'extra'),\n ]);\n\n // Add Original Date field to book and bookSection #188\n if (['book', 'bookSection'].includes(item.itemType)) {\n const dateIndex = fields.findIndex((f) => f.field === 'date');\n fields.splice(dateIndex + 1, 0, { field: 'original-date', localized: 'Original Date' });\n const matches = 'extra' in item && item.extra.match(/^original-date:\\s*(.*?)$/);\n if (matches) {\n _.extend(item, {\n 'original-date': matches[1],\n extra: item.extra.replace(/^original-date:\\s*.*?$/, '')\n });\n }\n }\n\n // Add Publisher to webpage\n if (['webpage'].includes(item.itemType)) {\n const beforeIndex = fields.findIndex((f) => f.field === 'websiteType');\n fields.splice(beforeIndex + 1, 0, { field: 'publisher', localized: 'Publisher' });\n const matches = 'extra' in item && item.extra.match(/^publisher:\\s*(.*?)$/i);\n if (matches) {\n _.extend(item, {\n publisher: matches[1],\n extra: item.extra.replace(/^publisher:\\s*.*?$/, '')\n });\n }\n }\n\n fields = fields.map((f) => ({\n options: f.field === 'itemType' ? itemTypes : null,\n key: f.field,\n label: f.localized,\n readonly: noEditFields.includes(f.field),\n processing: false,\n value: f.field in item ? item[f.field] : null\n }));\n\n return { item, fields };\n};\n\n/**\n * Calls the Zotero API to get the fields for the passed item type.\n *\n * @param itemType\n * @param retryOnFailure\n *\n * @returns {Promise<{itemTypes, itemTypeFields, itemTypeCreatorTypes}|*>}\n */\nconst getItemTypeMeta = async (itemType: string, retryOnFailure: boolean = true): any => {\n let itemTypes;\n let itemTypeFields;\n let itemTypeCreatorTypes;\n\n try {\n const [itemTypeR, itemTypeFieldsR, creatorTypesR] = await Promise.all([\n api()\n .itemTypes()\n .get({ cache: apiCheckCache('itemTypes') ? 'force-cache' : 'default' }),\n api()\n .itemTypeFields(itemType)\n .get({ cache: apiCheckCache(`itemTypeFields-${itemType}`) ? 'force-cache' : 'default' }),\n api()\n .itemTypeCreatorTypes(itemType)\n .get({ cache: apiCheckCache(`itemTypeCreatorTypes-${itemType}`) ? 'force-cache' : 'default' })\n ]);\n\n itemTypes = itemTypeR.getData();\n itemTypeFields = itemTypeFieldsR.getData();\n itemTypeCreatorTypes = creatorTypesR.getData();\n } catch (e) {\n // Clear the api cache\n localStorage.removeItem('zotero-bib-api-cache');\n\n // Call again if we're re-trying on failure\n if (retryOnFailure) {\n return getItemTypeMeta(itemType, false);\n }\n\n // If all else fails, throw an exception\n throw e;\n }\n\n return {\n itemTypes,\n itemTypeFields,\n itemTypeCreatorTypes\n };\n};\n\n/**\n * Returns true if the passed identifier matches a URL pattern.\n *\n * @param id\n *\n * @returns {boolean}\n */\nconst isUrl = (id) => !!id.match(/^(https?:\\/\\/)?[-a-zA-Z0-9@:%._+~#=]{2,256}\\.[a-z]{2,6}\\b(\\S*)$/i);\n\nexport default {\n getFieldsAndItem,\n getItemTypeMeta,\n isUrl\n};\n","// @flow\n\nimport React, { useCallback, useEffect, useMemo } from 'react';\nimport { Dropdown, Form } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport './CreatorField.css';\n\nconst NameTypes = {\n single: 0,\n full: 1\n};\n\ntype Props = {\n allowDelete?: boolean,\n creatorTypes: Array<any>,\n creator: any,\n onAdd: () => void,\n onDelete: () => void,\n onUpdate: (props: any) => void\n};\n\nconst CreatorField = (props: Props) => {\n /**\n * Updates the passed attribute for the current creator.\n *\n * @type {function(string, ?Event, *): *}\n */\n const onUpdate = useCallback((attribute: string, e: ?Event, { value }: any) => (\n props.onUpdate({ ...props.creator || {}, [attribute]: value })\n ), [props.creator, props.onUpdate]);\n\n /**\n * Updates the passed attributes for the current creator.\n *\n * @type {function(*): *}\n */\n const onUpdateAttributes = useCallback((attributes) => (\n props.onUpdate({ ...props.creator || {}, ...attributes })\n ), [props.creator, props.onUpdate]);\n\n /**\n * Sets the label attribute as a dropdown of the passed creatorTypes prop.\n *\n * @type {unknown}\n */\n const label = useMemo(() => (\n // eslint-disable-next-line jsx-a11y/label-has-associated-control\n <label>\n <Dropdown\n onChange={onUpdate.bind(this, 'creatorType')}\n options={_.map(props.creatorTypes, (ct) => ({\n key: ct.value,\n value: ct.value,\n text: ct.label\n }))}\n value={props.creator.creatorType}\n />\n </label>\n ), [props.creator.creatorType, props.creatorTypes]);\n\n /**\n * Default the nameType property to full (first name/last name).\n */\n useEffect(() => {\n if (!_.has(props.creator, 'nameType')) {\n onUpdateAttributes({ nameType: NameTypes.full });\n }\n }, [props.creator, onUpdateAttributes]);\n\n /**\n * Convert between firstName/lastName and name attributes depending on the name type.\n */\n useEffect(() => {\n if (props.creator.name && props.creator.nameType === NameTypes.full) {\n const [firstName, lastName] = props.creator.name.split(' ');\n onUpdateAttributes({ name: null, firstName, lastName });\n } else if ((props.creator.firstName || props.creator.lastName) && props.creator.nameType === NameTypes.single) {\n const name = _.compact([props.creator.firstName, props.creator.lastName]).join(' ');\n onUpdateAttributes({ firstName: null, lastName: null, name });\n }\n }, [props.creator.nameType]);\n\n return (\n <Form.Group\n className='creator-field'\n >\n { props.creator.nameType === NameTypes.full && (\n <>\n <Form.Input\n className='flex'\n label={label}\n onChange={onUpdate.bind(this, 'firstName')}\n placeholder={i18n.t('CreatorField.labels.firstName')}\n value={props.creator.firstName}\n />\n <Form.Input\n className='flex'\n onChange={onUpdate.bind(this, 'lastName')}\n placeholder={i18n.t('CreatorField.labels.lastName')}\n value={props.creator.lastName}\n />\n <Form.Button\n icon='exchange'\n onClick={() => onUpdateAttributes({ nameType: NameTypes.single })}\n />\n </>\n )}\n { props.creator.nameType === NameTypes.single && (\n <>\n <Form.Input\n className='flex'\n label={label}\n onChange={onUpdate.bind(this, 'name')}\n placeholder={i18n.t('CreatorField.labels.name')}\n value={props.creator.name}\n />\n <Form.Button\n icon='exchange'\n onClick={() => onUpdateAttributes({ nameType: NameTypes.full })}\n />\n </>\n )}\n <Form.Button\n icon='plus'\n onClick={props.onAdd}\n />\n <Form.Button\n disabled={!props.allowDelete}\n icon='minus'\n onClick={props.onDelete}\n />\n </Form.Group>\n );\n};\n\nexport default CreatorField;\n","// @flow\n\nimport React, { useCallback, useEffect, useMemo } from 'react';\nimport _ from 'underscore';\nimport CreatorField from './CreatorField';\n\ntype Props = {\n creatorTypes: Array<any>,\n onChange: (creators: Array<any>) => void,\n value: Array<any>\n};\n\nconst Creators = (props: Props) => {\n /**\n * Sets the default creator type.\n *\n * @type {unknown}\n */\n const defaultCreatorType = useMemo(() => (\n props.creatorTypes && props.creatorTypes.length && props.creatorTypes[0].value\n ), [props.creatorTypes]);\n\n /**\n * Adds a new creator record with the default type.\n *\n * @type {function(): *}\n */\n const onAddCreator = useCallback(() => props.onChange([\n ...(props.value || []),\n { creatorType: defaultCreatorType }\n ]), [props.onChange, props.value]);\n\n /**\n * Deletes the creator at the passed index.\n *\n * @type {function(*): *}\n */\n const onDeleteCreator = useCallback((index) => props.onChange(\n _.filter(props.value, (v, i) => i !== index)\n ), [props.onChange, props.value]);\n\n /**\n * Updates the creator at the passed index.\n *\n * @type {function(*, *): *}\n */\n const onUpdateCreator = useCallback((index, value) => props.onChange(\n _.map(props.value, (v, i) => (i === index ? value : v))\n ), [props.onChange, props.value]);\n\n /**\n * Updates the creator type on the items if the selected value is not longer valid.\n *\n * @type {(function(*): (*))|*}\n */\n const onUpdateCreatorType = useCallback((item) => {\n const creatorType = _.findWhere(props.creatorTypes, { value: item.creatorType });\n if (creatorType) {\n return item;\n }\n\n return {\n ...item,\n creatorType: defaultCreatorType\n };\n }, [props.creatorTypes, defaultCreatorType]);\n\n /**\n * Add the first creator when the component is mounted.\n */\n useEffect(() => {\n onAddCreator();\n }, []);\n\n /**\n * If the list of creator types changes, reset any invalid creator types to the default value.\n */\n useEffect(() => {\n if (props.value && props.value.length) {\n props.onChange(_.map(props.value, onUpdateCreatorType));\n }\n }, [onUpdateCreatorType, props.creatorTypes]);\n\n return _.map(props.value, (creator, index) => (\n <CreatorField\n allowDelete={props.value.length > 1}\n creator={creator}\n creatorTypes={props.creatorTypes}\n key={index}\n onAdd={() => onAddCreator()}\n onDelete={() => onDeleteCreator(index)}\n onUpdate={(value) => onUpdateCreator(index, value)}\n />\n ));\n};\n\nexport default Creators;\n","// @flow\n\nimport type { EditContainerProps } from '@performant-software/shared-components/types';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { Form } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport BibliographyUtils from '../utils/Bibliography';\nimport Creators from './Creators';\n\ntype Props = EditContainerProps & {\n /**\n * A JSON representation of the bibliographic item.\n */\n item: any\n};\n\n// Field constants\nconst FIELD_ABSTRACT_NOTE = 'abstractNote';\nconst FIELD_CREATORS = 'creators';\nconst FIELD_EXTRA = 'extra';\nconst FIELD_ITEM_TYPE = 'itemType';\n\n/**\n * This component can be used in conjunction with the `useEditContainer` higher-order component to create a form\n * used to enter bibliographic data.\n */\nconst BibliographyForm = (props: Props) => {\n const [creators, setCreators] = useState([]);\n const [fields, setFields] = useState([]);\n\n /**\n * Renders the input element for the passed field.\n *\n * @type {(function(*): *)|*}\n */\n const renderField = useCallback((field) => {\n if (field.key === FIELD_ITEM_TYPE) {\n return (\n <Form.Dropdown\n disabled={field.readonly}\n key={field.key}\n label={field.label}\n onChange={props.onTextInputChange.bind(this, field.key)}\n options={_.map(field.options, (option) => ({\n key: option.value,\n value: option.value,\n text: option.label\n }))}\n selectOnBlur={false}\n selection\n value={props.item[field.key] || ''}\n />\n );\n }\n\n if (field.key === FIELD_CREATORS) {\n return (\n <Creators\n creatorTypes={creators}\n key={field.key}\n onChange={(value) => props.onSetState({ [field.key]: value })}\n value={props.item[field.key] || []}\n />\n );\n }\n\n if (field.key === FIELD_ABSTRACT_NOTE || field.key === FIELD_EXTRA) {\n return (\n <Form.TextArea\n disabled={field.readonly}\n key={field.key}\n label={field.label}\n onChange={props.onTextInputChange.bind(this, field.key)}\n value={props.item[field.key] || ''}\n />\n );\n }\n\n return (\n <Form.Input\n disabled={field.readonly}\n key={field.key}\n label={field.label}\n onChange={props.onTextInputChange.bind(this, field.key)}\n value={props.item[field.key] || ''}\n />\n );\n }, [creators, props.item]);\n\n /**\n * Load the metadata for the selected item type.\n */\n useEffect(() => {\n BibliographyUtils\n .getItemTypeMeta(props.item.itemType)\n .then((data) => {\n const itemTypes = _.map(data.itemTypes, (it) => ({\n value: it.itemType,\n label: it.localized\n }));\n\n const itemTypeCreatorTypes = _.map(data.itemTypeCreatorTypes, (ct) => ({\n value: ct.creatorType,\n label: ct.localized\n }));\n\n setCreators(itemTypeCreatorTypes);\n\n const bibliographyData = BibliographyUtils.getFieldsAndItem(props.item, data.itemTypeFields, itemTypes);\n setFields(bibliographyData.fields);\n });\n }, [props.item.itemType]);\n\n return (\n <>\n { _.map(fields, renderField) }\n </>\n );\n};\n\nexport default BibliographyForm;\n","// @flow\n\nimport type { EditContainerProps } from '@performant-software/shared-components/types';\nimport React from 'react';\nimport { Form, Modal } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport BibliographyForm from './BibliographyForm';\n\ntype Props = EditContainerProps & {\n item: any\n};\n\nconst BibliographyModal = (props: Props) => (\n <Modal\n as={Form}\n centered={false}\n open\n >\n <Modal.Header\n content={i18n.t('BibliographyModal.title')}\n />\n <Modal.Content>\n <BibliographyForm\n {...props}\n />\n </Modal.Content>\n { props.children }\n </Modal>\n);\n\nexport default BibliographyModal;\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"zotero-translation-client\");","// @flow\n\nimport { createContext } from 'react';\n\nconst ZoteroTranslateContext = createContext();\n\nexport default ZoteroTranslateContext;\n","// @flow\n\nimport React, { useCallback, useContext, useState } from 'react';\nimport { Button, Input } from 'semantic-ui-react';\nimport ZoteroTranslationClient from 'zotero-translation-client';\nimport BibliographyUtils from '../utils/Bibliography';\nimport i18n from '../i18n/i18n';\nimport ZoteroTranslateContext from '../context/ZoteroTranslateContext';\nimport './BibliographySearchInput.css';\n\ntype Props = {\n /**\n * Callback fired when the translator encounters an error.\n */\n onError: () => void,\n\n /**\n * Callback fired when the translator is successful.\n * @param items\n */\n onFind: (items: array<any>) => void\n};\n\n/**\n * This component renders a search input and can be used within a `ZoteroTranslateContext` to lookup sources by URL,\n * ISBN, DOI, and more identifiers. The `ZoteroTranslateContext` requires a running\n * [Zotero Translation Server](https://github.com/zotero/translation-server) to be passed as the `translateUrl` key.\n */\nconst BibliographySearchInput = (props: Props) => {\n const [loading, setLoading] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n\n const { translateUrl } = useContext(ZoteroTranslateContext);\n\n /**\n * Calls the onFind prop if the request is successful, otherwise onError.\n *\n * @type {(function(*): void)|*}\n */\n const onLoadItems = useCallback((response) => {\n const { ok } = response.response;\n\n if (ok) {\n props.onFind(response.items);\n } else {\n props.onError();\n }\n }, [props.onFind]);\n\n /**\n * Uses the Zotero Translation API client to translate the search query.\n *\n * @type {(function(): void)|*}\n */\n const onSearch = useCallback(() => {\n setLoading(true);\n\n const translator = new ZoteroTranslationClient({\n translateURL: translateUrl,\n persist: false,\n });\n\n if (BibliographyUtils.isUrl(searchQuery)) {\n translator\n .translateUrl(searchQuery, { add: false })\n .then(onLoadItems)\n .finally(() => setLoading(false));\n } else {\n translator\n .translateIdentifier(searchQuery, { add: false })\n .then(onLoadItems)\n .finally(() => setLoading(false));\n }\n }, [searchQuery]);\n\n return (\n <div\n className='bibliography-search-input'\n >\n <Input\n autoFocus\n disabled={loading}\n onChange={(e, { value }) => setSearchQuery(value)}\n placeholder={i18n.t('BibliographySearchInput.labels.placeholder')}\n value={searchQuery}\n />\n <Button\n className='search-button'\n content={i18n.t('Common.buttons.search')}\n disabled={loading}\n loading={loading}\n onClick={onSearch}\n primary\n />\n </div>\n );\n};\n\nexport default BibliographySearchInput;\n","export const SORT_ASCENDING = 'ascending';\nexport const SORT_DESCENDING = 'descending';\n","// @flow\n\nimport React, { useCallback, useEffect, useRef } from 'react';\nimport { Button, Dropdown } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport { SORT_ASCENDING, SORT_DESCENDING } from '../constants/Sort';\n\ntype Option = {\n key: string,\n value: string,\n text: string\n};\n\ntype Sort = Option & {\n direction?: string\n};\n\ntype Props = {\n defaultValue?: string,\n direction: string,\n onChange: (sort: Sort) => void,\n options: Array<Option>,\n text: string,\n value: string\n};\n\n// TODO: Add this to ItemsToggle component\nconst SortSelector = (props: Props) => {\n const sortRef = useRef();\n\n /**\n * Calls the onChange prop with the direction, text, and value of the selected sort.\n *\n * @type {(function(*): void)|*}\n */\n const onSelection = useCallback((option) => {\n const direction = props.value === option.value && props.direction === SORT_ASCENDING\n ? SORT_DESCENDING\n : SORT_ASCENDING;\n\n props.onChange({ ...option, direction });\n }, [props.direction, props.onChange, props.value]);\n\n /**\n * Set the default sort to the passed default value or the first option in the list.\n */\n useEffect(() => {\n if (!props.value) {\n let defaultSort;\n\n if (props.defaultValue) {\n defaultSort = _.findWhere(props.options, { value: props.defaultValue });\n } else {\n defaultSort = _.first(props.options);\n }\n\n onSelection(defaultSort);\n }\n }, []);\n\n return (\n <Button.Group\n basic\n className='sort-selector'\n style={{\n fontSize: 'inherit'\n }}\n >\n <Button\n aria-label='Sort by'\n content={props.text}\n icon={props.direction === SORT_ASCENDING ? 'sort alphabet up' : 'sort alphabet down'}\n onClick={(e) => sortRef.current.handleClick(e)}\n />\n <Dropdown\n aria-label='Sort'\n className='button icon'\n floating\n options={_.map(props.options, (option) => ({\n ...option,\n onClick: () => onSelection(option)\n }))}\n ref={sortRef}\n trigger={<></>}\n value={props.value}\n />\n </Button.Group>\n );\n};\n\nexport default SortSelector;\n","// @flow\n\nimport { useCitationStyles } from '@performant-software/shared-components';\nimport React, { useEffect } from 'react';\nimport { Dropdown } from 'semantic-ui-react';\nimport _ from 'underscore';\n\ntype Props = {\n /**\n * Callback fired when the style selector is changed.\n */\n onChange: (name: string, xml: string) => void,\n\n /**\n * Default style value.\n */\n value?: string\n};\n\n/**\n * This component can be used, along with the `useCitationStyles` hook, to display a list of bibliographic styles\n * supported by Zotero.\n */\nconst StyleSelector = (props: Props) => {\n const { onStyleChange, style, styles } = useCitationStyles(props.value);\n\n /**\n * Call the onChange prop when the style changes.\n */\n useEffect(() => {\n if (style?.name && style?.xml) {\n props.onChange(style.name, style.xml);\n }\n }, [style]);\n\n return (\n <Dropdown\n onChange={(e, { value }) => onStyleChange(value)}\n options={_.map(styles, ({ name, title }) => ({\n key: name,\n value: name,\n text: title\n }))}\n search\n searchInput={{\n 'aria-label': 'Search styles',\n }}\n selectOnBlur={false}\n selection\n text={style?.title}\n value={style?.name || ''}\n />\n );\n};\n\nexport default StyleSelector;\n","// @flow\n\nimport { Citation } from '@performant-software/shared-components';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type ComponentType\n} from 'react';\nimport uuid from 'react-uuid';\nimport {\n Button,\n Grid,\n List,\n Message\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport BibliographyModal from './BibliographyModal';\nimport BibliographySearchInput from './BibliographySearchInput';\nimport i18n from '../i18n/i18n';\nimport SortSelector from './SortSelector';\nimport { SORT_DESCENDING } from '../constants/Sort';\nimport StyleSelector from './StyleSelector';\nimport Toaster from './Toaster';\nimport useList, { Props as ListProps } from './List';\nimport ZoteroTranslateContext from '../context/ZoteroTranslateContext';\nimport './BibliographyList.css';\n\ntype Item = {\n id?: number,\n uid?: string,\n data: any\n};\n\ntype ComponentProps = {\n items: Array<Item>,\n locale: string,\n style: ?{\n name: string,\n xml: string\n }\n};\n\nconst DEFAULT_ITEM_TYPE = 'book';\nconst LOCALE_URL = 'https://raw.githubusercontent.com/citation-style-language/locales/master/locales-en-US.xml';\n\nconst Sort = {\n author: 'author',\n date: 'date',\n title: 'title'\n};\n\nconst SortOptions = [{\n key: Sort.title,\n value: Sort.title,\n text: i18n.t('BibliographyList.sort.title')\n}, {\n key: Sort.author,\n value: Sort.author,\n text: i18n.t('BibliographyList.sort.author')\n}, {\n key: Sort.date,\n value: Sort.date,\n text: i18n.t('BibliographyList.sort.date')\n}];\n\nconst BibliographyListComponent: ComponentType<any> = useList((props: ComponentProps) => (\n <List\n divided\n relaxed='very'\n >\n { _.map(props.items, (item, index) => (\n <List.Item\n as={Grid}\n columns={2}\n key={index}\n padded\n >\n <List.Content\n as={Grid.Column}\n textAlign='left'\n verticalAlign='middle'\n width={14}\n >\n <Citation\n item={item}\n locale={props.locale}\n style={props.style && props.style.xml}\n />\n </List.Content>\n <List.Content\n as={Grid.Column}\n textAlign='right'\n verticalAlign='middle'\n width={2}\n >\n { _.map(props.actions, (action, actionIndex) => (\n <Button\n aria-label={action.name}\n basic\n icon={action.icon}\n key={actionIndex}\n onClick={action.onClick.bind(this, item)}\n />\n ))}\n </List.Content>\n </List.Item>\n ))}\n </List>\n));\n\ntype Props = ListProps & {\n /**\n * The array of bibliography items.\n */\n items: Array<Item>,\n\n /**\n * Callback fired when the passed item is deleted. This function should return a Promise.\n */\n onDelete: (item: Item) => Promise<any>,\n\n /**\n * Callback fired when the passed item is saved. This function should return a Promise.\n */\n onSave: (item: Item) => Promise<any>,\n\n /**\n * URL of the Zotero translation server.\n */\n translateUrl: string\n};\n\n/**\n * This component renders a list of bibliography items in Zbib format. This component requires the URL of a running\n * [Zotero Translation Server](https://github.com/zotero/translation-server) to be passed as the `translateUrl` prop.\n */\nconst BibliographyList = (props: Props) => {\n const [locale, setLocale] = useState();\n const [showToaster, setShowToaster] = useState(false);\n const [style, setStyle] = useState();\n const [sort, setSort] = useState({});\n\n /**\n * Converts the passed item into an object with \"id\", \"uid\", and \"data\" keys.\n *\n * @type {function(*): {uid: string, data: *, id: *}}\n */\n const createItem = useCallback((item) => {\n const { id } = item || {};\n const { uid = uuid() } = item || {};\n\n // Build the data object\n const data = _.omit(item, 'id', 'uid', 'data');\n\n // Remove any empty creators\n _.extend(data, {\n creators: _.reject(item.creators, (creator) => !(creator.name || creator.firstName || creator.lastName))\n });\n\n return { id, uid, data };\n }, []);\n\n /**\n * Returns the sort property value for the passed item based on the selected sort.\n *\n * @type {function(*, *): *}\n */\n const getSortProperty = useCallback((item, index) => {\n let value;\n\n if (sort === Sort.title) {\n value = item.title;\n } else if (sort === Sort.author) {\n const author = _.first(item.creators);\n value = author?.name || `${author?.lastName}, ${author?.firstName}`;\n } else if (sort === Sort.date) {\n value = item.date;\n } else {\n value = index;\n }\n\n return value;\n }, []);\n\n /**\n * Sets the items to display in the list. This function will filter out any items marked for delete,\n * expand the \"data\" property into the main object, and sort the collection according the user's selection.\n */\n const items = useMemo(() => {\n // Filter the list to exclude items marked for removal and transform the items\n let newItems = _.chain(props.items)\n .filter((item) => !item._destroy)\n .map((item) => ({ ..._.omit(item, 'data'), ...item.data }))\n .value();\n\n // Sort the list according to the selected sort property\n newItems = _.sortBy(newItems, getSortProperty);\n\n // If sorting in descending order, reverse the list\n if (sort.direction === SORT_DESCENDING) {\n newItems = newItems.reverse();\n }\n\n return newItems;\n }, [getSortProperty, sort, props.items]);\n\n /**\n * Renders the style selector and sort components.\n *\n * @type {unknown}\n */\n const renderListHeader = useCallback(() => (\n <>\n <StyleSelector\n onChange={(name, xml) => setStyle({ name, xml })}\n />\n <SortSelector\n direction={sort.direction}\n onChange={(value) => setSort(value)}\n options={SortOptions}\n text={sort.text}\n value={sort.value}\n />\n </>\n ), [sort, style]);\n\n /**\n * Deletes the passed item.\n *\n * @type {function(*): Promise<unknown>}\n */\n const onDelete = useCallback((item) => Promise.resolve(\n props.onDelete(createItem(item))\n ), [createItem, props.onDelete]);\n\n /**\n * Saves the passed item.\n *\n * @type {function(*): Promise<unknown>}\n */\n const onSave = useCallback((item) => Promise.resolve(\n props.onSave(createItem(item))\n ), [createItem, props.onSave]);\n\n /**\n * Loads the locale XML.\n */\n useEffect(() => {\n fetch(LOCALE_URL)\n .then((resp) => resp.text())\n .then((text) => setLocale(text));\n }, []);\n\n return (\n <ZoteroTranslateContext.Provider\n value={{ translateUrl: props.translateUrl }}\n >\n <div>\n <BibliographySearchInput\n onError={() => setShowToaster(true)}\n onFind={(results) => _.map(results, onSave)}\n />\n <BibliographyListComponent\n {...props}\n actions={[{\n name: 'edit'\n }, {\n name: 'delete'\n }]}\n className='bibliography-list'\n items={items}\n locale={locale}\n modal={{\n component: BibliographyModal,\n props: {\n defaults: {\n itemType: DEFAULT_ITEM_TYPE\n }\n }\n }}\n onDelete={onDelete}\n onSave={onSave}\n renderListHeader={renderListHeader}\n style={style}\n />\n { showToaster && (\n <Toaster\n onDismiss={() => setShowToaster(false)}\n timeout={2500}\n type={Toaster.MessageTypes.warning}\n >\n <Message.Header\n content={i18n.t('Common.messages.noResults')}\n />\n </Toaster>\n )}\n </div>\n </ZoteroTranslateContext.Provider>\n );\n};\n\nexport default BibliographyList;\n","// @flow\n\nimport React from 'react';\nimport { Icon } from 'semantic-ui-react';\n\ntype Props = {\n value: boolean\n};\n\nconst ICON_FALSE = 'times circle outline';\nconst ICON_TRUE = 'check circle outline';\n\nconst COLOR_FALSE = 'red';\nconst COLOR_TRUE = 'green';\n\nconst BooleanIcon = (props: Props) => {\n let name = ICON_FALSE;\n let color = COLOR_FALSE;\n\n if (props.value) {\n name = ICON_TRUE;\n color = COLOR_TRUE;\n }\n\n return (\n <Icon\n color={color}\n name={name}\n />\n );\n};\n\nexport default BooleanIcon;\n","// @flow\n\nimport React, { useEffect, useState, type ComponentType } from 'react';\nimport { Breadcrumb, Loader } from 'semantic-ui-react';\n\ntype Props = {\n active: boolean,\n as?: ComponentType<any>,\n id?: number,\n label?: string,\n name: string,\n onLoad: (id: number, name: string) => Promise<any>,\n url: string\n};\n\nconst BreadcrumbItem: ComponentType<any> = (props: Props) => {\n const [loading, setLoading] = useState(false);\n const [name, setName] = useState(null);\n\n /**\n * Sets or clears the name attribute on the state.\n */\n useEffect(() => {\n if (props.id) {\n props\n .onLoad(props.id, props.name)\n .then((n) => setName(n))\n .finally(() => setLoading(false));\n\n setLoading(true);\n } else {\n setName(null);\n }\n }, [props.id, props.name]);\n\n return (\n <>\n <Breadcrumb.Section\n active={props.active && !props.id}\n as={props.as}\n to={`/${props.url}`}\n >\n { props.label }\n </Breadcrumb.Section>\n { props.id && (\n <Breadcrumb.Divider\n icon='right chevron'\n />\n )}\n { loading && (\n <Loader\n active\n inline\n />\n )}\n { name && props.id && (\n <Breadcrumb.Section\n active={props.active}\n as={props.as}\n to={`/${props.url}/${props.id}`}\n >\n { name }\n </Breadcrumb.Section>\n )}\n </>\n );\n};\n\nexport default BreadcrumbItem;\n","// @flow\n\nimport React, { useCallback, useMemo, type ComponentType } from 'react';\nimport { Breadcrumb } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport BreadcrumbItem from './BreadcrumbItem';\nimport './Breadcrumbs.css';\n\nconst URL_DELIMITER = '/';\n\ntype Props = {\n /**\n * Alternate component to use to render the breadcrumb.\n */\n as?: ComponentType<any>,\n\n /**\n * A key-value pair of types to labels to match the `pathname`.\n */\n labels: { key: string, value: string },\n\n /**\n * Callback fired to lookup the name of the passed breadcrumb item.\n */\n onLoad: (id: number, name: string) => Promise<any>,\n\n /**\n * The URL for which to generate the breadcrumb.\n */\n pathname: string\n};\n\n/**\n * This component can be used to render a breadcrumb for the passed URL.\n */\nconst Breadcrumbs: ComponentType<any> = (props: Props) => {\n /**\n * Returns true if the passed string contains only digits.\n *\n * @type {function(*): boolean}\n */\n const isNumeric = useCallback((str: string) => /^\\d+$/.test(str), []);\n\n /**\n * Sets the items to display based on the URL path.\n *\n * @type {[]}\n */\n const items = useMemo(() => {\n const value = [];\n\n const path = props.pathname.split(URL_DELIMITER).splice(1);\n\n for (let i = 0; i < path.length; i += 1) {\n const key = path[i];\n const id = path[i + 1];\n const url = path.slice(0, i + 1).join(URL_DELIMITER);\n\n /*\n * If the item in the path is non-numeric, we'll add it as the item label.\n * If the next item is numeric, we'll add it as the ID.\n * If the next item is non-numeric, it'll be added as a separate label on the next iteration.\n */\n if (!isNumeric(key)) {\n const item = { key, url, id: undefined };\n\n if (isNumeric(id)) {\n item.id = id;\n }\n\n value.push(item);\n }\n }\n\n return value;\n }, [props.pathname]);\n\n /**\n * Returns true if there are more items to display.\n *\n * @type {function(*): boolean}\n */\n const hasMore = useCallback((index: number) => index < (items.length - 1), [items]);\n\n return (\n <Breadcrumb\n size='large'\n >\n { _.map(items, (item, index) => (\n <>\n <BreadcrumbItem\n active={!hasMore(index)}\n as={props.as}\n id={item.id}\n label={props.labels[item.key]}\n name={item.key}\n onLoad={props.onLoad}\n url={item.url}\n />\n { hasMore(index) && (\n <Breadcrumb.Divider\n icon='right chevron'\n />\n )}\n </>\n ))}\n </Breadcrumb>\n );\n};\n\nexport default Breadcrumbs;\n","// @flow\n\nimport React from 'react';\nimport { Button } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\n\ntype Props = {\n disabled: boolean,\n onClick: () => void\n};\n\nconst CancelButton = (props: Props) => (\n <Button\n basic\n disabled={props.disabled}\n onClick={props.onClick.bind(this)}\n size='medium'\n type='button'\n >\n { i18n.t('Common.buttons.cancel') }\n </Button>\n);\n\nexport default CancelButton;\n","// @flow\n\nimport React from 'react';\nimport { Button } from 'semantic-ui-react';\nimport './ColorButton.css';\n\ntype Props = {\n color: string,\n height?: number,\n onClick?: () => void,\n width?: number\n}\n\nconst ColorButton = (props: Props) => (\n <Button\n className='color-button'\n onClick={props.onClick && props.onClick.bind(this)}\n style={{\n backgroundColor: props.color,\n cursor: props.onClick ? 'pointer' : 'default',\n height: props.height,\n width: props.width\n }}\n title='color-button'\n />\n);\n\nColorButton.defaultProps = {\n height: undefined,\n onClick: undefined,\n width: undefined\n};\n\nexport default ColorButton;\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-color\");","// @flow\n\nimport React, { Component } from 'react';\nimport { SketchPicker } from 'react-color';\nimport { Button, Modal } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport ModalContext from '../context/ModalContext';\nimport './ColorPickerModal.css';\n\ntype Props = {\n color: string,\n onClose: () => void,\n onSave: (selectedColor: string) => void,\n open: boolean\n};\n\ntype State = {\n selectedColor: string\n};\n\nclass ColorPickerModal extends Component<Props, State> {\n /**\n * Constructs a new ColorPickerModal component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n selectedColor: props.color\n };\n }\n\n /**\n * Renders the ColorPickerModal component.\n *\n * @returns {*}\n */\n render() {\n return (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n className='color-picker-modal'\n mountNode={mountNode}\n onClose={this.props.onClose.bind(this)}\n open={this.props.open}\n >\n <Modal.Content>\n <SketchPicker\n color={this.state.selectedColor}\n disableAlpha={false}\n onChangeComplete={(selectedColor) => this.setState({ selectedColor })}\n />\n </Modal.Content>\n <Modal.Actions>\n <Button\n onClick={this.props.onSave.bind(this, this.state.selectedColor)}\n primary\n size='medium'\n type='submit'\n >\n { i18n.t('Common.buttons.save') }\n </Button>\n <Button\n basic\n onClick={this.props.onClose.bind(this)}\n size='medium'\n type='button'\n >\n { i18n.t('Common.buttons.cancel') }\n </Button>\n </Modal.Actions>\n </Modal>\n )}\n </ModalContext.Consumer>\n );\n }\n}\n\nexport default ColorPickerModal;\n","// @flow\n\nimport React from 'react';\nimport { Button, Label } from 'semantic-ui-react';\nimport _ from 'underscore';\n\ntype Item = {\n label: string,\n onClick: () => void\n};\n\ntype Props = {\n count?: number,\n items: Array<Item>,\n onShowMore?: () => void\n};\n\n/**\n * This component displays the passed items as labels. If a <code>count</code> prop is provided, the component\n * will display a \"+\" button.\n */\nconst CurrentFacetLabels = (props: Props) => (\n <Label.Group>\n { _.map(props.items, (item, index) => (\n <Label\n content={item.label}\n key={index}\n onRemove={item.onClick}\n />\n ))}\n { props.count && props.count > props.items.length && props.onShowMore && (\n <Label\n as={Button}\n content={`+${props.count - props.items.length}`}\n onClick={props.onShowMore}\n />\n )}\n </Label.Group>\n);\n\nCurrentFacetLabels.defaultProps = {\n count: undefined,\n onShowMore: undefined\n};\n\nexport default CurrentFacetLabels;\n\nexport type {\n Item\n};\n","// @flow\n\nimport React from 'react';\nimport { Button, Modal } from 'semantic-ui-react';\nimport CurrentFacetLabels, { type Item } from './CurrentFacetLabels';\nimport i18n from '../i18n/i18n';\n\ntype Props = {\n /**\n * An array of facet values.\n */\n items: Array<Item>,\n\n /**\n * Callback fired when the \"Done\" button is clicked.\n */\n onClose: () => void,\n\n /**\n * If `true` the modal will be visible.\n */\n open?: boolean\n};\n\n/**\n * This component displays all of the facets currently applied, without any limit.\n */\nconst CurrentFacetsModal = (props: Props) => (\n <Modal\n centered={false}\n open={props.open}\n >\n <Modal.Header\n content={i18n.t('CurrentFacetsModal.title')}\n />\n <Modal.Content>\n <CurrentFacetLabels\n items={props.items}\n />\n </Modal.Content>\n <Modal.Actions>\n <Button\n content={i18n.t('Common.buttons.done')}\n onClick={props.onClose}\n primary\n />\n </Modal.Actions>\n </Modal>\n);\n\nCurrentFacetsModal.defaultProps = {\n open: undefined\n};\n\nexport default CurrentFacetsModal;\n","// @flow\n\nimport React, { useMemo, useState } from 'react';\nimport _ from 'underscore';\nimport CurrentFacetLabels from './CurrentFacetLabels';\nimport CurrentFacetsModal from './CurrentFacetsModal';\nimport { type CurrentRefinementsProps } from '../types/InstantSearch';\n\ntype Props = CurrentRefinementsProps & {\n /**\n * The maximum number of facets to display. If more facets are added, they will be accessible via modal.\n */\n limit?: number\n};\n\n/**\n * This component can be used to display the facets/refinements currently applied to an InstantSearch index.\n */\nconst CurrentFacets = ({ useCurrentRefinements, ...props }: Props) => {\n const [modal, setModal] = useState(false);\n const { items } = useCurrentRefinements(props);\n\n /**\n * Sets the facet items based on the current refinements.\n */\n const facets = useMemo(() => (\n _.flatten(_.map(items, (group) => _.map(group.refinements, (refinement) => ({\n label: `${group.label}: ${refinement.label}`,\n onClick: () => group.refine(refinement)\n }))))\n ), [items]);\n\n /**\n * Limits the list of facets to the passed \"limit\" prop.\n */\n const filteredFacets = useMemo(() => _.filter(facets, (facet, index) => (\n !props.limit || index < props.limit\n )), [facets, props.limit]);\n\n /**\n * Don't render the component if no refinements are applied.\n */\n if (_.isEmpty(facets)) {\n return null;\n }\n\n return (\n <>\n <CurrentFacetLabels\n count={facets.length}\n items={filteredFacets}\n onShowMore={() => setModal(true)}\n />\n <CurrentFacetsModal\n items={facets}\n open={modal}\n onClose={() => setModal(false)}\n />\n </>\n );\n};\n\nCurrentFacets.defaultProps = {\n limit: undefined\n};\n\nexport default CurrentFacets;\n","// @flow\n\nimport React from 'react';\nimport './ColumnResize.css';\n\ntype Props = {\n onMouseDown: (e: MouseEvent) => void\n};\n\nconst ColumnResize = (props: Props) => (\n <div\n className='column-resize'\n onMouseDown={props.onMouseDown.bind(this)}\n role='presentation'\n >\n \n </div>\n);\n\nexport default ColumnResize;\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-dnd\");","// @flow\n\nimport React, { type Element, useRef } from 'react';\nimport { Ref } from 'semantic-ui-react';\nimport { useDrag, useDrop } from 'react-dnd';\n\ntype Props = {\n children: Element<any>,\n direction: 'horizontal' | 'vertical',\n id: any,\n index: number,\n onDrag: (dragIndex: number, hoverIndex: number) => void,\n onDragEnd?: () => void,\n onDragStart?: () => void\n};\n\nconst DIRECTION_VERTICAL = 'vertical';\n\nconst TYPE_ANY = 'any';\n\nconst Draggable = (props: Props) => {\n const { index, id, direction = DIRECTION_VERTICAL } = props;\n\n const ref = useRef(null);\n const [, drop] = useDrop({\n accept: TYPE_ANY,\n hover(i, monitor) {\n if (!ref.current) {\n return;\n }\n\n const dragIndex = i.index;\n const hoverIndex = index;\n\n // Don't replace items with themselves\n if (dragIndex === hoverIndex) {\n return;\n }\n\n // Determine rectangle on screen\n const hoverBoundingRect = ref.current.getBoundingClientRect();\n\n // Determine mouse position\n const clientOffset = monitor.getClientOffset();\n\n let hoverMiddle;\n let hoverClient;\n\n // Get middle\n if (direction === DIRECTION_VERTICAL) {\n hoverMiddle = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;\n } else {\n hoverMiddle = (hoverBoundingRect.right - hoverBoundingRect.left) / 2;\n }\n\n // Get pixels to the top/left\n if (direction === DIRECTION_VERTICAL) {\n hoverClient = clientOffset.y - hoverBoundingRect.top;\n } else {\n hoverClient = clientOffset.x - hoverBoundingRect.left;\n }\n\n // Only perform the move when the mouse has crossed half of the items height\n // When dragging downwards, only move when the cursor is below 50%\n // When dragging upwards, only move when the cursor is above 50%\n // Dragging downwards\n if (dragIndex < hoverIndex && hoverClient < hoverMiddle) {\n return;\n }\n\n // Dragging upwards\n if (dragIndex > hoverIndex && hoverClient > hoverMiddle) {\n return;\n }\n\n // Time to actually perform the action\n props.onDrag(dragIndex, hoverIndex);\n\n // // Note: we're mutating the monitor item here!\n // // Generally it's better to avoid mutations,\n // // but it's good here for the sake of performance\n // // to avoid expensive index searches.\n // eslint-disable-next-line no-param-reassign\n i.index = hoverIndex;\n },\n });\n\n const [{ isDragging }, drag] = useDrag({\n item: { type: TYPE_ANY, id, index },\n begin: () => props.onDragStart && props.onDragStart(),\n end: () => props.onDragEnd && props.onDragEnd(),\n collect: (monitor) => ({\n isDragging: monitor.isDragging(),\n }),\n });\n\n drag(drop(ref));\n\n if (ref && ref.current) {\n ref.current.style.opacity = isDragging ? 0 : 1;\n }\n\n return (\n <Ref\n innerRef={ref}\n >\n { props.children }\n </Ref>\n );\n};\n\nexport default Draggable;\n","// @flow\n\nimport { Browser, Object as ObjectUtils } from '@performant-software/shared-components';\nimport React, { Component, createRef, type Element } from 'react';\nimport {\n Checkbox,\n Button,\n Loader,\n Popup,\n Ref,\n Table\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport ColumnResize from './ColumnResize';\nimport useColumnSelector, { Props as ColumnSelectorProps } from './DataTableColumnSelector';\nimport useList, { Props as ListProps } from './List';\nimport './DataTable.css';\n\nimport type { Action } from './List';\n\ntype Props = ListProps & ColumnSelectorProps & {\n /**\n * If <code>true</code>, the rows of the table can be expanded and collapsed.\n */\n expandableRows?: boolean,\n\n /**\n * Function that returns JSX to render when the row for the passed item is expanded.\n */\n expandPanel?: (item: any, activePanel: any) => Element<any>,\n\n /**\n * Callback returning <code>true</code> if the row for the passed item is selected.\n */\n isRowSelected?: (item: any) => boolean,\n\n /**\n * An array of objects to render as rows in the list.\n */\n items: ?Array<any>,\n\n /**\n * Set to <code>true</code> if the list is currently loading data. If true, a loading indicator will display.\n */\n loading?: boolean,\n\n /**\n * Callback to clear the selected set of records.\n */\n onClearSelected?: () => void,\n\n /**\n * Callback fired when the passed column is clicked.\n */\n onColumnClick?: (column: Column) => void,\n\n /**\n * Callback fired when the passed item is selected. This callback is <i>only</i> fired if the <code>selectable</code>\n * prop is passed as <code>true</code>.\n */\n onRowSelect?: (item: any)=> void,\n\n /**\n * Callback fired when the select all checkbox in the table header is clicked.\n */\n onSelectAll?: (items: Array<any>) => void,\n\n /**\n * A function that returns a JSX element to render when the list is empty.\n */\n renderEmptyMessage?: () => Element<any>,\n\n /**\n * A function that returns a custom JSX element to render when the list is empty. This element will replace the\n * entire single row of the table.\n */\n renderEmptyRow?: () => void,\n\n /**\n * A function that returns a custom JSX element to render for the passed item. This element will replace the entire\n * table row.\n */\n renderItem?: (item: any, index: number, children?: any) => Element<any>,\n\n /**\n * If set to <code>true</code>, checkboxes will render as the first table column, allowing each row to be selectable.\n * The consuming component is responsible for tracking the selected items.\n */\n selectable?: boolean,\n\n /**\n * Name of the current sort column.\n */\n sortColumn?: string,\n\n /**\n * Current sort direction (ascending or descending).\n */\n sortDirection?: string,\n\n /**\n * Customization props for the\n * <a target=\"_blank\" href=\"https://react.semantic-ui.com/collections/table/\"><code>Table</code></a>\n * component.\n */\n tableProps?: any\n};\n\ntype State = {\n activePanel: any,\n resize: ?{\n columnRef: typeof Ref,\n offset: number\n }\n};\n\nclass DataTable extends Component<Props, State> {\n static defaultProps: any;\n\n columnRefs: any;\n onClick: (e: Event) => void;\n onMouseMove: (e: Event) => void;\n onMouseUp: (e: Event) => void;\n\n /**\n * Constructs a new DataTable component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n resize: null,\n activePanel: null\n };\n\n this.initializeColumnRefs();\n\n this.onClick = this.onPreventClick.bind(this);\n this.onMouseMove = this.onColumnResize.bind(this);\n this.onMouseUp = this.afterColumnResize.bind(this);\n }\n\n /**\n * If the resize object is present on the state, sets the capture click handler on the document and\n * clears the resize object on the state.\n */\n afterColumnResize() {\n if (this.state.resize && Browser.isBrowser()) {\n document.addEventListener('click', this.onClick, true);\n this.setState({ resize: undefined });\n }\n }\n\n /**\n * Initializes a ref for each table column.\n */\n initializeColumnRefs() {\n this.columnRefs = {};\n\n _.each(this.props.columns, (c) => {\n this.columnRefs[c.name] = createRef();\n });\n }\n\n /**\n * Adds the mousemove and mouseup event listeners for dynamic column resizing.\n */\n componentDidMount() {\n if (Browser.isBrowser()) {\n document.addEventListener('mousemove', this.onMouseMove);\n document.addEventListener('mouseup', this.onMouseUp);\n }\n }\n\n /**\n * Reinitialize the column refs if the columns change.\n *\n * @param prevProps\n */\n componentDidUpdate(prevProps: Props) {\n if (!ObjectUtils.isEqual(prevProps.columns, this.props.columns)) {\n this.initializeColumnRefs();\n }\n }\n\n /**\n * Removes the mousemove and mouseup event listeners.\n */\n componentWillUnmount() {\n if (Browser.isBrowser()) {\n document.removeEventListener('mousemove', this.onMouseMove);\n document.removeEventListener('mouseup', this.onMouseUp);\n }\n }\n\n /**\n * Returns the actual column count. This will be the number of columns +1 if the table allows actions.\n *\n * @returns {number}\n */\n getColumnCount() {\n let columnCount = this.props.columns.length;\n\n if (this.props.actions && this.props.actions.length) {\n columnCount += 1;\n }\n\n return columnCount;\n }\n\n /**\n * Resizes the current column based on the user's mouse position.\n *\n * @param e\n */\n onColumnResize(e: MouseEvent) {\n const { resize } = this.state;\n\n if (resize) {\n const { columnRef, offset } = resize;\n columnRef.current.style.width = `${offset + e.pageX}px`;\n }\n }\n\n /**\n * Stops progagation of the onclick event. The column resizing seems to trigger the 'click' event on the <th>\n * containing the <div> used to resize the column. Since the <th> already provides a 'click' event, this makes for\n * an awkward user experience because it will trigger a column sort each time a column is resized.\n *\n * This function will capture the onclick prior to it bubbling to the <th> element and prevent it from happening. It\n * will also remove the event listener from the document so that clicks elsewhere in the document are not prevented.\n *\n * @param e\n */\n onPreventClick(e: Event) {\n e.stopPropagation();\n\n if (Browser.isBrowser()) {\n document.removeEventListener('click', this.onClick, true);\n }\n }\n\n /**\n * Selects all of the items in the current collection.\n *\n * @param allSelected\n */\n onSelectAll(allSelected) {\n let items;\n\n if (allSelected) {\n items = [...this.props.items || []];\n } else {\n items = _.reject(this.props.items, this.props.isRowSelected.bind(this));\n }\n\n _.each(items, this.props.onRowSelect && this.props.onRowSelect.bind(this));\n }\n\n /**\n * Renders the DataTable component.\n *\n * @returns {*}\n */\n render() {\n return (\n <Table\n className='data-table'\n {...this.props.tableProps}\n >\n <Table.Header>\n <Table.Row>\n { this.renderSelectHeader() }\n { this.props.columns.map(this.renderHeaderCell.bind(this)) }\n { this.renderActionsHeader() }\n </Table.Row>\n </Table.Header>\n <Table.Body>\n { this.props.items && this.props.items.map(this.renderItem.bind(this)) }\n { this.renderEmptyTableRow() }\n { this.renderLoading() }\n </Table.Body>\n </Table>\n );\n }\n\n /**\n * Renders the action button for the passed item and action.\n *\n * @param item\n * @param action\n * @param index\n *\n * @returns {*}\n */\n renderActionButton(item: any, index: number, action: Action) {\n // If the action specified its own render function, return the result of the function call\n if (action.render) {\n return action.render(item, index);\n }\n\n const actionButton = (\n <Button\n aria-label={action.name}\n basic\n compact\n color={action.color}\n icon={action.icon}\n key={`${action.name}-${index}`}\n onClick={action.onClick && action.onClick.bind(this, item)}\n title={action.title}\n />\n );\n\n // Wrap the button in a popup if the action specifies a popup attribute\n if (action.popup) {\n const { content, title } = action.popup;\n\n return (\n <Popup\n content={content}\n header={title}\n hideOnScroll\n mouseEnterDelay={500}\n position='top right'\n trigger={actionButton}\n />\n );\n }\n\n // Otherwise, simply return the button\n return actionButton;\n }\n\n /**\n * Renders the actions for the passed item.\n *\n * @param item\n * @param index\n *\n * @returns {null|*}\n */\n renderActions(item: any, index: number) {\n if (!(this.props.actions && this.props.actions.length)) {\n return null;\n }\n\n const actions = this.props.actions\n .filter((action) => !action.accept || action.accept(item))\n .map((action) => {\n let defaults = {};\n\n if (action.name === 'edit') {\n defaults = {\n popup: {\n title: i18n.t('DataTable.actions.edit.title'),\n content: i18n.t('DataTable.actions.edit.content')\n }\n };\n } else if (action.name === 'copy') {\n defaults = {\n popup: {\n title: i18n.t('DataTable.actions.copy.title'),\n content: i18n.t('DataTable.actions.copy.content')\n }\n };\n } else if (action.name === 'delete') {\n defaults = {\n popup: {\n title: i18n.t('DataTable.actions.delete.title'),\n content: i18n.t('DataTable.actions.delete.content')\n }\n };\n }\n\n return _.defaults(action, defaults);\n });\n\n return (\n <Table.Cell\n className='actions-cell'\n key={index}\n >\n { actions.map(this.renderActionButton.bind(this, item, index)) }\n </Table.Cell>\n );\n }\n\n /**\n * Renders the action list header.\n *\n * @returns {null|*}\n */\n renderActionsHeader() {\n if (!(this.props.actions && this.props.actions.length)) {\n return null;\n }\n\n return (\n <Table.HeaderCell>\n { i18n.t('DataTable.columns.actions') }\n </Table.HeaderCell>\n );\n }\n\n /**\n * Renders the table cell for the passed item/column.\n *\n * @param item\n * @param column\n *\n * @returns {*}\n */\n renderCell(item: any, column: Column) {\n if (column.hidden) {\n return null;\n }\n\n let value;\n\n if (column.render) {\n value = column.render(item);\n } else if (column.resolve) {\n value = column.resolve(item);\n } else {\n value = item[column.name];\n }\n\n return (\n <Table.Cell\n key={`${item.id}-${column.name}`}\n className={column.className}\n >\n { value }\n </Table.Cell>\n );\n }\n\n /**\n * Renders the empty table row.\n *\n * @returns {null|*}\n */\n renderEmptyTableRow() {\n if (this.props.loading || (this.props.items && this.props.items.length)) {\n return null;\n }\n\n if (this.props.renderEmptyRow) {\n return this.props.renderEmptyRow();\n }\n\n return (\n <Table.Row>\n <Table.Cell\n colSpan={this.getColumnCount()}\n textAlign='center'\n >\n <div className='empty-container'>\n { this.props.renderEmptyMessage() }\n </div>\n </Table.Cell>\n </Table.Row>\n );\n }\n\n /**\n * Renders the table header cell for the passed column.\n *\n * @param column\n *\n * @returns {*}\n */\n renderHeaderCell(column: Column) {\n if (column.hidden) {\n return null;\n }\n\n if (column.renderHeader) {\n return column.renderHeader();\n }\n\n return (\n <Ref\n innerRef={this.columnRefs[column.name]}\n >\n <Table.HeaderCell\n key={column.name}\n sorted={this.props.sortColumn === column.name ? this.props.sortDirection : null}\n onClick={() => this.props.onColumnClick(column)}\n >\n { column.label }\n <ColumnResize\n onMouseDown={(e: MouseEvent) => {\n const columnRef = this.columnRefs[column.name];\n const offset = columnRef.current.offsetWidth - e.pageX;\n this.setState({ resize: { columnRef, offset } });\n }}\n />\n </Table.HeaderCell>\n </Ref>\n );\n }\n\n /**\n * Renders the table row for the passed item.\n *\n * @param item\n * @param index\n *\n * @returns {*}\n */\n renderItem(item: any, index: number) {\n const children = [\n this.renderSelectCheckbox(item, index),\n this.props.columns.map(this.renderCell.bind(this, item)),\n this.renderActions(item, index)\n ];\n\n const handleCellClick = (e) => {\n // only target table cells, not action buttons or checkboxes, etc.\n if (e.target.nodeName === 'TD') {\n this.setState((state) => ({\n activePanel: state.activePanel === item.id ? '' : item.id\n }));\n }\n };\n\n if (this.props.renderItem) {\n return this.props.renderItem(item, index, children);\n }\n\n return (\n <>\n <Table.Row\n key={index}\n onClick={this.props.expandableRows ? handleCellClick : () => { }}\n className={this.props.expandableRows ? 'expandable' : ''}\n >\n { children }\n </Table.Row>\n { this.props.expandableRows && (\n <Table.Row\n className={this.state.activePanel === item.id ? 'expanded-panel' : 'hidden'}\n >\n { this.props.expandPanel && this.props.expandPanel(item, this.state.activePanel) }\n </Table.Row>\n )}\n </>\n );\n }\n\n renderLoading() {\n if (!this.props.loading) {\n return null;\n }\n\n return (\n <Table.Row>\n <Table.Cell\n colSpan={this.getColumnCount()}\n textAlign='center'\n >\n <Loader\n active\n content={i18n.t('DataTable.loading')}\n inline\n />\n </Table.Cell>\n </Table.Row>\n );\n }\n\n /**\n * Renders the select checkbox for the passed item.\n *\n * @returns {null|*}\n */\n renderSelectCheckbox(item, index) {\n if (!(this.props.selectable && this.props.onRowSelect && this.props.isRowSelected)) {\n return null;\n }\n\n return (\n <Table.Cell\n className='select-cell'\n key={`select-cell-${index}`}\n >\n <Checkbox\n onClick={this.props.onRowSelect.bind(this, item)}\n checked={this.props.isRowSelected(item)}\n />\n </Table.Cell>\n );\n }\n\n /**\n * Renders the select list header.\n *\n * @returns {null|*}\n */\n renderSelectHeader() {\n if (!this.props.selectable) {\n return null;\n }\n\n const allSelected = this.props.items\n && this.props.items.length\n && _.every(this.props.items, this.props.isRowSelected.bind(this));\n\n return (\n <Table.HeaderCell\n className='select-cell'\n >\n <Checkbox\n onClick={this.onSelectAll.bind(this, allSelected)}\n checked={allSelected}\n />\n </Table.HeaderCell>\n );\n }\n}\n\nDataTable.defaultProps = {\n actions: undefined,\n addButton: {\n location: 'top',\n color: 'green'\n },\n buttons: [],\n count: 0,\n className: '',\n expandableRows: false,\n expandPanel: undefined,\n filters: undefined,\n items: [],\n loading: false,\n modal: undefined,\n page: 1,\n pages: 1,\n onColumnClick: () => {},\n onCopy: undefined,\n onPageChange: () => {},\n renderDeleteModal: undefined,\n renderEmptyRow: undefined,\n renderSearch: undefined,\n renderItem: undefined,\n showRecordCount: false,\n sortColumn: undefined,\n sortDirection: undefined,\n};\n\nexport default useColumnSelector(useList(DataTable));\n\nexport type {\n Props\n};\n","// @flow\n\nimport { Object as ObjectUtils } from '@performant-software/shared-components';\nimport React, { Component, type ComponentType, type Element } from 'react';\nimport { Checkbox, Dropdown, Icon } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport Draggable from './Draggable';\nimport type { Props as ListProps } from './List';\nimport './DataTableColumnSelector.css';\n\ntype Column = {\n className?: string,\n hidden?: boolean,\n label?: string,\n name: string,\n render?: (item: any) => Element<any>,\n renderHeader?: (item: any) => Element<any>,\n resolve?: (item: any) => any,\n sortable: boolean\n};\n\ntype Props = ListProps & {\n /**\n * CSS class name to append to the wrapped component.\n */\n className?: string,\n\n /**\n * An array of columns to display within the <code>Table</code>.\n * <br />\n * <br />\n *\n * If only a <code>name</code> attribute is provided, the value for each record will be pulled from the item property\n * matching that name.\n * <br />\n * <br />\n *\n * If a <code>resolve</code> callback is provided, the item will be passed to the function and the return value will\n * display as the property value.\n * <br />\n * <br />\n *\n * If a <code>render</code> callback is provided, the item will be passed to the function and the return JSX\n * will display as the property value.\n */\n columns: Array<Column>\n};\n\ntype State = {\n columns: Array<Column>\n};\n\n/**\n * Returns a function to wrap the passed component in a column selector. The ColumnSelector component will bind a\n * renderListHeader function, which can be used in the wrapped component to render a column selector dropdown button.\n *\n * @param WrappedComponent\n */\nconst useColumnSelector = (WrappedComponent: ComponentType<any>) => (\n class extends Component<Props, State> {\n static defaultProps = {\n className: ''\n };\n\n /**\n * Constructs a new DataTableColumnSelector component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n columns: props.columns\n };\n }\n\n /**\n * Reset the columns on the state when the props change.\n *\n * @param prevProps\n */\n componentDidUpdate(prevProps: Props): * {\n if (!ObjectUtils.isEqual(prevProps.columns, this.props.columns)) {\n this.setState({ columns: this.props.columns });\n }\n }\n\n /**\n * Toggles the hidden property for the passed column.\n *\n * @param column\n */\n onColumnCheckbox(column: Column) {\n this.setState((state) => ({\n columns: _.map(state.columns, (c) => (c.name === column.name ? { ...c, hidden: !c.hidden } : c))\n }));\n }\n\n /**\n * Drags/drops the column at the passed index to the new position.\n *\n * @param dragIndex\n * @param hoverIndex\n */\n onDrag(dragIndex: number, hoverIndex: number) {\n this.setState((state) => {\n const columns = [];\n const anchoredColumns = [];\n\n // Preserve the index of any unlabeled columns\n _.each(state.columns, (column, index) => {\n if (column.label && column.label.length) {\n columns.push(column);\n } else {\n anchoredColumns.push({ index, column });\n }\n });\n\n const column = columns[dragIndex];\n columns.splice(dragIndex, 1);\n columns.splice(hoverIndex, 0, column);\n\n // Add the unlabeled columns back in\n _.each(anchoredColumns, (c) => columns.splice(c.index, 0, c.column));\n\n return { columns };\n });\n }\n\n /**\n * Renders the DataTableColumnSelector component.\n *\n * @returns {*}\n */\n render() {\n return (\n <WrappedComponent\n {...this.props}\n className={`data-table-column-selector ${this.props.className}`}\n columns={this.state.columns}\n renderListHeader={this.renderHeader.bind(this)}\n />\n );\n }\n\n /**\n * Renders the dropdown column selector.\n *\n * @returns {*}\n */\n renderHeader() {\n return (\n <>\n { this.props.renderListHeader && this.props.renderListHeader() }\n <Dropdown\n aria-label='Select Columns'\n basic\n button\n icon='cog'\n className='icon configure-button open-right'\n closeOnBlur={false}\n >\n <Dropdown.Menu>\n { this.state.columns\n .filter((c) => c.label && c.label.length)\n .map((c, index) => (\n <Draggable\n id={c.name}\n index={index}\n key={c.name}\n onDrag={this.onDrag.bind(this)}\n >\n <Dropdown.Item\n aria-dropeffect='move'\n onClick={(e) => e.stopPropagation()}\n >\n <Icon\n name='bars'\n />\n <Checkbox\n aria-label='Select Column'\n checked={!c.hidden}\n label={c.label}\n onClick={this.onColumnCheckbox.bind(this, c)}\n />\n </Dropdown.Item>\n </Draggable>\n ))}\n </Dropdown.Menu>\n </Dropdown>\n </>\n );\n }\n }\n);\n\nexport default useColumnSelector;\n\nexport type {\n Column,\n Props\n};\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"axios\");","// @flow\n\nimport React, {\n useCallback,\n useEffect,\n useRef,\n useState,\n type Node\n} from 'react';\nimport { Dropdown, Ref } from 'semantic-ui-react';\n\ntype Props = {\n children: Node,\n onClick?: () => void,\n role?: string\n};\n\nconst DropdownMenu = (props: Props) => {\n const [open, setOpen] = useState(false);\n const ref = useRef();\n\n const onMouseEnter = useCallback(() => setOpen(true), []);\n const onMouseLeave = useCallback(() => setOpen(false), []);\n\n /**\n * Adds/removes the mouseenter/mouseleave events.\n */\n useEffect(() => {\n if (ref.current) {\n ref.current.addEventListener('mouseenter', onMouseEnter);\n ref.current.addEventListener('mouseleave', onMouseLeave);\n }\n\n return () => {\n if (ref.current) {\n ref.current.removeEventListener('mouseenter', onMouseEnter);\n ref.current.removeEventListener('mouseleave', onMouseLeave);\n }\n };\n }, [ref]);\n\n /**\n * Sets the \"role\" aria attribute on the current element if provided.\n */\n useEffect(() => {\n if (ref.current && props.role) {\n ref.current.setAttribute('role', props.role);\n }\n }, [ref, props.role]);\n\n return (\n <Ref\n innerRef={ref}\n >\n <Dropdown\n {...props}\n open={open}\n onClick={() => {\n if (props.onClick) {\n props.onClick();\n }\n\n setOpen(false);\n }}\n >\n <Dropdown.Menu>\n { props.children }\n </Dropdown.Menu>\n </Dropdown>\n </Ref>\n );\n};\n\nDropdownMenu.defaultProps = {\n onClick: undefined\n};\n\nexport default DropdownMenu;\n","// @flow\n\nimport React, { useCallback } from 'react';\nimport {\n Dropdown,\n Menu,\n type DropdownItemProps,\n type HeaderProps,\n type MenuProps\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport DropdownMenu from './DropdownMenu';\n\ntype Props = MenuProps & {\n header: HeaderProps,\n items: Array<DropdownItemProps | MenuProps>\n};\n\nconst MenuBar = ({ header, items, ...props }: Props) => {\n /**\n * Renders the passed item as a dropdown item.\n *\n * @param item\n *\n * @returns {JSX.Element}\n */\n const renderDropdownItem = useCallback((item, index) => (\n <Dropdown.Item\n key={index}\n {...item}\n />\n ), []);\n\n /**\n * Renders the passed item as a menu item.\n *\n * @returns {JSX.Element}\n */\n const renderMenuItem = useCallback((item, index) => (\n <Menu.Item\n key={index}\n {...item}\n />\n ), []);\n\n /**\n * Renders the passed item as a dropdown menu.\n *\n * @returns {JSX.Element}\n */\n const renderDropdown = useCallback((item, index) => (\n <DropdownMenu\n aria-label={item.content}\n item\n key={index}\n role='group'\n text={item.content}\n >\n { _.map(item.items, (i) => (i.items ? renderDropdown(i) : renderDropdownItem(i)))}\n </DropdownMenu>\n ), []);\n\n /**\n * Renders the passed item.\n *\n * @returns {JSX.Element}\n */\n const renderItem = useCallback((item) => (item.items ? renderDropdown(item) : renderMenuItem(item)), []);\n\n return (\n <Menu\n {...props}\n className='menu-bar'\n >\n <Menu.Item\n {...header}\n header\n />\n { _.map(items, (item) => renderItem(item)) }\n </Menu>\n );\n};\n\nexport default MenuBar;\n","// @flow\n\nimport React, { useCallback } from 'react';\nimport {\n Header,\n Menu,\n Ref,\n type HeaderProps,\n type MenuItemProps\n} from 'semantic-ui-react';\nimport _ from 'underscore';\n\ntype Props = {\n contextRef: {\n current: ?HTMLElement\n },\n header: HeaderProps,\n items: Array<HeaderProps | MenuItemProps>\n};\n\nconst MenuSidebar = ({\n contextRef,\n header,\n items,\n ...props\n}: Props) => {\n /**\n * Renders the passed item as a menu.\n *\n * @type {unknown}\n */\n const renderMenu = useCallback((item, index) => (\n <Menu.Item\n key={index}\n >\n <Menu.Header\n {...item}\n />\n <Menu.Menu>\n { _.map(item.items, (i) => renderItem(i)) }\n </Menu.Menu>\n </Menu.Item>\n ), []);\n\n /**\n * Renders the passed item as a menu item.\n *\n * @type {unknown}\n */\n const renderMenuItem = useCallback((item, index) => (\n <Menu.Item\n key={index}\n {...item}\n />\n ), []);\n\n /**\n * Renders the passed item.\n *\n * @type {function(*): *}\n */\n const renderItem = useCallback((item) => (item.items ? renderMenu(item) : renderMenuItem(item)), []);\n\n return (\n <Ref\n innerRef={contextRef}\n >\n <Menu\n {...props}\n fixed='left'\n vertical\n >\n <Menu.Item>\n <Header\n {...header}\n />\n </Menu.Item>\n { _.map(items, (item) => renderItem(item)) }\n </Menu>\n </Ref>\n );\n};\n\nexport default MenuSidebar;\n","// @flow\n\nimport axios from 'axios';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState\n} from 'react';\nimport { Form, Grid, Modal } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport DataTable from './DataTable';\nimport DropdownButton from './DropdownButton';\nimport i18n from '../i18n/i18n';\nimport MenuBar from './MenuBar';\nimport MenuSidebar from './MenuSidebar';\nimport ModalContext from '../context/ModalContext';\nimport useDataList, { SORT_ASCENDING, SORT_DESCENDING } from './DataList';\nimport './DataView.css';\n\nimport type { Column } from './DataTableColumnSelector';\n\ntype Sort = {\n label: string,\n value: string\n};\n\ntype Item = {\n id: string,\n label: string,\n group?: string,\n columns?: Array<Column>,\n sorts?: Array<Sort>\n};\n\ntype Props = {\n columnCount?: number,\n items: Array<Item>,\n layout: 'top' | 'left',\n title: string\n};\n\n/**\n * Sets up the List component used by the DataView component. This component is responsible for rendering the DataTable\n * and handling sorting.\n */\nconst List = useDataList((props) => {\n const [activeSort, setActiveSort] = useState();\n\n /**\n * Sets the active sort object on the state.\n *\n * @type {(function(*): void)|*}\n */\n const onSortChange = useCallback((sort) => {\n const newSort = { ...sort };\n\n if (activeSort && activeSort.value === sort.value) {\n newSort.direction = activeSort.direction === SORT_DESCENDING ? SORT_ASCENDING : SORT_DESCENDING;\n }\n\n setActiveSort(newSort);\n }, [props.sorts, activeSort]);\n\n /**\n * Calls the onSort prop when the active sort is changed.\n */\n useEffect(() => {\n if (activeSort) {\n props.onSort(activeSort.value, activeSort.direction, props.page);\n }\n }, [activeSort]);\n\n /**\n * Calls the onSort prop when the component is loaded to initialize the data set.\n */\n useEffect(() => {\n const { page } = props;\n\n let { sortColumn = '', sortDirection = SORT_ASCENDING } = props;\n\n if (!sortColumn) {\n const defaultSort = _.first(props.sort);\n\n if (defaultSort) {\n sortColumn = defaultSort.value;\n\n if (defaultSort.direction) {\n sortDirection = defaultSort.direction;\n }\n }\n }\n\n props.onSort(sortColumn, sortDirection, page);\n }, []);\n\n return (\n <DataTable\n {...props}\n renderListHeader={() => props.sorts && (\n <DropdownButton\n basic\n icon={activeSort && activeSort.direction === SORT_DESCENDING\n ? 'sort alphabet down'\n : 'sort alphabet up'}\n onChange={() => {}}\n options={_.map(props.sorts, (sort) => ({\n key: sort.value,\n value: sort.value,\n text: sort.label,\n onClick: () => onSortChange(sort)\n }))}\n text={activeSort\n ? i18n.t('DataView.labels.sortBy', { column: activeSort.label })\n : i18n.t('DataView.labels.noSort')}\n value={activeSort && activeSort.value}\n />\n )}\n tableProps={{\n ...props.tableProps || {},\n celled: true\n }}\n />\n );\n});\n\nconst DataView = (props: Props) => {\n const [activeItem, setActiveItem] = useState();\n const [selectedRecord, setSelectedRecord] = useState();\n\n const [columns, setColumns] = useState([]);\n const [menu, setMenu] = useState([]);\n const [paddingLeft, setPaddingLeft] = useState();\n const [key, setKey] = useState();\n\n const menuRef = useRef();\n\n /**\n * Sets the collection name based on the URL of the active item.\n *\n * @type {string}\n */\n const collectionName = useMemo(() => {\n let name = '';\n\n if (activeItem) {\n name = activeItem.url.substr(activeItem.url.lastIndexOf('/') + 1, activeItem.url.length);\n }\n\n return name;\n }, [activeItem]);\n\n /**\n * Merges the calculated columns with the columns passed with the active item. The idea is to allow customization\n * of the columns by the implementing component, but not require it.\n *\n * @type {(function(*): ([]|*))|*}\n */\n const mergeColumns = useCallback((items) => {\n if (!activeItem) {\n return [];\n }\n\n // Build the list of columns based on the unique set of properties\n const keys = _.chain(items)\n .map((item) => _.keys(item))\n .flatten()\n .uniq()\n .value();\n\n // Merge any columns provided by the implementing component by name\n let cols = _.map(keys, (col, index) => {\n const columnValue = _.findWhere(activeItem.columns, { name: col }) || {};\n\n const defaultValue = {\n name: col,\n label: col.trim().replace(/^\\w/, (c) => c.toUpperCase()).replaceAll('_', ' '),\n sortable: false,\n resolve: (item) => resolveValue(item, col),\n hidden: index > props.columnCount,\n index\n };\n\n return _.extend(defaultValue, columnValue);\n });\n\n // Include any columns provided by the implementing component that do not exist on the object (i.e. extra columns)\n cols = [\n ...cols,\n ..._.reject(activeItem.columns, (col) => _.contains(keys, col.name))\n ];\n\n // Sort the columns by the index property\n return _.sortBy(cols, 'index');\n }, [activeItem]);\n\n /**\n * Calls the \"show\" URL for the passed item. It's possible that the API does not implement a public \"show\" route. In\n * this case and error is expected and the passed item will be set as the selected record.\n *\n * @type {(function(*): void)|*}\n */\n const onItemSelection = useCallback((item) => {\n if (activeItem) {\n axios\n .get(`${activeItem.url}/${item.id}`)\n .then(({ data }) => {\n const itemKey = _.first(_.keys(data));\n setSelectedRecord(data[itemKey]);\n })\n .catch(() => {\n setSelectedRecord(item);\n });\n }\n }, [activeItem]);\n\n /**\n * Calls the \"index\" URL to initialize the data set.\n *\n * @type {function(*): *}\n */\n const onLoad = useCallback((params) => {\n let promise;\n\n if (activeItem) {\n promise = axios\n .get(activeItem.url, { params })\n .then((response) => {\n const items = response.data[collectionName];\n setColumns(mergeColumns(items));\n\n return response;\n });\n } else {\n promise = Promise.resolve();\n }\n\n return promise;\n }, [activeItem]);\n\n /**\n * Returns the value of the passed attribute on the passed item. This function handles use cases for special\n * types of objects.\n *\n * @type {function(*, *): *}\n */\n const resolveValue = useCallback((item, attribute) => {\n let value = item[attribute];\n\n if (_.isArray(value)) {\n value = _.size(value);\n } else if (_.isBoolean(value)) {\n value = Boolean(value).toString();\n } else if (_.isObject(value)) {\n value = value[_.first(_.keys(value))];\n }\n\n return value;\n }, []);\n\n /**\n * Re-formats the passed items as a menu object. If we're grouping the menu items, items will be added as\n * a child property of the group object.\n */\n useEffect(() => {\n const hasGroups = _.every(props.items, (item) => !!item.group);\n\n if (!hasGroups) {\n setMenu(props.items);\n } else {\n const menuItems = _.groupBy(props.items, 'group');\n const headers = _.keys(menuItems);\n\n setMenu(_.map(headers, (header) => ({\n content: header,\n items: _.map(menuItems[header], (item) => ({\n active: activeItem && activeItem.id === item.id,\n content: item.label,\n onClick: () => setActiveItem(item)\n }))\n })));\n }\n }, [activeItem, props.items]);\n\n /**\n * Set the active item as the first item in the list.\n */\n useEffect(() => {\n if (props.items && props.items.length) {\n setActiveItem(_.first(props.items));\n }\n }, [props.items]);\n\n /**\n * If we're using the sidebar layout, set the padding so the fixed positioned menu does not overlap the content.\n */\n useEffect(() => {\n if (props.layout === 'left' && menuRef && menuRef.current) {\n setPaddingLeft(menuRef.current.offsetWidth);\n }\n }, [menuRef, props.layout]);\n\n /**\n * Calculates the key value when the active item or columns are changed. This is done to force re-rendering\n * of the List component when the columns are loaded via the API.\n */\n useEffect(() => {\n const keys = [];\n\n if (activeItem) {\n keys.push(activeItem.id);\n }\n\n if (columns && columns.length) {\n keys.push(..._.pluck(columns, 'name'));\n }\n\n setKey(keys.join(''));\n }, [activeItem, columns]);\n\n return (\n <div\n className='data-view'\n >\n { props.layout === 'top' && (\n <MenuBar\n header={{\n content: props.title\n }}\n items={menu}\n />\n )}\n { props.layout === 'left' && (\n <MenuSidebar\n contextRef={menuRef}\n header={{\n content: props.title\n }}\n items={menu}\n />\n )}\n <div\n style={{\n marginLeft: paddingLeft\n }}\n >\n { activeItem && (\n <List\n actions={[{\n name: 'details',\n icon: 'info',\n onClick: onItemSelection\n }]}\n collectionName={collectionName}\n columns={columns}\n key={key}\n onLoad={onLoad}\n perPageOptions={[10, 25, 50, 100]}\n searchable\n sorts={activeItem.sorts}\n />\n )}\n </div>\n { selectedRecord && (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n as={Form}\n centered={false}\n className='data-view-modal'\n closeIcon\n mountNode={mountNode}\n onClose={() => setSelectedRecord(null)}\n open\n >\n <Modal.Header\n content={i18n.t('DataView.labels.details')}\n />\n <Modal.Content>\n <Grid\n columns={3}\n doubling\n >\n { _.map(mergeColumns([selectedRecord]), (column) => (\n <Grid.Column\n as={Form.Field}\n key={column.name}\n >\n <span\n className='label'\n >\n { column.label }\n </span>\n { resolveValue(selectedRecord, column.name) }\n </Grid.Column>\n ))}\n </Grid>\n </Modal.Content>\n </Modal>\n )}\n </ModalContext.Consumer>\n )}\n </div>\n );\n};\n\nDataView.defaultProps = {\n columnCount: 5,\n layout: 'left'\n};\n\nexport default DataView;\n","// @flow\n\nimport { Hooks, Object as ObjectUtils } from '@performant-software/shared-components';\nimport React, { useEffect } from 'react';\nimport _ from 'underscore';\nimport DataTable from './DataTable';\nimport type { Props as DataTableProps } from './DataTable';\nimport useDataList, { SORT_ASCENDING, SORT_DESCENDING, type Props as DataListProps } from './DataList';\nimport './ListTable.css';\n\ntype Props = DataListProps & DataTableProps & {\n /**\n * If true, columns can be shown/hidden by the user.\n */\n configurable?: boolean,\n\n /**\n * The name of the default sort column.\n */\n defaultSort?: string,\n\n /**\n * The default direction to sort the list (ascending vs. descending).\n */\n defaultSortDirection?: string,\n\n /**\n * Callback supplied by the <code>DataList</code> higher-order component which can be used to initialize the list.\n */\n onInit?: (page?: number) => void,\n\n /**\n * Callback supplied by the <code>DataList</code> higher-order component which can be used to sort the list.\n */\n onSort?: (sortColumn: string, sortDirection: string, page?: number) => void,\n\n /**\n * Current sort column supplied by the <code>DataList</code> higher-order component.\n */\n sortColumn?: string,\n\n /**\n * Current sort direction supplied by the <code>DataList</code> higher-order component.\n */\n sortDirection?: string,\n\n /**\n * Customization props for the\n * <a target=\"_blank\" href=\"https://react.semantic-ui.com/collections/table/\"><code>Table</code></a>\n * component.\n */\n tableProps?: any\n};\n\n/**\n * The <code>ListTable</code> component renders a list which has the ability to load, save, and delete records from\n * an API (via the <code>DataList</code> higher-order component). This component will integrate seamlessly with a\n * back-end implementing the <code>resource-api</code>. See the\n * <a href=\"https://github.com/performant-software/resource-api\">GitHub page</a> for more details.\n */\nconst ListTable = useDataList((props: Props) => {\n const prevColumns = Hooks.usePrevious(props.columns);\n\n /**\n * Sorts the list by the selected column, and/or reverse the direction.\n *\n * @param column\n */\n const onColumnClick = (column) => {\n if (!column.sortable) {\n return;\n }\n\n const sortColumn = column.name;\n let sortDirection = SORT_ASCENDING;\n\n /**\n * If the column has not yet been click-sorted, check to see if there is a default sort\n * direction on the column. Otherwise, toggle the sort direction on the state.\n */\n if (column.name === props.sortColumn) {\n sortDirection = props.sortDirection === SORT_ASCENDING ? SORT_DESCENDING : SORT_ASCENDING;\n } else if (column.sortDirection) {\n sortDirection = column.sortDirection;\n }\n\n props.onSort(sortColumn, sortDirection);\n };\n\n /**\n * Initializes the list by calling the onSort prop. If no sortColumn prop is passed, we'll sort the list by the first\n * sortable column.\n */\n useEffect(() => {\n if (!ObjectUtils.isEqual(props.columns, prevColumns)) {\n const {\n page,\n defaultSort,\n defaultSortDirection = SORT_ASCENDING\n } = props;\n\n if (defaultSort) {\n props.onSort(defaultSort, defaultSortDirection, page);\n } else {\n const sortableColumn = _.findWhere(props.columns, { sortable: true });\n\n if (sortableColumn) {\n onColumnClick(sortableColumn);\n } else {\n // If no columns are sortable, load the data as is\n props.onInit();\n }\n }\n }\n }, [props.columns]);\n\n return (\n <DataTable\n {...props}\n onColumnClick={onColumnClick.bind(this)}\n />\n );\n});\n\nListTable.defaultProps = {\n configurable: true,\n tableProps: {\n celled: true,\n sortable: true\n }\n};\n\nexport default ListTable;\n","// @flow\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState\n} from 'react';\nimport axios from 'axios';\nimport _ from 'underscore';\nimport ListTable from './ListTable';\nimport MenuSidebar from './MenuSidebar';\n\ntype Props = {\n columnCount?: number,\n title: string,\n url: string\n};\n\nconst DatabaseView = (props: Props) => {\n const [columns, setColumns] = useState([]);\n const [selectedTable, setSelectedTable] = useState();\n const [tables, setTables] = useState([]);\n\n const menuRef = useRef();\n\n const service = useMemo(() => ({\n getColumns: (params) => axios.get(`${props.url}/api/columns`, { params }),\n getData: (params) => axios.post(`${props.url}/api/search`, params),\n getTables: () => axios.get(`${props.url}/api/tables`)\n }), [props.url]);\n\n const resolveValue = useCallback((column, item) => {\n let value = item[column.column_name];\n\n const { data_type: dataType } = column;\n\n if (value) {\n switch (dataType) {\n case 'timestamp without time zone':\n value = new Date(value).toLocaleDateString();\n break;\n\n default:\n // Value is already set\n }\n }\n\n return value;\n }, []);\n\n useEffect(() => {\n if (service) {\n service\n .getTables()\n .then(({ data }) => {\n setTables(data);\n setSelectedTable(_.first(data));\n });\n }\n }, [service]);\n\n useEffect(() => {\n if (selectedTable) {\n service\n .getColumns({ table_name: selectedTable.table_name })\n .then(({ data }) => setColumns(data));\n }\n }, [selectedTable, service]);\n\n const test = useMemo(() => _.map(columns, (column, index) => ({\n name: column.column_name,\n label: column.column_name,\n resolve: resolveValue.bind(this, column),\n sortable: true,\n hidden: index > props.columnCount\n })), [columns, resolveValue, props.columnCount]);\n\n return (\n <div\n className='database-view'\n >\n <MenuSidebar\n contextRef={menuRef}\n header={{\n content: props.title,\n inverted: true\n }}\n inverted\n items={[{\n items: _.map(tables, (table) => ({\n active: selectedTable === table,\n content: table.table_name,\n onClick: () => setSelectedTable(table)\n }))\n }]}\n style={{\n overflow: 'auto',\n width: '250px'\n }}\n />\n <div\n style={{\n marginLeft: '250px'\n }}\n >\n { selectedTable && (\n <ListTable\n collectionName='items'\n columns={test}\n onLoad={(params) => service.getData({ ...params, table_name: selectedTable.table_name })}\n perPageOptions={[10, 25, 50, 100]}\n searchable\n />\n )}\n </div>\n </div>\n );\n};\n\nDatabaseView.defaultProps = {\n columnCount: Number.MAX_SAFE_INTEGER\n};\n\nexport default DatabaseView;\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-calendar\");","// @flow\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport Calendar from 'react-calendar';\nimport { Icon, Transition } from 'semantic-ui-react';\nimport DateInput from './DateInput';\n\nimport './DatePicker.css';\n\ntype Props = {\n closeOnSelection?: boolean,\n formatOptions?: any,\n locale?: string,\n onChange: (date: ?Date) => void,\n value: ?Date\n};\n\nconst DatePicker = (props: Props) => {\n const [calendar, setCalendar] = useState(false);\n const calendarWrapper = useRef<any>(null);\n\n const onDocumentClick = (event: Event) => {\n const calendarInstance = calendarWrapper.current;\n\n if (calendarInstance && !calendarInstance.contains(event.target)) {\n setCalendar(false);\n }\n };\n\n useEffect(() => {\n // Bind the event listener\n document.addEventListener('mousedown', onDocumentClick);\n\n // Unbind the event listener\n return () => document.removeEventListener('mousedown', onDocumentClick);\n }, [calendarWrapper]);\n\n return (\n <>\n <DateInput\n formatOptions={props.formatOptions}\n locale={props.locale}\n onChange={props.onChange.bind(this)}\n onClick={() => setCalendar(true)}\n value={props.value}\n />\n <Transition\n visible={calendar}\n >\n <div\n ref={calendarWrapper}\n style={{\n position: 'absolute',\n zIndex: '999'\n }}\n >\n <Calendar\n locale={props.locale}\n onChange={(date) => {\n props.onChange(date);\n if (props.closeOnSelection) {\n setCalendar(false);\n }\n }}\n next2AriaLabel='Next Year'\n next2Label={<Icon name='angle double right' />}\n nextAriaLabel='Next Month'\n nextLabel={<Icon name='chevron right' />}\n prev2AriaLabel='Previous Year'\n prev2Label={<Icon name='angle double left' />}\n prevAriaLabel='Previous Month'\n prevLabel={<Icon name='chevron left' />}\n value={props.value}\n />\n </div>\n </Transition>\n </>\n );\n};\n\nDatePicker.defaultProps = {\n closeOnSelection: true\n};\n\nexport default DatePicker;\n","// @flow\n\nimport React, { type Component } from 'react';\nimport { Popup } from 'semantic-ui-react';\n\ntype Props = {\n className?: string,\n content: string,\n delayInterval?: number,\n renderPopup?: () => Component<any>,\n popupContent?: string\n}\n\n/**\n * Renders the DescriptorField component. This component can be used to static text as with a popup on hover.\n *\n * @param props\n *\n * @returns {*}\n *\n * @constructor\n */\nconst DescriptorField = (props: Props) => (\n <Popup\n className={props.className}\n content={props.popupContent}\n hoverable\n mouseEnterDelay={props.delayInterval}\n trigger={props.renderPopup\n ? props.renderPopup()\n : (<span className='text'>{ props.content }</span>)}\n wide\n />\n);\n\nDescriptorField.defaultProps = {\n delayInterval: 1000,\n renderPopup: undefined,\n popupContent: undefined\n};\n\nexport default DescriptorField;\n","// @flow\n\nimport React, { useMemo } from 'react';\nimport uuid from 'react-uuid';\nimport { Icon } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\n\ntype Props = {\n basic?: boolean,\n className?: string,\n color?: string,\n compact?: boolean,\n filename?: string,\n primary?: boolean,\n size?: string,\n secondary?: boolean,\n url: string\n};\n\nconst DownloadButton = (props: Props) => {\n /**\n * Sets the appropriate class names based on the formatting props.\n *\n * @type {string}\n */\n const className = useMemo(() => {\n const classNames = ['ui', 'button'];\n\n if (props.basic) {\n classNames.push('basic');\n }\n\n if (props.className) {\n classNames.push(...props.className.split(' '));\n }\n\n if (props.color) {\n classNames.push(props.color);\n }\n\n if (props.compact) {\n classNames.push('compact');\n }\n\n if (props.primary) {\n classNames.push('primary');\n }\n\n if (props.secondary) {\n classNames.push('secondary');\n }\n\n if (props.size) {\n classNames.push(props.size);\n }\n\n return classNames.join(' ');\n }, [props.basic, props.color]);\n\n return (\n <a\n className={className}\n download={props.filename || uuid()}\n href={props.url}\n >\n <Icon\n name='cloud download'\n />\n { i18n.t('Common.buttons.download') }\n </a>\n );\n};\n\nexport default DownloadButton;\n","// @flow\n\nimport React from 'react';\nimport { Button, Loader } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\n\ntype Props = {\n onClick: (item: any) => Promise<any>,\n saving: boolean\n};\n\nconst SaveButton = (props: Props) => (\n <Button\n onClick={props.onClick.bind(this)}\n primary\n size='medium'\n type='submit'\n >\n { i18n.t('Common.buttons.save') }\n { props.saving && (\n <Loader\n active\n className='saving'\n inline\n size='tiny'\n />\n )}\n </Button>\n);\n\nexport default SaveButton;\n","// @flow\n\nimport { useEditContainer, type EditContainerProps } from '@performant-software/shared-components';\nimport React, { Component, type ComponentType } from 'react';\nimport {\n Dimmer,\n Form,\n Loader,\n Menu,\n Message,\n type MenuProps\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport CancelButton from './CancelButton';\nimport SaveButton from './SaveButton';\nimport Toaster from './Toaster';\nimport i18n from '../i18n/i18n';\nimport './EditPage.css';\n\ntype Props = EditContainerProps & {\n /**\n * CSS class name to append to the container <code>div</code> element.\n */\n className?: string,\n\n /**\n * The form component to render.\n */\n component: ComponentType<any>,\n\n /**\n * If provided, the passed menu will render as tabs at the top of the page.\n */\n menu?: MenuProps,\n\n /**\n * Callback fired when the close button is clicked.\n */\n onClose: () => void,\n\n /**\n * Callback fired when the save button is clicked.\n */\n onSave: () => Promise<any>,\n\n /**\n * If <code>true</code>, a loading indicator will display.\n */\n showLoading: boolean\n};\n\ntype State = {\n currentTab: string,\n showToaster: boolean\n};\n\n/**\n * The <code>EditPage</code> component can be used to edit the details of a single record within a page view. This\n * component uses the <code>EditContainer</code> higher-order component to facilitate all of the editing functionality.\n * This component is responsible for rendering the container in which the editable form is rendered.\n */\nclass EditPageClass extends Component<Props, State> {\n static defaultProps: any;\n\n /**\n * Constructs a new EditPage component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n currentTab: '',\n showToaster: false\n };\n }\n\n /**\n * Sets the current tab to the first tab in the array.\n */\n componentDidMount() {\n if (this.props.menu) {\n const tab = _.first(this.props.menu.items);\n this.setState({ currentTab: tab && tab.key });\n }\n }\n\n /**\n * Resets the <code>showToaster</code> property when the set of errors changes.\n *\n * @param prevProps\n */\n componentDidUpdate(prevProps: Props) {\n if (!_.isEmpty(this.props.errors) && !_.isEmpty(prevProps.errors) && prevProps.errors !== this.props.errors) {\n this.setState({ showToaster: true });\n }\n }\n\n /**\n * Shows the toaster and calls the onSave prop.\n *\n * @returns {*}\n */\n onSave() {\n this.setState({ showToaster: true });\n return this.props.onSave();\n }\n\n /**\n * Renders the EditPage component.\n *\n * @returns {*}\n */\n render() {\n return (\n <Dimmer.Dimmable\n as='div'\n className={`edit-page ${this.props.className || ''}`}\n >\n { this.renderLoading() }\n <Form\n noValidate\n >\n { this.renderMenu() }\n { this.renderButtons() }\n { this.renderComponent() }\n { this.renderToaster() }\n </Form>\n </Dimmer.Dimmable>\n );\n }\n\n /**\n * Renders the buttons and container if no menu is present.\n *\n * @returns {null|*}\n */\n renderButtons() {\n if (this.props.menu) {\n return null;\n }\n\n return (\n <div\n className='button-container'\n >\n <SaveButton\n onClick={this.onSave.bind(this)}\n saving={this.props.saving}\n />\n <CancelButton\n disabled={this.props.saving}\n onClick={this.props.onClose.bind(this)}\n />\n </div>\n );\n }\n\n /**\n * Renders the wrapped component.\n *\n * @returns {*}\n */\n renderComponent() {\n const WrappedComponent = this.props.component;\n\n return (\n <WrappedComponent\n {...this.props}\n currentTab={this.state.currentTab}\n />\n );\n }\n\n /**\n * Renders the loading indicator.\n *\n * @returns {null|*}\n */\n renderLoading() {\n if (!(this.props.showLoading && this.props.loading)) {\n return null;\n }\n\n return (\n <Dimmer\n active={this.props.loading}\n inverted\n >\n <Loader\n content={i18n.t('Common.messages.loading')}\n />\n </Dimmer>\n );\n }\n\n /**\n * Renders the menu (if present).\n *\n * @returns {null|*}\n */\n renderMenu() {\n if (!this.props.menu) {\n return null;\n }\n\n return (\n <Menu\n {..._.omit(this.props.menu, 'items')}\n >\n { this.props.menu && _.map(this.props.menu.items, (item) => (\n <Menu.Item\n active={item.key === this.state.currentTab}\n key={item.key}\n name={item.name}\n onClick={() => this.setState({ currentTab: item.key })}\n />\n ))}\n <Menu.Menu\n position='right'\n >\n <Menu.Item>\n <SaveButton\n onClick={this.onSave.bind(this)}\n saving={this.props.saving}\n />\n <CancelButton\n disabled={this.props.saving}\n onClick={this.props.onClose.bind(this)}\n />\n </Menu.Item>\n </Menu.Menu>\n </Menu>\n );\n }\n\n /**\n * Renders the toaster component.\n *\n * @returns {null|*}\n */\n renderToaster() {\n if (!this.state.showToaster) {\n return null;\n }\n\n if (!(this.props.errors && this.props.errors.length)) {\n return null;\n }\n\n return (\n <Toaster\n onDismiss={() => this.setState({ showToaster: false })}\n timeout={0}\n type={Toaster.MessageTypes.negative}\n >\n <Message.Header\n content={i18n.t('Common.messages.error.header')}\n />\n <Message.List\n items={this.props.errors}\n />\n </Toaster>\n );\n }\n}\n\nEditPageClass.defaultProps = {\n showLoading: true\n};\n\nconst EditPage = useEditContainer(EditPageClass);\nexport default EditPage;\n\nexport type EditPageProps = EditContainerProps & {\n currentTab: string\n};\n","// @flow\n\nimport React, { Component, type ComponentType } from 'react';\nimport { Table } from 'semantic-ui-react';\nimport uuid from 'react-uuid';\nimport _ from 'underscore';\nimport DataTable, { type Props as DataTableProps } from './DataTable';\nimport Draggable from './Draggable';\nimport './EmbeddedList.css';\n\nimport type { Column, Props as ColumnSelectorProps } from './DataTableColumnSelector';\n\ntype Props = DataTableProps & ColumnSelectorProps & {\n /**\n * The name of the default sort column.\n */\n defaultSort?: string,\n\n /**\n * The default direction to sort the list (ascending vs. descending).\n */\n defaultSortDirection?: string,\n\n /**\n * Callback fired when a table row is dragged.\n */\n onDrag?: (dragIndex: number, hoverIndex: number) => void\n};\n\ntype State = {\n sortColumn: ?string,\n sortDirection: ?string\n};\n\nconst PATH_DELIMITER = '.';\nconst SORT_ASCENDING = 'ascending';\nconst SORT_DESCENDING = 'descending';\n\n/**\n * The <code>EmbeddedList</code> component can be used to display a collection of records that live within a parent\n * object. This is especially useful when the collection is to be saved at the same time as the parent.\n */\nclass EmbeddedList extends Component<Props, State> {\n static defaultProps: any;\n\n /**\n * Constructs a new EmbeddedList component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n sortColumn: null,\n sortDirection: null\n };\n }\n\n /**\n * Sorts the table by the first column.\n */\n componentDidMount() {\n let column;\n\n if (this.props.defaultSort) {\n column = _.findWhere(this.props.columns, { name: this.props.defaultSort });\n } else {\n column = _.find(this.props.columns, (c) => c.sortable !== false);\n }\n\n if (column) {\n this.onColumnClick(column, this.props.defaultSortDirection);\n }\n }\n\n /**\n * Returns the sorted, filtered list of items.\n *\n * @returns {*}\n */\n getItems() {\n const { items } = this.props;\n const { sortColumn, sortDirection } = this.state;\n\n return _.orderBy(_.filter(items, (item) => !item._destroy), sortColumn, sortDirection);\n }\n\n /**\n * Sorts the table by the passed column.\n *\n * @param column\n */\n onColumnClick(column: Column, direction: string = SORT_ASCENDING) {\n /*\n * We'll disable the column sorting if the table rows are draggable. Making the table rows draggable implies\n * that the sorting will be done manually. Allowing column click sorting could make things confusing.\n */\n if (this.props.onDrag) {\n return;\n }\n\n /*\n * If the column is not sortable, we'll do nothing. Check explicity for \"false\" here because the default behavior\n * should allow columns to be sortable.\n */\n if (column.sortable === false) {\n return;\n }\n\n const sortColumn = column.name;\n let sortDirection = direction || SORT_ASCENDING;\n\n if (column.name === this.state.sortColumn) {\n sortDirection = this.state.sortDirection === SORT_ASCENDING ? SORT_DESCENDING : SORT_ASCENDING;\n }\n\n this.setState({ sortColumn, sortDirection });\n }\n\n /**\n * Deletes the passed item. This function returns a promise so that calls can be chained together.\n *\n * @param item\n *\n * @returns {Promise}\n */\n onDelete(item: any) {\n this.props.onDelete(item);\n return Promise.resolve();\n }\n\n /**\n * Saves the passed item, resets the state, and reloads the data. This function returns a promise so that calls can\n * be chained together.\n *\n * @param item\n *\n * @returns {Promise}\n */\n onSave(item: any) {\n const uid = item.uid ? item.uid : uuid();\n\n if (this.props.onSave) {\n this.props.onSave({ ...item, uid });\n }\n\n return Promise.resolve();\n }\n\n /**\n * Renders the EmbeddedList component.\n *\n * @returns {*}\n */\n render() {\n return (\n <DataTable\n {...this.props}\n actions={this.props.actions}\n addButton={this.props.addButton}\n buttons={this.props.buttons}\n className={`embedded-list ${this.props.className ? this.props.className : ''}`}\n configurable={this.props.configurable}\n columns={this.props.columns}\n count={this.props.items.length}\n items={this.getItems()}\n modal={this.props.modal}\n onColumnClick={this.onColumnClick.bind(this)}\n onCopy={this.props.onCopy}\n onDrag={this.props.onDrag}\n onDelete={this.onDelete.bind(this)}\n onSave={this.onSave.bind(this)}\n renderDeleteModal={this.props.renderDeleteModal}\n renderEmptyRow={this.props.renderEmptyRow}\n renderItem={this.renderItem.bind(this)}\n sortColumn={this.state.sortColumn}\n sortDirection={this.state.sortDirection}\n tableProps={{\n celled: true,\n sortable: !this.props.onDrag\n }}\n selectable={this.props.selectable}\n onRowSelect={this.props.onRowSelect}\n selectedRows={this.props.selectedRows}\n showRecordCount={this.props.showRecordCount}\n />\n );\n }\n\n /**\n * Renders the passed item. This function should be used if the table row is draggable.\n *\n * @param item\n * @param index\n * @param children\n *\n * @returns {*}\n */\n renderItem(item: any, index: number, children: ComponentType<any>) {\n if (this.props.onDrag) {\n // Since the item may not be saved yet, we'll look for the ID or UID columns as the key. This is necessary to\n // maintain the correct element when dragging.\n const key = item.id || item.uid;\n\n return (\n <Draggable\n id={key}\n index={index}\n item={item}\n key={key}\n onDrag={this.props.onDrag.bind(this)}\n >\n <Table.Row>\n { children }\n </Table.Row>\n </Draggable>\n );\n }\n\n return (\n <Table.Row\n key={index}\n >\n { children }\n </Table.Row>\n );\n }\n}\n\n/**\n * UnderscoreJS mixin to allow sorting by a property string (i.e. \"person.name\") and a sort\n * direction (\"ascending\" or \"descending\").\n */\n_.mixin({\n orderBy: (items, property, direction) => {\n if (!property) {\n return items;\n }\n\n const sortProperty = _.property(property.split(PATH_DELIMITER));\n let ordered = _.sortBy(items, (item) => sortProperty(item));\n\n if (direction === SORT_DESCENDING) {\n ordered = ordered.reverse();\n }\n\n return ordered;\n }\n});\n\nEmbeddedList.defaultProps = {\n items: [],\n addButton: {\n location: 'top'\n },\n buttons: [],\n className: '',\n configurable: true,\n modal: undefined,\n onCopy: undefined,\n onDrag: undefined,\n onSave: () => {},\n renderDeleteModal: undefined,\n renderEmptyRow: undefined\n};\n\nexport default EmbeddedList;\n\nexport {\n SORT_ASCENDING,\n SORT_DESCENDING\n};\n","// @flow\n\nimport React, {\n useImperativeHandle,\n useMemo,\n useState,\n type Node\n} from 'react';\nimport {\n Accordion,\n Divider,\n Header,\n Icon\n} from 'semantic-ui-react';\nimport './Facet.css';\n\ntype Props = {\n /**\n * Facet content to display inside the accordion menu.\n */\n children: Node,\n\n /**\n * Classname to apply to the root element.\n */\n className?: string,\n\n /**\n * If `true`, the facet will be expanded by default.\n */\n defaultActive?: boolean,\n\n /**\n * If `true`, a divider will be rendered between each facet in the list.\n */\n divided?: boolean,\n\n /**\n * React ref element to apply to the expand/collapse functions.\n */\n innerRef?: {\n current: ?HTMLElement\n },\n\n /**\n * Facet title to display at the top.\n */\n title: string,\n\n /**\n * If `true`, the facet will be visible in the DOM.\n */\n visible?: boolean\n};\n\n/**\n * This component can be used as a wrapper to display various types of facets (list, toggle, etc).\n */\nconst Facet = (props: Props) => {\n const [active, setActive] = useState(props.defaultActive);\n\n /**\n * Sets the class name variable for the Accordion component.\n *\n * @type {string}\n */\n const className = useMemo(() => {\n const classNames = ['facet'];\n\n if (!props.visible) {\n classNames.push('hidden');\n }\n\n if (props.className) {\n classNames.push(props.className);\n }\n\n return classNames.join(' ');\n }, [props.className, props.visible]);\n\n /**\n * Expose collapse/expand functions on the ref object to allow parent components to imperatively open/close.\n */\n useImperativeHandle(props.innerRef, () => ({\n collapse: () => setActive(false),\n expand: () => setActive(true)\n }));\n\n return (\n <>\n <Accordion\n className={className}\n >\n <Accordion.Title\n active={active}\n index={0}\n onClick={() => setActive((prevActive) => !prevActive)}\n >\n <div\n className='facet-title'\n >\n <Header\n content={props.title}\n size='tiny'\n />\n <Icon\n name='dropdown'\n />\n </div>\n </Accordion.Title>\n <Accordion.Content\n active={active}\n >\n { props.children }\n </Accordion.Content>\n </Accordion>\n { props.divided && (\n <Divider />\n )}\n </>\n );\n};\n\nFacet.defaultProps = {\n children: undefined,\n defaultActive: true,\n divided: false,\n visible: true\n};\n\nexport type {\n Props\n};\n\nexport default Facet;\n","// @flow\n\nimport React from 'react';\nimport { Button, type ButtonProps } from 'semantic-ui-react';\nimport { type ClearRefinementsProps } from '../types/InstantSearch';\n\ntype Props = ButtonProps & ClearRefinementsProps;\n\n/**\n * This component is used with the `useClearRefinements` hook from Instant Search Hooks. This component also accepts\n * all of the props of the Semantic UI <code>Button</code> component.\n */\nconst FacetClearButton = ({ useClearRefinements, ...props }: Props) => {\n const { refine, canRefine } = useClearRefinements(props);\n\n return (\n <Button\n {...props}\n disabled={!canRefine}\n onClick={() => refine()}\n />\n );\n};\n\nexport default FacetClearButton;\n","// @flow\n\nimport React from 'react';\nimport { Button } from 'semantic-ui-react';\nimport './LinkButton.css';\n\ntype Props = {\n content: string,\n onClick: () => void\n};\n\nconst LinkButton = (props: Props) => (\n <Button\n basic\n className='link-button'\n compact\n content={props.content}\n onClick={props.onClick.bind(this)}\n type='button'\n />\n);\n\nexport default LinkButton;\n","// @flow\n\nimport { Timer } from '@performant-software/shared-components';\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState\n} from 'react';\nimport {\n Checkbox,\n Icon,\n Input,\n Label,\n List\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport Facet, { type Props as FacetProps } from './Facet';\nimport i18n from '../i18n/i18n';\nimport LinkButton from './LinkButton';\nimport { type RefinementListProps } from '../types/InstantSearch';\nimport './FacetList.css';\n\ntype Props = FacetProps & RefinementListProps & {\n /**\n * The default value for the `operator` prop. If not provided, this will default to `or`.\n */\n defaultOperator?: string,\n\n /**\n * Default value of the facet list.\n */\n defaultValue?: string,\n\n /**\n * If \"true\", the component will render a search box for searching individual facet values.\n */\n searchable?: boolean,\n\n /**\n * If \"true\", the component will render a toggle to change the behavior of the list from \"or\" to \"and\" logic.\n */\n toggleable?: boolean\n};\n\nconst OPERATOR_OR = 'or';\nconst OPERATOR_AND = 'and';\n\n/**\n * This component is used with the `useRefinementList` hook from Instant Search Hooks. If the `searchable` prop\n * is \"true\", the component will also render a search box used to filter the list of facet values.\n */\nconst FacetList = forwardRef(({ useRefinementList, ...props }: Props, ref: HTMLElement) => {\n const [operator, setOperator] = useState(props.defaultOperator || OPERATOR_OR);\n\n const {\n canRefine,\n canToggleShowMore,\n isShowingMore,\n items,\n refine,\n searchForItems,\n toggleShowMore,\n } = useRefinementList({ ...props, operator });\n\n const searchRef = useRef();\n const [query, setQuery] = useState('');\n\n /**\n * Clears the current search state.\n *\n * @type {(function(): void)|*}\n */\n const onClear = useCallback(() => {\n // Reset the query view\n setQuery('');\n\n // Reset the list of refinements\n searchForItems();\n\n // Refocus the input element\n const { current: instance } = searchRef;\n if (instance) {\n instance.focus();\n }\n }, []);\n\n /**\n * Executes the search within the list of facet values.\n *\n * @type {function(): *}\n */\n const onSearch = useCallback(() => searchForItems(query), [query, searchForItems]);\n\n /**\n * Toggles the \"and\" / \"or\" list operator.\n *\n * @type {function(): void}\n */\n const onToggleOperator = useCallback(() => {\n setOperator((prevOperator) => (prevOperator === OPERATOR_OR ? OPERATOR_AND : OPERATOR_OR));\n }, []);\n\n /**\n * Sets the visibility variable based on the items and query.\n */\n const visible = useMemo(() => !(canRefine && _.isEmpty(items) && _.isEmpty(query)), [items, query]);\n\n /**\n * Sets the default value if provided.\n */\n useEffect(() => {\n if (props.defaultValue) {\n refine(props.defaultValue);\n }\n }, [props.defaultValue]);\n\n /**\n * Persist the facet search when a user selects or deselects items.\n */\n useEffect(() => {\n if (query) {\n searchForItems(query);\n }\n }, [items]);\n\n return (\n <Facet\n className='facet-list'\n defaultActive={props.defaultActive}\n divided={props.divided}\n innerRef={ref}\n title={props.title}\n visible={visible}\n >\n { props.searchable && (\n <Input\n icon={query && (\n <Icon\n link\n name='times'\n onClick={onClear}\n />\n )}\n fluid\n onChange={(e, { value }) => setQuery(value)}\n onKeyDown={() => Timer.clearSearchTimer()}\n onKeyUp={() => Timer.setSearchTimer(onSearch)}\n placeholder={i18n.t('FacetList.labels.search')}\n ref={searchRef}\n value={query}\n />\n )}\n <List\n className='facet-list'\n >\n { _.map(items, (item, index) => (\n <List.Item\n key={index}\n >\n <Checkbox\n checked={item.isRefined}\n label={{\n children: (\n <>\n <span>{ item.label }</span>\n <Label\n circular\n content={item.count}\n size='small'\n />\n </>\n )\n }}\n onClick={() => refine(item.value)}\n />\n </List.Item>\n ))}\n </List>\n { canToggleShowMore && (\n <>\n <Icon\n name={isShowingMore ? 'angle up' : 'angle down'}\n />\n <LinkButton\n content={isShowingMore\n ? i18n.t('FacetList.buttons.showLess')\n : i18n.t('FacetList.buttons.showMore')}\n onClick={() => toggleShowMore()}\n />\n </>\n )}\n { props.toggleable && (\n <Checkbox\n className='toggleable'\n checked={operator === OPERATOR_AND}\n label={operator === OPERATOR_OR\n ? i18n.t('FacetList.labels.matchAny')\n : i18n.t('FacetList.labels.matchAll')}\n onChange={onToggleOperator}\n toggle\n />\n )}\n </Facet>\n );\n});\n\nFacetList.defaultProps = {\n ...Facet.defaultProps,\n defaultOperator: OPERATOR_OR\n};\n\nexport default FacetList;\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"rc-slider\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"rc-slider/assets/index.css\");","// @flow\n\nimport Slider from 'rc-slider';\nimport React, {\n forwardRef,\n useEffect,\n useMemo,\n useState\n} from 'react';\nimport { Grid } from 'semantic-ui-react';\nimport Facet, { type Props as FacetProps } from './Facet';\nimport { type RangeSliderProps } from '../types/InstantSearch';\nimport 'rc-slider/assets/index.css';\nimport './FacetSlider.css';\n\ntype Props = FacetProps & RangeSliderProps;\n\n/**\n * This component can be used with the `useRange` hook from Instant Search Hooks.\n */\nconst FacetSlider = forwardRef(({ useRangeSlider, ...props }: Props, ref: HTMLElement) => {\n const {\n start,\n range,\n refine,\n } = useRangeSlider(props);\n\n const [valueView, setValueView] = useState<Array<number>>([range.min, range.max]);\n\n /**\n * Sets the visibility variable based on the range min and max.\n *\n * @type {unknown}\n */\n const visible = useMemo(() => range.min === 0 && range.max === 0, [range.min, range.max]);\n\n /**\n * Resets the value and valueView when the current refinement is cleared.\n */\n useEffect(() => {\n if (start[0] <= range.min && start[1] >= range.max) {\n setValueView([range.min, range.max]);\n }\n }, [range, start]);\n\n return (\n <Facet\n defaultActive={props.defaultActive}\n divided={props.divided}\n innerRef={ref}\n title={props.title}\n visible={visible}\n >\n <div\n className='facet-slider'\n >\n <div\n className='range-container'\n >\n <Slider\n allowCross={false}\n defaultValue={start}\n max={range.max}\n min={range.min}\n onAfterChange={(v) => refine(v)}\n onChange={(v) => setValueView(v)}\n range\n value={valueView}\n />\n </div>\n <Grid\n columns={2}\n >\n <Grid.Column>\n { valueView[0] }\n </Grid.Column>\n <Grid.Column\n textAlign='right'\n >\n { valueView[1] }\n </Grid.Column>\n </Grid>\n </div>\n </Facet>\n );\n});\n\nFacetSlider.defaultProps = Facet.defaultProps;\n\nexport default FacetSlider;\n","// @flow\n\nimport React, { forwardRef, useMemo } from 'react';\nimport { Checkbox, Label } from 'semantic-ui-react';\nimport Facet, { type Props as FacetProps } from './Facet';\nimport { type ToggleRefinementProps } from '../types/InstantSearch';\n\ntype Props = FacetProps & ToggleRefinementProps;\n\n/**\n * This component is used with the `useToggleRefinement` hook from Instant Search Hooks.\n */\nconst FacetToggle = forwardRef(({ useToggleRefinement, ...props }: Props, ref: HTMLElement) => {\n const {\n value: {\n isRefined,\n count\n },\n refine\n } = useToggleRefinement(props);\n\n /**\n * Sets the visibility variable based on the count.\n *\n * @type {boolean}\n */\n const visible = useMemo(() => !!count, [count]);\n\n return (\n <Facet\n defaultActive={props.defaultActive}\n divided={props.divided}\n innerRef={ref}\n title={props.title}\n visible={visible}\n >\n <Checkbox\n checked={isRefined}\n label={{\n children: (\n <Label\n circular\n content={count}\n size='small'\n />\n )\n }}\n onClick={() => refine({ isRefined })}\n toggle\n />\n </Facet>\n );\n});\n\nFacetToggle.defaultProps = Facet.defaultProps;\n\nexport default FacetToggle;\n","// @flow\n\nimport React, { useRef } from 'react';\nimport { Button } from 'semantic-ui-react';\n\ntype Props = {\n multiple?: boolean,\n onSelection: (files: Array<File>) => void\n};\n\nconst FileInputButton = ({ onSelection, multiple, ...buttonProps }: Props) => {\n const fileInputRef = useRef();\n\n /**\n * Converts the passed file list to an array.\n *\n * @param fileList\n *\n * @returns {[]}\n */\n const toArray = (fileList) => {\n const array = [];\n\n for (let i = 0; i < fileList.length; i += 1) {\n array.push(fileList.item(i));\n }\n\n return array;\n };\n\n return (\n <>\n <Button\n {...buttonProps}\n onClick={() => fileInputRef.current && fileInputRef.current.click()}\n />\n <input\n ref={fileInputRef}\n type='file'\n multiple={multiple}\n onChange={(e) => onSelection(toArray(e.target.files))}\n style={{\n display: 'none'\n }}\n />\n </>\n );\n};\n\nFileInputButton.defaultProps = {\n multiple: false\n};\n\nexport default FileInputButton;\n","// @flow\n\nimport React, { Component, createRef } from 'react';\nimport { Icon, Message } from 'semantic-ui-react';\nimport { Trans } from 'react-i18next';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport './FileUpload.css';\n\ntype Props = {\n /**\n * A list of file types to include\n */\n fileTypes?: Array<string>,\n\n /**\n * The maximum size for a single file\n */\n maxSize?: number,\n\n /**\n * Call back for when files are added\n */\n onFilesAdded: (files: Array<File>) => void,\n};\n\ntype State = {\n errors: ?Array<string>\n};\n\ntype FileEvent = {\n dataTransfer: HTMLInputElement,\n preventDefault: () => void,\n target: HTMLInputElement\n};\n\n/**\n * The <code>FileUpload</code> component renders a dropzone and allows a user to drop or select one or more files\n * from their local file system. Optionally, the files can be limited by size or type.\n */\nclass FileUpload extends Component<Props, State> {\n fileInput: any;\n filePattern: any;\n\n /**\n * Constructs a new FileUpload component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n errors: null\n };\n\n this.fileInput = createRef();\n this.filePattern = this.props.fileTypes && new RegExp(`(.*?)\\\\.${this.props.fileTypes.join('|')}$`);\n }\n\n /**\n * Triggers the file input click.\n */\n onClickDropzone() {\n this.fileInput.current.click();\n }\n\n /**\n * Adds the selected files.\n *\n * @param e\n */\n onDropFiles(e: FileEvent) {\n e.preventDefault();\n const files = this.toArray(e.dataTransfer.files);\n const validFiles = this.validate(files);\n if (validFiles.length === files.length) {\n this.props.onFilesAdded(files);\n }\n }\n\n /**\n * Adds the selected files.\n *\n * @param e\n */\n onFilesAdded(e: FileEvent) {\n e.preventDefault();\n const files = this.toArray(e.target.files);\n const validFiles = this.validate(files);\n if (validFiles.length === files.length) {\n this.props.onFilesAdded(files);\n }\n }\n\n /**\n * Renders the FileUpload component.\n */\n render() {\n return (\n <div\n className='file-upload'\n >\n <Message\n error\n header={i18n.t('Common.errors.title')}\n hidden={!(this.state.errors && this.state.errors.length)}\n visible={this.state.errors && this.state.errors.length}\n onDismiss={() => this.setState({ errors: null })}\n list={this.state.errors}\n />\n <div\n className='file-dropzone'\n onClick={this.onClickDropzone.bind(this)}\n onDragLeave={(e) => { e.preventDefault(); }}\n onDragOver={(e) => { e.preventDefault(); }}\n onDrop={this.onDropFiles.bind(this)}\n onKeyDown={() => {}}\n role='button'\n tabIndex={-1}\n >\n <Icon\n color='blue'\n name='cloud upload'\n size='large'\n />\n <div className='file-dropzone-text'>\n <Trans i18nKey='FileUpload.add'>\n <span className='link-text'>Add files</span>\n or drop files here\n </Trans>\n </div>\n <input\n ref={this.fileInput}\n className='file-input'\n type='file'\n multiple\n onChange={this.onFilesAdded.bind(this)}\n />\n </div>\n </div>\n );\n }\n\n /**\n * Converts the passed file list to an array.\n *\n * @param fileList\n *\n * @returns {[]}\n */\n toArray(fileList: any) {\n const array = [];\n\n for (let i = 0; i < fileList.length; i += 1) {\n array.push(fileList.item(i));\n }\n\n return array;\n }\n\n /**\n * Validates the passed list of files.\n *\n * @param files\n *\n * @returns {[]|*}\n */\n validate(files: Array<File>) {\n if (!this.props.maxSize && !this.props.fileTypes) {\n return files;\n }\n\n const validFiles = [];\n const errors = [];\n\n _.each(files, (file) => {\n let valid = true;\n\n // Files are invalid if they exceed the maximum size\n if (this.props.maxSize && file.size > this.props.maxSize) {\n valid = false;\n errors.push(i18n.t('FileUpload.errors.maxSize', { name: file.name }));\n }\n\n // Files are invalid if they do not match the acceptable types\n if (this.filePattern && !file.name.match(this.filePattern)) {\n valid = false;\n errors.push(i18n.t('FileUpload.errors.fileType', { name: file.name, type: /[^.]+$/.exec(file.name) }));\n }\n\n if (valid) {\n validFiles.push(file);\n }\n });\n\n this.setState({ errors });\n\n return validFiles;\n }\n}\n\nexport default FileUpload;\n","// @flow\n\nimport React, { useMemo, type ComponentType } from 'react';\nimport { Icon, Label, Loader } from 'semantic-ui-react';\nimport './FileUploadStatus.css';\n\ntype Props = {\n status: string\n};\n\nconst Status = {\n pending: 'pending',\n processing: 'processing',\n complete: 'complete',\n error: 'error'\n};\n\nconst ColorsByStatus = {\n [Status.processing]: 'black',\n [Status.complete]: 'green',\n [Status.error]: 'red'\n};\n\nconst IconsByStatus = {\n [Status.pending]: 'clock outline',\n [Status.complete]: 'checkmark',\n [Status.error]: 'warning circle'\n};\n\nconst TextByStatus = {\n [Status.pending]: 'Pending',\n [Status.processing]: 'Processing',\n [Status.complete]: 'Complete',\n [Status.error]: 'Error'\n};\n\nconst FileUploadStatus: ComponentType<any> = ({ status = Status.pending }: Props) => {\n const color = useMemo(() => ColorsByStatus[status], [status]);\n const icon = useMemo(() => IconsByStatus[status], [status]);\n const text = useMemo(() => TextByStatus[status], [status]);\n\n return (\n <Label\n className='file-upload-status'\n color={color}\n >\n { status === Status.processing && (\n <Loader\n active\n inline\n inverted\n size='mini'\n />\n )}\n { icon && (\n <Icon\n name={icon}\n />\n )}\n { text }\n </Label>\n );\n};\n\nexport default FileUploadStatus;\n","// @flow\n\nimport React, { useMemo, type ComponentType } from 'react';\nimport { Header, Icon, Progress } from 'semantic-ui-react';\nimport './FileUploadProgress.css';\n\ntype Props = {\n completed: number,\n total: number,\n uploading?: boolean\n};\n\nconst FileUploadProgress: ComponentType<any> = (props: Props) => {\n /**\n * Sets the \"complete\" variable to \"true\" if the number of completed items is equal to the total and\n * greater than zero.\n *\n * @type {unknown}\n */\n const complete = useMemo(() => (\n props.completed > 0 && props.completed === props.total\n ), [props.completed, props.total]);\n\n /**\n * Sets the percent of completed items.\n *\n * @type {number|number}\n */\n const percent = useMemo(() => (\n props.total > 0 ? (props.completed / props.total) : 0\n ), [props.completed, props.total]);\n\n /**\n * Sets the formatted percent view.\n */\n const percentView = useMemo(() => (\n Number(percent)\n .toLocaleString(undefined, {\n style: 'percent',\n minimumFractionDigits: 0\n })\n ), [percent]);\n\n return (\n <div\n className='file-upload-progress'\n >\n <Icon\n color='blue'\n name='cloud upload'\n size='big'\n />\n <div\n className='progress-container'\n >\n <Header>\n <Header.Content\n content={percentView}\n />\n <Header.Subheader>\n { !(props.uploading || complete) && 'Getting Started' }\n { props.uploading && 'Uploading...' }\n { complete && 'Completed' }\n </Header.Subheader>\n </Header>\n <Progress\n color='blue'\n percent={percent * 100}\n />\n </div>\n </div>\n );\n};\n\nexport default FileUploadProgress;\n","// @flow\n\nimport React, {\n useCallback,\n useMemo,\n useState,\n type ComponentType\n} from 'react';\nimport {\n Button,\n Dimmer,\n Form,\n Item,\n Loader,\n Message,\n Modal\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport FileUpload from './FileUpload';\nimport FileUploadStatus from './FileUploadStatus';\nimport FileUploadProgress from './FileUploadProgress';\nimport i18n from '../i18n/i18n';\nimport ModalContext from '../context/ModalContext';\n\ntype Props = {\n /**\n * If <code>true</code>, the modal will close once the upload has completed.\n */\n closeOnComplete?: boolean,\n\n /**\n * Component to render at top of modal.\n */\n headerComponent?: ComponentType<any>,\n\n /**\n * Component to render within the modal.\n */\n itemComponent: ComponentType<any>,\n\n /**\n * Callback fired when a file is added.\n */\n onAddFile: (file: File) => any,\n\n /**\n * Callback fired when the close button is clicked.\n */\n onClose: () => void,\n\n /**\n * Callback fired when the save button is clicked. See <code>strategy</code> prop.\n */\n onSave: (items: Array<any>) => Promise<any>,\n\n /**\n * An object with keys containing the names of properties that are required.\n */\n required?: { [key: string]: string },\n\n /**\n * If <code>true</code>, a full page loader will display while uploading is in progress.\n */\n showPageLoader?: boolean,\n\n /**\n * The upload strategy to use. If <code>batch</code>, we'll execute one <code>onSave</code> request with each item\n * as an array in the body. If <code>single</code>, we'll execute an <code>onSave</code> request for each item.\n */\n strategy?: string\n};\n\nconst Strategy = {\n batch: 'batch',\n single: 'single'\n};\n\nconst Status = {\n pending: 'pending',\n processing: 'processing',\n complete: 'complete',\n error: 'error'\n};\n\n/**\n * The <code>FileUploadModal</code> is a convenience wrapper for the <code>FileUpload</code> component, allowing\n * it to render in a modal.\n */\nconst FileUploadModal: ComponentType<any> = (props: Props) => {\n const [items, setItems] = useState([]);\n const [uploadCount, setUploadCount] = useState(0);\n const [uploading, setUploading] = useState(false);\n const [statuses, setStatuses] = useState({});\n\n /**\n * Sets the <code>hasErrors</code> value to <code>true</code> if at least one item on the state contains errors.\n */\n const hasErrors = useMemo(() => !!_.find(items, (item) => !_.isEmpty(item.errors)), [items]);\n\n /**\n * Sets the <code>hasUploadErrors</code> value to <code>true</code> if at least one file uploaded with\n * an error status.\n */\n const hasUploadErrors = useMemo(() => (\n !!_.find(_.values(statuses), (status) => status === Status.error)\n ), [statuses]);\n\n /**\n * Calls the <code>onAddFile</code> prop for each item in the passed collection of files and adds them\n * to the items on the state.\n *\n * @type {function(*): void}\n */\n const onAddFiles = useCallback((files) => (\n setItems((prevItems) => [\n ...prevItems,\n ..._.map(files, props.onAddFile)\n ])\n ), []);\n\n /**\n * Updates the passed association for the passed item.\n *\n * @type {function(*, string, string, *): void}\n */\n const onAssociationInputChange = useCallback((item: any, idAttribute: string, attribute: string, value: any) => (\n setItems((prevItems) => _.map(prevItems, (i) => (i !== item ? i : {\n ...i,\n [idAttribute]: value.id,\n [attribute]: value,\n errors: _.without(item.errors, idAttribute)\n })))\n ), []);\n\n /**\n * Calls the <code>onSave</code> prop with the current list of items.\n *\n * @type {function(): *}\n */\n const onBatchUpload = useCallback(() => (\n props\n .onSave(items)\n .then(() => setUploadCount(1))\n ), [items]);\n\n /**\n * Sets the uploading state <code>false</code> and calls the <code>onClose</code> prop if necessary.\n *\n * @type {(function(): void)|*}\n */\n const onComplete = useCallback(() => {\n setUploading(false);\n\n if (props.closeOnComplete) {\n props.onClose();\n }\n }, [props.closeOnComplete, props.onClose]);\n\n /**\n * Deletes the passed item from the state.\n *\n * @type {function(*): void}\n */\n const onDelete = useCallback((item) => (\n setItems((prevItems) => _.filter(prevItems, (i) => i !== item))\n ), []);\n\n /**\n * Sets the status for the item at the passed index.\n *\n * @type {function(*, *): void}\n */\n const setStatus = useCallback((index, status) => (\n setStatuses((prevStatuses) => ({ ...prevStatuses, [index]: status }))\n ));\n\n /**\n * Iterates of the list of items and sequentially calls the <code>onSave</code> prop for each.\n *\n * @type {function(): Promise<unknown>}\n */\n const onSingleUpload = useCallback(async () => {\n for (let i = 0; i < items.length; i += 1) {\n const item = items[i];\n\n // Update the status for the item\n setStatus(i, Status.processing);\n\n let error;\n\n // Do the upload\n try {\n // eslint-disable-next-line no-await-in-loop\n await props.onSave(item);\n } catch (e) {\n error = e;\n }\n\n // Update the status for the item\n if (error) {\n setStatus(i, Status.error);\n } else {\n setStatus(i, Status.complete);\n }\n\n // Update the upload count\n setUploadCount((prevCount) => prevCount + 1);\n }\n\n return Promise.resolve();\n }, [items, props.onSave]);\n\n /**\n * Sets the passed item onto the state.\n *\n * @type {function(*, *): void}\n */\n const onSetState = useCallback((item: any, attributes: string) => (\n setItems((prevItems) => _.map(prevItems, (i) => (i !== item ? i : {\n ...i,\n ...attributes,\n errors: []\n })))\n ), []);\n\n /**\n * Updates the text value for the passed item.\n *\n * @type {function(*, string, Event, {value: *}): void}\n */\n const onTextInputChange = useCallback((item: any, attribute: string, e: Event, { value }: { value: any }) => (\n setItems((prevItems) => _.map(prevItems, (i) => (i !== item ? i : {\n ...i,\n [attribute]: value,\n errors: _.without(item.errors, attribute)\n })))\n ), []);\n\n /**\n * Updates the passed item with the passed object of attributes.\n *\n * @type {function(*, *): void}\n */\n const onUpdate = useCallback((item, attributes) => (\n setItems((prevItems) => _.map(prevItems, (i) => (i !== item ? i : { ...i, ...attributes })))\n ), []);\n\n /**\n * Validates the passed item.\n *\n * @type {function(*): *&{errors: []}}\n */\n const validateItem = useCallback((item) => {\n const errors = [];\n\n _.each(_.keys(props.required), (key) => {\n const value = item[key];\n let invalid;\n\n if (_.isNumber(value)) {\n invalid = _.isEmpty(value.toString());\n } else {\n invalid = _.isEmpty(value);\n }\n\n if (invalid) {\n errors.push(key);\n }\n });\n\n return {\n ...item,\n errors\n };\n }, [props.required]);\n\n /**\n * Validates the items on the state.\n *\n * @type {function(): Promise<void>}\n */\n const onValidate = useCallback(() => new Promise((resolve, reject) => {\n let error = false;\n\n // Validate each item\n const newItems = _.map(items, (item) => {\n const newItem = validateItem(item);\n\n if (!_.isEmpty(newItem.errors)) {\n error = true;\n }\n\n return newItem;\n });\n\n // Set the new items on the state\n setItems(newItems);\n\n // Reject or resolve the promise\n if (error) {\n reject();\n } else {\n resolve();\n }\n }), [items]);\n\n /**\n * Updates the passed item with the passed props.\n *\n * @type {(function(): void)|*}\n */\n const onUpload = useCallback(() => {\n // Set the uploading indicator\n setUploading(true);\n\n // Upload the files\n onValidate()\n .then(() => (\n props.strategy === Strategy.batch\n ? onBatchUpload()\n : onSingleUpload()\n ))\n .finally(onComplete);\n }, [onBatchUpload, onComplete, onSingleUpload, onValidate, props.strategy]);\n\n /**\n * Renders the error message for the passed item.\n *\n * @type {(function(*, *): (null|*))|*}\n */\n const renderMessageItem = useCallback((item, index) => {\n if (_.isEmpty(item.errors)) {\n return null;\n }\n\n const filename = !_.isEmpty(item.name) ? item.name : index;\n const fields = _.map(item.errors, (e) => props.required[e]).join(', ');\n\n return (\n <Message.Item\n content={i18n.t('FileUploadModal.errors.required', { filename, fields })}\n key={index}\n />\n );\n }, []);\n\n /**\n * Renders the status component for the passed index.\n *\n * @type {(function(*): (null|*))|*}\n */\n const renderStatus = useCallback((index) => {\n if (props.strategy !== Strategy.single) {\n return null;\n }\n\n return (\n <FileUploadStatus\n status={statuses[index]}\n />\n );\n }, [statuses, props.strategy]);\n\n /**\n * Memoization and case correction for the <code>headerComponent</code> prop.\n *\n * @type {React$AbstractComponent<*, *>}\n */\n const HeaderComponent = useMemo(() => props.headerComponent, [props.headerComponent]);\n\n /**\n * Memoization and case correction for the <code>itemComponent</code> prop.\n *\n * @type {React$AbstractComponent<*, *>}\n */\n const UploadItem = useMemo(() => props.itemComponent, [props.itemComponent]);\n\n return (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n centered={false}\n className='serial-upload-modal'\n mountNode={mountNode}\n open\n >\n { props.showPageLoader && (\n <Dimmer\n active={uploading}\n inverted\n >\n <Loader\n content={i18n.t('FileUploadModal.loader')}\n />\n </Dimmer>\n )}\n <Modal.Header>\n { props.strategy === Strategy.batch && i18n.t('FileUploadModal.title') }\n { props.strategy === Strategy.single && (\n <FileUploadProgress\n completed={uploadCount}\n total={items.length}\n uploading={uploading}\n />\n )}\n </Modal.Header>\n <Modal.Content\n scrolling\n >\n { hasErrors && (\n <Message\n error\n >\n <Message.Header\n content={i18n.t('FileUploadModal.errors.header')}\n />\n <Message.List>\n { _.map(items, renderMessageItem) }\n </Message.List>\n </Message>\n )}\n { hasUploadErrors && (\n <Message\n content={i18n.t('FileUploadModal.errors.upload.content')}\n header={i18n.t('FileUploadModal.errors.upload.header')}\n error\n />\n )}\n <FileUpload\n onFilesAdded={onAddFiles}\n />\n { HeaderComponent && (\n <HeaderComponent\n items={items}\n onSetItems={setItems}\n uploading={uploading}\n />\n )}\n <Item.Group\n as={Form}\n divided\n noValidate\n relaxed='very'\n >\n { _.map(items, (item, index) => (\n <UploadItem\n isError={(key) => _.contains(item.errors, key)}\n isRequired={(key) => !!(props.required && props.required[key])}\n item={item}\n key={index}\n onAssociationInputChange={onAssociationInputChange.bind(this, item)}\n onDelete={onDelete.bind(this, item)}\n onSetState={onSetState.bind(this, item)}\n onTextInputChange={onTextInputChange.bind(this, item)}\n onUpdate={onUpdate.bind(this, item)}\n renderStatus={renderStatus.bind(this, index)}\n />\n ))}\n </Item.Group>\n </Modal.Content>\n <Modal.Actions>\n <Button\n content={i18n.t('Common.buttons.upload')}\n disabled={uploading || uploadCount > 0 || _.isEmpty(items)}\n icon='cloud upload'\n loading={uploading && !props.showPageLoader}\n onClick={onUpload}\n primary\n />\n <Button\n content={uploadCount > 0\n ? i18n.t('Common.buttons.close')\n : i18n.t('Common.buttons.cancel')}\n disabled={uploading}\n onClick={props.onClose}\n />\n </Modal.Actions>\n </Modal>\n )}\n </ModalContext.Consumer>\n );\n};\n\nFileUploadModal.defaultProps = {\n closeOnComplete: true,\n strategy: Strategy.batch,\n showPageLoader: true\n};\n\nexport default FileUploadModal;\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@react-google-maps/api\");","// @flow\n\nimport { Map } from '@performant-software/shared-components';\nimport {\n GoogleMap as MapComponent,\n Marker\n} from '@react-google-maps/api';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useState\n} from 'react';\n\ntype LatLng = {\n lat: () => number,\n lng: () => number\n};\n\ntype Props = {\n className?: string,\n containerStyle?: any,\n defaultCenter?: {\n lat: number,\n lng: number\n },\n defaultZoom?: number,\n onDragEnd?: (latLng: LatLng) => void,\n position?: {\n lat: number,\n lng: number\n }\n};\n\nconst DEFAULT_ZOOM = 1;\nconst DEFAULT_ZOOM_MARKER = 12;\n\nconst GoogleMap = (props: Props) => {\n // Convert the position props to floats to avoid Javascript errors.\n const position = Map.getPosition(props.position);\n\n const [center, setCenter] = useState(position || props.defaultCenter);\n const [map, setMap] = useState();\n\n /**\n * Set the zoom value based on the position and defaultZoom prop.\n *\n * @type {*}\n */\n const zoom = useMemo(() => {\n let value;\n\n if (position) {\n value = DEFAULT_ZOOM_MARKER;\n } else if (props.defaultZoom) {\n value = props.defaultZoom;\n } else {\n value = DEFAULT_ZOOM;\n }\n\n return value;\n }, [position, props.defaultZoom]);\n\n /**\n * Call the onDragEnd prop, passing the new location.\n *\n * @type {(function({latLng: *}): void)|*}\n */\n const onDragEnd = useCallback(({ latLng }) => {\n if (props.onDragEnd) {\n props.onDragEnd({\n lat: latLng.lat(),\n lng: latLng.lng()\n });\n }\n }, [props.onDragEnd]);\n\n /**\n * Sets the map object when the component mounts.\n *\n * @type {function(*): void}\n */\n const onLoad = useCallback((m) => setMap(m), []);\n\n // If the position is changed manually and the new location is outside of the current bounds, re-center the map.\n useEffect(() => {\n if (map && position) {\n const bounds = map.getBounds();\n if (bounds && !bounds.contains(position)) {\n setCenter(position);\n }\n }\n }, [props.position]);\n\n return (\n <MapComponent\n center={center}\n mapContainerClassName={props.className}\n mapContainerStyle={props.containerStyle}\n onClick={onDragEnd}\n onLoad={onLoad}\n zoom={zoom}\n >\n { position && (\n <Marker\n draggable={!!props.onDragEnd}\n onDragEnd={onDragEnd}\n position={position}\n visible\n />\n )}\n </MapComponent>\n );\n};\n\nGoogleMap.defaultProps = {\n containerStyle: {\n height: '400px'\n },\n defaultCenter: {\n lat: 0,\n lng: 0\n }\n};\n\nexport default GoogleMap;\n","// @flow\n\nimport { StandaloneSearchBox } from '@react-google-maps/api';\nimport React, { useCallback, useState, type Element } from 'react';\nimport _ from 'underscore';\n\ntype Props = {\n children: Element<any>,\n onLocationSelection: ({ lat: number, lng: number }) => void\n}\n\nconst GooglePlacesSearch = (props: Props) => {\n const [searchBox, setSearchBox] = useState();\n\n const onPlacesChanged = useCallback(() => {\n if (searchBox) {\n const place = _.first(searchBox.getPlaces());\n const { location } = place.geometry;\n\n const name = place.formatted_address;\n const lat = location.lat();\n const lng = location.lng();\n\n props.onLocationSelection({\n name,\n lat,\n lng,\n result: place\n });\n }\n }, [searchBox, props.onLocationSelection]);\n\n return (\n <StandaloneSearchBox\n onLoad={(s) => setSearchBox(s)}\n onPlacesChanged={onPlacesChanged}\n >\n { props.children }\n </StandaloneSearchBox>\n );\n};\n\nexport default GooglePlacesSearch;\n","// @flow\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState\n} from 'react';\nimport _ from 'underscore';\nimport {\n Button,\n Card,\n Header,\n Image,\n Ref\n} from 'semantic-ui-react';\nimport Draggable from './Draggable';\nimport './HorizontalCards.css';\n\ntype Props = {\n cardClassName?: string,\n cardsClassName?: string,\n className?: string,\n inlineImage?: boolean,\n items: Array<any>,\n onClick?: (item: any, index: number) => void,\n onDrag?: (dragIndex: number, hoverIndex: number) => void,\n perPage: number,\n renderDescription?: (item: any) => Element<any> | string,\n renderExtra?: (item: any) => Element<any> | string,\n renderHeader?: (item: any) => Element<any> | string,\n renderImage: (item: any) => string,\n renderMeta?: (item: any) => Element<any> | string,\n};\n\nconst HorizontalCards = (props: Props) => {\n const [marginWidth, setMarginWidth] = useState(0);\n const [pageWidth, setPageWidth] = useState(0);\n const [scrollPage, setScrollPage] = useState(0);\n const [scrollPages, setScrollPages] = useState(0);\n\n const ref = useRef();\n\n /**\n * Sets the flex-box style based on the page width.\n *\n * @type {function(): {flex: string}}\n */\n const cardStyle = useMemo(() => ({\n flex: `0 0 ${(pageWidth / props.perPage) - marginWidth}px`\n }), [pageWidth, marginWidth, props.perPage]);\n\n /**\n * Helper function to concatenate class names.\n *\n * @type {function(*, *=): string}\n */\n const getClassName = useCallback((className, defaultClassName = null) => {\n const classNames = [];\n\n if (defaultClassName) {\n classNames.push(defaultClassName);\n }\n\n if (className) {\n classNames.push(className);\n }\n\n return classNames.join(' ');\n }, []);\n\n /**\n * Initializes the page width and scroll pages on the sate.\n *\n * @type {(function(*=): void)|*}\n */\n const initialize = useCallback((event) => {\n const instance = ref.current;\n\n if (instance) {\n const { clientWidth, scrollWidth } = instance;\n\n setPageWidth(clientWidth);\n setScrollPages(Math.ceil(scrollWidth / clientWidth));\n\n if (!event) {\n setScrollPage(0);\n }\n\n const child = instance.firstChild;\n if (child) {\n const style = window.getComputedStyle(child);\n const leftMargin = parseFloat(style.marginLeft) || 0;\n const rightMargin = parseFloat(style.marginRight) || 0;\n\n setMarginWidth(leftMargin + rightMargin);\n }\n }\n }, [ref, props.items]);\n\n /**\n * Sets the current page number on the state.\n *\n * @type {function(*): void}\n */\n const onPageChange = useCallback((increment) => {\n let nextPage = scrollPage + increment;\n\n if (nextPage < 0) {\n nextPage = scrollPages;\n } else if (nextPage >= scrollPages) {\n nextPage = 0;\n }\n\n setScrollPage(nextPage);\n }, [scrollPage, scrollPages]);\n\n /**\n * Sets the window resize event listener.\n */\n useEffect(() => {\n window.addEventListener('resize', initialize);\n\n return () => window.removeEventListener('resize', initialize);\n }, []);\n\n /**\n * Re-initialize the component if the items change.\n */\n useEffect(() => initialize(), [initialize, props.items]);\n\n /**\n * Sets the total number of pages on the state.\n */\n useEffect(() => {\n const instance = ref.current;\n\n if (instance) {\n const { scrollWidth } = instance;\n setScrollPages(Math.ceil(scrollWidth / pageWidth));\n }\n }, [pageWidth]);\n\n /**\n * Scrolls to the new position once the page changes.\n */\n useEffect(() => {\n const instance = ref.current;\n\n if (instance) {\n instance.scrollTo({ left: (scrollPage * pageWidth), behavior: 'smooth' });\n }\n }, [scrollPage, pageWidth]);\n\n /**\n * Renders the card component. If a \"route\" prop is passed, the component is wrapped in a Link.\n *\n * @param item\n * @param index\n *\n * @returns {JSX.Element}\n */\n const renderCard = (item, index) => {\n let card = (\n <Card\n className={getClassName(props.cardClassName)}\n link\n onClick={props.onClick && props.onClick.bind(this, item, index)}\n style={cardStyle}\n >\n { !props.inlineImage && renderImage(item) }\n { (props.renderHeader || props.renderMeta || props.renderDescription) && (\n <Card.Content>\n { props.inlineImage && renderImage(item) }\n { props.renderHeader && (\n <Card.Header\n as={Header}\n size='small'\n >\n { props.renderHeader(item) }\n </Card.Header>\n )}\n { props.renderMeta && (\n <Card.Meta>\n { props.renderMeta(item) }\n </Card.Meta>\n )}\n { props.renderDescription && (\n <Card.Description>\n { props.renderDescription(item) }\n </Card.Description>\n )}\n </Card.Content>\n )}\n { props.renderExtra && (\n <Card.Content\n extra\n >\n { props.renderExtra(item) }\n </Card.Content>\n )}\n </Card>\n );\n\n if (props.onDrag) {\n // Since the item may not be saved yet, we'll look for the ID or UID columns as the key. This is necessary to\n // maintain the correct element when dragging.\n const key = item.id || item.uid;\n\n card = (\n <Draggable\n direction='horizontal'\n id={key}\n index={index}\n item={item}\n key={key}\n onDrag={props.onDrag}\n >\n { card }\n </Draggable>\n );\n }\n\n return card;\n };\n\n /**\n * Renders the image based on the return type of the renderImage prop. String values returned will be assumed to be\n * a src attribute for the image.\n *\n * @type {(function(*=): (*))|*}\n */\n const renderImage = useCallback((item) => {\n const image = props.renderImage(item);\n\n if (_.isString(image) || !image) {\n return (\n <Image\n alt={item.alt}\n className='image-placeholder'\n src={image}\n style={{\n objectFit: 'cover'\n }}\n />\n );\n }\n\n return image;\n }, [props.renderImage]);\n\n return (\n <div\n className={getClassName(props.className, 'horizontal-cards')}\n >\n <Ref\n innerRef={ref}\n >\n <Card.Group\n className={getClassName(props.cardsClassName)}\n >\n { _.map(props.items, renderCard.bind(this)) }\n </Card.Group>\n </Ref>\n <div\n className='button-container'\n >\n { scrollPages > 1 && (\n <div\n className='pagination'\n >\n <Button\n aria-label='Left'\n basic\n circular\n icon='angle left'\n onClick={onPageChange.bind(this, -1)}\n />\n <Button\n aria-label='Right'\n basic\n circular\n icon='angle right'\n onClick={onPageChange.bind(this, 1)}\n />\n </div>\n )}\n </div>\n </div>\n );\n};\n\nHorizontalCards.defaultProps = {\n perPage: 4\n};\n\nexport default HorizontalCards;\n","// @flow\n\nimport React from 'react';\nimport { Modal } from 'semantic-ui-react';\nimport { IIIFViewer } from '@performant-software/shared-components';\n\ntype Props = {\n onClose: () => void\n};\n\nconst IIIFModal = ({ onClose, ...props }: Props) => (\n <Modal\n centered={false}\n closeIcon\n onClose={onClose}\n open\n >\n <Modal.Content>\n <IIIFViewer\n {...props}\n />\n </Modal.Content>\n </Modal>\n);\n\nexport default IIIFModal;\n","// @flow\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useState\n} from 'react';\nimport {\n Button,\n Dimmer,\n Grid,\n Image,\n Loader,\n Transition\n} from 'semantic-ui-react';\nimport './ImageCarousel.css';\n\ntype ImageType = {\n caption?: string,\n src: string\n};\n\ntype Props = {\n images: Array<ImageType>,\n onClose: () => void\n};\n\nconst ImageCarousel = (props: Props) => {\n const [currentIndex, setCurrentIndex] = useState(0);\n const [visible, setVisible] = useState(true);\n\n /**\n * Sets the current image based on the current index.\n *\n * @type {*}\n */\n const image = useMemo(() => {\n let value;\n\n if (props.images && props.images.length > currentIndex) {\n value = props.images[currentIndex];\n }\n\n return value;\n }, [currentIndex, props.images]);\n\n /**\n * Sets the new index value.\n *\n * @type {(function(*): void)|*}\n */\n const onIndexChange = useCallback((increment) => {\n const newIndex = currentIndex + increment;\n\n if (newIndex >= 0 && newIndex < props.images.length) {\n setCurrentIndex(newIndex);\n setVisible(false);\n }\n }, [currentIndex, props.images]);\n\n /**\n * Sets up the component when initially mounted.\n */\n useEffect(() => {\n // Disabled scrolling on the page when carousel is visible.\n if (document.body) {\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n // Re-enable scrolling\n if (document.body) {\n document.body.style.overflow = 'auto';\n }\n };\n }, []);\n\n return (\n <Dimmer\n active\n className='image-carousel'\n page\n >\n <Grid\n padded\n >\n <Grid.Row>\n <Grid.Column\n textAlign='right'\n >\n <Button\n icon='times'\n onClick={props.onClose}\n size='huge'\n />\n </Grid.Column>\n </Grid.Row>\n <Grid.Row\n className='image-content'\n >\n <Grid.Column>\n { props.images && props.images.length > 1 && (\n <Button\n disabled={currentIndex === 0}\n icon='chevron left'\n onClick={() => onIndexChange(-1)}\n size='massive'\n />\n )}\n </Grid.Column>\n <Grid.Column\n className='image-container'\n >\n { !visible && (\n <Loader\n active\n />\n )}\n <Transition\n animation='fade'\n duration={500}\n visible={visible}\n >\n <Image\n src={image?.src}\n onLoad={() => setVisible(true)}\n />\n </Transition>\n </Grid.Column>\n <Grid.Column>\n { props.images && props.images.length > 1 && (\n <Button\n disabled={currentIndex === props.images.length - 1}\n icon='chevron right'\n onClick={() => onIndexChange(1)}\n size='massive'\n />\n )}\n </Grid.Column>\n </Grid.Row>\n <Grid.Row>\n <Grid.Column\n textAlign='center'\n >\n { image?.caption }\n </Grid.Column>\n </Grid.Row>\n </Grid>\n </Dimmer>\n );\n};\n\nexport default ImageCarousel;\n","// @flow\n\nimport React, { Component, type ComponentType } from 'react';\nimport { Button, Dropdown } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport { SORT_ASCENDING } from './DataList';\n\ntype Sort = {\n key: string,\n text: string,\n value: string,\n direction?: ?string\n};\n\ntype Props = {\n defaultView?: number,\n hideToggle?: boolean,\n onSort?: (sortColumn: string, sortDirection?: ?string) => void,\n sort?: Array<Sort>,\n sortColumn?: string,\n sortDirection?: string\n};\n\ntype State = {\n view: number\n};\n\nconst Views = {\n list: 0,\n grid: 1\n};\n\n/**\n * Returns a function to wrap the passed component in a ItemToggle. The ItemToggle component can be used to toggle a\n * list of records between list and grid views. It will also render a sort dropdown component if a list of sort\n * properties is provided.\n *\n * @param WrappedComponent\n */\nconst useItemsToggle = (WrappedComponent: ComponentType<any>) => (\n class extends Component<Props, State> {\n // Default props\n static defaultProps = {\n hideToggle: false,\n sort: []\n };\n\n // Sort dropdown ref\n sortDropdown: typeof Dropdown;\n\n /**\n * Constructs a new ItemsToggle component.\n *\n * @param props\n */\n constructor(props: any) {\n super(props);\n\n this.state = {\n view: props.defaultView || Views.list\n };\n }\n\n /**\n * Renders the sort value for the current option.\n *\n * @returns {*}\n */\n getSortValue() {\n const sort = _.find(this.props.sort, { value: this.props.sortColumn });\n return sort && sort.text;\n }\n\n /**\n * Returns true if the component should be hidden.\n *\n * @returns {boolean|*}\n */\n isHidden() {\n return this.props.hideToggle && _.isEmpty(this.props.sort);\n }\n\n /**\n * Calls the onSort prop.\n *\n * @param sort\n *\n * @returns {*|void}\n */\n onSort(sort: Sort) {\n if (!this.props.onSort) {\n return;\n }\n\n let sortDirection;\n\n if (sort.value !== this.props.sortColumn) {\n sortDirection = sort.direction;\n }\n\n this.props.onSort(sort.value, sortDirection);\n }\n\n /**\n * Renders the ItemsToggle component.\n *\n * @returns {*}\n */\n render() {\n const renderListHeader = this.isHidden()\n ? undefined\n : this.renderHeader.bind(this);\n\n return (\n <WrappedComponent\n {...this.props}\n renderListHeader={renderListHeader}\n view={this.state.view}\n />\n );\n }\n\n /**\n * Renders the list header icons:\n * <ul>\n * <li>List/Grid view toggle</li>\n * <li>Sort dropdown</li>\n * </ul>\n *\n * @returns {*}\n */\n renderHeader() {\n if (this.isHidden()) {\n return null;\n }\n\n return (\n <>\n { !this.props.hideToggle && (\n <>\n <Button\n active={this.state.view === Views.list}\n aria-label='List View'\n basic\n icon='list'\n onClick={() => this.setState({ view: Views.list })}\n />\n <Button\n active={this.state.view === Views.grid}\n aria-label='Grid View'\n basic\n icon='grid layout'\n onClick={() => this.setState({ view: Views.grid })}\n />\n </>\n )}\n { !_.isEmpty(this.props.sort) && this.props.onSort && (\n <Button.Group\n basic\n style={{\n fontSize: 'inherit'\n }}\n >\n <Button\n aria-label='Sort by'\n content={this.getSortValue()}\n icon={this.props.sortDirection === SORT_ASCENDING ? 'sort alphabet up' : 'sort alphabet down'}\n onClick={(e) => this.sortDropdown.handleClick(e)}\n />\n <Dropdown\n aria-label='Sort'\n className='button icon'\n floating\n options={_.map(this.props.sort, (sort) => ({\n ...sort,\n onClick: this.onSort.bind(this, sort)\n }))}\n ref={(sortDropdown) => {\n this.sortDropdown = sortDropdown;\n }}\n trigger={<></>}\n value={this.props.sortColumn}\n />\n </Button.Group>\n )}\n </>\n );\n }\n }\n);\n\nexport default useItemsToggle;\n\nexport {\n Views\n};\n","// @flow\n\nimport React, { Component, type Element } from 'react';\nimport {\n Button,\n Card,\n Checkbox,\n Header,\n Icon,\n Item,\n Segment\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport useList from './List';\nimport useItemsToggle, { Views } from './ItemsToggle';\nimport Draggable from './Draggable';\nimport './Items.css';\n\nimport type { Props as ListProps } from './List';\n\ntype Props = ListProps & {\n /**\n * Renders the Card/Item component as the passed component.\n */\n as?: Element<any>,\n\n /**\n * Props to supply to the Card/Item component.\n */\n asProps?: any,\n\n /**\n * Child elements to append below the list content.\n */\n children?: Element<any>,\n\n /**\n * Callback returning <code>true</code> if the row for the passed item is selected.\n */\n isRowSelected?: (item: any) => boolean,\n\n /**\n * An array of objects to render as rows in the list.\n */\n items: Array<any>,\n\n /**\n * If true, the list items will be formatted as a link.\n */\n link?: boolean,\n\n /**\n * Callback fired when a table row is dragged\n */\n onDrag?: (dragIndex: number, hoverIndex: number) => void,\n\n /**\n * Callback fired when the passed item is selected. This callback is <i>only</i> fired if the <code>selectable</code>\n * prop is passed as <code>true</code>.\n */\n onRowSelect?: (item: any) => void,\n\n /**\n * Callback fired when the select all checkbox is checked.\n */\n onSelectAllRows?: (items: Array<any>) => void,\n\n /**\n * A function that returns a JSX element to render as additional card content.\n */\n renderAdditionalContent?: (item: any) => Element<any>,\n\n /**\n * A function that returns a JSX element to render as the card description.\n * See Semantic UI <a href=\"https://react.semantic-ui.com/views/card/\">Card</a>.\n */\n renderDescription?: (item: any) => Element<any>,\n\n /**\n * A function that returns a JSX element to render when the list has no items.\n */\n renderEmptyList?: () => Element<any>,\n\n /**\n * A function that returns a JSX element to render as the card extra content.\n * See Semantic UI <a href=\"https://react.semantic-ui.com/views/card/\">Card</a>.\n */\n renderExtra?: (item: any) => Element<any>,\n\n /**\n * A function that returns a JSX element to render as the card header.\n * See Semantic UI <a href=\"https://react.semantic-ui.com/views/card/\">Card</a>.\n */\n renderHeader?: (item: any) => Element<any>,\n\n /**\n * A function that returns a JSX element to render as the card image.\n * See Semantic UI <a href=\"https://react.semantic-ui.com/views/card/\">Card</a>.\n */\n renderImage?: (item: any) => Element<any>,\n\n /**\n * A function that returns a JSX element to render as the card meta.\n * See Semantic UI <a href=\"https://react.semantic-ui.com/views/card/\">Card</a>.\n */\n renderMeta?: (item: any) => Element<any>,\n\n /**\n * If <code>true</code>, a selection box will display for each row.\n */\n selectable?: boolean,\n\n /**\n * Toggles between list view and grid view. This prop is provided by the <code>ItemsToggle</code> higher-order\n * component.\n */\n view: number\n};\n\n/**\n * The <code>Items</code> component is used as the presentation for a list of records. The component renders\n * both a <a href=\"https://react.semantic-ui.com/elements/list/\" target=\"_blank\">List</a> and\n * <a href=\"https://react.semantic-ui.com/views/card/\" target=\"_blank\">Card</a> views.\n */\nclass ItemsClass extends Component<Props, {}> {\n static defaultProps: any;\n\n /**\n * Returns the list of actions for the passed item.\n *\n * @param item\n *\n * @returns {Array<*>}\n */\n getActions(item) {\n return this.props.actions\n .filter((action) => !action.accept || action.accept(item))\n .map((action) => {\n let defaults = {};\n\n if (action.name === 'edit') {\n defaults = {\n basic: true,\n label: i18n.t('ItemList.actions.edit')\n };\n } else if (action.name === 'copy') {\n defaults = {\n basic: true,\n label: i18n.t('ItemList.actions.copy')\n };\n } else if (action.name === 'delete') {\n defaults = {\n basic: true,\n color: 'red',\n label: i18n.t('ItemList.actions.delete')\n };\n }\n\n return _.defaults(action, defaults);\n });\n }\n\n /**\n * Returns a space delimited string of class names.\n *\n * @returns {string}\n */\n getClassName() {\n const classNames = ['item-list'];\n\n if (this.props.className) {\n classNames.push(this.props.className);\n }\n\n return classNames.join(' ');\n }\n\n /**\n * Returns as asProps function value for the passed item, if provided.\n *\n * @param item\n *\n * @returns {*|{}}\n */\n getItemProps(item) {\n return (this.props.asProps && this.props.asProps(item)) || {};\n }\n\n /**\n * Returns true if the component has the necessary props to render itself in the \"selectable\" state.\n *\n * @returns {boolean}\n */\n isSelectable() {\n return !!(this.props.selectable && this.props.isRowSelected && this.props.onRowSelect);\n }\n\n /**\n * Renders the Items component.\n *\n * @returns {*}\n */\n render() {\n return (\n <div\n className={this.getClassName()}\n >\n { this.renderList() }\n { this.renderGrid() }\n { this.renderEmptyList() }\n { this.props.children }\n </div>\n );\n }\n\n /**\n * Renders the card for the passed item.\n *\n * @param item\n * @param index\n *\n * @returns {*}\n */\n renderCard(item, index) {\n const actions = this.getActions(item);\n\n let card = (\n <Card\n as={this.props.as}\n key={item.id || index}\n link={this.props.link}\n {...this.getItemProps(item)}\n >\n { this.props.renderImage && this.props.renderImage(item) }\n <Card.Content>\n { this.props.renderHeader && (\n <Card.Header>\n { this.props.renderHeader(item) }\n </Card.Header>\n )}\n { this.props.renderMeta && (\n <Card.Meta>\n { this.props.renderMeta(item) }\n </Card.Meta>\n )}\n { this.props.renderDescription && (\n <Card.Description>\n { this.props.renderDescription(item) }\n </Card.Description>\n )}\n </Card.Content>\n { this.props.renderExtra && (\n <Card.Content\n extra\n >\n { this.props.renderExtra(item) }\n </Card.Content>\n )}\n { !_.isEmpty(actions) && (\n <Card.Content\n extra\n textAlign='center'\n >\n { _.map(actions, (action, actionIndex) => (\n <Button\n aria-label={action.name}\n basic\n color={action.resolveColor ? action.resolveColor(item) : action.color}\n icon={action.resolveIcon ? action.resolveIcon(item) : action.icon}\n key={actionIndex}\n onClick={action.onClick.bind(this, item)}\n />\n ))}\n { this.isSelectable() && (\n <Button\n aria-label='Select'\n basic\n color={this.props.isRowSelected && this.props.isRowSelected(item) ? 'green' : undefined}\n icon='checkmark'\n onClick={this.props.onRowSelect && this.props.onRowSelect.bind(this, item)}\n />\n )}\n </Card.Content>\n )}\n </Card>\n );\n\n if (this.props.onDrag) {\n card = (\n <Draggable\n id={item.id || item.uid}\n index={index}\n item={item}\n key={item.id || item.uid}\n onDrag={this.props.onDrag.bind(this)}\n >\n { card }\n </Draggable>\n );\n }\n\n return card;\n }\n\n /**\n * Renders the empty list.\n *\n * @returns {null|*}\n */\n renderEmptyList() {\n if (this.props.loading || (this.props.items && this.props.items.length)) {\n return null;\n }\n\n if (this.props.renderEmptyList) {\n return this.props.renderEmptyList();\n }\n\n return (\n <Segment\n className='empty-list'\n padded='very'\n textAlign='center'\n >\n <Header\n icon\n >\n <Icon\n name='file outline'\n />\n </Header>\n { this.props.renderEmptyMessage() }\n </Segment>\n );\n }\n\n /**\n * Renders the grid view.\n *\n * @returns {null|*}\n */\n renderGrid() {\n if (this.props.view !== Views.grid || !(this.props.items && this.props.items.length)) {\n return null;\n }\n\n return (\n <Card.Group>\n { _.map(this.props.items, this.renderCard.bind(this)) }\n </Card.Group>\n );\n }\n\n /**\n * Renders the list item for the passed item.\n *\n * @param item\n * @param index\n *\n * @returns {*}\n */\n renderItem(item, index) {\n let listItem = (\n <Item\n as={this.props.as}\n key={item.id || index}\n {...this.getItemProps(item)}\n >\n { this.props.renderImage && (\n <Item.Image>\n { this.props.renderImage(item) }\n </Item.Image>\n )}\n <Item.Content\n className='primary-content'\n >\n { this.props.renderHeader && (\n <Item.Header>\n { this.props.renderHeader(item) }\n </Item.Header>\n )}\n { this.props.renderMeta && (\n <Item.Meta>\n { this.props.renderMeta(item) }\n </Item.Meta>\n )}\n { this.props.renderDescription && (\n <Item.Description>\n { this.props.renderDescription(item) }\n </Item.Description>\n )}\n { this.props.renderExtra && (\n <Item.Extra>\n { this.props.renderExtra(item) }\n </Item.Extra>\n )}\n { _.map(this.getActions(item), (action, actionIndex) => (\n <Button\n basic={action.basic}\n color={action.resolveColor ? action.resolveColor(item) : action.color}\n content={action.resolveName ? action.resolveName(item) : action.label}\n key={actionIndex}\n icon={action.resolveIcon ? action.resolveIcon(item) : action.icon}\n onClick={action.onClick.bind(this, item)}\n />\n ))}\n </Item.Content>\n { this.props.renderAdditionalContent && this.props.renderAdditionalContent(item) }\n { this.isSelectable() && (\n <div\n className='checkbox-container'\n >\n <Checkbox\n checked={this.props.isRowSelected && this.props.isRowSelected(item)}\n onChange={this.props.onRowSelect && this.props.onRowSelect.bind(this, item)}\n />\n </div>\n )}\n </Item>\n );\n\n if (this.props.onDrag) {\n listItem = (\n <Draggable\n id={item.id || item.uid}\n index={index}\n item={item}\n key={item.id || item.uid}\n onDrag={this.props.onDrag.bind(this)}\n >\n { listItem }\n </Draggable>\n );\n }\n\n return listItem;\n }\n\n /**\n * Renders the list view.\n *\n * @returns {null|*}\n */\n renderList() {\n if (this.props.view !== Views.list || !(this.props.items && this.props.items.length)) {\n return null;\n }\n\n return (\n <Item.Group\n divided\n link={this.props.link}\n relaxed='very'\n >\n { _.map(this.props.items, this.renderItem.bind(this)) }\n </Item.Group>\n );\n }\n}\n\nItemsClass.defaultProps = {\n actions: []\n};\n\nconst Items = useItemsToggle(useList(ItemsClass));\nexport default Items;\n\nexport type {\n Props\n};\n","// @flow\n\nimport { InfiniteScroll } from '@performant-software/shared-components';\nimport React, { Component } from 'react';\nimport uuid from 'react-uuid';\nimport { Loader } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport Items, { type Props as ItemsProps } from './Items';\nimport './ItemCollection.css';\n\ntype Props = ItemsProps & {\n /**\n * Appends the passed <code>className</code> and passes it to the <code>Items</code> component.\n */\n className?: string,\n\n /**\n * The DOM element responsible for infinite scrolling. If no context is provided, the document <code>body</code>\n * will be assumed.\n */\n context: {\n current: HTMLElement\n },\n\n /**\n * If <code>true</code>, the list will display a loading indicator.\n */\n loading?: boolean,\n\n /**\n * Callback fired when the bottom of the scroll container is reached.\n */\n onBottomReached?: (page: number) => void,\n\n /**\n * Callback fired when the delete action is clicked.\n */\n onDelete?: (item: any) => void,\n\n /**\n * Callback fired when a new record is added to the list.\n */\n onSave?: (item: any) => void,\n\n /**\n * The number of records to display on a single page.\n */\n perPage?: number,\n\n /**\n * The number of pixels from the bottom of the scroll container the <code>onBottomReached</code> callback\n * should fire.\n */\n scrollOffset?: number\n};\n\ntype State = {\n page: number\n};\n\n/**\n * An <code>ItemCollection</code> component can be used to render a list of records stored on an object in memory. This\n * component is responsible for handling infinite scroll and rendering the <code>Items</code> component, which handles\n * the presentation.\n */\nclass ItemCollection extends Component<Props, State> {\n static defaultProps: any;\n\n /**\n * Constructs a new ItemCollection component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n page: 1\n };\n }\n\n /**\n * Returns the concatenated class names.\n *\n * @returns {string}\n */\n getClassName() {\n const classNames = ['item-collection'];\n\n if (this.props.className) {\n classNames.push(this.props.className);\n }\n\n return classNames.join(' ');\n }\n\n /**\n * Returns the list of items to render based on the current page.\n *\n * @returns {Array<T>|*[]}\n */\n getItems(): Array<any> {\n const endIndex = this.state.page * this.props.perPage;\n const items = (this.props.items && this.props.items.slice(0, endIndex)) || [];\n return _.filter(items, (item) => !item._destroy);\n }\n\n /**\n * Increments the page number and fetches the data.\n */\n onBottomReached() {\n if (this.props.loading) {\n return;\n }\n\n this.setState((state) => ({ page: state.page + 1 }), () => {\n if (this.props.onBottomReached) {\n this.props.onBottomReached(this.state.page);\n }\n });\n }\n\n /**\n * Calls the onDelete prop and returns a promise.\n *\n * @param item\n *\n * @returns {Promise<unknown>}\n */\n onDelete(item: any) {\n this.props.onDelete(item);\n return Promise.resolve();\n }\n\n /**\n * Calls the onSave prop and returns a promise.\n *\n * @param item\n *\n * @returns {Promise<unknown>}\n */\n onSave(item: any) {\n if (this.props.onSave) {\n const uid = item.uid ? item.uid : uuid();\n this.props.onSave({ ...item, uid });\n }\n\n return Promise.resolve();\n }\n\n /**\n * Renders the ItemCollection component.\n *\n * @returns {*}\n */\n render() {\n return (\n <InfiniteScroll\n context={this.props.context}\n offset={this.props.scrollOffset}\n onBottomReached={this.onBottomReached.bind(this)}\n >\n <Items\n {...this.props}\n items={this.getItems()}\n className={this.getClassName()}\n onDelete={this.onDelete.bind(this)}\n onSave={this.onSave.bind(this)}\n >\n <Loader\n active={this.props.loading}\n content={i18n.t('Common.messages.loading')}\n />\n </Items>\n </InfiniteScroll>\n );\n }\n}\n\nItemCollection.defaultProps = {\n addButton: {\n location: 'top'\n },\n buttons: [],\n className: '',\n configurable: true,\n modal: undefined,\n onCopy: undefined,\n onDrag: undefined,\n onSave: () => {},\n perPage: Number.MAX_SAFE_INTEGER,\n renderDeleteModal: undefined,\n renderEmptyRow: undefined,\n scrollOffset: 0\n};\n\nexport default ItemCollection;\n","// @flow\n\nimport React, { useCallback, useEffect, useMemo } from 'react';\nimport { Dimmer, Loader } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport Items, { type ItemsProps } from './Items';\nimport useDataList, { SORT_ASCENDING, type Props as DataListProps } from './DataList';\n\ntype Sort = {\n key: any,\n value: any,\n text: string,\n direction: ?string\n};\n\ntype Props = DataListProps & ItemsProps & {\n /**\n * Callback fired when the sort dropdown is changed. This prop is provided by the <code>DataList</code>\n * higher-order component.\n */\n onSort: (column: string, direction: ?string, page?: number) => void,\n\n /**\n * An array of sort attributes to apply to the list. The values provided will display in a dropdown in the\n * list header.\n */\n sort?: Array<Sort>,\n\n /**\n * Name of the current sort column.\n */\n sortColumn?: string,\n\n /**\n * Current sort direction (ascending or descending).\n */\n sortDirection?: string\n};\n\n/**\n * An <code>ItemList</code> component can be used to render a list of records returned from an API. Under the\n * hood, the <code>DataList</code> component handles calling the API, storing the records, filters, etc, and\n * the <code>Items</code> component handles the presentation.\n */\nconst ItemList = useDataList((props: Props) => {\n useEffect(() => {\n const { page } = props;\n\n let { sortColumn = '', sortDirection = SORT_ASCENDING } = props;\n\n if (!sortColumn) {\n const defaultSort = _.first(props.sort);\n\n if (defaultSort) {\n sortColumn = defaultSort.value;\n\n if (defaultSort.direction) {\n sortDirection = defaultSort.direction;\n }\n }\n }\n\n props.onSort(sortColumn, sortDirection, page);\n }, []);\n\n /**\n * Sets the variable to true if every item in the passed collection is selected.\n */\n const allSelected = useMemo(() => props.isRowSelected && props.items && props.items.length && _.every(\n props.items,\n props.isRowSelected.bind(this)\n ), [props.items, props.isRowSelected]);\n\n /**\n * Selects all items in the collection. If all items are currently selected, deselects all items.\n *\n * @type {(function(): void)|*}\n */\n const onSelectAll = useCallback(() => {\n if (props.items && props.isRowSelected && props.onRowSelect) {\n let items;\n\n if (allSelected) {\n items = [...props.items];\n } else {\n items = _.reject(props.items, props.isRowSelected.bind(this));\n }\n\n _.each(items, props.onRowSelect.bind(this));\n }\n }, [allSelected, props.isRowSelected, props.items, props.onRowSelect]);\n\n return (\n <>\n <Dimmer\n active={props.loading}\n inverted\n >\n <Loader\n content={i18n.t('Common.messages.loading')}\n />\n </Dimmer>\n <Items\n {...props}\n buttons={[...(props.buttons || []), {\n accept: () => props.selectable,\n color: 'green',\n content: allSelected ? i18n.t('ItemList.buttons.deselectAll') : i18n.t('ItemList.buttons.selectAll'),\n icon: 'checkmark',\n onClick: onSelectAll.bind(this)\n }]}\n />\n </>\n );\n});\n\nItemList.defaultProps = {\n filters: {},\n searchable: true,\n};\n\nexport default ItemList;\n","// @flow\n\nimport React from 'react';\nimport LinkButton from './LinkButton';\nimport './LinkLabel.css';\n\ntype Props = {\n content: string,\n htmlFor: string,\n label: string,\n onClick: () => void\n};\n\nconst LinkLabel = (props: Props) => (\n <>\n <label\n className='link-label'\n htmlFor={props.htmlFor}\n >\n { props.label }\n </label>\n <LinkButton\n content={props.content}\n onClick={props.onClick.bind(this)}\n />\n </>\n);\n\nexport default LinkLabel;\n","// @flow\n\nimport { Keyboard } from '@performant-software/shared-components';\nimport React, { Component, type Node } from 'react';\nimport { Form, Segment, Transition } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport LinkLabel from './LinkLabel';\nimport './KeyboardField.css';\n\ntype Props = {\n autoFocus?: boolean,\n children: Node<any>,\n className?: string,\n error?: boolean,\n id?: string,\n label: string,\n layout: any,\n name: string,\n onChange: (e: ?Event, { value: string }) => void,\n required: boolean,\n value: string,\n visible: boolean\n};\n\ntype State = {\n showKeyboard: boolean\n};\n\nclass KeyboardField extends Component<Props, State> {\n static defaultProps: any;\n\n /**\n * Constructs a new KeyboardField component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n showKeyboard: false\n };\n }\n\n /**\n * Hides the keyboard when the parent component is no longer visible.\n *\n * @param prevProps\n */\n componentDidUpdate(prevProps: Props) {\n if (prevProps.visible && !this.props.visible) {\n this.setState({ showKeyboard: false });\n }\n }\n\n /**\n * Triggers the text input change.\n *\n * @param e\n * @param value\n */\n onInputChange(e: Event, value: any) {\n this.props.onChange(e, value);\n }\n\n /**\n * Triggers the keyboard input change.\n *\n * @param value\n */\n onKeyboardChange(value: any) {\n this.props.onChange(null, { value });\n }\n\n /**\n * Renders the KeyboardField component.\n *\n * @returns {*}\n */\n render() {\n return (\n <Form.Field\n className='keyboard-field'\n >\n <Form.Input\n autoFocus={this.props.autoFocus}\n className={this.props.className}\n error={this.props.error}\n id={this.props.id}\n input={{\n 'aria-label': this.props.name\n }}\n label={this.renderLabel()}\n name={this.props.name}\n onChange={this.onInputChange.bind(this)}\n required={this.props.required}\n value={this.props.value}\n >\n { this.props.children }\n </Form.Input>\n <Transition\n duration={{\n hide: 50,\n show: 500\n }}\n visible={this.state.showKeyboard}\n >\n <Segment>\n <Keyboard\n layout={this.props.layout}\n onChange={this.onKeyboardChange.bind(this)}\n value={this.props.value}\n keyboardClass={this.props.name}\n />\n </Segment>\n </Transition>\n </Form.Field>\n );\n }\n\n /**\n * Renders the input label.\n *\n * @returns {*}\n */\n renderLabel() {\n return (\n <LinkLabel\n content={this.state.showKeyboard\n ? i18n.t('KeyboardField.labels.hideKeyboard')\n : i18n.t('KeyboardField.labels.showKeyboard')}\n htmlFor={this.props.name}\n label={this.props.label}\n onClick={() => this.setState((state) => ({ showKeyboard: !state.showKeyboard }))}\n />\n );\n }\n}\n\nKeyboardField.defaultProps = {\n autoFocus: false,\n className: '',\n error: false,\n id: ''\n};\n\nexport default KeyboardField;\n","// @flow\n\nimport React, { useCallback, type ComponentType } from 'react';\nimport _ from 'underscore';\n\ntype Props = {\n items: Array<any>,\n onChange: (items: Array<any>) => void\n};\n\nconst withBatchEdit = (WrappedComponent: ComponentType<any>): any => (props: Props) => {\n /**\n * Adds a new item to the list.\n *\n * @type {(function(): void)|*}\n */\n const onAddItem = useCallback(() => {\n props.onChange([...props.items, {}]);\n }, [props.items]);\n\n /**\n * Removes the item at the passed index from the list.\n *\n * @type {(function(*): void)|*}\n */\n const onRemoveItem = useCallback((findIndex) => {\n props.onChange(_.reject(props.items, (item, index) => index === findIndex));\n }, [props.items]);\n\n /**\n * Updates the passed attribute of the item at the passed index.\n *\n * @type {(function(number, string, ?Event, {value: *}): void)|*}\n */\n const onUpdateItem = useCallback((findIndex: number, attribute: string, e: ?Event, { value }) => {\n props.onChange(_.map(props.items, (item, index) => (\n index !== findIndex ? item : ({ ...item, [attribute]: value })\n )));\n }, [props.items]);\n\n return (\n <WrappedComponent\n {...props}\n onAddItem={onAddItem}\n onRemoveItem={onRemoveItem}\n onUpdateItem={onUpdateItem}\n />\n );\n};\n\nexport default withBatchEdit;\n\nexport type BatchEditProps = {\n onAddItem: () => void,\n onRemoveItem: (index: number) => void,\n onUpdateItem: (index: number, attribute: string, e: Event, data: any) => void\n};\n","// @flow\n\nimport React, { type ComponentType } from 'react';\nimport { Button, Grid, Input } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport withBatchEdit, { type BatchEditProps } from '../hooks/BatchEdit';\n\ntype Item = {\n key: string,\n value: string\n};\n\ntype Props = BatchEditProps & {\n items: Array<Item>,\n onChange: (items: Array<Item>) => void\n};\n\nconst KeyValuePairs: ComponentType<any> = withBatchEdit((props: Props) => (\n <div>\n <Button\n basic\n content={i18n.t('Common.buttons.add')}\n icon='plus'\n onClick={props.onAddItem.bind(this)}\n type='button'\n />\n <Grid\n padded='vertically'\n >\n { _.map(props.items, (item, index) => (\n <Grid.Row\n columns={3}\n >\n <Grid.Column\n width={8}\n >\n <Input\n fluid\n onChange={props.onUpdateItem.bind(this, index, 'key')}\n placeholder={i18n.t('KeyValuePairs.labels.key')}\n value={item.key}\n />\n </Grid.Column>\n <Grid.Column\n width={7}\n >\n <Input\n fluid\n onChange={props.onUpdateItem.bind(this, index, 'value')}\n placeholder={i18n.t('KeyValuePairs.labels.value')}\n value={item.value}\n />\n </Grid.Column>\n <Grid.Column\n width={1}\n >\n <Button\n color='red'\n icon='trash'\n onClick={props.onRemoveItem.bind(this, index)}\n />\n </Grid.Column>\n </Grid.Row>\n ))}\n { _.isEmpty(props.items) && (\n <Grid.Row\n columns={1}\n >\n <Grid.Column>\n { i18n.t('Common.labels.noRecords') }\n </Grid.Column>\n </Grid.Row>\n )}\n </Grid>\n </div>\n));\n\nexport default KeyValuePairs;\n","// @flow\n\nimport React from 'react';\nimport { Image, Loader } from 'semantic-ui-react';\nimport './LazyLoader.css';\n\ntype Props = {\n active: boolean,\n size: string\n};\n\nconst LazyLoader = (props: Props) => (\n <Image\n className='lazy-loader'\n size={props.size}\n >\n <Loader\n active={props.active}\n />\n </Image>\n);\n\nLazyLoader.defaultProps = {\n active: false,\n size: 'small'\n};\n\nexport default LazyLoader;\n","// @flow\n\nimport React, { useState, type Node } from 'react';\nimport {\n Button,\n Dimmer,\n Icon,\n Image,\n Loader,\n Segment,\n Transition,\n Visibility\n} from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport AudioPlayer from './AudioPlayer';\nimport DownloadButton from './DownloadButton';\nimport LazyLoader from './LazyLoader';\nimport './LazyAudio.css';\n\ntype Props = {\n children?: Node,\n dimmable: boolean,\n download?: string,\n duration?: number,\n image?: any,\n name?: string,\n preview?: string,\n size?: string,\n src?: string\n};\n\nconst LazyAudio = (props: Props) => {\n const [dimmer, setDimmer] = useState(false);\n const [error, setError] = useState(false);\n const [loaded, setLoaded] = useState(!props.preview);\n const [modal, setModal] = useState(false);\n const [visible, setVisible] = useState(false);\n\n if (!visible) {\n return (\n <Visibility\n as='span'\n fireOnMount\n onTopVisible={() => setVisible(true)}\n >\n <Loader\n active\n inline='centered'\n size={props.size}\n />\n </Visibility>\n );\n }\n\n return (\n <>\n <Transition\n duration={props.duration}\n visible\n >\n <Dimmer.Dimmable\n as={Segment}\n className='lazy-audio'\n compact\n onBlur={() => setDimmer(false)}\n onMouseEnter={() => setDimmer(true)}\n onMouseLeave={() => setDimmer(false)}\n >\n { !loaded && (\n <LazyLoader\n active\n size={props.size}\n />\n )}\n { !error && props.preview && (\n <Image\n {...props.image}\n onError={() => {\n setError(true);\n setLoaded(true);\n }}\n onLoad={() => {\n setError(false);\n setLoaded(true);\n }}\n size={props.size}\n src={props.preview}\n />\n )}\n { (error || !props.preview) && (\n <Image\n {...props.image}\n className='placeholder-image'\n size={props.size}\n >\n <Icon\n name='file audio outline'\n size='big'\n />\n </Image>\n )}\n { (props.src || props.children) && props.dimmable && (\n <Dimmer\n active={dimmer}\n >\n <div\n className='buttons'\n >\n { props.src && (\n <Button\n content={i18n.t('LazyAudio.buttons.play')}\n icon='play circle outline'\n onClick={() => setModal(true)}\n primary\n />\n )}\n { props.download && (\n <DownloadButton\n color='green'\n filename={props.name}\n url={props.download}\n />\n )}\n { props.children }\n </div>\n </Dimmer>\n )}\n </Dimmer.Dimmable>\n </Transition>\n { props.src && (\n <AudioPlayer\n onClose={() => setModal(false)}\n open={modal}\n size='large'\n src={props.src}\n />\n )}\n </>\n );\n};\n\nLazyAudio.defaultProps = {\n dimmable: true,\n duration: 1000,\n preview: undefined,\n size: 'medium',\n src: undefined\n};\n\nexport default LazyAudio;\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-pdf\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-pdf/dist/esm/Page/AnnotationLayer.css\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-pdf/dist/esm/Page/TextLayer.css\");","// @flow\n\nimport React, { useCallback, useState, type Node } from 'react';\nimport { pdfjs, Document, Page } from 'react-pdf';\nimport {\n Dimmer,\n Icon,\n Image,\n Loader,\n Segment,\n Transition,\n Visibility\n} from 'semantic-ui-react';\nimport DownloadButton from './DownloadButton';\nimport LazyLoader from './LazyLoader';\n\nimport 'react-pdf/dist/esm/Page/AnnotationLayer.css';\nimport 'react-pdf/dist/esm/Page/TextLayer.css';\nimport './LazyDocument.css';\n\ntype Props = {\n children?: Node,\n dimmable?: boolean,\n download?: string,\n duration?: number,\n image?: any,\n pdf?: boolean,\n preview?: ?string,\n size?: string,\n src?: string\n};\n\npdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.js`;\n\nconst LazyDocument = (props: Props) => {\n const [dimmer, setDimmer] = useState(false);\n const [error, setError] = useState(false);\n const [loaded, setLoaded] = useState(!props.preview);\n const [visible, setVisible] = useState(false);\n\n /**\n * Returns the list of class names for the image component.\n *\n * @type {function(*=): []}\n */\n const getClassNames = useCallback((defaultClass = null) => {\n const classNames = [];\n\n if (defaultClass) {\n classNames.push(defaultClass);\n }\n\n if (!loaded) {\n classNames.push('hidden');\n }\n\n return classNames.join(' ');\n }, [loaded]);\n\n if (!visible) {\n return (\n <Visibility\n as='span'\n fireOnMount\n onTopVisible={() => setVisible(true)}\n >\n <Loader\n active\n inline='centered'\n size={props.size}\n />\n </Visibility>\n );\n }\n\n return (\n <>\n <Transition\n duration={props.duration}\n visible\n >\n <Dimmer.Dimmable\n as={Segment}\n className='lazy-document'\n compact\n onBlur={() => setDimmer(false)}\n onMouseEnter={() => setDimmer(true)}\n onMouseLeave={() => setDimmer(false)}\n >\n { !loaded && (\n <LazyLoader\n active\n size={props.size}\n />\n )}\n { !error && props.preview && (\n <Image\n {...props.image}\n className={getClassNames()}\n onError={() => {\n setError(true);\n setLoaded(true);\n }}\n onLoad={() => {\n setError(false);\n setLoaded(true);\n }}\n src={props.preview}\n size={props.size}\n />\n )}\n { !error && loaded && !props.preview && props.src && props.pdf && (\n <Image\n {...props.image}\n className={getClassNames()}\n size={props.size}\n >\n <Document\n file={props.src}\n onLoadError={(e) => console.log(e.message)}\n >\n <Page\n pageNumber={1}\n />\n </Document>\n </Image>\n )}\n { (error || (!props.preview && !(props.src && props.pdf))) && (\n <Image\n {...props.image}\n className={getClassNames('placeholder-image')}\n size={props.size}\n >\n <Icon\n name='file alternate outline'\n size='big'\n />\n </Image>\n )}\n { (props.download || props.src || props.children) && props.dimmable && (\n <Dimmer\n active={dimmer}\n >\n <div\n className='buttons'\n >\n { props.download && (\n <DownloadButton\n primary\n url={props.download || props.src}\n />\n )}\n { props.children }\n </div>\n </Dimmer>\n )}\n </Dimmer.Dimmable>\n </Transition>\n </>\n );\n};\n\nLazyDocument.defaultProps = {\n dimmable: true,\n duration: 1000,\n pdf: false,\n preview: undefined,\n size: 'medium',\n src: undefined\n};\n\nexport default LazyDocument;\n","// @flow\n\nimport React, { useState } from 'react';\nimport { Image, Message, Modal } from 'semantic-ui-react';\nimport ModalContext from '../context/ModalContext';\nimport './PhotoViewer.css';\nimport i18n from '../i18n/i18n';\n\ntype Props = {\n alt?: string,\n image: string,\n onClose: () => void,\n open: boolean,\n size?: string\n};\n\nconst PhotoViewer = (props: Props) => {\n const [error, setError] = useState(false);\n\n return (\n <ModalContext.Consumer>\n {(mountNode) => (\n <Modal\n centered={false}\n className='photo-viewer'\n closeIcon\n mountNode={mountNode}\n onClose={props.onClose.bind(this)}\n open={props.open}\n size={props.size}\n >\n <Modal.Content>\n { error && (\n <Message\n content={i18n.t('PhotoViewer.errors.path.content', { path: props.image })}\n header={i18n.t('PhotoViewer.errors.path.header')}\n icon='exclamation circle'\n />\n )}\n { !error && (\n <Image\n alt={props.alt}\n fluid\n onError={() => setError(true)}\n src={props.image}\n />\n )}\n </Modal.Content>\n </Modal>\n )}\n </ModalContext.Consumer>\n );\n};\n\nPhotoViewer.defaultProps = {\n size: 'small'\n};\n\nexport default PhotoViewer;\n","// @flow\n\nimport React, { useCallback, useState, type Node } from 'react';\nimport {\n Button,\n Dimmer,\n Icon,\n Image,\n Loader,\n Segment,\n Transition,\n Visibility\n} from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport DownloadButton from './DownloadButton';\nimport LazyLoader from './LazyLoader';\nimport PhotoViewer from './PhotoViewer';\nimport './LazyImage.css';\n\ntype Props = {\n children?: Node,\n dimmable: boolean,\n download?: string,\n duration?: number,\n image?: any,\n name?: string,\n preview?: string,\n size?: string,\n src?: string\n};\n\nconst LazyImage = (props: Props) => {\n const [dimmer, setDimmer] = useState(false);\n const [error, setError] = useState(false);\n const [loaded, setLoaded] = useState(!(props.src || props.preview));\n const [modal, setModal] = useState(false);\n const [visible, setVisible] = useState(false);\n\n /**\n * Returns the list of class names for the image component.\n *\n * @type {function(*=): []}\n */\n const getClassNames = useCallback((defaultClass = null) => {\n const classNames = [];\n\n if (defaultClass) {\n classNames.push(defaultClass);\n }\n\n if (!loaded) {\n classNames.push('hidden');\n }\n\n return classNames.join(' ');\n }, [loaded]);\n\n if (!visible) {\n return (\n <Visibility\n as='span'\n fireOnMount\n onTopVisible={() => setVisible(true)}\n >\n <Loader\n active\n inline='centered'\n size={props.size}\n />\n </Visibility>\n );\n }\n\n return (\n <>\n <Transition\n duration={props.duration}\n visible\n >\n <Dimmer.Dimmable\n as={Segment}\n className='lazy-image'\n compact\n onBlur={() => setDimmer(false)}\n onMouseEnter={() => setDimmer(true)}\n onMouseLeave={() => setDimmer(false)}\n >\n { !loaded && (\n <LazyLoader\n active\n size={props.size}\n />\n )}\n { !error && (props.preview || props.src) && (\n <Image\n {...props.image}\n className={getClassNames()}\n onError={() => {\n setError(true);\n setLoaded(true);\n }}\n onLoad={() => {\n setError(false);\n setLoaded(true);\n }}\n size={props.size}\n src={props.preview || props.src}\n />\n )}\n { (error || !(props.preview || props.src)) && (\n <Image\n {...props.image}\n className={getClassNames('placeholder-image')}\n size={props.size}\n >\n <Icon\n name='image'\n size='big'\n />\n </Image>\n )}\n { (props.src || props.children) && props.dimmable && (\n <Dimmer\n active={dimmer}\n >\n <div\n className='buttons'\n >\n { props.src && (\n <Button\n content={i18n.t('LazyImage.buttons.view')}\n icon='photo'\n onClick={() => setModal(true)}\n primary\n />\n )}\n { props.download && (\n <DownloadButton\n color='green'\n filename={props.name}\n url={props.download}\n />\n )}\n { props.children }\n </div>\n </Dimmer>\n )}\n </Dimmer.Dimmable>\n </Transition>\n { props.src && (\n <PhotoViewer\n image={props.src}\n onClose={() => setModal(false)}\n open={modal}\n size='large'\n />\n )}\n </>\n );\n};\n\nLazyImage.defaultProps = {\n dimmable: true,\n duration: 1000,\n size: 'medium'\n};\n\nexport default LazyImage;\n","// @flow\n\nimport React, {\n useEffect,\n useRef,\n useState,\n type Element\n} from 'react';\nimport {\n Embed,\n Message,\n Modal,\n Ref\n} from 'semantic-ui-react';\nimport ModalContext from '../context/ModalContext';\nimport './VideoPlayer.css';\nimport i18n from '../i18n/i18n';\n\ntype Props = {\n autoPlay?: boolean,\n embedded?: boolean,\n icon?: string | Element<any>,\n onClose: () => void,\n open: boolean,\n placeholder?: ?string,\n placeholderAlt?: string,\n size?: string,\n video: string\n};\n\nconst VideoPlayer = (props: Props) => {\n const [error, setError] = useState(false);\n\n const embedRef = useRef();\n\n /**\n * Work-around to set the \"alt\" attribute on the placeholder <img> element if provided.\n */\n useEffect(() => {\n if (embedRef && embedRef.current && props.placeholderAlt) {\n const placeholder = embedRef.current.querySelector('.placeholder');\n\n if (placeholder) {\n placeholder.setAttribute('alt', props.placeholderAlt);\n }\n }\n }, [embedRef, props.placeholderAlt]);\n\n return (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n centered={false}\n className='video-player'\n closeIcon\n mountNode={mountNode}\n onClose={props.onClose.bind(this)}\n open={props.open}\n size={props.size}\n >\n <Modal.Content>\n { error && (\n <Message\n content={i18n.t('VideoPlayer.errors.path.content', { path: props.video })}\n header={i18n.t('VideoPlayer.errors.path.header')}\n icon='exclamation circle'\n />\n )}\n { props.embedded && (\n <Ref\n innerRef={embedRef}\n >\n <Embed\n active={props.autoPlay}\n icon={props.icon}\n iframe={props.autoPlay ? { allow: 'autoplay' } : undefined}\n placeholder={props.placeholder}\n url={`${props.video}${props.autoPlay ? '?autoplay=true' : ''}`}\n />\n </Ref>\n )}\n { !props.embedded && (\n <video\n autoPlay={props.autoPlay}\n controls\n onError={() => setError(true)}\n src={props.video}\n />\n )}\n </Modal.Content>\n </Modal>\n )}\n </ModalContext.Consumer>\n );\n};\n\nVideoPlayer.defaultProps = {\n autoPlay: false,\n embedded: false,\n icon: 'right circle arrow',\n size: 'small'\n};\n\nexport default VideoPlayer;\n","// @flow\n\nimport React, {\n useCallback,\n useState,\n type Element,\n type Node\n} from 'react';\nimport {\n Button,\n Dimmer,\n Icon,\n Image,\n Loader,\n Segment,\n Transition,\n Visibility\n} from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport DownloadButton from './DownloadButton';\nimport LazyLoader from './LazyLoader';\nimport VideoPlayer from './VideoPlayer';\nimport './LazyVideo.css';\n\ntype Props = {\n autoPlay?: boolean,\n children?: Node,\n dimmable: boolean,\n download?: string,\n duration?: number,\n embedded?: boolean,\n icon?: string | Element<any>,\n image?: any,\n name?: string,\n preview?: ?string,\n size?: string,\n src?: string\n};\n\nconst LazyVideo = (props: Props) => {\n const [dimmer, setDimmer] = useState(false);\n const [error, setError] = useState(false);\n const [loaded, setLoaded] = useState(!(props.preview || props.src));\n const [modal, setModal] = useState(false);\n const [visible, setVisible] = useState(false);\n\n /**\n * Returns the list of class names for the image component.\n *\n * @type {function(*=): []}\n */\n const getClassNames = useCallback((defaultClass = null) => {\n const classNames = [];\n\n if (defaultClass) {\n classNames.push(defaultClass);\n }\n\n if (!loaded) {\n classNames.push('hidden');\n }\n\n return classNames.join(' ');\n }, [loaded]);\n\n if (!visible) {\n return (\n <Visibility\n as='span'\n fireOnMount\n onTopVisible={() => setVisible(true)}\n >\n <Loader\n active\n inline='centered'\n size={props.size}\n />\n </Visibility>\n );\n }\n\n return (\n <>\n <Transition\n duration={props.duration}\n visible\n >\n <Dimmer.Dimmable\n as={Segment}\n className='lazy-video'\n compact\n onBlur={() => setDimmer(false)}\n onMouseEnter={() => setDimmer(true)}\n onMouseLeave={() => setDimmer(false)}\n >\n { !loaded && (\n <LazyLoader\n active\n size={props.size}\n />\n )}\n { !error && props.preview && (\n <Image\n {...props.image}\n className={getClassNames()}\n onError={() => {\n setError(true);\n setLoaded(true);\n }}\n onLoad={() => {\n setError(false);\n setLoaded(true);\n }}\n src={props.preview}\n size={props.size}\n />\n )}\n { !error && !props.preview && props.src && (\n <Image\n {...props.image}\n className={getClassNames()}\n size={props.size}\n >\n <video\n onError={() => {\n setError(true);\n setLoaded(true);\n }}\n onLoadedData={() => {\n setError(false);\n setLoaded(true);\n }}\n src={props.src}\n />\n </Image>\n )}\n { (error || (!props.preview && !props.src)) && (\n <Image\n {...props.image}\n className={getClassNames('placeholder-image')}\n size={props.size}\n >\n <Icon\n name='image'\n size='big'\n />\n </Image>\n )}\n { (props.src || props.children) && props.dimmable && (\n <Dimmer\n active={dimmer}\n >\n <div\n className='buttons'\n >\n { props.src && (\n <Button\n content={i18n.t('LazyVideo.buttons.play')}\n icon='video'\n onClick={() => setModal(true)}\n primary\n />\n )}\n { props.download && (\n <DownloadButton\n color='green'\n filename={props.name}\n url={props.download}\n />\n )}\n { props.children }\n </div>\n </Dimmer>\n )}\n </Dimmer.Dimmable>\n </Transition>\n { props.src && (\n <VideoPlayer\n autoPlay={props.autoPlay}\n embedded={props.embedded}\n icon={props.icon}\n onClose={() => setModal(false)}\n open={modal}\n placeholder={props.preview}\n size='large'\n video={props.src}\n />\n )}\n </>\n );\n};\n\nLazyVideo.defaultProps = {\n autoPlay: false,\n dimmable: true,\n duration: 1000,\n embedded: false,\n icon: 'right circle arrow',\n size: 'medium'\n};\n\nexport default LazyVideo;\n","// @flow\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type ComponentType,\n type Node\n} from 'react';\nimport { Icon } from 'semantic-ui-react';\nimport { Trans } from 'react-i18next';\nimport _ from 'underscore';\nimport FileInputButton from './FileInputButton';\nimport i18n from '../i18n/i18n';\nimport LazyAudio from './LazyAudio';\nimport LazyDocument from './LazyDocument';\nimport LazyImage from './LazyImage';\nimport LazyVideo from './LazyVideo';\n\ntype Props = {\n children?: Node,\n contentType: string,\n dimmable?: boolean,\n downloadUrl?: string,\n name?: string,\n onUpload: (file: File) => void,\n preview?: string,\n size?: string,\n src?: string\n};\n\nconst ContentTypes = {\n audio: 'audio',\n image: 'image',\n pdf: 'application/pdf',\n video: 'video'\n};\n\nconst WebContentTypes = [\n 'image/png',\n 'image/jpeg',\n 'image/gif',\n 'image/webp',\n 'image/bmp',\n 'video/m4v',\n 'video/mp4'\n];\n\nconst LazyMedia: ComponentType<any> = (props: Props) => {\n const [contentType, setContentType] = useState(props.contentType || '');\n const [name, setName] = useState(props.name);\n const [preview, setPreview] = useState(props.preview);\n const [source, setSource] = useState(props.src);\n\n /**\n * Sets the file extension based on the name.\n *\n * @type {*}\n */\n const fileExtension = useMemo(() => {\n let value;\n\n if (name) {\n value = name.split('.').pop();\n value = value && value.toUpperCase();\n }\n\n return value;\n }, [name]);\n\n /**\n * Sets the content type, name, preview, and source attributes. Also calls the onUpload prop.\n *\n * @type {(function(*): void)|*}\n */\n const onUpload = useCallback((files) => {\n const file = _.first(files);\n\n setContentType(file.type);\n setName(file.name);\n setPreview(null);\n\n if (_.contains(WebContentTypes, file.type)\n || file.type.startsWith(ContentTypes.audio)\n || file.type === ContentTypes.pdf) {\n setSource(URL.createObjectURL(file));\n } else {\n setSource(null);\n }\n\n props.onUpload(file);\n }, [props.onUpload]);\n\n /**\n * Renders the child buttons.\n *\n * @type {unknown}\n */\n const renderChildren = useCallback(() => (\n <>\n { props.onUpload && (\n <FileInputButton\n color='orange'\n content={i18n.t('Common.buttons.upload')}\n icon='cloud upload'\n onSelection={onUpload}\n />\n )}\n { props.children }\n </>\n ));\n\n /**\n * Renders the media component.\n *\n * @type {(function(): *)|*}\n */\n const renderMedia = useCallback(() => {\n if (contentType.startsWith(ContentTypes.image)) {\n return (\n <LazyImage\n dimmable={props.dimmable}\n download={props.downloadUrl}\n preview={preview}\n src={source}\n size={props.size}\n >\n { renderChildren() }\n </LazyImage>\n );\n }\n\n if (contentType.startsWith(ContentTypes.video)) {\n return (\n <LazyVideo\n dimmable={props.dimmable}\n download={props.downloadUrl}\n preview={preview}\n src={source}\n size={props.size}\n >\n { renderChildren() }\n </LazyVideo>\n );\n }\n\n if (contentType.startsWith(ContentTypes.audio)) {\n return (\n <LazyAudio\n dimmable={props.dimmable}\n download={props.downloadUrl}\n preview={preview}\n src={source}\n size={props.size}\n >\n { renderChildren() }\n </LazyAudio>\n );\n }\n\n return (\n <LazyDocument\n dimmable={props.dimmable}\n download={props.downloadUrl}\n pdf={contentType === ContentTypes.pdf}\n preview={preview}\n src={source}\n size={props.size}\n >\n { renderChildren() }\n </LazyDocument>\n );\n }, [contentType, preview, source, props.dimmable, props.downloadUrl, props.size]);\n\n /**\n * Renders the upload message.\n *\n * @type {(function(): (null|*))|*}\n */\n const renderMessage = useCallback(() => {\n if (!fileExtension) {\n return null;\n }\n\n return (\n <div>\n <Icon\n name='info circle'\n />\n <span>\n <Trans\n components={{ bold: <strong /> }}\n default='Your <bold>{{type}}</bold> has been received'\n i18n={i18n}\n i18nKey='LazyMedia.messages.uploaded'\n values={{\n type: fileExtension\n }}\n />\n </span>\n </div>\n );\n }, [fileExtension]);\n\n /**\n * Sets the content type, name, preview, and source.\n */\n useEffect(() => {\n if (props.contentType) {\n setContentType(props.contentType);\n }\n\n if (props.name) {\n setName(props.name);\n }\n\n if (props.preview) {\n setPreview(props.preview);\n }\n\n if (props.src) {\n setSource(props.src);\n } else {\n setSource(null);\n }\n }, [props.contentType, props.name, props.preview, props.src]);\n\n return (\n <div\n className='lazy-media'\n >\n { renderMedia() }\n { renderMessage() }\n </div>\n );\n};\n\nLazyMedia.defaultProps = {\n dimmable: true,\n size: 'medium'\n};\n\nexport default LazyMedia;\n","// @flow\n\nimport React, { useState, type Node } from 'react';\nimport { Button } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport IIIFModal from './IIIFModal';\nimport LazyMedia from './LazyMedia';\n\ntype Props = {\n children?: Node,\n color?: string,\n content?: string,\n manifest?: string,\n options?: any\n};\n\nconst LazyIIIF = ({ manifest, options = {}, ...props }: Props) => {\n const [modal, setModal] = useState(false);\n\n return (\n <>\n <LazyMedia\n {...props}\n >\n { manifest && (\n <Button\n color={props.color}\n content={props.content || i18n.t('Common.buttons.iiif')}\n icon='images outline'\n onClick={() => setModal(true)}\n />\n )}\n { props.children }\n </LazyMedia>\n { modal && (\n <IIIFModal\n manifestId={manifest}\n onClose={() => setModal(false)}\n options={_.defaults(options, { showIIIFBadge: false })}\n />\n )}\n </>\n );\n};\n\nexport default LazyIIIF;\n","// @flow\n\nimport React from 'react';\nimport { Dimmer, Loader, Segment } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport './ListLoader.css';\n\ntype Props = {\n /**\n * If present, the list loader spinner will display.\n */\n active: boolean\n};\n\n/**\n * A loader displays a spinner when active.\n */\nconst ListLoader = (props: Props) => (\n <Dimmer.Dimmable\n as={Segment}\n className='listLoader'\n dimmed={props.active}\n style={{\n opacity: props.active ? '0.8' : '0'\n }}\n >\n <Dimmer\n active={props.active}\n inverted\n >\n <Loader\n content={i18n.t('Common.messages.loading')}\n />\n </Dimmer>\n </Dimmer.Dimmable>\n);\n\nexport default ListLoader;\n","// @flow\n\nimport React, { type Element } from 'react';\nimport {\n Button,\n Form,\n Grid,\n Header,\n Icon,\n Input,\n Message,\n Modal\n} from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport ModalContext from '../context/ModalContext';\nimport './LoginModal.css';\n\ntype Props = {\n disabled: boolean,\n loginFailed: boolean,\n onClose: () => void,\n onLogin: () => void,\n onPasswordChange: () => void,\n onUsernameChange: () => void,\n open: boolean,\n trigger?: () => Element<any>,\n placeholder: string\n};\n\nconst LoginModal = (props: Props) => (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n as={Form}\n className='login-modal'\n error={props.loginFailed}\n mountNode={mountNode}\n open={props.open}\n size='small'\n trigger={props.trigger}\n >\n <Header\n icon='user circle'\n content={i18n.t('LoginModal.header')}\n />\n <Message\n error\n header={i18n.t('LoginModal.loginErrorHeader')}\n content={i18n.t('LoginModal.loginErrorContent')}\n />\n <Grid\n padded='vertically'\n textAlign='center'\n >\n <Grid.Column>\n <Grid.Row>\n <Input\n autoFocus\n className='form-field'\n icon={<Icon name='at' />}\n onChange={props.onUsernameChange.bind(this)}\n placeholder={props.placeholder}\n size='huge'\n />\n </Grid.Row>\n <Grid.Row\n className='row'\n >\n <Input\n className='form-field'\n icon={<Icon name='lock' />}\n onChange={props.onPasswordChange.bind(this)}\n placeholder={i18n.t('LoginModal.password')}\n size='huge'\n type='password'\n />\n </Grid.Row>\n </Grid.Column>\n </Grid>\n <Modal.Actions>\n <Button\n disabled={props.disabled}\n onClick={props.onLogin.bind(this)}\n primary\n size='large'\n type='submit'\n >\n { i18n.t('LoginModal.buttonLogin') }\n </Button>\n { props.onClose && (\n <Button\n basic\n onClick={props.onClose.bind(this)}\n size='large'\n >\n { i18n.t('LoginModal.buttonCancel') }\n </Button>\n )}\n </Modal.Actions>\n </Modal>\n )}\n </ModalContext.Consumer>\n);\n\nLoginModal.defaultProps = {\n placeholder: i18n.t('LoginModal.email')\n};\n\nexport default LoginModal;\n","// @flow\n\nimport React, {\n useEffect,\n useState,\n type Element,\n type Node\n} from 'react';\nimport {\n Dimmer,\n Header,\n Image,\n Loader,\n Pagination,\n Segment,\n Transition\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport './MasonryGrid.css';\n\ntype Item = {\n alt: string,\n extra?: Element<any> | string,\n id: number,\n image: string,\n subtitle?: string,\n title?: string,\n};\n\ntype LayoutProps = {\n children: Array<Node>,\n columns: number,\n gap: number\n};\n\nconst MasonryLayout = (props: LayoutProps) => {\n const columnWrapper = {};\n const result = [];\n\n // create columns\n for (let i = 0; i < props.columns; i += 1) {\n columnWrapper[`column${i}`] = [];\n }\n\n // divide children into columns\n for (let i = 0; i < props.children.length; i += 1) {\n const columnIndex = i % props.columns;\n columnWrapper[`column${columnIndex}`].push(\n <div\n className='itemContainer'\n key={i}\n style={{\n marginBottom: `${props.gap}px`\n }}\n >\n { props.children[i] }\n </div>\n );\n }\n\n // wrap children in each column with a div\n for (let i = 0; i < props.columns; i += 1) {\n result.push(\n <div\n className='column'\n key={i}\n style={{\n marginLeft: `${i > 0 ? props.gap : 0}px`\n }}\n >\n { columnWrapper[`column${i}`] }\n </div>\n );\n }\n\n return (\n <div\n className='masonryGrid'\n >\n { result }\n </div>\n );\n};\n\ntype TileProps = {\n item: Item,\n onClick?: (item: any) => void,\n renderContent?: (item: Item) => Node\n};\n\nconst HEIGHT_OFFSET = 350;\nconst MIN_HEIGHT = 175;\n\nconst MasonryTile = (props: TileProps) => {\n const [dimmerActive, setDimmerActive] = useState(false);\n const [height, setHeight] = useState(0);\n\n /**\n * Calculate the height of the tile once the component mounts.\n */\n useEffect(() => {\n setHeight(MIN_HEIGHT + Math.ceil(Math.random() * HEIGHT_OFFSET));\n }, []);\n\n return (\n <Dimmer.Dimmable\n className='item'\n dimmed={dimmerActive}\n onClick={() => props.onClick && props.onClick(props.item)}\n onMouseEnter={() => setDimmerActive(true)}\n onMouseLeave={() => setDimmerActive(false)}\n style={{\n cursor: props.onClick ? 'pointer' : undefined,\n height: `${height}px`\n }}\n >\n <Transition\n duration={800}\n visible={dimmerActive}\n >\n <Dimmer.Inner\n active={dimmerActive}\n >\n <Header\n content={props.item.title}\n inverted\n subheader={props.item.subtitle}\n />\n { props.item.extra && (\n <div\n className='extraContainer'\n >\n { props.item.extra }\n </div>\n )}\n </Dimmer.Inner>\n </Transition>\n <Image\n alt={props.item.alt}\n className='image'\n src={props.item.image}\n />\n { props.renderContent && props.renderContent(props.item) }\n </Dimmer.Dimmable>\n );\n};\n\ntype Props = {\n columns: number,\n gap: number,\n items: Array<Item>,\n loading?: boolean,\n onClick?: (item: any) => void,\n onPageChange?: (page: number) => void,\n page: number,\n pages: number,\n renderContent?: (item: Item) => Node,\n renderEmpty?: () => Node\n};\n\nconst MasonryGrid = (props: Props) => (\n <div\n className='masonry-grid'\n >\n <Loader\n active={props.loading}\n />\n <div>\n <MasonryLayout\n columns={props.columns}\n gap={props.gap}\n >\n { _.map(props.items, (item, index) => (\n <MasonryTile\n key={index}\n item={item}\n onClick={props.onClick}\n renderContent={props.renderContent}\n />\n ))}\n </MasonryLayout>\n { props.pages > 1 && props.onPageChange && (\n <Segment\n basic\n textAlign='center'\n >\n <Pagination\n activePage={props.page}\n firstItem={null}\n lastItem={null}\n onPageChange={(e, { activePage }) => props.onPageChange && props.onPageChange(activePage)}\n totalPages={props.pages}\n size='small'\n />\n </Segment>\n )}\n </div>\n { !props.loading && !(props.items && props.items.length) && props.renderEmpty && props.renderEmpty() }\n </div>\n);\n\nexport default MasonryGrid;\n","// @flow\n\nimport React from 'react';\nimport { Button } from 'semantic-ui-react';\nimport './PlayButton.css';\n\ntype Props = {\n /**\n * What to do when the button is clicked.\n */\n onClick?: () => void,\n /**\n * Size of the button.\n */\n size?: 'mini' | 'tiny' | 'small' | 'medium' | 'large' | 'big' | 'huge' | 'massive',\n /**\n * Custom styling object.\n */\n style?: any\n};\n\n/**\n * This component can be used as a toggle for playing media.\n */\nconst PlayButton = (props: Props) => (\n <Button\n className='play-button'\n color='black'\n icon='play'\n onClick={(e) => {\n if (props.onClick) {\n e.stopPropagation();\n\n // $FlowFixMe - Not really an issue since we're checking for props.onClick above.\n props.onClick();\n }\n }}\n size={props.size}\n style={props.style}\n />\n);\n\nPlayButton.defaultProps = {\n onClick: undefined,\n size: 'massive',\n style: undefined\n};\n\nexport default PlayButton;\n","// @flow\n\nimport React from 'react';\nimport PlayButton from './PlayButton';\nimport './VideoPlayerButton.css';\n\nconst VideoPlayerButton = () => (\n <div\n className='icon video-player-button'\n >\n <div>\n <PlayButton />\n </div>\n </div>\n);\n\nexport default VideoPlayerButton;\n","// @flow\n\nimport React, { useState, type Element } from 'react';\nimport {\n Button,\n Dimmer, Image,\n Loader,\n Transition\n} from 'semantic-ui-react';\nimport PlayButton from './PlayButton';\nimport VideoPlayer from './VideoPlayer';\nimport VideoPlayerButton from './VideoPlayerButton';\nimport './MediaGallery.css';\n\ntype Item = {\n image?: string,\n embedded?: boolean,\n preview?: string,\n src?: string,\n type: 'image' | 'video'\n};\n\ntype Props = {\n item: Item,\n label?: string,\n loading?: boolean,\n onClose?: () => void,\n onNext?: () => void,\n onPrevious?: () => void,\n renderContent?: () => Element<any>,\n visible: boolean\n};\n\nconst MediaGallery = (props: Props) => {\n const [video, setVideo] = useState(false);\n\n return (\n <Dimmer\n active={props.visible}\n className='media-gallery mediaGallery'\n page\n >\n { props.loading && (\n <Loader\n active\n size='big'\n />\n )}\n { props.item && (\n <>\n <Transition\n animation='fade'\n mountOnShow={false}\n >\n <div\n className='imageContainer'\n >\n <Image\n src={props.item.image}\n style={{\n objectFit: 'contain'\n }}\n />\n { props.item.type === 'video' && (\n <PlayButton\n onClick={() => setVideo(true)}\n style={{\n position: 'absolute',\n top: '50%'\n }}\n />\n )}\n </div>\n </Transition>\n { props.renderContent && props.renderContent() }\n { props.onClose && (\n <div\n className='controls top right'\n >\n <Button\n basic\n circular\n icon='times'\n inverted\n onClick={props.onClose}\n size='large'\n />\n </div>\n )}\n { props.label && (\n <div\n className='controls top left'\n >\n <Button\n basic\n content={props.label}\n inverted\n size='large'\n />\n </div>\n )}\n { props.onPrevious && (\n <div\n className='controls middle left'\n >\n <Button\n basic\n disabled={!props.onPrevious}\n inverted\n icon='angle left'\n onClick={props.onPrevious}\n size='huge'\n />\n </div>\n )}\n { props.onNext && (\n <div\n className='controls middle right'\n >\n <Button\n basic\n disabled={!props.onNext}\n inverted\n icon='angle right'\n onClick={props.onNext}\n size='huge'\n />\n </div>\n )}\n { props.item.src && (\n <VideoPlayer\n autoPlay\n embedded={props.item.embedded}\n icon={<VideoPlayerButton />}\n onClose={() => setVideo(false)}\n open={video}\n placeholder={props.item.preview}\n size='huge'\n video={props.item.src}\n />\n )}\n </>\n )}\n </Dimmer>\n );\n};\n\nexport default MediaGallery;\n","// @flow\n\nimport React, { useEffect, useState } from 'react';\nimport { Image, Loader } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport './MediaGrid.css';\n\ntype Item = {\n image: string\n};\n\ntype Props = {\n items: Array<Item>,\n loading?: boolean,\n onClick?: (item: Item) => void\n};\n\nconst MAX_IMAGES = 5;\n\nconst MediaGrid = (props: Props) => {\n const [items, setItems] = useState([]);\n\n /**\n * Grab the list of image URLs to display and save it on the sate.\n */\n useEffect(() => {\n const list = [];\n\n for (let i = 0; i < props.items.length && list.length < MAX_IMAGES; i += 1) {\n if (!_.isEmpty(props.items[i].image)) {\n list.push(props.items[i]);\n }\n }\n\n setItems(list);\n }, [props.items]);\n\n // Return null if no items are passed\n if (_.isEmpty(props.items)) {\n return null;\n }\n\n return (\n <div\n className='mediaGrid'\n >\n <Loader\n active={props.loading}\n />\n <div\n className={`grid${items.length}`}\n >\n { _.map(items, (item, index) => (\n <div\n className='mediaImage'\n key={index}\n >\n <Image\n onClick={() => props.onClick && props.onClick(item)}\n src={item.image}\n style={{\n cursor: props.onClick ? 'pointer' : undefined,\n objectFit: 'cover',\n width: '100%'\n }}\n />\n </div>\n ))}\n </div>\n </div>\n );\n};\n\nexport default MediaGrid;\n","// @flow\n\nimport React, { type Element } from 'react';\nimport { InfiniteScroll } from '@performant-software/shared-components';\nimport { Card, Image } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport ListLoader from './ListLoader';\nimport PlayButton from './PlayButton';\nimport './MediaList.css';\n\ntype Item = {\n ...any,\n image: string,\n type: 'image' | 'video'\n};\n\ntype Props = {\n items: Array<Item>,\n loading?: boolean,\n onBottomReached: () => void,\n onClick: (item: any, index: number) => void,\n renderDescription?: (item: Item) => Element<any>,\n renderExtra?: (item: Item) => Element<any>,\n renderHeader?: (item: Item) => Element<any>,\n renderMeta?: (item: Item) => Element<any>,\n textAlign?: 'left' | 'center' | 'right'\n};\n\nconst MediaList = (props: Props) => (\n <InfiniteScroll\n offset={100}\n onBottomReached={props.onBottomReached}\n >\n <ListLoader\n active={props.loading || false}\n />\n <Card.Group\n doubling\n stackable\n >\n { _.map(props.items, (item, i) => (\n <Card\n onClick={props.onClick.bind(this, item, i)}\n >\n <Image\n alt={item.alt}\n src={item.image}\n style={{\n objectFit: 'cover'\n }}\n />\n { item.type === 'video' && (\n <div\n style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)'\n }}\n >\n <PlayButton />\n </div>\n )}\n { (props.renderMeta || props.renderHeader || props.renderDescription) && (\n <Card.Content>\n { props.renderHeader && (\n <Card.Header\n content={props.renderHeader(item)}\n textAlign={props.textAlign}\n />\n )}\n { props.renderMeta && (\n <Card.Meta\n content={props.renderMeta(item)}\n textAlign={props.textAlign}\n />\n )}\n { props.renderDescription && (\n <Card.Description\n content={props.renderDescription(item)}\n textAlign={props.textAlign}\n />\n )}\n </Card.Content>\n )}\n { props.renderExtra && (\n <Card.Content\n content={props.renderExtra(item)}\n extra\n textAlign={props.textAlign}\n />\n )}\n </Card>\n ))}\n </Card.Group>\n </InfiniteScroll>\n);\n\nexport default MediaList;\n","// @flow\n\nimport React, { Component } from 'react';\nimport { withTranslation } from 'react-i18next';\nimport { Button, Dropdown } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport './ModalDropdown.css';\n\ntype Props = {\n onClear: () => void,\n renderModal: ({ onClose: () => void, open: boolean }) => void,\n searchQuery: ?string\n};\n\ntype State = {\n modalVisible: boolean\n};\n\nclass ModalDropdown extends Component<Props, State> {\n /**\n * Constructs a new ModalDropdown component.\n *\n * @param props\n */\n constructor(props) {\n super(props);\n\n this.state = {\n modalVisible: false\n };\n }\n\n /**\n * Closes the modal.\n */\n onClose() {\n this.setState({ modalVisible: false });\n }\n\n /**\n * Renders the ModalDropdown component.\n *\n * @returns {*}\n */\n render() {\n return (\n <>\n <Dropdown\n className='modal-dropdown'\n onClick={() => this.setState({ modalVisible: true })}\n onSearchChange={() => {}}\n open={false}\n search\n searchInput={{\n 'aria-label': 'Search'\n }}\n selection\n searchQuery={this.props.searchQuery || ''}\n />\n <Button.Group>\n <Button\n basic\n content={i18n.t('Common.buttons.clear')}\n icon='times'\n onClick={this.props.onClear.bind(this)}\n type='button'\n />\n </Button.Group>\n { this.renderModal() }\n </>\n );\n }\n\n /**\n * Renders the modal.\n *\n * @returns {*}\n */\n renderModal() {\n return this.props.renderModal({\n onClose: this.onClose.bind(this),\n open: this.state.modalVisible\n });\n }\n}\n\nexport default withTranslation()(ModalDropdown);\n","// @flow\n\nimport { Timer } from '@performant-software/shared-components';\nimport React, { Component, createRef } from 'react';\nimport { Dropdown, DropdownSearchInput, Icon } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport './RemoteDropdown.css';\n\ntype Option = {\n key: string,\n value: string,\n text: any\n};\n\ntype ApiResponse = {\n data: {\n items: Array<any>,\n list: {\n pages: number\n }\n }\n};\n\ntype Props = {\n allowAdditions?: boolean,\n className?: string,\n collectionName: string,\n fluid?: boolean,\n multiple?: boolean,\n onAddItem?: (value: string) => Promise<any>,\n onLoad: ({ search: string, page: number}) => Promise<ApiResponse>,\n onSelection: (value: string) => void,\n placeholder?: string,\n renderOption: (item: any) => Option,\n value: string\n};\n\ntype State = {\n loading: boolean,\n options: Array<Option>,\n page: number,\n pages: number,\n search: string\n};\n\nclass RemoteDropdown extends Component<Props, State> {\n static defaultProps: any;\n dropdown: DropdownSearchInput;\n\n /**\n * Constructs a new RemoteDropdown component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n loading: false,\n options: [],\n page: 1,\n pages: 1,\n search: ''\n };\n\n this.dropdown = createRef();\n }\n\n /**\n * Resets the component.\n */\n componentDidMount() {\n this.onReset();\n }\n\n /**\n * Resets the state and executes the search.\n *\n * @param prevProps\n */\n componentDidUpdate(prevProps: Props) {\n if (this.props.value !== prevProps.value) {\n this.setState({\n page: 1,\n pages: 1,\n search: ''\n }, this.onSearch.bind(this));\n }\n }\n\n /**\n * Returns the dropdown class name(s).\n *\n * @returns {string}\n */\n getClassNames() {\n const classNames = ['remote-dropdown'];\n if (this.props.className) {\n classNames.push(this.props.className);\n }\n\n return classNames.join(' ');\n }\n\n /**\n * Returns the dropdown value as an array.\n *\n * @returns {[]}\n */\n getValues() {\n let values = [];\n const { value } = this.props;\n\n if (value && value.length) {\n values = Array.isArray(value) ? value : [value];\n }\n\n return values;\n }\n\n /**\n * Returns the passed value as a dropdown option.\n *\n * @param value\n *\n * @returns {{text: *, value: *, key: *}}\n */\n getOption(value: string) {\n return {\n key: value,\n text: value,\n value\n };\n }\n\n /**\n * Returns the complete list of dropdown options. If applicable, the \"Add\" and \"Load more\" options are added to the\n * end of the list.\n *\n * @returns {*[]}\n */\n getOptions() {\n const options = [...this.state.options];\n\n /*\n * Add the current dropdown value to the list. Since the value doesn't render unless it exists in the list of\n * options, we'll need to add the value to the list of options if it exists of another page.\n */\n _.each(this.getValues(), (value) => {\n if (!_.findWhere(options, { value })) {\n options.push(this.getOption(value));\n }\n });\n\n /*\n * Add the \"Add\" option if the dropdown allows additions and the search query does not already exist in the list\n * of options.\n */\n const { search } = this.state;\n\n if (this.props.allowAdditions && search && !_.findWhere(options, { text: search })) {\n options.push({\n key: 'add',\n value: 'add',\n text: this.renderAddOption(),\n onClick: this.onAddItem.bind(this)\n });\n }\n\n /*\n * Add the \"Load more\" option if the dropdown is paginated and contains more pages.\n */\n if (this.state.page < this.state.pages) {\n options.push({\n key: 'more',\n value: 'more',\n text: this.renderLoadMoreOption(),\n onClick: () => this.setState((state) => ({ page: state.page + 1 }), this.onSearch.bind(this))\n });\n }\n\n return options;\n }\n\n /**\n * Returns the list of options to display for the search. This list will include the options that match the search\n * criteria with the current value(s) excluded.\n *\n * @returns {*}\n */\n getSearchOptions() {\n return _.filter(this.getOptions(), (option) => !this.getValues().includes(option.value));\n }\n\n /**\n * Adds the current search query as a new dropdown option.\n *\n * @param e\n *\n * @returns {*|Q.Promise<any>|Promise<R>|Promise<any>|void}\n */\n onAddItem(e: Event) {\n return this.props.onAddItem && this.props\n .onAddItem(this.state.search)\n .then(() => {\n // Resolve the new value. If multiple are allowed, append the new value to the existing list.\n let value = this.state.search;\n if (this.props.multiple) {\n value = [\n ...this.props.value,\n this.state.search\n ];\n }\n\n // Set the new value\n this.onOptionSelection(e, { value });\n\n // Close the dropdown (single select only)\n if (!this.props.multiple) {\n this.dropdown.current.close();\n }\n });\n }\n\n /**\n * Selects the passed value.\n *\n * @param e\n * @param value\n */\n onOptionSelection(e: Event, { value }: any) {\n this.props.onSelection(value);\n }\n\n /**\n * Resets the dropdown state.\n */\n onReset() {\n this.setState({\n options: _.map(this.getValues(), this.getOption.bind(this)),\n page: 1,\n pages: 1,\n search: ''\n });\n }\n\n /**\n * Executes the search and sets the rendered options on the state.\n */\n onSearch() {\n const { page, search } = this.state;\n\n this.setState({\n loading: true\n }, () => {\n this.props\n .onLoad({ page, search })\n .then(({ data }) => {\n const options = _.map(data[this.props.collectionName], this.props.renderOption.bind(this));\n const { pages } = data.list;\n\n this.setState((state) => ({\n loading: false,\n options: [\n ...page > 1 ? (state.options || []) : [],\n ...options\n ],\n page,\n pages\n }));\n });\n });\n }\n\n /**\n * Sets the search on the state and re-sets the page counts.\n *\n * @param e\n * @param searchQuery\n */\n onSearchChange(e: Event, { searchQuery }: any) {\n this.setState({\n page: 1,\n pages: 1,\n search: searchQuery\n });\n }\n\n /**\n * Renders the RemoteDropdown component.\n *\n * @returns {*}\n */\n render() {\n return (\n <Dropdown\n className={this.getClassNames()}\n clearable\n fluid={this.props.fluid}\n loading={this.state.loading}\n multiple={this.props.multiple}\n onBlur={this.onReset.bind(this)}\n onClose={this.onReset.bind(this)}\n onChange={this.onOptionSelection.bind(this)}\n onOpen={this.onSearch.bind(this)}\n onSearchChange={this.onSearchChange.bind(this)}\n options={this.getOptions()}\n placeholder={this.props.placeholder}\n ref={this.dropdown}\n scrolling\n search={() => this.getSearchOptions()}\n searchInput={{\n 'aria-label': 'Search',\n className: 'remote-dropdown-search-input',\n onKeyDown: Timer.clearSearchTimer.bind(this),\n onKeyUp: Timer.setSearchTimer.bind(this, this.onSearch.bind(this))\n }}\n searchQuery={this.state.search}\n selectOnBlur={false}\n selection\n value={this.props.value}\n />\n );\n }\n\n /**\n * Renders the \"Add\" dropdown option.\n *\n * @returns {*}\n */\n renderAddOption() {\n return (\n <div\n className='extra-option'\n >\n <Icon name='plus circle' />\n {`${i18n.t('RemoteDropdown.labels.add')} ${this.state.search}`}\n </div>\n );\n }\n\n /**\n * Renders the \"Load more\" dropdown option.\n *\n * @returns {*}\n */\n renderLoadMoreOption() {\n return (\n <div\n className='extra-option'\n >\n <Icon name='refresh' />\n { i18n.t('RemoteDropdown.labels.loadMore') }\n </div>\n );\n }\n}\n\nRemoteDropdown.defaultProps = {\n allowAdditions: false,\n className: '',\n fluid: false,\n multiple: false,\n onAddItem: undefined,\n placeholder: null\n};\n\nexport default RemoteDropdown;\n","// @flow\n\nimport { Timer } from '@performant-software/shared-components';\nimport React, { useCallback, useRef, useState } from 'react';\nimport { Icon, Input, type InputProps } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport { type SearchBoxProps } from '../types/InstantSearch';\n\ntype Props = InputProps & SearchBoxProps;\n\n/**\n * This component is used with the `useSearchBox` function from Instant Search Hooks and renders an input element that\n * when changed will execute a new query.\n */\nconst SearchBox = ({ useSearchBox, ...props }: Props) => {\n const {\n query,\n refine,\n clear,\n isSearchStalled\n } = useSearchBox(props);\n\n const [search, setSearch] = useState(query);\n const ref = useRef();\n\n /**\n * Clears the current search state.\n *\n * @type {(function(): void)|*}\n */\n const onClear = useCallback(() => {\n // Reset the query view\n setSearch('');\n\n // Clear the results\n clear();\n\n // Refocus the input element\n const { current: instance } = ref;\n if (instance) {\n instance.focus();\n }\n }, [clear]);\n\n /**\n * Calls the refine prop when the search changes.\n *\n * @type {function(): void}\n */\n const onSearch = useCallback(() => refine(search), [refine, search]);\n\n return (\n <Input\n {...props}\n aria-label='Search'\n icon={(\n <Icon\n link={!_.isEmpty(query)}\n name={_.isEmpty(query) ? 'search' : 'times'}\n onClick={onClear}\n />\n )}\n input={{\n 'aria-label': 'search'\n }}\n loading={isSearchStalled}\n onChange={(e, { value }) => setSearch(value)}\n onKeyDown={() => Timer.clearSearchTimer()}\n onKeyUp={() => Timer.setSearchTimer(onSearch)}\n ref={ref}\n type='text'\n value={search}\n />\n );\n};\n\nexport default SearchBox;\n","// @flow\n\nimport React, { useCallback, useEffect } from 'react';\nimport { Pagination } from 'semantic-ui-react';\nimport { type PaginationProps } from '../types/InstantSearch';\n\ntype Props = PaginationProps & {\n /**\n * If `true`, we'll scroll to the top of the page after applying the new page value.\n */\n scrollToTop?: boolean\n};\n\n/**\n * This component is used with the `usePagination` hook from Instant Search Hooks and renders a list of page numbers\n * that can be selected by the user. If the `scrollToTop` prop is set to `true`, the window will scroll to the top\n * after applying a new value.\n */\nconst SearchPagination = ({ usePagination, ...props }: Props) => {\n const { currentRefinement, nbPages: pages, refine } = usePagination(props);\n const onPageChange = useCallback((e, { activePage }) => refine(activePage - 1), [refine]);\n\n /**\n * Scroll to the top of the page when the current page changes.\n */\n useEffect(() => {\n if (props.scrollToTop) {\n window.scroll({ top: 0, behavior: 'smooth' });\n }\n }, [currentRefinement, props.scrollToTop]);\n\n /**\n * Return null if there are no pages.\n */\n if (pages === 0) {\n return null;\n }\n\n return (\n <Pagination\n activePage={currentRefinement + 1}\n onPageChange={onPageChange}\n totalPages={pages}\n />\n );\n};\n\nSearchPagination.defaultProps = {\n scrollToTop: false\n};\n\nexport default SearchPagination;\n","// @flow\n\nimport React, { type Element, type Node } from 'react';\nimport ItemCollection from './ItemCollection';\nimport { type HitsProps } from '../types/InstantSearch';\n\ntype Props = HitsProps & {\n /**\n * Renders the component as the passed `as` prop.\n */\n as?: Element<any>,\n\n /**\n * Additional props to pass to the container component.\n */\n asProps?: any,\n\n /**\n * If `true` each item will be rendered as a Link.\n */\n link?: boolean,\n\n /**\n * Renders the description for the passed item.\n */\n renderDescription?: (item: any) => Node,\n\n /**\n * Component to render if the list contains no records.\n */\n renderEmptyList?: () => Node,\n\n /**\n * Renders the extra content for the passed item.\n */\n renderExtra?: (item: any) => Node,\n\n /**\n * Renders the header for the passed item.\n */\n renderHeader?: (item: any) => Node,\n\n /**\n * Renders the image for the passed item.\n */\n renderImage?: (item: any) => Node,\n\n /**\n * Renders the meta for the passed item.\n */\n renderMeta?: (item: any) => Node\n};\n\n/**\n * This component is used with the `useHits` hook from Instant Search Hooks and renders a pass-through to the\n * `ItemCollection` component.\n */\nconst SearchResults = ({ useHits, ...props }: Props) => {\n const { hits } = useHits(props);\n\n const {\n as,\n asProps,\n link,\n renderDescription,\n renderEmptyList,\n renderExtra,\n renderHeader,\n renderImage,\n renderMeta\n } = props;\n\n return (\n <ItemCollection\n as={as}\n asProps={asProps}\n hideToggle\n items={hits}\n link={link}\n renderDescription={renderDescription}\n renderEmptyList={renderEmptyList}\n renderExtra={renderExtra}\n renderHeader={renderHeader}\n renderImage={renderImage}\n renderMeta={renderMeta}\n />\n );\n};\n\nSearchResults.defaultProps = {\n as: undefined,\n asProps: undefined,\n link: undefined,\n renderDescription: undefined,\n renderEmptyList: undefined,\n renderExtra: undefined,\n renderHeader: undefined,\n renderImage: undefined,\n renderMeta: undefined\n};\n\nexport default SearchResults;\n","// @flow\n\nimport React from 'react';\nimport _ from 'underscore';\nimport DropdownButton from './DropdownButton';\nimport i18n from '../i18n/i18n';\nimport { type HitsPerPageProps } from '../types/InstantSearch';\n\ntype Props = HitsPerPageProps & {\n /**\n * An array of numeric values to present to the user as the number of records to display per page.\n */\n options: Array<number>\n};\n\n/**\n * This component is used with the `useHitsPerPage` hook from Instant Search Hooks and renders a dropdown with\n * options for the number of records to display per page.\n */\nconst SearchResultsPerPage = ({ useHitsPerPage, options }: Props) => {\n const { items, refine } = useHitsPerPage({\n items: _.map(options, (option, index) => ({\n label: option,\n value: option,\n default: index === 0\n }))\n });\n\n const { value } = _.findWhere(items, { isRefined: true });\n\n return (\n <DropdownButton\n basic\n icon='list'\n onChange={(e, data) => refine(data.value)}\n options={_.map(items, (item) => ({\n key: item.value,\n value: item.value,\n text: item.label\n }))}\n text={i18n.t('SearchResultsPerPage.labels.show', { value })}\n value={value}\n />\n );\n};\n\nexport default SearchResultsPerPage;\n","// @flow\n\nimport React, { useMemo } from 'react';\nimport _ from 'underscore';\nimport DropdownButton from './DropdownButton';\nimport type { SortByProps } from '../types/InstantSearch';\n\nconst ICON_SORT_ASCENDING = 'sort alphabet up';\nconst ICON_SORT_DESCENDING = 'sort alphabet down';\nconst SORT_DIRECTION_DESCENDING = 'desc';\n\ntype Props = SortByProps & {\n /**\n * A list of label/value objects to use as the dropdown options.\n */\n items: Array<{ label: string, value: string }>\n};\n\nconst SearchResultsSort = ({ useSortBy, ...props }: Props) => {\n const { currentRefinement, options, refine } = useSortBy(props);\n const { label, value } = _.findWhere(options, { value: currentRefinement }) || _.first(options);\n\n /**\n * Sets the icon variable based on the current sort value.\n *\n * @type {string}\n */\n const icon = useMemo(() => (\n value && value.endsWith(SORT_DIRECTION_DESCENDING)\n ? ICON_SORT_DESCENDING\n : ICON_SORT_ASCENDING\n ), [value]);\n\n return (\n <DropdownButton\n basic\n icon={icon}\n onChange={(e, data) => refine(data.value)}\n options={_.map(options, (option) => ({\n key: option.value,\n value: option.value,\n text: option.description || option.label,\n }))}\n text={label}\n value={value}\n />\n );\n};\n\nexport default SearchResultsSort;\n","// @flow\n\nimport React from 'react';\nimport i18n from '../i18n/i18n';\nimport type { StatsProps } from '../types/InstantSearch';\n\nconst MsToS = 1000.0;\nconst DECIMAL_PLACES = 2;\n\n/**\n * This component is used with the `useStats` hook from Instant Search Hooks and renders a label of the number of\n * records returned and the time it took to execute the request.\n */\nconst SearchStats = ({ useStats, ...props }: StatsProps) => {\n const { nbHits: count, processingTimeMS } = useStats(props);\n const seconds = (processingTimeMS / MsToS).toFixed(DECIMAL_PLACES);\n\n return (\n <div>\n { i18n.t('SearchStats.labels.results', { count, seconds }) }\n </div>\n );\n};\n\nexport default SearchStats;\n","// @flow\n\nimport React, { type Node } from 'react';\nimport { Divider, Header } from 'semantic-ui-react';\n\ntype Props = {\n children: Node,\n divided?: boolean,\n header?: string,\n visible?: boolean\n}\n\nconst Section = (props: Props) => {\n if (!props.visible) {\n return null;\n }\n\n return (\n <div\n className='section'\n >\n { props.header && (\n <Header\n content={props.header}\n />\n )}\n { props.children }\n <Divider\n hidden={!props.divided}\n />\n </div>\n );\n};\n\nSection.defaultProps = {\n divided: true,\n header: undefined,\n visible: true\n};\n\nexport default Section;\n","// @flow\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type ComponentType,\n type Element\n} from 'react';\nimport {\n Button,\n Form,\n Grid,\n Icon,\n Message,\n Modal,\n Table\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport SelectizeHeader from './SelectizeHeader';\nimport i18n from '../i18n/i18n';\nimport ModalContext from '../context/ModalContext';\nimport useDataList from './DataList';\nimport useList, { type Props as ListProps } from './List';\nimport './Selectize.css';\n\ntype Props = {\n centered?: boolean,\n collectionName: string,\n filters?: {\n component: ComponentType<any>,\n defaults: any,\n props: any,\n onChange?: (filter: any) => Promise<any>\n },\n modal?: {\n onSave: (item: any) => Promise<any>\n },\n multiple?: boolean | number,\n onClose: () => void,\n onLoad: (params: any) => Promise<any>,\n onSave: (items: any) => void,\n selectedItems: Array<any>,\n title: string\n};\n\ntype GridProps = ListProps & {\n isSelected: (item: any) => boolean,\n onInit: () => void,\n onItemSelection: (item: any) => void,\n onSelect: (item: any) => void,\n renderHeader?: (params: any) => Element<any>,\n renderItem?: (item: any) => Element<any>,\n renderItems?: ({\n isSelected: (item: any) => boolean,\n items: any,\n onSelect: () => void\n }) => Element<any>,\n selectedItem: any,\n selectedItems: Array<any>\n};\n\nconst SelectizeGrid = useDataList(useList((props: GridProps) => {\n useEffect(() => {\n if (props.onInit) {\n props.onInit();\n }\n }, []);\n\n /**\n * Renders a checkmark of the passed item is selected.\n *\n * @type {(function(*): (null|*))|*}\n */\n const renderCheckmark = useCallback((item: any) => {\n if (!props.isSelected(item)) {\n return null;\n }\n\n return (\n <Icon\n color='green'\n name='check'\n />\n );\n }, [props.selectedItems]);\n\n /**\n * Renders the selectize header component.\n *\n * @returns {JSX.Element|*}\n */\n const renderHeader = () => {\n if (props.renderHeader) {\n return props.renderHeader({\n onItemClick: props.onItemSelection.bind(this),\n selectedItem: props.selectedItem,\n selectedItems: props.selectedItems,\n });\n }\n\n return (\n <SelectizeHeader\n isSelected={(item) => props.selectedItem === item}\n items={props.selectedItems}\n onItemClick={props.onItemSelection.bind(this)}\n renderItem={props.renderItem.bind(this)}\n />\n );\n };\n\n /**\n * Renders the list of items as a table.\n *\n * @type {(function(): (null|*))|*}\n */\n const renderItems = useCallback(() => {\n if (_.isEmpty(props.items)) {\n return null;\n }\n\n if (props.renderItems) {\n return props.renderItems({\n isSelected: props.isSelected,\n items: props.items,\n onSelect: props.onSelect\n });\n }\n\n return (\n <Table\n basic\n padded\n selectable\n >\n <Table.Body>\n { _.map(props.items, (item, index) => (\n <Table.Row\n key={index}\n onClick={props.onSelect.bind(this, item)}\n >\n <Table.Cell>{ props.renderItem(item) }</Table.Cell>\n <Table.Cell>\n { renderCheckmark(item) }\n </Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n );\n }, [renderCheckmark, props.items, props.onSelect, props.renderItem]);\n\n /**\n * Renders the empty list component.\n *\n * @type {(function(): (null|*))|*}\n */\n const renderEmpty = useCallback(() => {\n if ((props.items && props.items.length) || props.loading) {\n return null;\n }\n\n return (\n <Grid\n className='empty'\n padded='vertically'\n >\n <Grid.Column\n textAlign='center'\n >\n <Grid.Row>\n <Icon\n name='search'\n size='huge'\n />\n </Grid.Row>\n <Grid.Row>\n { i18n.t('Selectize.messages.noRecords') }\n </Grid.Row>\n </Grid.Column>\n </Grid>\n );\n }, [props.items, props.loading]);\n\n return (\n <Grid>\n <Grid.Column\n textAlign='center'\n >\n { renderHeader() }\n { renderItems() }\n { renderEmpty() }\n </Grid.Column>\n </Grid>\n );\n}));\n\nconst Selectize = (props: Props) => {\n const [error, setError] = useState(false);\n const [selectedItem, setSelectedItem] = useState();\n const [selectedItems, setSelectedItems] = useState(props.selectedItems || []);\n\n /**\n * Sets the allowMultiple prop to \"true\" if the multiple prop is a boolean or non-zero integer.\n *\n * @type {boolean}\n */\n const allowMultiple = useMemo(() => !!props.multiple, [props.multiple]);\n\n /**\n * Sets the allowed number of items that can be selected. If the multiple prop is a boolean, this will be\n * and unlimited amount.\n *\n * @type {boolean|number}\n */\n const allowedCount = useMemo(() => (\n _.isNumber(props.multiple) ? props.multiple : Number.MAX_SAFE_INTEGER\n ), [props.multiple]);\n\n /**\n * Returns true if the passed item is selected.\n *\n * @type {function(*): boolean}\n */\n const isSelected = useCallback((item) => !!_.findWhere(selectedItems, { id: item.id }, [selectedItems]));\n\n /**\n * If the passed item is selected, deselect the item. If we're not allowing multiple select, replace the selected\n * items with the passed item. Otherwise, append the passed item to the list of selected items.\n *\n * If the user has already selected the maximum number allowed, display an error message.\n *\n * @type {(function(*=): void)|*}\n */\n const onSelect = useCallback((item) => {\n if (isSelected(item)) {\n setSelectedItems((prevItems) => _.filter(prevItems, (i) => i.id !== item.id));\n } else if (!allowMultiple) {\n setSelectedItems([item]);\n } else if (selectedItems.length >= allowedCount) {\n setError(true);\n } else {\n setSelectedItems((prevItems) => [\n ...prevItems,\n item\n ]);\n }\n }, [isSelected, props.multiple]);\n\n /**\n * Selects or deselects the single passed item.\n *\n * @type {(function(*=): void)|*}\n */\n const onItemSelection = useCallback((item) => {\n if (selectedItem === item) {\n setSelectedItem(null);\n onSelect(item);\n } else {\n setSelectedItem(item);\n }\n }, [selectedItem, onSelect]);\n\n /**\n * Returns the promise from the modal onSave prop, if provided. Otherwise returns a resolved promise.\n *\n * @type {(function(*=): (*))|*}\n */\n const onSave = useCallback((item) => {\n if (props.modal && props.modal.onSave) {\n return props.modal.onSave(item).then((saved) => onSelect(saved));\n }\n\n return Promise.resolve();\n }, [onSelect, props.modal]);\n\n return (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n as={Form}\n centered={props.centered}\n className='selectize'\n mountNode={mountNode}\n noValidate\n open\n size='small'\n >\n <Modal.Header\n content={props.title}\n />\n <Modal.Content>\n <Message\n content={i18n.t('Selectize.messages.maxSelected.content')}\n error\n header={i18n.t('Selectize.messages.maxSelected.header')}\n onDismiss={() => setError(false)}\n visible={error}\n />\n <SelectizeGrid\n {...props}\n actions={[]}\n isSelected={isSelected}\n onDelete={() => Promise.resolve()}\n onDeleteAll={() => Promise.resolve()}\n onItemSelection={onItemSelection}\n onSave={onSave}\n onSelect={onSelect}\n selectedItem={selectedItem}\n selectedItems={selectedItems}\n />\n </Modal.Content>\n <Modal.Actions>\n <Button\n onClick={props.onSave.bind(this, selectedItems)}\n primary\n size='medium'\n type='submit'\n >\n { i18n.t('Common.buttons.save') }\n </Button>\n <Button\n basic\n onClick={props.onClose.bind(this)}\n size='medium'\n type='button'\n >\n { i18n.t('Common.buttons.cancel') }\n </Button>\n </Modal.Actions>\n </Modal>\n )}\n </ModalContext.Consumer>\n );\n};\n\nSelectize.defaultProps = {\n centered: false,\n modal: undefined,\n multiple: true,\n searchable: true,\n selectedItems: []\n};\n\nexport default Selectize;\n","// @flow\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type Element\n} from 'react';\nimport {\n Button,\n Card,\n Header,\n Icon,\n Image,\n Segment,\n Transition\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport './SelectizeImageHeader.css';\n\ntype Props = {\n collapsable?: boolean,\n onItemClick: (item: any) => void,\n perPage?: number,\n renderDescription?: (item: any) => Element<any> | string,\n renderExtra?: (item: any) => Element<any> | string,\n renderHeader?: (item: any) => Element<any> | string,\n renderImage?: (item: any) => Element<any> | string,\n renderMeta?: (item: any) => Element<any> | string,\n selectedItem: any,\n selectedItems: Array<any>\n};\n\ntype CardProps = {\n onClick: () => void,\n onDelete: () => void,\n description?: Element<any> | string,\n extra?: Element<any> | string,\n header?: Element<any> | string,\n image?: Element<any> | string,\n meta?: Element<any> | string,\n selected: boolean\n};\n\nconst DEFAULT_PER_PAGE = 5;\n\nconst SelectizeCard = (props: CardProps) => (\n <Card\n raised={props.selected}\n link\n onClick={props.onClick}\n >\n { props.image && _.isString(props.image) && (\n <Image\n size='small'\n src={props.image}\n />\n )}\n { !!props.image && !_.isString(props.image) && props.image }\n { !props.image && (\n <Segment\n placeholder\n >\n <Icon\n name='image'\n size='large'\n />\n </Segment>\n )}\n <Card.Content>\n { props.header && (\n <Card.Header>\n <Header\n as='h6'\n content={props.header}\n />\n </Card.Header>\n )}\n { props.meta && (\n <Card.Meta\n content={props.meta}\n />\n )}\n { props.description && (\n <Card.Description\n content={props.description}\n />\n )}\n </Card.Content>\n { props.extra && (\n <Card.Content\n extra\n >\n { props.extra }\n </Card.Content>\n )}\n { props.selected && (\n <Card.Content\n extra\n >\n <Button\n basic\n circular\n compact\n icon='times'\n onClick={props.onDelete}\n />\n </Card.Content>\n )}\n </Card>\n);\n\nSelectizeCard.defaultProps = {\n header: undefined,\n image: undefined,\n meta: undefined,\n renderExtra: undefined\n};\n\nconst SelectizeImageHeader = (props: Props) => {\n const [page, setPage] = useState(1);\n const [pages, setPages] = useState(0);\n const [collapsed, setCollapsed] = useState(false);\n\n /**\n * Sets the items for the current page.\n *\n * @type {null}\n */\n const items = useMemo(() => {\n let records = null;\n\n if (page && props.selectedItems && props.selectedItems.length) {\n const startIndex = (page - 1) * (props.perPage || DEFAULT_PER_PAGE);\n const endIndex = startIndex + (props.perPage || DEFAULT_PER_PAGE);\n\n records = props.selectedItems.slice(startIndex, endIndex);\n }\n\n return records;\n }, [page, props.perPage, props.selectedItems]);\n\n /**\n * Sets the pagination label.\n *\n * @type {string}\n */\n const pagination = useMemo(() => {\n const startIndex = (page - 1) * (props.perPage || DEFAULT_PER_PAGE);\n const endIndex = startIndex + (props.perPage || DEFAULT_PER_PAGE);\n const total = props.selectedItems.length;\n\n return `${startIndex + 1} - ${Math.min(endIndex, total)} of ${total}`;\n }, [page, props.perPage, props.selectedItems]);\n\n /**\n * Changes the current page number. If the next page is invalid, we move to the first page or last page.\n *\n * @type {(function(*): void)|*}\n */\n const onPageChange = useCallback((increment) => {\n let nextPage = page + increment;\n\n if (nextPage < 1) {\n nextPage = pages;\n } else if (nextPage > pages) {\n nextPage = 1;\n }\n\n setPage(nextPage);\n }, [page, pages]);\n\n /**\n * Set the number of pages when the perPage or selectedItems props change.\n */\n useEffect(() => {\n if (props.perPage && props.selectedItems) {\n setPages(Math.ceil(props.selectedItems.length / props.perPage));\n }\n }, [props.perPage, props.selectedItems]);\n\n /**\n * If we're removing the last item on the page, decrement the page by 1.\n */\n useEffect(() => {\n if (!(items && items.length) && props.selectedItems && props.selectedItems.length && page > 1) {\n setPage(page - 1);\n }\n }, [items, page, props.selectedItems]);\n\n if (_.isEmpty(items)) {\n return null;\n }\n\n return (\n <Segment\n className='selectize-image-header'\n >\n <Transition\n visible={!collapsed}\n >\n <div>\n <div\n className='container'\n >\n <Button\n basic\n circular\n disabled={pages <= 1}\n icon='arrow left'\n onClick={onPageChange.bind(this, -1)}\n />\n <Card.Group\n itemsPerRow={props.perPage}\n >\n { _.map(items, (item) => (\n <SelectizeCard\n description={props.renderDescription && props.renderDescription(item)}\n extra={props.renderExtra && props.renderExtra(item)}\n header={props.renderHeader && props.renderHeader(item)}\n image={props.renderImage && props.renderImage(item)}\n meta={props.renderMeta && props.renderMeta(item)}\n key={item.id}\n onClick={() => (\n props.selectedItem === item\n ? props.onItemClick(null)\n : props.onItemClick(item)\n )}\n onDelete={() => props.onItemClick(item)}\n selected={item === props.selectedItem}\n />\n ))}\n </Card.Group>\n <Button\n basic\n circular\n disabled={pages <= 1}\n icon='arrow right'\n onClick={onPageChange.bind(this, 1)}\n />\n </div>\n </div>\n </Transition>\n <div\n className='bottom-container'\n >\n <div />\n <div>{ pagination }</div>\n <div>\n { props.collapsable && (\n <Button\n as='a'\n basic\n circular\n className='link'\n compact\n content={collapsed ? i18n.t('Common.buttons.show') : i18n.t('Common.buttons.hide')}\n onClick={() => setCollapsed((prevCollapsed) => !prevCollapsed)}\n />\n )}\n </div>\n </div>\n </Segment>\n );\n};\n\nSelectizeImageHeader.defaultProps = {\n collapsable: true,\n onItemClick: () => {},\n perPage: DEFAULT_PER_PAGE,\n renderExtra: undefined\n};\n\nexport default SelectizeImageHeader;\n","// @flow\n\nimport { Element } from '@performant-software/shared-components';\nimport type { EditContainerProps } from '@performant-software/shared-components/types';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState\n} from 'react';\nimport {\n Button,\n Form,\n Grid,\n Menu,\n MenuProps,\n Message,\n Ref,\n Sticky\n} from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport Toaster from './Toaster';\nimport './SimpleEditPage.css';\n\ntype Props = EditContainerProps & {\n /**\n * Additional class attribute to apply to the root DOM element.\n */\n className?: string,\n\n /**\n * Sets the default visible tab. If no value is provided, the first tab will be visible.\n */\n defaultTab?: string,\n\n /**\n * If `false`, the save button will be hidden.\n */\n editable?: boolean,\n\n /**\n * Props to provide to the Semantic UI `Menu` component.\n */\n menuProps?: typeof MenuProps,\n\n /**\n * Callback fired when the \"Cancel\" button is clicked.\n */\n onCancel: () => void,\n\n /**\n * Callback fired when a tab is clicked.\n *\n * @param tab\n */\n onTabClick?: (tab: string) => void,\n\n /**\n * If `true`, the saved toaster will display when the component is mounted.\n */\n saved?: boolean,\n\n /**\n * If `true`, the tabs menu will \"stick\" to the top of the window.\n */\n stickyMenu?: boolean\n};\n\n/**\n * This component can be used to render the layout for a form/page with edit capabilities. Use in conjunction with the\n * `withEditPage` higher-order component for a fully fledged record editing environment.\n */\nconst SimpleEditPage: any = (props: Props) => {\n const [currentTab, setCurrentTab] = useState();\n const [saved, setSaved] = useState(false);\n\n const contentRef = useRef();\n\n // $FlowIgnore\n const tabs = Element.findByType(props.children, SimpleEditPage.Tab);\n const tab = useMemo(() => _.find(tabs, (nextTab) => nextTab.key === currentTab), [currentTab, tabs]);\n\n /**\n * Memo-izes the class name variable.\n *\n * @type {string}\n */\n const className = useMemo(() => {\n const classNames = ['simple-edit-page'];\n\n if (props.className) {\n classNames.push(props.className);\n }\n\n return classNames.join(' ');\n }, [props.className]);\n\n /**\n * Sets the current tab.\n *\n * @type {(function(*): void)|*}\n */\n const onTabClick = useCallback((item) => {\n const { key } = item;\n setCurrentTab(key);\n\n if (props.onTabClick) {\n props.onTabClick(key);\n }\n }, [props.onTabClick]);\n\n /**\n * Renders the tab menu component.\n *\n * @type {(function(): (*))|*}\n */\n const renderTabs = useCallback(() => {\n const menu = (\n <Menu\n {...props.menuProps}\n >\n { tabs?.length > 1 && _.map(tabs, (item) => (\n <Menu.Item\n active={item.key === currentTab}\n disabled={props.loading || props.saving}\n key={item.key}\n name={item.props.name}\n onClick={() => onTabClick(item)}\n />\n ))}\n <Menu.Menu\n position='right'\n >\n <Menu.Item\n className='button-container'\n >\n { props.editable && (\n <Button\n content={i18n.t('Common.buttons.save')}\n disabled={props.loading || props.saving}\n onClick={props.onSave}\n primary\n />\n )}\n <Button\n basic\n content={i18n.t('Common.buttons.cancel')}\n disabled={props.loading || props.saving}\n onClick={props.onCancel}\n />\n </Menu.Item>\n </Menu.Menu>\n </Menu>\n );\n\n if (props.stickyMenu) {\n return (\n <Sticky\n context={contentRef}\n offset={20}\n >\n { menu }\n </Sticky>\n );\n }\n\n return menu;\n });\n\n useEffect(() => {\n // Sets the default tab to the first tab in the list, or the tab on the URL state\n let defaultTab;\n\n if (props.defaultTab) {\n defaultTab = { key: props.defaultTab };\n } else {\n defaultTab = _.first(tabs);\n }\n\n if (defaultTab) {\n onTabClick(defaultTab);\n }\n\n // Sets the saved indicator based on the URL state\n if (props.saved) {\n setSaved(true);\n }\n }, []);\n\n return (\n <Grid\n className={className}\n >\n <Grid.Row>\n <Grid.Column>\n { renderTabs() }\n </Grid.Column>\n </Grid.Row>\n <Grid.Row>\n <Grid.Column>\n <Ref\n innerRef={contentRef}\n >\n <div>\n <Form\n error={!_.isEmpty(props.errors)}\n loading={props.loading || props.saving}\n noValidate\n >\n <Message\n error\n header={i18n.t('Common.errors.save')}\n list={props.errors}\n />\n { tab && tab.props.children }\n </Form>\n { saved && (\n <Toaster\n onDismiss={() => setSaved(false)}\n type={Toaster.MessageTypes.positive}\n >\n <Message.Header\n content={i18n.t('Common.messages.save.header')}\n />\n <Message.Content\n content={i18n.t('Common.messages.save.content')}\n />\n </Toaster>\n )}\n </div>\n </Ref>\n </Grid.Column>\n </Grid.Row>\n </Grid>\n );\n};\n\nSimpleEditPage.defaultProps = {\n editable: true,\n menuProps: {\n pointing: true,\n secondary: true\n }\n};\n\nconst Tab = (props: any) => props.children;\nTab.displayName = 'Tab';\n\n// $FlowIgnore\nconst SimpleEditPageStatic = Object.assign(SimpleEditPage, { Tab });\n\nexport default SimpleEditPageStatic;\n","// @flow\n\nimport { Element } from '@performant-software/shared-components';\nimport React, { Component, type Node } from 'react';\nimport { Header, Menu, Modal } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport ModalContext from '../context/ModalContext';\nimport './TabbedModal.css';\n\ntype Props = {\n children: Node,\n className?: string,\n header: string,\n inlineTabs?: boolean,\n renderHeader?: () => Node\n};\n\ntype State = {\n tab: any\n};\n\nclass TabbedModal extends Component<Props, State> {\n static defaultProps: any;\n static Tab: any;\n\n /**\n * Constructs a new TabbedModal component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = {\n tab: null\n };\n }\n\n /**\n * Parses the child components and sets the actions and tabs list on the state. The current tab is set to the first\n * child in the list of tabs.\n */\n componentDidMount() {\n const tab = _.first(Element.findByType(this.props.children, TabbedModal.Tab));\n this.setState({ tab: tab.props.name });\n }\n\n /**\n * Returns the header classes.\n *\n * @returns {string}\n */\n getHeaderClasses() {\n const classes = ['modal-header'];\n\n if (this.props.inlineTabs) {\n classes.push('inline-header');\n }\n\n return classes.join(' ');\n }\n\n /**\n * Returns the modal classes.\n *\n * @returns {string}\n */\n getModalClasses() {\n const classes = ['tabbed-modal'];\n\n if (this.props.className) {\n classes.push(this.props.className);\n }\n\n return classes.join(' ');\n }\n\n /**\n * Renders the TabbedModal component.\n *\n * @returns {*}\n */\n render() {\n const tabs = Element.findByType(this.props.children, TabbedModal.Tab);\n const tab = _.find(tabs, (t) => t.props.name === this.state.tab);\n\n return (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n className={this.getModalClasses()}\n mountNode={mountNode}\n {..._.omit(this.props, 'header', 'renderHeader', 'inlineTabs', 'className')}\n >\n <Modal.Header\n className={this.getHeaderClasses()}\n >\n { this.renderHeader() }\n <Menu\n float='right'\n secondary\n >\n { _.map(Element.findByType(this.props.children, TabbedModal.Tab), this.renderTab.bind(this)) }\n </Menu>\n </Modal.Header>\n <Modal.Content>\n { tab && (\n <div\n key={tab.props.name}\n >\n { tab.props.children }\n </div>\n )}\n </Modal.Content>\n { Element.findByType(this.props.children, Modal.Actions) }\n </Modal>\n )}\n </ModalContext.Consumer>\n );\n }\n\n /**\n * Renders the header.\n *\n * @returns {*}\n */\n renderHeader() {\n if (this.props.renderHeader) {\n return this.props.renderHeader();\n }\n\n return (\n <Header content={this.props.header} />\n );\n }\n\n /**\n * Renders the passed tab.\n *\n * @param tab\n *\n * @returns {*}\n */\n renderTab(tab: TabbedModal.Tab) {\n const { name } = tab.props;\n\n return (\n <Menu.Item\n active={this.state.tab === name}\n key={name}\n name={name}\n onClick={() => this.setState({ tab: name })}\n >\n { name }\n </Menu.Item>\n );\n }\n}\n\nconst Tab = (props) => props.children;\nTab.displayName = 'Tab';\n\nTabbedModal.Tab = Tab;\n\nTabbedModal.defaultProps = {\n className: undefined,\n inlineTabs: true,\n renderHeader: undefined\n};\n\nexport default TabbedModal;\n","// @flow\n\nimport React from 'react';\nimport { Menu } from 'semantic-ui-react';\nimport _ from 'underscore';\n\ntype Tab = {\n active: boolean,\n key: string,\n label: string,\n visible: boolean\n};\n\ntype Props = {\n onTabClick: (tab: Tab) => void,\n tabs: Array<Tab>\n}\n\nconst TabsMenu = (props: Props) => (\n <Menu\n pointing\n secondary\n >\n { _.map(_.where(props.tabs, { visible: true }), (tab) => (\n <Menu.Item\n active={tab.active}\n key={tab.key}\n name={tab.label}\n onClick={props.onTabClick.bind(this, tab)}\n />\n ))}\n </Menu>\n);\n\nexport default TabsMenu;\n","// @flow\n\nimport React from 'react';\nimport { Icon, Label } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport './TagsList.css';\n\ntype Props = {\n config?: {\n [key: string]: {\n background: string,\n color: string\n }\n },\n onDelete?: (tag: string) => void,\n tags: Array<string>\n};\n\nconst TagsList = (props: Props) => (\n <div\n className='tags-list'\n >\n { _.map(props.tags || [], (tag) => (\n <Label\n style={{\n backgroundColor: props.config && props.config[tag] && props.config[tag].background,\n color: props.config && props.config[tag] && props.config[tag].color,\n marginRight: '10px'\n }}\n >\n { tag }\n { props.onDelete && (\n <Icon\n name='delete'\n onClick={props.onDelete.bind(this, tag)}\n />\n )}\n </Label>\n ))}\n </div>\n);\n\nexport default TagsList;\n","// @flow\n\nimport React, { useEffect, useState } from 'react';\nimport { Image, Loader } from 'semantic-ui-react';\nimport LazyImage from './LazyImage';\n\ntype Props = {\n src: ?string,\n style?: any\n};\n\nconst Thumbnail = (props: Props) => {\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n if (!loading) {\n setLoading(true);\n }\n }, [props.src]);\n\n return (\n <div>\n <Loader\n active={props.src && loading}\n />\n { props.src && (\n <Image\n {...props}\n onLoad={() => setLoading(false)}\n style={{\n ...props.style,\n visibility: loading ? 'hidden' : 'visible'\n }}\n />\n )}\n { !props.src && (\n <LazyImage />\n )}\n </div>\n );\n};\n\nThumbnail.defaultProps = {\n style: {}\n};\n\nexport default Thumbnail;\n","// @flow\n\nimport { Browser } from '@performant-software/shared-components';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { withTranslation } from 'react-i18next';\nimport {\n Button,\n Grid,\n Input,\n Label,\n Modal,\n Segment\n} from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport ModalContext from '../context/ModalContext';\nimport './VideoFrameSelector.css';\n\ntype Props = {\n button: any,\n defaultInterval: number,\n onSelect: (file: File) => void,\n src: string,\n title: string\n};\n\nconst INTERVAL_STEP = 1;\nconst MIN_INTERVAL = 1;\nconst MAX_INTERVAL = 300;\n\nconst VideoFrameSelector = (props: Props) => {\n const [duration, setDuration] = useState(0);\n const [interval, setInterval] = useState(props.defaultInterval);\n const [time, setTime] = useState(0);\n const [modal, setModal] = useState(false);\n\n const videoRef = useRef(null);\n\n useEffect(() => {\n if (videoRef.current) {\n videoRef.current.currentTime = time;\n }\n }, [time]);\n\n return (\n <>\n <Button\n {...props.button}\n onClick={() => setModal(true)}\n />\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n centered={false}\n className='video-frame-selector'\n mountNode={mountNode}\n open={modal}\n size='small'\n >\n <Modal.Header\n content={props.title}\n />\n <Modal.Content>\n <Segment>\n <video\n crossOrigin='anonymous'\n onLoadedMetadata={() => videoRef.current && setDuration(videoRef.current.duration)}\n ref={videoRef}\n src={props.src}\n />\n </Segment>\n <Grid\n columns={2}\n >\n <Grid.Column>\n <div>\n <Label\n content={i18n.t('VideoFrameSelector.labels.interval', { count: interval })}\n />\n </div>\n <Input\n aria-label='Interval Selector'\n min={MIN_INTERVAL}\n max={MAX_INTERVAL}\n name='duration'\n onChange={(e, { value }) => setInterval(Number(value))}\n step={INTERVAL_STEP}\n type='range'\n value={interval}\n />\n </Grid.Column>\n <Grid.Column\n textAlign='right'\n >\n <Button\n aria-label='Previous Frame'\n basic\n disabled={time === 0}\n icon='arrow left'\n onClick={() => setTime(Math.max(time - interval, 0))}\n />\n <Button\n aria-label='Next Frame'\n basic\n disabled={time === duration}\n icon='arrow right'\n onClick={() => setTime(Math.min(time + interval, duration))}\n />\n </Grid.Column>\n </Grid>\n </Modal.Content>\n <Modal.Actions>\n <Button\n content={i18n.t('Common.buttons.ok')}\n primary\n onClick={() => {\n const video = videoRef.current;\n\n if (video && Browser.isBrowser()) {\n const canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n\n canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);\n\n canvas.toBlob((blob) => {\n const file = new File([blob], 'test.png', {\n lastModified: new Date().getTime(),\n type: blob.type\n });\n\n props.onSelect(file);\n setModal(false);\n });\n }\n }}\n />\n <Button\n basic\n content={i18n.t('Common.buttons.cancel')}\n onClick={() => setModal(false)}\n />\n </Modal.Actions>\n </Modal>\n )}\n </ModalContext.Consumer>\n </>\n );\n};\n\nVideoFrameSelector.defaultProps = {\n button: {\n basic: true,\n content: i18n.t('VideoFrameSelector.buttons.select'),\n icon: 'image'\n },\n defaultInterval: 15,\n title: i18n.t('VideoFrameSelector.title'),\n};\n\nexport default withTranslation()(VideoFrameSelector);\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-syntax-highlighter\");","// @flow\n\nimport React, { type ComponentType, useState } from 'react';\nimport SyntaxHighlighter from 'react-syntax-highlighter';\nimport { Button, Modal } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport ModalContext from '../context/ModalContext';\n\ntype Props = {\n highlighter?: any,\n opener: {\n component: ComponentType<any>,\n props: any\n },\n style: any,\n xml: string\n};\n\nconst ViewXML = (props: Props) => {\n const [showModal, setShowModal] = useState(false);\n const OpenerComponent = props.opener.component;\n const openerProps = props.opener.props;\n\n return (\n <ModalContext.Consumer>\n { (mountNode) => (\n <>\n <OpenerComponent\n {...openerProps}\n className='view-xml-trigger'\n onClick={() => setShowModal(true)}\n />\n <Modal\n className='view-xml-modal'\n closeIcon\n centered={false}\n mountNode={mountNode}\n open={showModal}\n onClose={() => setShowModal(false)}\n >\n <Modal.Header\n content={i18n.t('ViewXML.title')}\n />\n <Modal.Content>\n <SyntaxHighlighter\n language='xml'\n style={props.highlighter}\n >\n { props.xml }\n </SyntaxHighlighter>\n </Modal.Content>\n <Modal.Actions>\n <Button\n basic\n content={i18n.t('Common.buttons.close')}\n onClick={() => setShowModal(false)}\n />\n </Modal.Actions>\n </Modal>\n </>\n )}\n </ModalContext.Consumer>\n );\n};\n\nViewXML.defaultProps = {\n opener: {\n component: Button,\n props: {\n content: i18n.t('ViewXML.buttons.view')\n }\n },\n style: {\n maxHeight: '70vh'\n }\n};\n\nexport default ViewXML;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0,\n\t44: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunk_performant_software_semantic_components\"] = self[\"webpackChunk_performant_software_semantic_components\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [44], () => (__webpack_require__(923)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","require","NestedAccordion","props","state","activeItems","prevProps","defaultActive","this","length","isActive","some","active","_","multipleItemTypes","setState","id","item","classNames","showToggle","push","join","properties","type","isItemActive","toggleOnClick","onItemToggle","onItemClick","toggleItem","Accordion","className","fluid","inverted","panels","rootItems","renderPanel","bind","styled","children","getChildItems","key","onClick","style","backgroundColor","undefined","renderToggle","renderItem","renderRight","renderContent","Button","compact","getButtonClass","icon","e","stopPropagation","i","Component","defaultProps","resources","en","translation","i18n","i18next","init","debug","fallbackLng","lng","interpolation","escapeValue","Toaster","useState","visible","setVisible","timeout","useEffect","onDismiss","Transition","animation","duration","transitionOnMount","Message","info","MessageTypes","negative","positive","warning","SORT_ASCENDING","SORT_DESCENDING","WrappedComponent","initializeState","polling","pollingInterval","setInterval","fetchData","saved","clearInterval","items","page","setSession","loading","perPage","search","sortColumn","sortDirection","params","filters","per_page","sort_by","sort_direction","onLoad","then","data","collectionName","list","pages","count","defaults","f","filter","onCreateFilter","session","restoreSession","getDefaultFilters","defaultPerPage","perPageOptions","defaultSearch","defaultSort","defaultSortDirection","error","value","ObjectUtils","onSearchChange","searchRef","inputRef","current","focus","onSearch","uid","uuid","selectedItem","onDelete","afterDelete","onError","Promise","resolve","onDeleteAll","afterDeleteAll","resolveErrors","onChange","activePage","onSave","direction","component","showLabels","isFilterActive","onFilterChange","onPageChange","onPerPageChange","onSort","onInit","renderSearch","content","searchable","Input","Icon","link","name","onClearSearch","input","ref","onKeyDown","Timer","onKeyUp","size","getSessionKey","sessionStorage","getItem","JSON","parse","setItem","stringify","DropdownButton","dropdownRef","useRef","basic","color","text","disabled","handleClick","Dropdown","floating","options","scrolling","selectOnBlur","trigger","EditModal","useEditContainer","OuterComponent","showToaster","setShowToaster","hasErrors","errors","showLoading","Dimmer","Loader","Modal","saving","primary","inline","onClose","AssociatedDropdown","modalAdd","modalEdit","searchQuery","clearTimeout","onSelection","option","map","renderOption","onBlur","onOptionSelection","onOpen","placeholder","searchInput","selection","upward","renderEditButton","renderAddButton","renderClearButton","renderModal","modal","required","onClear","onInitialize","record","setTimeout","date","iconPosition","readOnly","display","toLocaleDateString","locale","formatOptions","preventDefault","React","FuzzyDate","getInitialState","calendar","Calendar","initializeDate","startDate","endDate","dateComponent","convertToDate","format","accuracy","description","range","parseDate","setDisplay","onAccuracyChange","getDefaultDate","month","getDefaultMonth","setEndDate","property","toDate","year","parseInt","onEdit","mountNode","as","Form","open","title","label","Checkbox","checked","radio","renderYear","renderMonth","renderDate","onRangeChange","TextArea","onDescriptionChange","daysInMonth","onDateChange","onMonthChange","listMonths","m","onYearChange","getDisplayDate","addYear","addMonth","addDate","Browser","navigator","language","FilterTypes","boolean","integer","relationship","select","string","FilterOperators","equal","notEqual","contain","notContain","empty","notEmpty","greaterThan","lessThan","FilterOperatorOptions","OperatorsByType","getOperatorsByType","useCallback","operators","onDefaultSort","renderInput","operator","onSaveChildAssociation","renderSearchQuery","useMemo","centered","noValidate","Grid","columns","verticalAlign","Header","textAlign","onReset","marginLeft","width","onDeleteChildAssociation","getContent","Label","onRemove","modalDelete","modalDeleteAll","modalFilter","location","buttons","addButton","deleteButton","selectable","render","renderDeleteAllButton","button","include","copy","onCopy","renderHeader","actions","getActions","renderEmptyMessage","renderFooter","renderEditModal","renderDeleteModal","renderDeleteAllModal","renderFilterModal","action","onEditButton","onCopyButton","onDeleteButton","onAddButton","secondary","index","accept","onDeleteAllButton","Confirm","header","onCancel","onConfirm","Trans","i18nKey","onFilterButton","onSaveFilter","getButtons","hasPages","showCount","showRecordCount","renderRecordCount","renderPagination","renderListHeader","hasLabels","renderButton","Menu","borderless","renderFilterButton","renderPerPage","onRemoveFilter","Pagination","firstItem","lastItem","totalPages","Number","toLocaleString","onColumnClick","useList","renderActions","renderCheckbox","el","onRowSelect","selectedRows","find","r","useDataList","getRootItems","sortDropdown","sortValue","sort","renderSort","fontSize","AccordionList","onAddItem","loaded","lazyLoad","selectedPage","parentId","pagination","pageCount","autoFocus","renderHeaderAddButton","b","renderSubHeader","renderAddModal","canAddItem","onSelectAll","selectedRowIds","toBeSelected","reduce","tbs","includes","renderSelectAll","canDeleteItem","canEditItem","canCopyItem","hideAddRootButton","recordCount","selected","renderCopyButton","renderDeleteButton","renderSelectCheckbox","Segment","isSelected","AccordionSelector","selectedItems","isSelectable","multiple","onItemSelection","withTranslation","vertical","onRight","onLeft","setError","path","src","controls","hiddenFields","noEditFields","apiCheckCache","cacheTimes","okToUseCache","localStorage","Date","now","getItemTypeMeta","itemType","retryOnFailure","all","api","itemTypes","get","cache","itemTypeFields","itemTypeCreatorTypes","itemTypeR","itemTypeFieldsR","creatorTypesR","getData","removeItem","getFieldsAndItem","fields","titleField","BibliographyTypes","field","localized","itf","concat","dateIndex","findIndex","splice","matches","extra","match","replace","beforeIndex","publisher","readonly","processing","isUrl","onUpdate","attribute","creator","onUpdateAttributes","attributes","creatorTypes","ct","creatorType","nameType","split","firstName","lastName","onAdd","allowDelete","defaultCreatorType","onAddCreator","onDeleteCreator","v","onUpdateCreator","onUpdateCreatorType","creators","setCreators","setFields","renderField","onTextInputChange","onSetState","BibliographyUtils","it","bibliographyData","createContext","setLoading","setSearchQuery","translateUrl","useContext","ZoteroTranslateContext","onLoadItems","response","ok","onFind","translator","ZoteroTranslationClient","translateURL","persist","add","translateIdentifier","sortRef","defaultValue","useCitationStyles","onStyleChange","styles","xml","Sort","SortOptions","BibliographyListComponent","List","divided","relaxed","padded","Citation","actionIndex","setLocale","setStyle","setSort","createItem","getSortProperty","author","newItems","_destroy","reverse","fetch","resp","results","BibliographyModal","setName","n","Breadcrumb","to","url","isNumeric","str","test","pathname","slice","hasMore","labels","ColorButton","cursor","height","selectedColor","SketchPicker","disableAlpha","onChangeComplete","CurrentFacetLabels","onShowMore","CurrentFacetsModal","CurrentFacets","useCurrentRefinements","setModal","facets","group","refinements","refinement","refine","filteredFacets","facet","limit","onMouseDown","role","DIRECTION_VERTICAL","drop","useDrop","hover","monitor","dragIndex","hoverIndex","hoverMiddle","hoverClient","hoverBoundingRect","getBoundingClientRect","clientOffset","getClientOffset","bottom","top","right","left","y","x","onDrag","useDrag","begin","onDragStart","end","onDragEnd","collect","isDragging","drag","opacity","Ref","innerRef","DataTable","resize","activePanel","initializeColumnRefs","onPreventClick","onMouseMove","onColumnResize","onMouseUp","afterColumnResize","document","addEventListener","columnRefs","c","createRef","removeEventListener","columnCount","columnRef","offset","pageX","allSelected","isRowSelected","Table","tableProps","renderSelectHeader","renderHeaderCell","renderActionsHeader","renderEmptyTableRow","renderLoading","actionButton","popup","Popup","hideOnScroll","mouseEnterDelay","position","renderActionButton","column","hidden","renderEmptyRow","colSpan","getColumnCount","sorted","offsetWidth","renderCell","expandableRows","target","nodeName","expandPanel","anchoredColumns","closeOnBlur","onColumnCheckbox","DropdownMenu","setOpen","onMouseEnter","onMouseLeave","setAttribute","renderDropdownItem","renderMenuItem","renderDropdown","contextRef","renderMenu","fixed","activeSort","setActiveSort","onSortChange","newSort","sorts","celled","DataView","activeItem","setActiveItem","selectedRecord","setSelectedRecord","setColumns","menu","setMenu","paddingLeft","setPaddingLeft","setKey","menuRef","substr","lastIndexOf","mergeColumns","keys","flatten","uniq","cols","col","columnValue","trim","toUpperCase","replaceAll","sortable","resolveValue","axios","itemKey","Boolean","toString","menuItems","headers","layout","closeIcon","doubling","ListTable","prevColumns","Hooks","sortableColumn","configurable","DatabaseView","selectedTable","setSelectedTable","tables","setTables","service","getColumns","getTables","column_name","dataType","data_type","table_name","table","overflow","MAX_SAFE_INTEGER","DatePicker","setCalendar","calendarWrapper","onDocumentClick","event","calendarInstance","contains","zIndex","closeOnSelection","next2AriaLabel","next2Label","nextAriaLabel","nextLabel","prev2AriaLabel","prev2Label","prevAriaLabel","prevLabel","DescriptorField","popupContent","hoverable","delayInterval","renderPopup","wide","download","filename","href","EditPageClass","currentTab","tab","renderButtons","renderComponent","renderToaster","EmbeddedList","getItems","orderBy","sortProperty","ordered","Facet","setActive","useImperativeHandle","collapse","expand","prevActive","Divider","useClearRefinements","canRefine","OPERATOR_OR","FacetList","forwardRef","useRefinementList","defaultOperator","setOperator","canToggleShowMore","isShowingMore","searchForItems","toggleShowMore","query","setQuery","instance","onToggleOperator","prevOperator","isRefined","circular","toggleable","toggle","FacetSlider","useRangeSlider","start","min","max","valueView","setValueView","allowCross","onAfterChange","FacetToggle","useToggleRefinement","FileInputButton","buttonProps","fileInputRef","click","fileList","array","toArray","files","fileInput","filePattern","fileTypes","RegExp","dataTransfer","validate","onFilesAdded","onClickDropzone","onDragLeave","onDragOver","onDrop","onDropFiles","tabIndex","maxSize","validFiles","file","valid","exec","Status","ColorsByStatus","IconsByStatus","TextByStatus","status","complete","completed","total","percent","percentView","minimumFractionDigits","uploading","Progress","Strategy","FileUploadModal","setItems","uploadCount","setUploadCount","setUploading","statuses","setStatuses","hasUploadErrors","onAddFiles","prevItems","onAddFile","onAssociationInputChange","idAttribute","onBatchUpload","onComplete","closeOnComplete","setStatus","prevStatuses","onSingleUpload","prevCount","validateItem","onValidate","reject","newItem","onUpload","strategy","renderMessageItem","renderStatus","HeaderComponent","headerComponent","UploadItem","itemComponent","showPageLoader","onSetItems","Item","isError","isRequired","GoogleMap","Map","defaultCenter","center","setCenter","setMap","zoom","defaultZoom","latLng","lat","bounds","getBounds","mapContainerClassName","mapContainerStyle","containerStyle","Marker","draggable","searchBox","setSearchBox","onPlacesChanged","place","getPlaces","geometry","formatted_address","onLocationSelection","result","StandaloneSearchBox","s","HorizontalCards","marginWidth","setMarginWidth","pageWidth","setPageWidth","scrollPage","setScrollPage","scrollPages","setScrollPages","cardStyle","flex","getClassName","defaultClassName","initialize","clientWidth","scrollWidth","Math","ceil","child","firstChild","window","getComputedStyle","leftMargin","parseFloat","rightMargin","marginRight","increment","nextPage","scrollTo","behavior","renderImage","image","Image","alt","objectFit","Card","cardsClassName","card","cardClassName","inlineImage","renderMeta","renderDescription","renderExtra","IIIFViewer","currentIndex","setCurrentIndex","images","onIndexChange","newIndex","body","caption","Views","grid","ItemsClass","asProps","renderList","renderGrid","renderEmptyList","getItemProps","resolveColor","resolveIcon","view","renderCard","listItem","resolveName","renderAdditionalContent","defaultView","hideToggle","isHidden","getSortValue","useItemsToggle","ItemCollection","endIndex","onBottomReached","InfiniteScroll","context","scrollOffset","ItemList","htmlFor","KeyboardField","showKeyboard","renderLabel","onInputChange","hide","show","Keyboard","onKeyboardChange","keyboardClass","onRemoveItem","onUpdateItem","withBatchEdit","LazyLoader","LazyAudio","dimmer","setDimmer","preview","setLoaded","dimmable","Visibility","fireOnMount","onTopVisible","pdfjs","LazyDocument","getClassNames","defaultClass","pdf","Document","onLoadError","console","log","message","Page","pageNumber","PhotoViewer","LazyImage","VideoPlayer","embedRef","placeholderAlt","querySelector","video","embedded","Embed","autoPlay","iframe","allow","LazyVideo","onLoadedData","ContentTypes","WebContentTypes","LazyMedia","contentType","setContentType","setPreview","source","setSource","fileExtension","pop","startsWith","URL","createObjectURL","renderChildren","renderMedia","downloadUrl","renderMessage","components","bold","default","values","manifest","manifestId","showIIIFBadge","dimmed","LoginModal","loginFailed","onUsernameChange","onPasswordChange","onLogin","MasonryLayout","columnWrapper","columnIndex","marginBottom","gap","MasonryTile","dimmerActive","setDimmerActive","setHeight","random","subheader","subtitle","renderEmpty","PlayButton","setVideo","mountOnShow","onPrevious","onNext","stackable","transform","ModalDropdown","modalVisible","RemoteDropdown","dropdown","Array","isArray","getValues","getOption","allowAdditions","renderAddOption","renderLoadMoreOption","getOptions","close","clearable","getSearchOptions","useSearchBox","clear","isSearchStalled","setSearch","SearchPagination","usePagination","currentRefinement","nbPages","scrollToTop","scroll","SearchResults","useHits","hits","useHitsPerPage","useSortBy","endsWith","useStats","nbHits","seconds","processingTimeMS","toFixed","Section","SelectizeGrid","renderCheckmark","renderItems","onSelect","Selectize","setSelectedItem","setSelectedItems","allowMultiple","allowedCount","SelectizeCard","raised","meta","SelectizeImageHeader","setPage","setPages","collapsed","setCollapsed","records","startIndex","itemsPerRow","collapsable","prevCollapsed","SimpleEditPage","setCurrentTab","setSaved","contentRef","tabs","Element","Tab","nextTab","onTabClick","renderTabs","menuProps","editable","stickyMenu","Sticky","defaultTab","pointing","displayName","Object","assign","TabbedModal","classes","inlineTabs","t","getModalClasses","getHeaderClasses","float","renderTab","tags","tag","config","background","Thumbnail","visibility","VideoFrameSelector","setDuration","defaultInterval","interval","time","setTime","videoRef","currentTime","crossOrigin","onLoadedMetadata","step","canvas","createElement","videoWidth","videoHeight","getContext","drawImage","toBlob","blob","File","lastModified","getTime","ViewXML","showModal","setShowModal","OpenerComponent","opener","openerProps","highlighter","maxHeight","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","every","getter","__esModule","d","a","definition","o","defineProperty","enumerable","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","self","forEach","__webpack_exports__"],"sourceRoot":""}
|