@performant-software/semantic-components 0.5.13 → 0.5.14
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
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 \"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/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/context/ModalContext.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/AssociatedDropdown.js","webpack://@performant-software/semantic-components/./src/components/BooleanIcon.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/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/./src/components/DateInput.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/external commonjs \"react-uuid\"","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/FileInputButton.js","webpack://@performant-software/semantic-components/./src/components/FileUpload.js","webpack://@performant-software/semantic-components/./src/components/FileUploadModal.js","webpack://@performant-software/semantic-components/./src/components/FuzzyDate.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/Items.js","webpack://@performant-software/semantic-components/./src/components/ItemsToggle.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/LinkButton.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/external commonjs \"react-pdf/dist/esm/entry.webpack\"","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/ListFilters.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/ReferenceCodeDropdown.js","webpack://@performant-software/semantic-components/./src/components/ReferenceCodeFormLabel.js","webpack://@performant-software/semantic-components/./src/components/ReferenceCodeModal.js","webpack://@performant-software/semantic-components/./src/components/ReferenceTableModal.js","webpack://@performant-software/semantic-components/./src/components/ReferenceCodeFormDropdown.js","webpack://@performant-software/semantic-components/./src/components/ReferenceTablesList.js","webpack://@performant-software/semantic-components/./src/components/RemoteDropdown.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/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 = function(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 = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\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(function(key) { return __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};","var __WEBPACK_NAMESPACE_OBJECT__ = require(\"react\");","var __WEBPACK_NAMESPACE_OBJECT__ = require(\"underscore\");","var __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","var __WEBPACK_NAMESPACE_OBJECT__ = require(\"@performant-software/shared-components\");","var __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 _ from 'underscore';\nimport { Input, Message } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport Toaster from './Toaster';\n\ntype Props = {\n collectionName: string,\n defaultPerPage?: number,\n defaultSearch?: string,\n defaultSort?: string,\n defaultSortDirection?: string,\n filters?: {\n component: ComponentType<any>,\n defaults?: any,\n props?: any,\n onChange?: (filter: any) => Promise<any>\n },\n onDelete?: (item: any) => Promise<any>,\n onDeleteAll?: () => Promise<any>,\n onLoad: (params: any) => Promise<any>,\n onSave?: (item: any) => Promise<any>,\n perPageOptions?: Array<number>,\n polling?: number,\n resolveErrors?: (error: any) => Array<string>,\n saved?: boolean,\n searchable: boolean,\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 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 || (props.filters && props.filters.defaults) || {};\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 * 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, defaults, props } = 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 props: {\n ...props,\n defaults,\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='search'\n input={{\n 'aria-label': 'search'\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","var __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 component: ComponentType<any>,\n onClose: () => void,\n onSave: () => Promise<any>,\n showLoading: boolean\n};\n\nconst EditModal = (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 useEditContainer(EditModal);\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 './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 actions: Array<Action>,\n addButton: {\n basic: boolean,\n color: string,\n location: string,\n onClick?: () => void\n },\n buttons: Array<ListButton>,\n count: number,\n className: string,\n configurable: boolean,\n deleteButton?: {\n color: string,\n location: string,\n onClick?: () => void\n },\n filters?: {\n active: boolean,\n component: Component<{}>,\n props?: any,\n state?: any,\n onChange: (params: any) => Promise<any>\n },\n items: ?Array<any>,\n loading?: boolean,\n modal?: {\n component: Element<any>,\n props: any,\n state: any\n },\n page: number,\n pages: number,\n onCopy?: (item: any) => any,\n onDelete: (item: any) => void,\n onDeleteAll?: () => Promise<any>,\n onPageChange: () => void,\n onPerPageChange: () => void,\n onSave: (item: any) => Promise<any>,\n onSelectAll?: (items: Array<any>) => void,\n perPage: number,\n perPageOptions: Array<number>,\n renderDeleteModal?: ({ selectedItem: any, onCancel: () => void, onConfirm: () => void }) => Element<any>,\n renderEmptyRow?: () => void,\n renderItem?: (item: any, index: number, children?: any) => Element<any>,\n renderListHeader?: () => ?Element<any>,\n renderSearch?: () => Element<any>,\n selectable?: boolean,\n showRecordCount: boolean,\n t: (key: string) => string\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 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 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 * 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 onClick={this.onAddButton.bind(this)}\n >\n <Icon name='plus' />\n { 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 if (!renderHeader) {\n return null;\n }\n\n return (\n <div\n className='header'\n >\n <Grid\n columns={2}\n verticalAlign='bottom'\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>\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","import React from 'react';\n\nconst ModalContext = React.createContext();\n\nexport default ModalContext;\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 Date = {\n accuracy: number,\n description: string,\n endDate?: Date,\n range: boolean,\n startDate?: Date\n};\n\ntype Props = {\n onLeft: (data: Date) => void,\n onRight: (data: Date) => void\n};\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 { 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 } 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 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","var __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 './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","var __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 id: any,\n index: number,\n onDrag: (dragIndex: number, hoverIndex: number) => void\n};\n\nconst TYPE_ANY = 'any';\n\nconst Draggable = (props: Props) => {\n const { index, id } = 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 // Get vertical middle\n const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;\n\n // Determine mouse position\n const clientOffset = monitor.getClientOffset();\n\n // Get pixels to the top\n const hoverClientY = clientOffset.y - hoverBoundingRect.top;\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 && hoverClientY < hoverMiddleY) {\n return;\n }\n\n // Dragging upwards\n if (dragIndex > hoverIndex && hoverClientY > hoverMiddleY) {\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 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 from './DataTableColumnSelector';\nimport useList from './List';\nimport './DataTable.css';\n\nimport type { Action } from './List';\n\ntype Column = {\n className?: string,\n hidden?: boolean,\n label?: string,\n name: string,\n render?: (item: any) => void,\n renderHeader?: (item: any) => void,\n resolve?: (item: any) => void,\n sortable: boolean\n};\n\ntype Props = {\n actions: Array<Action>,\n className: string,\n columns: Array<Column>,\n expandableRows: boolean,\n expandPanel: (item: any, activePanel: any) => Component<any>,\n isRowSelected: (item: any) => boolean,\n items: ?Array<any>,\n loading: boolean,\n onClearSelected: () => void,\n onColumnClick: (column: Column) => void,\n onRowSelect?: (item: any)=>void,\n onSelectAll: (items: Array<any>)=>void,\n renderEmptyMessage: () => Element<any>,\n renderEmptyRow?: () => void,\n renderItem?: (item: any, index: number, children?: any) => Element<any>,\n sortColumn?: string,\n sortDirection?: string,\n t: (key: string) => string,\n tableProps: any,\n selectable?: boolean,\n selectedRows: Array<{id: number}>,\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 selectedRows: [],\n sortColumn: undefined,\n sortDirection: undefined,\n};\n\nexport default useColumnSelector(useList(DataTable));\n\nexport type {\n Column\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 './DataTableColumnSelector.css';\n\nimport type { Column } from './DataTable';\n\ntype Props = {\n className: string,\n columns: Array<Column>,\n renderListHeader?: () => Element<any>\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","var __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 './DataTable';\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 useDataList, { SORT_ASCENDING, SORT_DESCENDING } from './DataList';\nimport './ListTable.css';\n\nimport type { Column } from './DataTable';\n\ntype Props = {\n columns: Array<Column>,\n defaultSort?: string,\n defaultSortDirection?: string,\n page: number,\n onSort: (sortColumn: string, sortDirection: string, page?: number) => void,\n onInit: (page?: number) => void,\n sortColumn: string,\n sortDirection: string\n};\n\nconst ListTable = (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 onCopy: undefined,\n renderDeleteModal: undefined,\n renderEmptyRow: undefined,\n tableProps: {\n celled: true,\n sortable: true\n }\n};\n\nexport default useDataList(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","// @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","var __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","var __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-uuid\");","// @flow\n\nimport React from 'react';\nimport uuid from 'react-uuid';\nimport { Button } from 'semantic-ui-react';\n\ntype Props = {\n filename?: string,\n url: string\n};\n\nconst DownloadButton = ({ filename, url, ...button }: Props) => (\n <a\n download={filename || uuid()}\n href={url}\n >\n <Button\n {...button}\n />\n </a>\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 className?: string,\n component: ComponentType<any>,\n menu?: MenuProps,\n onClose: () => void,\n onSave: () => Promise<any>,\n showLoading: boolean\n};\n\ntype State = {\n currentTab: string,\n showToaster: boolean\n};\n\nclass EditPage 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\nEditPage.defaultProps = {\n showLoading: true\n};\n\nexport default useEditContainer(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 from './DataTable';\nimport Draggable from './Draggable';\nimport './EmbeddedList.css';\n\nimport type { Action } from './List';\nimport type { Column } from './DataTable';\n\ntype ListButton = {\n render: () => ComponentType<any>\n};\n\ntype Props = {\n actions: Array<Action>,\n addButton?: {\n location: string,\n color: string\n },\n buttons?: Array<ListButton>,\n className?: string,\n columns: Array<Column>,\n configurable: boolean,\n defaultSort?: string,\n defaultSortDirection?: string,\n items: Array<any>,\n modal?: {\n component: ComponentType<any>,\n props: any,\n state: any\n },\n onCopy?: (item: any) => any,\n onDelete: (item: any) => void,\n onDrag?: (dragIndex: number, hoverIndex: number) => void,\n onSave?: (item: any) => void,\n renderDeleteModal?: ({ selectedItem: any, onCancel: () => void, onConfirm: () => void }) => void,\n renderEmptyRow?: () => void,\n selectable: boolean,\n onRowSelect: (Array<{id: number}>),\n selectedRows: Array<{id: number}>,\n showRecordCount: boolean,\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 EmbeddedList component can be used to display a collection of records that live within a parent object. This is\n * 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, { 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 fileTypes?: Array<string>,\n maxSize?: number,\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\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, { Component, type ComponentType } 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 i18n from '../i18n/i18n';\nimport FileUpload from './FileUpload';\nimport ModalContext from '../context/ModalContext';\nimport Toaster from './Toaster';\n\ntype Props = {\n button: string,\n includeButton?: boolean,\n itemComponent: ComponentType<any>,\n onAddFile: (file: File) => any,\n onClose?: () => void,\n onSave: (items: Array<any>) => Promise<any>,\n required: { [string]: string },\n title?: string\n};\n\ntype State = {\n items: Array<any>,\n modal: boolean,\n saving: boolean\n};\n\nconst LIST_DELIMITER = ', ';\n\nclass FileUploadModal extends Component<Props, State> {\n static defaultProps: any;\n\n /**\n * Constructs a new FileUploadModal component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = this.getInitialState();\n }\n\n /**\n * Returns the initial component state.\n *\n * @returns {{saving: boolean, items: [], modal: boolean}}\n */\n getInitialState() {\n return {\n items: [],\n modal: !this.props.includeButton,\n saving: false\n };\n }\n\n /**\n * Returns true if any of the items contain errors.\n *\n * @returns {boolean}\n */\n hasErrors() {\n return !!_.find(this.state.items, (item) => !_.isEmpty(item.errors));\n }\n\n /**\n * Adds the passed collection of files to the state. Typically files will be added as a property of another model.\n * This component calls the onAddFiles prop to transform the items stored in the state.\n *\n * @param files\n */\n onAddFiles(files: Array<File>) {\n this.setState((state) => ({\n items: [\n ...state.items,\n ..._.map(files, this.props.onAddFile.bind(this))\n ]\n }));\n }\n\n /**\n * Updates the passed association for the passed item.\n *\n * @param item\n * @param idAttribute\n * @param attribute\n * @param value\n */\n onAssociationInputChange(item: any, idAttribute: string, attribute: string, value: any) {\n this.setState((state) => ({\n items: _.map(state.items, (i) => (i !== item ? i : ({\n ...i,\n [idAttribute]: value.id,\n [attribute]: value,\n errors: _.without(item.errors, idAttribute)\n })))\n }));\n }\n\n /**\n * Resets the state or calls the onClose prop.\n */\n onClose() {\n if (this.props.onClose) {\n this.props.onClose();\n } else {\n this.setState(this.getInitialState());\n }\n }\n\n /**\n * Deletes the passed item from the state.\n *\n * @param item\n */\n onDelete(item: any) {\n this.setState((state) => ({\n items: _.filter(state.items, (i) => i !== item)\n }));\n }\n\n /**\n * Clears the errors for all items in the state.\n */\n onDismissErrors() {\n this.setState((state) => ({\n items: _.map(state.items, (item) => _.omit(item, 'errors'))\n }));\n }\n\n /**\n * Validates the items and saves.\n */\n onSave() {\n this.setState((state) => ({\n items: _.map(state.items, this.validateItem.bind(this))\n }), this.save.bind(this));\n }\n\n /**\n * Updates the text value for the passed item.\n *\n * @param item\n * @param attribute\n * @param e\n * @param value\n */\n onTextInputChange(item: any, attribute: string, e: Event, { value }: { value: any }) {\n this.setState((state) => ({\n items: _.map(state.items, (i) => (i !== item ? i : ({\n ...i,\n [attribute]: value,\n errors: _.without(item.errors, attribute)\n })))\n }));\n }\n\n /**\n * Updates the passed item with the passed props.\n *\n * @param item\n * @param props\n */\n onUpdate(item: any, props: any) {\n this.setState((state) => ({\n items: _.map(state.items, (i) => (i !== item ? i : ({\n ...i,\n ...props,\n errors: _.without(item.errors, _.keys(props))\n })))\n }));\n }\n\n /**\n * Renders the FileUploadModal component.\n *\n * @returns {*}\n */\n render() {\n return (\n <>\n { this.props.includeButton && (\n <Button\n content={this.props.button}\n icon='cloud upload'\n onClick={() => this.setState({ modal: true })}\n primary\n />\n )}\n { this.state.modal && (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n centered={false}\n className='file-upload-modal'\n mountNode={mountNode}\n open\n >\n <Dimmer\n active={this.state.saving}\n inverted\n >\n <Loader\n content={i18n.t('FileUploadModal.loader')}\n />\n </Dimmer>\n { this.renderErrors() }\n <Modal.Header\n content={this.props.title || i18n.t('FileUploadModal.title')}\n />\n <Modal.Content>\n <FileUpload\n onFilesAdded={this.onAddFiles.bind(this)}\n />\n { this.renderItems() }\n </Modal.Content>\n <Modal.Actions>\n <Button\n content={i18n.t('Common.buttons.save')}\n disabled={!(this.state.items && this.state.items.length)}\n primary\n onClick={this.onSave.bind(this)}\n />\n <Button\n basic\n content={i18n.t('Common.buttons.cancel')}\n onClick={this.onClose.bind(this)}\n />\n </Modal.Actions>\n </Modal>\n )}\n </ModalContext.Consumer>\n )}\n </>\n );\n }\n\n /**\n * Renders the error modal.\n *\n * @returns {null|*}\n */\n renderErrors() {\n if (!this.hasErrors()) {\n return null;\n }\n\n return (\n <Toaster\n onDismiss={this.onDismissErrors.bind(this)}\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 { _.map(this.state.items, this.renderMessageItem.bind(this)) }\n </Message.List>\n </Toaster>\n );\n }\n\n /**\n * Renders the passed item.\n *\n * @param item\n *\n * @returns {*}\n */\n renderItem(item: any) {\n const FileItem = this.props.itemComponent;\n\n return (\n <FileItem\n isError={(key) => _.contains(item.errors, key)}\n isRequired={(key) => !!this.props.required[key]}\n item={item}\n onAssociationInputChange={this.onAssociationInputChange.bind(this, item)}\n onDelete={this.onDelete.bind(this, item)}\n onTextInputChange={this.onTextInputChange.bind(this, item)}\n onUpdate={this.onUpdate.bind(this, item)}\n />\n );\n }\n\n /**\n * Renders the list of items.\n *\n * @returns {null|*}\n */\n renderItems() {\n if (!(this.state.items && this.state.items.length)) {\n return null;\n }\n\n return (\n <Item.Group\n as={Form}\n divided\n noValidate\n relaxed='very'\n >\n { _.map(this.state.items, this.renderItem.bind(this)) }\n </Item.Group>\n );\n }\n\n /**\n * Renders the errors message for the passed item.\n *\n * @param item\n * @param index\n *\n * @returns {null|*}\n */\n renderMessageItem(item: any, index: number) {\n if (_.isEmpty(item.errors)) {\n return null;\n }\n\n const filename = !_.isEmpty(item.name) ? item.name : `File ${index}`;\n const fields = _.map(item.errors, (e) => this.props.required[e]).join(LIST_DELIMITER);\n\n return (\n <Message.Item\n content={i18n.t('FileUploadModal.errors.required', { filename, fields })}\n key={index}\n />\n );\n }\n\n /**\n * Saves the uploaded items.\n */\n save() {\n if (this.hasErrors()) {\n return;\n }\n\n this.setState({ saving: true }, () => {\n this.props\n .onSave(this.state.items)\n .then(this.onClose.bind(this));\n });\n }\n\n /**\n * Validates the list of items.\n */\n validate() {\n this.setState((state) => {\n const items = _.map(state.items, this.validateItem.bind(this));\n\n return {\n items,\n saving: !_.find(items, (item) => !_.isEmpty(item.errors))\n };\n }, this.save.bind(this));\n }\n\n /**\n * Validates the passed item.\n *\n * @param item\n *\n * @returns {{errors: []}}\n */\n validateItem(item: any) {\n const errors = [];\n\n _.each(_.keys(this.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 { ...item, errors };\n }\n}\n\nFileUploadModal.defaultProps = {\n includeButton: true\n};\n\nexport type FileUploadProps = {\n isError: (key: string) => boolean,\n isRequired: (key: string) => boolean,\n item: any,\n onAssociationInputChange: (idKey: string, valueKey: string, item: any) => void,\n onDelete: (item: any) => void,\n onTextInputChange: (item: any, value: any) => void,\n onUpdate: (item: any, props: any) => void\n};\n\nexport default FileUploadModal;\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","var __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, { useCallback, useEffect, useState } 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 // If no default zoom is provided and a position is provided, set the default zoom to 12.\n let { defaultZoom } = props;\n\n if (!defaultZoom) {\n if (position) {\n defaultZoom = DEFAULT_ZOOM_MARKER;\n } else {\n defaultZoom = DEFAULT_ZOOM;\n }\n }\n\n // Call the onDragEnd prop, passing the new location.\n const onDragEnd = ({ latLng }) => {\n if (props.onDragEnd) {\n // $FlowFixMe - Not actually fixing, we're checking for presence here.\n props.onDragEnd({\n lat: latLng.lat(),\n lng: latLng.lng()\n });\n }\n };\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={defaultZoom}\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 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 './HorizontalCards.css';\n\ntype Props = {\n inlineImage?: boolean,\n items: Array<any>,\n onClick?: (item: any, index: 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 number of pages and total page width on the state.\n */\n useEffect(() => {\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 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 }, []);\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 * 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 * Returns the flex-box style based on the page width.\n *\n * @type {function(): {flex: string}}\n */\n const getCardStyle = useCallback(() => ({\n flex: `0 0 ${(pageWidth / props.perPage) - marginWidth}px`\n }), [pageWidth, marginWidth, props.perPage]);\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 <Card\n link\n onClick={() => {\n if (props.onClick) {\n props.onClick(item, index);\n }\n }}\n style={getCardStyle()}\n >\n { !props.inlineImage && renderImage(item) }\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 { props.renderExtra && (\n <Card.Content\n extra\n >\n { props.renderExtra(item) }\n </Card.Content>\n )}\n </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='horizontal-cards'\n >\n <Ref\n innerRef={ref}\n >\n <Card.Group>\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, { 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 children: Element<any>,\n className: string,\n isRowSelected?: (item: any) => boolean,\n items: Array<any>,\n loading: boolean,\n onDrag?: (dragIndex: number, hoverIndex: number) => void,\n onRowSelect?: (item: any) => void,\n onSelectAllRows?: (items: Array<any>) => void,\n renderAdditionalContent?: (item: any) => Element<any>,\n renderDescription?: (item: any) => Element<any>,\n renderEmptyList: () => Element<any>,\n renderExtra?: (item: any) => Element<any>,\n renderHeader?: (item: any) => Element<any>,\n renderImage?: (item: any) => Element<any>,\n renderMeta?: (item: any) => Element<any>,\n selectable?: boolean,\n view: number\n};\n\n/**\n * The Items component is used as the presentation for a list of records. The component renders both a list\n * (see Semantic-UI List) and grid (see Semantic-UI Card) views.\n */\nclass Items 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 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 card = (\n <Card\n key={item.id || index}\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 { this.props.actions && this.props.actions.length && (\n <Card.Content\n extra\n textAlign='center'\n >\n { _.map(this.getActions(item), (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 return card;\n }\n\n return (\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 /**\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 const listItem = (\n <Item\n key={item.id || index}\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 return listItem;\n }\n\n return (\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 /**\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 relaxed='very'\n >\n { _.map(this.props.items, this.renderItem.bind(this)) }\n </Item.Group>\n );\n }\n}\n\nItems.defaultProps = {\n actions: []\n};\n\nexport default useItemsToggle(useList(Items));\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 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 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: 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 * 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 return (\n <WrappedComponent\n {...this.props}\n renderListHeader={this.renderHeader.bind(this)}\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 return (\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 { this.props.sort && this.props.sort.length > 1 && 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 { InfiniteScroll } from '@performant-software/shared-components';\nimport React, { Component } from 'react';\nimport uuid from 'react-uuid';\nimport { Loader } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport Items from './Items';\nimport './ItemCollection.css';\n\ntype Props = {\n className?: string,\n context: {\n current: HTMLElement\n },\n items: Array<any>,\n loading?: boolean,\n onBottomReached?: (page: number) => void,\n onDelete: (item: any) => void,\n onSave?: (item: any) => void,\n perPage: number,\n scrollOffset: number\n};\n\ntype State = {\n page: number\n};\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 return (this.props.items && this.props.items.slice(0, endIndex)) || [];\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 { Button, Dimmer, Loader } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport Items from './Items';\nimport useDataList, { SORT_ASCENDING } from './DataList';\n\ntype ListButton = {\n ...typeof Button,\n accept: () => boolean\n};\n\ntype Sort = {\n key: any,\n value: any,\n text: string,\n direction: ?string\n};\n\ntype Props = {\n buttons: Array<ListButton>,\n isRowSelected: (item: any) => boolean,\n items: Array<any>,\n loading?: boolean,\n page: number,\n onRowSelect: (item: any) => 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\n/**\n * An ItemList component can be used to render a list of records returned from an API. Under the hood, the DataList\n * component handles calling the API, storing the records, filters, etc, and the Items component handles the\n * presentation.\n *\n * @param props\n *\n * @returns {*}\n */\nconst ItemList = (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 onCopy: undefined,\n onSort: () => {},\n renderDeleteModal: undefined,\n renderEmptyRow: undefined,\n searchable: true,\n};\n\nexport default useDataList(ItemList);\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 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","var __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-pdf/dist/esm/entry.webpack\");","// @flow\n\nimport React, { useState, useEffect, type Node } from 'react';\nimport { Document, Page } from 'react-pdf/dist/esm/entry.webpack';\nimport {\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 './LazyDocument.css';\n\ntype Props = {\n children?: Node,\n dimmable?: boolean,\n duration?: number,\n image?: any,\n preview?: ?string,\n size?: string,\n src?: string\n};\n\nconst LazyDocument = (props: Props) => {\n const [visible, setVisible] = useState(false);\n const [dimmer, setDimmer] = useState(false);\n const [contentType, setContentType] = useState('');\n\n useEffect(() => {\n if (props.src && !props.preview) {\n fetch(props.src)\n .then((response) => response.blob())\n .then((blob) => setContentType(blob.type));\n }\n }, [props.preview, props.src]);\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 { props.preview && (\n <Image\n {...props.image}\n src={props.preview}\n size={props.size}\n />\n )}\n { !props.preview && props.src && contentType === 'application/pdf' && (\n <Image\n {...props.image}\n size={props.size}\n >\n <Document\n file={props.src}\n >\n <Page\n pageNumber={1}\n />\n </Document>\n </Image>\n )}\n { !props.preview && (!props.src || contentType !== 'application/pdf') && (\n <Image\n {...props.image}\n className='placeholder-image'\n size={props.size}\n >\n <Icon\n name='file alternate 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 <DownloadButton\n content={i18n.t('LazyDocument.buttons.download')}\n icon='cloud download'\n primary\n url={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 preview: undefined,\n size: 'medium',\n src: undefined\n};\n\nexport default LazyDocument;\n","// @flow\n\nimport React from 'react';\nimport { Image, Modal } from 'semantic-ui-react';\nimport ModalContext from '../context/ModalContext';\nimport './PhotoViewer.css';\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 <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 <Image\n alt={props.alt}\n fluid\n src={props.image}\n />\n </Modal.Content>\n </Modal>\n )}\n </ModalContext.Consumer>\n);\n\nPhotoViewer.defaultProps = {\n size: 'small'\n};\n\nexport default PhotoViewer;\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 PhotoViewer from './PhotoViewer';\nimport './LazyImage.css';\n\ntype Props = {\n children?: Node,\n dimmable: boolean,\n duration?: number,\n image?: any,\n preview?: string,\n size?: string,\n src?: string\n};\n\nconst LazyImage = (props: Props) => {\n const [visible, setVisible] = useState(false);\n const [modal, setModal] = useState(false);\n const [dimmer, setDimmer] = 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-image'\n compact\n onBlur={() => setDimmer(false)}\n onMouseEnter={() => setDimmer(true)}\n onMouseLeave={() => setDimmer(false)}\n >\n { props.src && (\n <Image\n {...props.image}\n size={props.size}\n src={props.preview || props.src}\n />\n )}\n { !props.src && (\n <Image\n {...props.image}\n className='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.children }\n </div>\n </Dimmer>\n )}\n </Dimmer.Dimmable>\n </Transition>\n <PhotoViewer\n image={props.src || ''}\n onClose={() => setModal(false)}\n open={modal}\n size='large'\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, { type Element, useEffect, useRef } from 'react';\nimport { Embed, Modal, Ref } from 'semantic-ui-react';\nimport ModalContext from '../context/ModalContext';\nimport './VideoPlayer.css';\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 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 { 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 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, { useState, type Element, 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 VideoPlayer from './VideoPlayer';\nimport './LazyVideo.css';\n\ntype Props = {\n autoPlay?: boolean,\n children?: Node,\n dimmable: boolean,\n duration?: number,\n embedded?: boolean,\n icon?: string | Element<any>,\n image?: any,\n preview?: ?string,\n size?: string,\n src?: string\n};\n\nconst LazyVideo = (props: Props) => {\n const [visible, setVisible] = useState(false);\n const [modal, setModal] = useState(false);\n const [dimmer, setDimmer] = 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-video'\n compact\n onBlur={() => setDimmer(false)}\n onMouseEnter={() => setDimmer(true)}\n onMouseLeave={() => setDimmer(false)}\n >\n { props.preview && (\n <Image\n {...props.image}\n src={props.preview}\n size={props.size}\n />\n )}\n { !props.preview && props.src && (\n <Image\n {...props.image}\n size={props.size}\n >\n <video\n src={props.src}\n />\n </Image>\n )}\n { !props.preview && !props.src && (\n <Image\n {...props.image}\n className='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.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 { type EditContainerProps } from '@performant-software/shared-components';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n type Element\n} from 'react';\nimport uuid from 'react-uuid';\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};\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 Operators = {\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 OperatorsByType = {\n [FilterTypes.boolean]: [\n Operators.equal\n ],\n [FilterTypes.date]: [\n Operators.equal\n ],\n [FilterTypes.relationship]: [\n Operators.equal,\n Operators.notEqual,\n Operators.empty,\n Operators.notEmpty\n ],\n [FilterTypes.select]: [\n Operators.equal,\n Operators.notEqual,\n Operators.empty,\n Operators.notEmpty\n ],\n [FilterTypes.string]: [\n Operators.equal,\n Operators.notEqual,\n Operators.contain,\n Operators.notContain,\n Operators.empty,\n Operators.notEmpty\n ],\n [FilterTypes.text]: [\n Operators.contain,\n Operators.notContain,\n Operators.empty,\n Operators.notEmpty\n ]\n};\n\nconst OperatorOptions = [{\n key: Operators.equal,\n value: Operators.equal,\n text: i18n.t('ListFilters.operators.equal')\n}, {\n key: Operators.notEqual,\n value: Operators.notEqual,\n text: i18n.t('ListFilters.operators.notEqual')\n}, {\n key: Operators.contain,\n value: Operators.contain,\n text: i18n.t('ListFilters.operators.contain')\n}, {\n key: Operators.notContain,\n value: Operators.notContain,\n text: i18n.t('ListFilters.operators.notContain')\n}, {\n key: Operators.empty,\n value: Operators.empty,\n text: i18n.t('ListFilters.operators.empty')\n}, {\n key: Operators.notEmpty,\n value: Operators.notEmpty,\n text: i18n.t('ListFilters.operators.notEmpty')\n}, {\n key: Operators.greaterThan,\n value: Operators.greaterThan,\n text: i18n.t('ListFilters.operators.greaterThan')\n}, {\n key: Operators.lessThan,\n value: Operators.lessThan,\n text: i18n.t('ListFilters.operators.lessThan')\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(OperatorOptions, (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 === Operators.empty || filter.operator === Operators.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', {\n ...filter,\n uid: uuid(),\n operator: Operators.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={() => {\n /*\n * If we're removing the last filter, call the onReset prop to ensure the UI doesn't display\n * as active.\n */\n if (props.item.filters && props.item.filters.length === 1) {\n props.onReset();\n } else {\n props.onDeleteChildAssociation('filters', filter);\n }\n }}\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};\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 { ReferenceCodesService } from '@performant-software/shared-components';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useState\n} from 'react';\nimport _ from 'underscore';\nimport { Dropdown } from 'semantic-ui-react';\n\ntype Item = {\n reference_table_id: number,\n key: string\n};\n\ntype Props = {\n fluid?: boolean,\n multiple?: boolean,\n onChange: (item: Item) => void,\n placeholder?: string,\n referenceTable: string,\n value: Item | Array<Item>\n};\n\nconst ReferenceCodeDropdown = (props: Props) => {\n const [loading, setLoading] = useState(false);\n const [options, setOptions] = useState([]);\n\n /**\n * Converts the passed ID to a reference code item.\n *\n * @type {function(*): {reference_code_id: *}}\n */\n const toItem = useCallback((id) => ({\n reference_code_id: id\n }), []);\n\n /**\n * Converts the passed reference code to a dropdown option.\n *\n * @type {function(*): {text: *, value: *, key: *}}\n */\n const toOption = useCallback((referenceCode) => ({\n key: referenceCode.id,\n value: referenceCode.id,\n text: referenceCode.name\n }), []);\n\n /**\n * Converts the selected values and calls the onChange prop.\n *\n * @type {(function(*, {value: *}): void)|*}\n */\n const onChange = useCallback((e, { value }) => {\n let values;\n\n if (props.multiple) {\n values = value;\n } else {\n values = _.compact([value]);\n }\n\n props.onChange(_.map(values, toItem));\n }, [toItem, props.multiple, props.onChange]);\n\n /**\n * Sets the \"value\" variable for the Dropdown component.\n */\n const value = useMemo(() => {\n const v = _.pluck(_.filter(props.value, (x) => !x._destroy), 'reference_code_id');\n return props.multiple ? v : _.first(v);\n }, [props.multiple, props.value]);\n\n /**\n * Loads the list of reference codes from the server.\n */\n useEffect(() => {\n setLoading(true);\n\n const params = {\n per_page: 0,\n reference_table: props.referenceTable,\n sort_by: 'name'\n };\n\n ReferenceCodesService\n .fetchAll(params)\n .then(({ data }) => setOptions(_.map(data.reference_codes, toOption)))\n .finally(() => setLoading(false));\n }, [toOption]);\n\n return (\n <Dropdown\n clearable\n disabled={loading}\n fluid={props.fluid}\n loading={loading}\n multiple={props.multiple}\n onChange={onChange}\n options={options}\n placeholder={props.placeholder}\n search\n selection\n selectOnBlur={false}\n value={value}\n />\n );\n};\n\nReferenceCodeDropdown.defaultProps = {\n fluid: true,\n multiple: false,\n placeholder: undefined\n};\n\nexport default ReferenceCodeDropdown;\n","// @flow\n\nimport React, { type ComponentType } from 'react';\nimport { withTranslation } from 'react-i18next';\nimport {\n Button,\n Header,\n Icon,\n Popup\n} from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\n\ntype Props = {\n label: string,\n onClick: () => void,\n referenceTable: string\n};\n\nconst ReferenceCodeFormLabel: ComponentType<any> = withTranslation()((props: Props) => (\n <div>\n <label\n htmlFor={props.referenceTable}\n >\n { props.label }\n </label>\n <Popup\n hoverable\n trigger={(\n <Icon\n name='info circle'\n style={{\n marginLeft: '0.3em'\n }}\n />\n )}\n >\n <Header\n content={props.label}\n />\n <p>{ i18n.t('ReferenceCodeFormLabel.content', { name: props.label })}</p>\n <Button\n content={i18n.t('Common.buttons.edit')}\n icon='edit'\n primary\n onClick={props.onClick}\n />\n </Popup>\n </div>\n));\n\nexport default ReferenceCodeFormLabel;\n","// @flow\n\nimport type { EditContainerProps } from '@performant-software/shared-components';\nimport React from 'react';\nimport { Form, Modal } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport ModalContext from '../context/ModalContext';\n\nconst ReferenceCodeModal = (props: EditContainerProps) => (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n as={Form}\n centered={false}\n mountNode={mountNode}\n open\n >\n <Modal.Header\n content={props.item.id\n ? i18n.t('ReferenceCodeModal.title.edit')\n : i18n.t('ReferenceCodeModal.title.add')}\n />\n <Modal.Content>\n <Form.Input\n error={props.isError('name')}\n label={i18n.t('ReferenceCodeModal.labels.name')}\n onChange={props.onTextInputChange.bind(this, 'name')}\n required={props.isRequired('name')}\n value={props.item.name}\n />\n </Modal.Content>\n { props.children }\n </Modal>\n )}\n </ModalContext.Consumer>\n);\n\nexport default ReferenceCodeModal;\n","// @flow\n\nimport type { EditContainerProps } from '@performant-software/shared-components';\nimport React from 'react';\nimport { Form, Header, Modal } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport EmbeddedList from './EmbeddedList';\nimport ModalContext from '../context/ModalContext';\nimport ReferenceCodeModal from './ReferenceCodeModal';\n\nconst ReferenceTableModal = (props: EditContainerProps) => (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n as={Form}\n centered={false}\n className='reference-table-modal'\n mountNode={mountNode}\n open\n >\n <Modal.Header\n content={props.item.id\n ? i18n.t('ReferenceTableModal.title.edit')\n : i18n.t('ReferenceTableModal.title.add')}\n />\n <Modal.Content>\n <Form.Input\n error={props.isError('name')}\n label={i18n.t('ReferenceTableModal.labels.name')}\n onChange={props.onTextInputChange.bind(this, 'name')}\n required={props.isRequired('name')}\n value={props.item.name}\n />\n <Form.Input\n error={props.isError('key')}\n label={i18n.t('ReferenceTableModal.labels.key')}\n onChange={props.onTextInputChange.bind(this, 'key')}\n required={props.isRequired('key')}\n value={props.item.key}\n />\n <Header\n content={i18n.t('ReferenceTableModal.labels.referenceCodes')}\n />\n <EmbeddedList\n actions={[{\n name: 'edit'\n }, {\n name: 'copy'\n }, {\n name: 'delete'\n }]}\n columns={[{\n name: 'name',\n label: i18n.t('ReferenceTableModal.referenceCodes.columns.name')\n }]}\n items={props.item.reference_codes}\n modal={{\n component: ReferenceCodeModal,\n props: {\n required: ['name']\n }\n }}\n onDelete={props.onDeleteChildAssociation.bind(this, 'reference_codes')}\n onSave={props.onSaveChildAssociation.bind(this, 'reference_codes')}\n />\n </Modal.Content>\n { props.children }\n </Modal>\n )}\n </ModalContext.Consumer>\n);\n\nexport default ReferenceTableModal;\n","// @flow\n\nimport { ReferenceTablesService } from '@performant-software/shared-components';\nimport React, { type ComponentType, useState } from 'react';\nimport { Form } from 'semantic-ui-react';\nimport EditModal from './EditModal';\nimport ReferenceCodeDropdown from './ReferenceCodeDropdown';\nimport ReferenceCodeFormLabel from './ReferenceCodeFormLabel';\nimport ReferenceTableModal from './ReferenceTableModal';\n\ntype Props = {\n error?: boolean,\n label?: string,\n required?: boolean,\n referenceTable: string\n};\n\nconst ReferenceCodeFormDropdown: ComponentType<any> = (props: Props) => {\n const {\n error,\n label,\n required,\n referenceTable,\n ...rest\n } = props;\n\n const [modal, setModal] = useState(false);\n const [dropdownKey, setDropdownKey] = useState(0);\n\n return (\n <>\n <Form.Input\n error={error}\n label={(\n <ReferenceCodeFormLabel\n label={label}\n onClick={() => setModal(true)}\n referenceTable={referenceTable}\n />\n )}\n required={required}\n >\n <ReferenceCodeDropdown\n {...rest}\n id={referenceTable}\n referenceTable={referenceTable}\n key={dropdownKey}\n />\n </Form.Input>\n { modal && (\n <EditModal\n component={ReferenceTableModal}\n item={{ id: referenceTable }}\n onClose={() => setModal(false)}\n onInitialize={(key) => (\n ReferenceTablesService\n .fetchByKey(key)\n .then(({ data }) => data.reference_table)\n )}\n onSave={(record) => (\n ReferenceTablesService\n .save(record)\n .then(({ data }) => data.reference_table)\n .then(() => setDropdownKey((prevKey) => prevKey + 1))\n .finally(() => setModal(false))\n )}\n />\n )}\n </>\n );\n};\n\nexport default ReferenceCodeFormDropdown;\n","// @flow\n\nimport { ReferenceTablesService } from '@performant-software/shared-components';\nimport React from 'react';\nimport ListTable from './ListTable';\nimport ReferenceTableModal from './ReferenceTableModal';\n\nconst ReferenceTablesList = () => (\n <ListTable\n actions={[{\n name: 'edit'\n }, {\n name: 'copy'\n }, {\n name: 'delete'\n }]}\n collectionName='reference_tables'\n columns={[{\n name: 'name',\n label: 'Name',\n sortable: true\n }, {\n name: 'key',\n label: 'Key',\n sortable: true\n }]}\n modal={{\n component: ReferenceTableModal,\n props: {\n onInitialize: (id) => (\n ReferenceTablesService\n .fetchOne(id)\n .then(({ data }) => data.reference_table)\n ),\n required: ['name', 'key']\n }\n }}\n onDelete={(referenceTable) => ReferenceTablesService.delete(referenceTable)}\n onLoad={(params) => ReferenceTablesService.fetchAll(params)}\n onSave={(referenceTable) => ReferenceTablesService.save(referenceTable)}\n />\n);\n\nexport default ReferenceTablesList;\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 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 useState,\n type ComponentType,\n type Element\n} from 'react';\nimport {\n Button,\n Form,\n Grid,\n Icon,\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,\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 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 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.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 [selectedItem, setSelectedItem] = useState();\n const [selectedItems, setSelectedItems] = useState(props.selectedItems || []);\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 * @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 (!props.multiple) {\n setSelectedItems([item]);\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 <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 { 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","var __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 = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(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 = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(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 = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\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(function(id) { return 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], function() { return __webpack_require__(790); })\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","pollingInterval","initializeState","polling","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","session","restoreSession","defaults","defaultPerPage","perPageOptions","defaultSearch","defaultSort","defaultSortDirection","error","value","ObjectUtils","selectedItem","onDelete","afterDelete","catch","onError","Promise","resolve","onDeleteAll","afterDeleteAll","resolveErrors","onChange","activePage","onSave","direction","component","isFilterActive","onFilterChange","onPageChange","onPerPageChange","onSort","onInit","renderSearch","content","searchable","Input","input","onKeyDown","Timer","onKeyUp","onSearch","onSearchChange","size","getSessionKey","sessionStorage","getItem","JSON","parse","setItem","stringify","DropdownButton","dropdownRef","useRef","basic","color","text","disabled","current","handleClick","Dropdown","floating","options","ref","scrolling","selectOnBlur","trigger","EditModal","OuterComponent","showToaster","setShowToaster","hasErrors","errors","showLoading","Dimmer","Loader","Modal","saving","primary","inline","onClose","useEditContainer","modalDelete","modalDeleteAll","modalEdit","modalFilter","location","buttons","addButton","deleteButton","modal","selectable","render","renderAddButton","renderDeleteAllButton","button","include","copy","onCopy","renderHeader","actions","getActions","renderEmptyMessage","renderFooter","renderEditModal","renderDeleteModal","renderDeleteAllModal","renderFilterModal","action","name","onEditButton","onCopyButton","onDeleteButton","onAddButton","Icon","index","accept","onDeleteAllButton","Confirm","header","Header","onCancel","onConfirm","open","Trans","i18nKey","onFilterButton","onSaveFilter","getButtons","hasPages","showCount","showRecordCount","Grid","columns","textAlign","renderRecordCount","renderPagination","renderListHeader","verticalAlign","renderButton","Menu","borderless","secondary","renderFilterButton","renderPerPage","Pagination","firstItem","lastItem","totalPages","Number","toLocaleString","onColumnClick","renderEmptyRow","useList","renderActions","useCallback","title","renderCheckbox","Checkbox","el","onRowSelect","checked","selectedRows","find","r","useDataList","useMemo","getRootItems","sortDropdown","sortValue","sort","renderSort","fontSize","AccordionList","modalAdd","searchQuery","onAddItem","loaded","lazyLoad","selectedPage","parentId","pagination","pageCount","autoFocus","renderHeaderAddButton","map","b","renderSubHeader","renderAddModal","canAddItem","onSelectAll","selectedRowIds","toBeSelected","reduce","tbs","includes","renderSelectAll","canDeleteItem","canEditItem","canCopyItem","hideAddRootButton","recordCount","selected","renderEditButton","renderCopyButton","renderDeleteButton","renderSelectCheckbox","React","Segment","isSelected","AccordionSelector","selectedItems","isSelectable","multiple","mountNode","width","onItemSelection","withTranslation","vertical","onRight","onLeft","AssociatedDropdown","clearTimeout","onSelection","option","renderOption","onBlur","onOptionSelection","onOpen","placeholder","searchInput","selection","upward","renderClearButton","renderModal","required","onClear","onInitialize","record","setTimeout","ColorButton","cursor","height","ColorPickerModal","selectedColor","SketchPicker","disableAlpha","onChangeComplete","onMouseDown","role","drop","useDrop","hover","monitor","dragIndex","hoverIndex","hoverBoundingRect","getBoundingClientRect","hoverMiddleY","bottom","top","hoverClientY","getClientOffset","y","onDrag","useDrag","collect","isDragging","drag","opacity","Ref","innerRef","DataTable","columnRefs","onMouseMove","onMouseUp","resize","activePanel","initializeColumnRefs","onPreventClick","onColumnResize","afterColumnResize","Browser","document","addEventListener","c","createRef","removeEventListener","columnCount","columnRef","offset","pageX","allSelected","isRowSelected","Table","tableProps","renderSelectHeader","renderHeaderCell","renderActionsHeader","renderEmptyTableRow","renderLoading","actionButton","popup","Popup","hideOnScroll","mouseEnterDelay","position","filter","renderActionButton","column","hidden","colSpan","getColumnCount","sorted","label","offsetWidth","renderCell","expandableRows","target","nodeName","expandPanel","anchoredColumns","splice","closeOnBlur","onColumnCheckbox","DropdownMenu","setOpen","onMouseEnter","onMouseLeave","setAttribute","renderDropdownItem","renderMenuItem","renderDropdown","contextRef","renderMenu","fixed","List","activeSort","setActiveSort","onSortChange","newSort","sorts","celled","DataView","activeItem","setActiveItem","selectedRecord","setSelectedRecord","setColumns","menu","setMenu","paddingLeft","setPaddingLeft","setKey","menuRef","url","substr","lastIndexOf","mergeColumns","keys","flatten","uniq","cols","col","columnValue","defaultValue","trim","replace","toUpperCase","replaceAll","sortable","resolveValue","axios","itemKey","response","attribute","Boolean","toString","group","menuItems","headers","layout","marginLeft","as","Form","centered","closeIcon","doubling","ListTable","prevColumns","Hooks","sortableColumn","configurable","DatabaseView","selectedTable","setSelectedTable","tables","setTables","service","getColumns","getData","getTables","column_name","dataType","data_type","Date","toLocaleDateString","table_name","test","table","overflow","MAX_SAFE_INTEGER","date","iconPosition","readOnly","display","locale","formatOptions","preventDefault","DatePicker","calendar","setCalendar","calendarWrapper","onDocumentClick","event","calendarInstance","contains","zIndex","closeOnSelection","next2AriaLabel","next2Label","nextAriaLabel","nextLabel","prev2AriaLabel","prev2Label","prevAriaLabel","prevLabel","DescriptorField","popupContent","hoverable","delayInterval","renderPopup","wide","filename","download","uuid","href","EditPage","currentTab","tab","noValidate","renderButtons","renderComponent","renderToaster","EmbeddedList","_destroy","uid","getItems","orderBy","property","sortProperty","split","ordered","reverse","FileInputButton","buttonProps","fileInputRef","click","fileList","array","toArray","files","FileUpload","fileInput","filePattern","fileTypes","RegExp","dataTransfer","validate","onFilesAdded","onClickDropzone","onDragLeave","onDragOver","onDrop","onDropFiles","tabIndex","maxSize","validFiles","file","valid","match","exec","FileUploadModal","getInitialState","includeButton","onAddFile","idAttribute","validateItem","save","renderErrors","onAddFiles","renderItems","onDismissErrors","renderMessageItem","FileItem","itemComponent","isError","isRequired","onAssociationInputChange","onTextInputChange","onUpdate","Item","divided","relaxed","fields","FuzzyDate","Calendar","initializeDate","startDate","endDate","dateComponent","convertToDate","format","accuracy","description","range","parseDate","setDisplay","onAccuracyChange","getDefaultDate","month","getDefaultMonth","setEndDate","toDate","year","parseInt","onEdit","radio","renderYear","renderMonth","renderDate","onRangeChange","TextArea","onDescriptionChange","daysInMonth","onDateChange","onMonthChange","listMonths","m","onYearChange","getDisplayDate","addYear","addMonth","addDate","navigator","language","GoogleMap","Map","defaultCenter","center","setCenter","setMap","defaultZoom","onDragEnd","latLng","lat","bounds","getBounds","mapContainerClassName","mapContainerStyle","containerStyle","zoom","Marker","draggable","searchBox","setSearchBox","onPlacesChanged","place","getPlaces","geometry","formatted_address","onLocationSelection","result","StandaloneSearchBox","s","HorizontalCards","marginWidth","setMarginWidth","pageWidth","setPageWidth","scrollPage","setScrollPage","scrollPages","setScrollPages","instance","clientWidth","scrollWidth","Math","ceil","child","firstChild","window","getComputedStyle","leftMargin","parseFloat","rightMargin","marginRight","scrollTo","left","behavior","increment","nextPage","getCardStyle","flex","renderImage","image","Image","alt","src","objectFit","Card","link","inlineImage","renderMeta","renderDescription","renderExtra","extra","circular","Items","getClassName","renderList","renderGrid","renderEmptyList","card","actionIndex","resolveColor","resolveIcon","padded","view","renderCard","listItem","resolveName","renderAdditionalContent","getSortValue","ItemCollection","endIndex","slice","onBottomReached","InfiniteScroll","context","scrollOffset","ItemList","htmlFor","KeyboardField","showKeyboard","renderLabel","onInputChange","hide","show","Keyboard","onKeyboardChange","keyboardClass","onRemoveItem","findIndex","onUpdateItem","withBatchEdit","LazyDocument","dimmer","setDimmer","contentType","setContentType","preview","fetch","blob","Document","Page","pageNumber","dimmable","Visibility","fireOnMount","onTopVisible","PhotoViewer","LazyImage","setModal","VideoPlayer","embedRef","placeholderAlt","querySelector","embedded","Embed","autoPlay","iframe","allow","video","controls","LazyVideo","FilterTypes","boolean","integer","relationship","select","string","Operators","OperatorsByType","OperatorOptions","getOperatorsByType","operators","onDefaultSort","renderInput","operator","onSaveChildAssociation","renderSearchQuery","onReset","onDeleteChildAssociation","dimmed","LoginModal","loginFailed","onUsernameChange","onPasswordChange","onLogin","MasonryLayout","columnWrapper","columnIndex","marginBottom","gap","MasonryTile","dimmerActive","setDimmerActive","setHeight","random","subheader","subtitle","renderEmpty","PlayButton","setVideo","mountOnShow","onPrevious","onNext","setItems","stackable","transform","ModalDropdown","modalVisible","ReferenceCodeDropdown","setLoading","setOptions","toItem","reference_code_id","toOption","referenceCode","values","v","x","reference_table","referenceTable","ReferenceCodesService","reference_codes","finally","clearable","ReferenceCodeModal","rest","dropdownKey","setDropdownKey","ReferenceTableModal","ReferenceTablesService","prevKey","RemoteDropdown","dropdown","Array","isArray","getValues","getOption","allowAdditions","renderAddOption","renderLoadMoreOption","getOptions","close","getClassNames","getSearchOptions","Section","Divider","SelectizeGrid","renderCheckmark","onSelect","Selectize","setSelectedItem","setSelectedItems","prevItems","TabbedModal","Element","Tab","classes","inlineTabs","tabs","t","getModalClasses","getHeaderClasses","float","renderTab","displayName","pointing","onTabClick","tags","tag","Label","config","background","Thumbnail","visibility","VideoFrameSelector","setDuration","defaultInterval","interval","time","setTime","videoRef","currentTime","crossOrigin","onLoadedMetadata","min","max","step","canvas","createElement","videoWidth","videoHeight","getContext","drawImage","toBlob","File","lastModified","getTime","ViewXML","showModal","setShowModal","OpenerComponent","opener","openerProps","highlighter","xml","maxHeight","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","Object","every","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","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 \"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/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/context/ModalContext.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/AssociatedDropdown.js","webpack://@performant-software/semantic-components/./src/components/BooleanIcon.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/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/./src/components/DateInput.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/external commonjs \"react-uuid\"","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/FileInputButton.js","webpack://@performant-software/semantic-components/./src/components/FileUpload.js","webpack://@performant-software/semantic-components/./src/components/FileUploadModal.js","webpack://@performant-software/semantic-components/./src/components/FuzzyDate.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/Items.js","webpack://@performant-software/semantic-components/./src/components/ItemsToggle.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/LinkButton.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/external commonjs \"react-pdf/dist/esm/entry.webpack\"","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/ListFilters.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/ReferenceCodeDropdown.js","webpack://@performant-software/semantic-components/./src/components/ReferenceCodeFormLabel.js","webpack://@performant-software/semantic-components/./src/components/ReferenceCodeModal.js","webpack://@performant-software/semantic-components/./src/components/ReferenceTableModal.js","webpack://@performant-software/semantic-components/./src/components/ReferenceCodeFormDropdown.js","webpack://@performant-software/semantic-components/./src/components/ReferenceTablesList.js","webpack://@performant-software/semantic-components/./src/components/RemoteDropdown.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/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 = function(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 = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\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(function(key) { return __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};","var __WEBPACK_NAMESPACE_OBJECT__ = require(\"react\");","var __WEBPACK_NAMESPACE_OBJECT__ = require(\"underscore\");","var __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","var __WEBPACK_NAMESPACE_OBJECT__ = require(\"@performant-software/shared-components\");","var __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 _ from 'underscore';\nimport { Input, Message } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport Toaster from './Toaster';\n\ntype Props = {\n collectionName: string,\n defaultPerPage?: number,\n defaultSearch?: string,\n defaultSort?: string,\n defaultSortDirection?: string,\n filters?: {\n component: ComponentType<any>,\n defaults?: any,\n props?: any,\n onChange?: (filter: any) => Promise<any>\n },\n onDelete?: (item: any) => Promise<any>,\n onDeleteAll?: () => Promise<any>,\n onLoad: (params: any) => Promise<any>,\n onSave?: (item: any) => Promise<any>,\n perPageOptions?: Array<number>,\n polling?: number,\n resolveErrors?: (error: any) => Array<string>,\n saved?: boolean,\n searchable: boolean,\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 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 || (props.filters && props.filters.defaults) || {};\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 * 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, defaults, props } = 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 props: {\n ...props,\n defaults,\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='search'\n input={{\n 'aria-label': 'search'\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","var __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 component: ComponentType<any>,\n onClose: () => void,\n onSave: () => Promise<any>,\n showLoading: boolean\n};\n\nconst EditModal = (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 useEditContainer(EditModal);\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 './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 actions: Array<Action>,\n addButton: {\n basic: boolean,\n color: string,\n location: string,\n onClick?: () => void\n },\n buttons: Array<ListButton>,\n count: number,\n className: string,\n configurable: boolean,\n deleteButton?: {\n color: string,\n location: string,\n onClick?: () => void\n },\n filters?: {\n active: boolean,\n component: Component<{}>,\n props?: any,\n state?: any,\n onChange: (params: any) => Promise<any>\n },\n items: ?Array<any>,\n loading?: boolean,\n modal?: {\n component: Element<any>,\n props: any,\n state: any\n },\n page: number,\n pages: number,\n onCopy?: (item: any) => any,\n onDelete: (item: any) => void,\n onDeleteAll?: () => Promise<any>,\n onPageChange: () => void,\n onPerPageChange: () => void,\n onSave: (item: any) => Promise<any>,\n onSelectAll?: (items: Array<any>) => void,\n perPage: number,\n perPageOptions: Array<number>,\n renderDeleteModal?: ({ selectedItem: any, onCancel: () => void, onConfirm: () => void }) => Element<any>,\n renderEmptyRow?: () => void,\n renderItem?: (item: any, index: number, children?: any) => Element<any>,\n renderListHeader?: () => ?Element<any>,\n renderSearch?: () => Element<any>,\n selectable?: boolean,\n showRecordCount: boolean,\n t: (key: string) => string\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 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 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 * 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 onClick={this.onAddButton.bind(this)}\n >\n <Icon name='plus' />\n { 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 if (!renderHeader) {\n return null;\n }\n\n return (\n <div\n className='header'\n >\n <Grid\n columns={2}\n verticalAlign='bottom'\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>\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","import React from 'react';\n\nconst ModalContext = React.createContext();\n\nexport default ModalContext;\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 Date = {\n accuracy: number,\n description: string,\n endDate?: Date,\n range: boolean,\n startDate?: Date\n};\n\ntype Props = {\n onLeft: (data: Date) => void,\n onRight: (data: Date) => void\n};\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 { 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 } 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 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","var __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 './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","var __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 id: any,\n index: number,\n onDrag: (dragIndex: number, hoverIndex: number) => void\n};\n\nconst TYPE_ANY = 'any';\n\nconst Draggable = (props: Props) => {\n const { index, id } = 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 // Get vertical middle\n const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;\n\n // Determine mouse position\n const clientOffset = monitor.getClientOffset();\n\n // Get pixels to the top\n const hoverClientY = clientOffset.y - hoverBoundingRect.top;\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 && hoverClientY < hoverMiddleY) {\n return;\n }\n\n // Dragging upwards\n if (dragIndex > hoverIndex && hoverClientY > hoverMiddleY) {\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 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 from './DataTableColumnSelector';\nimport useList from './List';\nimport './DataTable.css';\n\nimport type { Action } from './List';\n\ntype Column = {\n className?: string,\n hidden?: boolean,\n label?: string,\n name: string,\n render?: (item: any) => void,\n renderHeader?: (item: any) => void,\n resolve?: (item: any) => void,\n sortable: boolean\n};\n\ntype Props = {\n actions: Array<Action>,\n className: string,\n columns: Array<Column>,\n expandableRows: boolean,\n expandPanel: (item: any, activePanel: any) => Component<any>,\n isRowSelected: (item: any) => boolean,\n items: ?Array<any>,\n loading: boolean,\n onClearSelected: () => void,\n onColumnClick: (column: Column) => void,\n onRowSelect?: (item: any)=>void,\n onSelectAll: (items: Array<any>)=>void,\n renderEmptyMessage: () => Element<any>,\n renderEmptyRow?: () => void,\n renderItem?: (item: any, index: number, children?: any) => Element<any>,\n sortColumn?: string,\n sortDirection?: string,\n t: (key: string) => string,\n tableProps: any,\n selectable?: boolean,\n selectedRows: Array<{id: number}>,\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 selectedRows: [],\n sortColumn: undefined,\n sortDirection: undefined,\n};\n\nexport default useColumnSelector(useList(DataTable));\n\nexport type {\n Column\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 './DataTableColumnSelector.css';\n\nimport type { Column } from './DataTable';\n\ntype Props = {\n className: string,\n columns: Array<Column>,\n renderListHeader?: () => Element<any>\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","var __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 './DataTable';\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 useDataList, { SORT_ASCENDING, SORT_DESCENDING } from './DataList';\nimport './ListTable.css';\n\nimport type { Column } from './DataTable';\n\ntype Props = {\n columns: Array<Column>,\n defaultSort?: string,\n defaultSortDirection?: string,\n page: number,\n onSort: (sortColumn: string, sortDirection: string, page?: number) => void,\n onInit: (page?: number) => void,\n sortColumn: string,\n sortDirection: string\n};\n\nconst ListTable = (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 onCopy: undefined,\n renderDeleteModal: undefined,\n renderEmptyRow: undefined,\n tableProps: {\n celled: true,\n sortable: true\n }\n};\n\nexport default useDataList(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","// @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","var __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","var __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-uuid\");","// @flow\n\nimport React from 'react';\nimport uuid from 'react-uuid';\nimport { Button } from 'semantic-ui-react';\n\ntype Props = {\n filename?: string,\n url: string\n};\n\nconst DownloadButton = ({ filename, url, ...button }: Props) => (\n <a\n download={filename || uuid()}\n href={url}\n >\n <Button\n {...button}\n />\n </a>\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 className?: string,\n component: ComponentType<any>,\n menu?: MenuProps,\n onClose: () => void,\n onSave: () => Promise<any>,\n showLoading: boolean\n};\n\ntype State = {\n currentTab: string,\n showToaster: boolean\n};\n\nclass EditPage 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\nEditPage.defaultProps = {\n showLoading: true\n};\n\nexport default useEditContainer(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 from './DataTable';\nimport Draggable from './Draggable';\nimport './EmbeddedList.css';\n\nimport type { Action } from './List';\nimport type { Column } from './DataTable';\n\ntype ListButton = {\n render: () => ComponentType<any>\n};\n\ntype Props = {\n actions: Array<Action>,\n addButton?: {\n location: string,\n color: string\n },\n buttons?: Array<ListButton>,\n className?: string,\n columns: Array<Column>,\n configurable: boolean,\n defaultSort?: string,\n defaultSortDirection?: string,\n items: Array<any>,\n modal?: {\n component: ComponentType<any>,\n props: any,\n state: any\n },\n onCopy?: (item: any) => any,\n onDelete: (item: any) => void,\n onDrag?: (dragIndex: number, hoverIndex: number) => void,\n onSave?: (item: any) => void,\n renderDeleteModal?: ({ selectedItem: any, onCancel: () => void, onConfirm: () => void }) => void,\n renderEmptyRow?: () => void,\n selectable: boolean,\n onRowSelect: (Array<{id: number}>),\n selectedRows: Array<{id: number}>,\n showRecordCount: boolean,\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 EmbeddedList component can be used to display a collection of records that live within a parent object. This is\n * 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, { 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 fileTypes?: Array<string>,\n maxSize?: number,\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\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, { Component, type ComponentType } 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 i18n from '../i18n/i18n';\nimport FileUpload from './FileUpload';\nimport ModalContext from '../context/ModalContext';\nimport Toaster from './Toaster';\n\ntype Props = {\n button: string,\n includeButton?: boolean,\n itemComponent: ComponentType<any>,\n onAddFile: (file: File) => any,\n onClose?: () => void,\n onSave: (items: Array<any>) => Promise<any>,\n required: { [string]: string },\n title?: string\n};\n\ntype State = {\n items: Array<any>,\n modal: boolean,\n saving: boolean\n};\n\nconst LIST_DELIMITER = ', ';\n\nclass FileUploadModal extends Component<Props, State> {\n static defaultProps: any;\n\n /**\n * Constructs a new FileUploadModal component.\n *\n * @param props\n */\n constructor(props: Props) {\n super(props);\n\n this.state = this.getInitialState();\n }\n\n /**\n * Returns the initial component state.\n *\n * @returns {{saving: boolean, items: [], modal: boolean}}\n */\n getInitialState() {\n return {\n items: [],\n modal: !this.props.includeButton,\n saving: false\n };\n }\n\n /**\n * Returns true if any of the items contain errors.\n *\n * @returns {boolean}\n */\n hasErrors() {\n return !!_.find(this.state.items, (item) => !_.isEmpty(item.errors));\n }\n\n /**\n * Adds the passed collection of files to the state. Typically files will be added as a property of another model.\n * This component calls the onAddFiles prop to transform the items stored in the state.\n *\n * @param files\n */\n onAddFiles(files: Array<File>) {\n this.setState((state) => ({\n items: [\n ...state.items,\n ..._.map(files, this.props.onAddFile.bind(this))\n ]\n }));\n }\n\n /**\n * Updates the passed association for the passed item.\n *\n * @param item\n * @param idAttribute\n * @param attribute\n * @param value\n */\n onAssociationInputChange(item: any, idAttribute: string, attribute: string, value: any) {\n this.setState((state) => ({\n items: _.map(state.items, (i) => (i !== item ? i : ({\n ...i,\n [idAttribute]: value.id,\n [attribute]: value,\n errors: _.without(item.errors, idAttribute)\n })))\n }));\n }\n\n /**\n * Resets the state or calls the onClose prop.\n */\n onClose() {\n if (this.props.onClose) {\n this.props.onClose();\n } else {\n this.setState(this.getInitialState());\n }\n }\n\n /**\n * Deletes the passed item from the state.\n *\n * @param item\n */\n onDelete(item: any) {\n this.setState((state) => ({\n items: _.filter(state.items, (i) => i !== item)\n }));\n }\n\n /**\n * Clears the errors for all items in the state.\n */\n onDismissErrors() {\n this.setState((state) => ({\n items: _.map(state.items, (item) => _.omit(item, 'errors'))\n }));\n }\n\n /**\n * Validates the items and saves.\n */\n onSave() {\n this.setState((state) => ({\n items: _.map(state.items, this.validateItem.bind(this))\n }), this.save.bind(this));\n }\n\n /**\n * Updates the text value for the passed item.\n *\n * @param item\n * @param attribute\n * @param e\n * @param value\n */\n onTextInputChange(item: any, attribute: string, e: Event, { value }: { value: any }) {\n this.setState((state) => ({\n items: _.map(state.items, (i) => (i !== item ? i : ({\n ...i,\n [attribute]: value,\n errors: _.without(item.errors, attribute)\n })))\n }));\n }\n\n /**\n * Updates the passed item with the passed props.\n *\n * @param item\n * @param props\n */\n onUpdate(item: any, props: any) {\n this.setState((state) => ({\n items: _.map(state.items, (i) => (i !== item ? i : ({\n ...i,\n ...props,\n errors: _.without(item.errors, _.keys(props))\n })))\n }));\n }\n\n /**\n * Renders the FileUploadModal component.\n *\n * @returns {*}\n */\n render() {\n return (\n <>\n { this.props.includeButton && (\n <Button\n content={this.props.button}\n icon='cloud upload'\n onClick={() => this.setState({ modal: true })}\n primary\n />\n )}\n { this.state.modal && (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n centered={false}\n className='file-upload-modal'\n mountNode={mountNode}\n open\n >\n <Dimmer\n active={this.state.saving}\n inverted\n >\n <Loader\n content={i18n.t('FileUploadModal.loader')}\n />\n </Dimmer>\n { this.renderErrors() }\n <Modal.Header\n content={this.props.title || i18n.t('FileUploadModal.title')}\n />\n <Modal.Content>\n <FileUpload\n onFilesAdded={this.onAddFiles.bind(this)}\n />\n { this.renderItems() }\n </Modal.Content>\n <Modal.Actions>\n <Button\n content={i18n.t('Common.buttons.save')}\n disabled={!(this.state.items && this.state.items.length)}\n primary\n onClick={this.onSave.bind(this)}\n />\n <Button\n basic\n content={i18n.t('Common.buttons.cancel')}\n onClick={this.onClose.bind(this)}\n />\n </Modal.Actions>\n </Modal>\n )}\n </ModalContext.Consumer>\n )}\n </>\n );\n }\n\n /**\n * Renders the error modal.\n *\n * @returns {null|*}\n */\n renderErrors() {\n if (!this.hasErrors()) {\n return null;\n }\n\n return (\n <Toaster\n onDismiss={this.onDismissErrors.bind(this)}\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 { _.map(this.state.items, this.renderMessageItem.bind(this)) }\n </Message.List>\n </Toaster>\n );\n }\n\n /**\n * Renders the passed item.\n *\n * @param item\n *\n * @returns {*}\n */\n renderItem(item: any) {\n const FileItem = this.props.itemComponent;\n\n return (\n <FileItem\n isError={(key) => _.contains(item.errors, key)}\n isRequired={(key) => !!this.props.required[key]}\n item={item}\n onAssociationInputChange={this.onAssociationInputChange.bind(this, item)}\n onDelete={this.onDelete.bind(this, item)}\n onTextInputChange={this.onTextInputChange.bind(this, item)}\n onUpdate={this.onUpdate.bind(this, item)}\n />\n );\n }\n\n /**\n * Renders the list of items.\n *\n * @returns {null|*}\n */\n renderItems() {\n if (!(this.state.items && this.state.items.length)) {\n return null;\n }\n\n return (\n <Item.Group\n as={Form}\n divided\n noValidate\n relaxed='very'\n >\n { _.map(this.state.items, this.renderItem.bind(this)) }\n </Item.Group>\n );\n }\n\n /**\n * Renders the errors message for the passed item.\n *\n * @param item\n * @param index\n *\n * @returns {null|*}\n */\n renderMessageItem(item: any, index: number) {\n if (_.isEmpty(item.errors)) {\n return null;\n }\n\n const filename = !_.isEmpty(item.name) ? item.name : `File ${index}`;\n const fields = _.map(item.errors, (e) => this.props.required[e]).join(LIST_DELIMITER);\n\n return (\n <Message.Item\n content={i18n.t('FileUploadModal.errors.required', { filename, fields })}\n key={index}\n />\n );\n }\n\n /**\n * Saves the uploaded items.\n */\n save() {\n if (this.hasErrors()) {\n return;\n }\n\n this.setState({ saving: true }, () => {\n this.props\n .onSave(this.state.items)\n .then(this.onClose.bind(this));\n });\n }\n\n /**\n * Validates the list of items.\n */\n validate() {\n this.setState((state) => {\n const items = _.map(state.items, this.validateItem.bind(this));\n\n return {\n items,\n saving: !_.find(items, (item) => !_.isEmpty(item.errors))\n };\n }, this.save.bind(this));\n }\n\n /**\n * Validates the passed item.\n *\n * @param item\n *\n * @returns {{errors: []}}\n */\n validateItem(item: any) {\n const errors = [];\n\n _.each(_.keys(this.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 { ...item, errors };\n }\n}\n\nFileUploadModal.defaultProps = {\n includeButton: true\n};\n\nexport type FileUploadProps = {\n isError: (key: string) => boolean,\n isRequired: (key: string) => boolean,\n item: any,\n onAssociationInputChange: (idKey: string, valueKey: string, item: any) => void,\n onDelete: (item: any) => void,\n onTextInputChange: (item: any, value: any) => void,\n onUpdate: (item: any, props: any) => void\n};\n\nexport default FileUploadModal;\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","var __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, { useCallback, useEffect, useState } 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 // If no default zoom is provided and a position is provided, set the default zoom to 12.\n let { defaultZoom } = props;\n\n if (!defaultZoom) {\n if (position) {\n defaultZoom = DEFAULT_ZOOM_MARKER;\n } else {\n defaultZoom = DEFAULT_ZOOM;\n }\n }\n\n // Call the onDragEnd prop, passing the new location.\n const onDragEnd = ({ latLng }) => {\n if (props.onDragEnd) {\n // $FlowFixMe - Not actually fixing, we're checking for presence here.\n props.onDragEnd({\n lat: latLng.lat(),\n lng: latLng.lng()\n });\n }\n };\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={defaultZoom}\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 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 './HorizontalCards.css';\n\ntype Props = {\n inlineImage?: boolean,\n items: Array<any>,\n onClick?: (item: any, index: 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 number of pages and total page width on the state.\n */\n useEffect(() => {\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 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 }, []);\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 * 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 * Returns the flex-box style based on the page width.\n *\n * @type {function(): {flex: string}}\n */\n const getCardStyle = useCallback(() => ({\n flex: `0 0 ${(pageWidth / props.perPage) - marginWidth}px`\n }), [pageWidth, marginWidth, props.perPage]);\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 <Card\n link\n onClick={() => {\n if (props.onClick) {\n props.onClick(item, index);\n }\n }}\n style={getCardStyle()}\n >\n { !props.inlineImage && renderImage(item) }\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 { props.renderExtra && (\n <Card.Content\n extra\n >\n { props.renderExtra(item) }\n </Card.Content>\n )}\n </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='horizontal-cards'\n >\n <Ref\n innerRef={ref}\n >\n <Card.Group>\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, { 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 children: Element<any>,\n className: string,\n isRowSelected?: (item: any) => boolean,\n items: Array<any>,\n loading: boolean,\n onDrag?: (dragIndex: number, hoverIndex: number) => void,\n onRowSelect?: (item: any) => void,\n onSelectAllRows?: (items: Array<any>) => void,\n renderAdditionalContent?: (item: any) => Element<any>,\n renderDescription?: (item: any) => Element<any>,\n renderEmptyList: () => Element<any>,\n renderExtra?: (item: any) => Element<any>,\n renderHeader?: (item: any) => Element<any>,\n renderImage?: (item: any) => Element<any>,\n renderMeta?: (item: any) => Element<any>,\n selectable?: boolean,\n view: number\n};\n\n/**\n * The Items component is used as the presentation for a list of records. The component renders both a list\n * (see Semantic-UI List) and grid (see Semantic-UI Card) views.\n */\nclass Items 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 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 card = (\n <Card\n key={item.id || index}\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 { this.props.actions && this.props.actions.length && (\n <Card.Content\n extra\n textAlign='center'\n >\n { _.map(this.getActions(item), (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 return card;\n }\n\n return (\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 /**\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 const listItem = (\n <Item\n key={item.id || index}\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 return listItem;\n }\n\n return (\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 /**\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 relaxed='very'\n >\n { _.map(this.props.items, this.renderItem.bind(this)) }\n </Item.Group>\n );\n }\n}\n\nItems.defaultProps = {\n actions: []\n};\n\nexport default useItemsToggle(useList(Items));\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 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 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: 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 * 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 return (\n <WrappedComponent\n {...this.props}\n renderListHeader={this.renderHeader.bind(this)}\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 return (\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 { this.props.sort && this.props.sort.length > 1 && 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 { InfiniteScroll } from '@performant-software/shared-components';\nimport React, { Component } from 'react';\nimport uuid from 'react-uuid';\nimport { Loader } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport Items from './Items';\nimport './ItemCollection.css';\n\ntype Props = {\n className?: string,\n context: {\n current: HTMLElement\n },\n items: Array<any>,\n loading?: boolean,\n onBottomReached?: (page: number) => void,\n onDelete: (item: any) => void,\n onSave?: (item: any) => void,\n perPage: number,\n scrollOffset: number\n};\n\ntype State = {\n page: number\n};\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 return (this.props.items && this.props.items.slice(0, endIndex)) || [];\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 { Button, Dimmer, Loader } from 'semantic-ui-react';\nimport _ from 'underscore';\nimport i18n from '../i18n/i18n';\nimport Items from './Items';\nimport useDataList, { SORT_ASCENDING } from './DataList';\n\ntype ListButton = {\n ...typeof Button,\n accept: () => boolean\n};\n\ntype Sort = {\n key: any,\n value: any,\n text: string,\n direction: ?string\n};\n\ntype Props = {\n buttons: Array<ListButton>,\n isRowSelected: (item: any) => boolean,\n items: Array<any>,\n loading?: boolean,\n page: number,\n onRowSelect: (item: any) => 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\n/**\n * An ItemList component can be used to render a list of records returned from an API. Under the hood, the DataList\n * component handles calling the API, storing the records, filters, etc, and the Items component handles the\n * presentation.\n *\n * @param props\n *\n * @returns {*}\n */\nconst ItemList = (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 onCopy: undefined,\n onSort: () => {},\n renderDeleteModal: undefined,\n renderEmptyRow: undefined,\n searchable: true,\n};\n\nexport default useDataList(ItemList);\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 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","var __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-pdf/dist/esm/entry.webpack\");","// @flow\n\nimport React, { useState, useEffect, type Node } from 'react';\nimport { Document, Page } from 'react-pdf/dist/esm/entry.webpack';\nimport {\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 './LazyDocument.css';\n\ntype Props = {\n children?: Node,\n dimmable?: boolean,\n duration?: number,\n image?: any,\n preview?: ?string,\n size?: string,\n src?: string\n};\n\nconst LazyDocument = (props: Props) => {\n const [visible, setVisible] = useState(false);\n const [dimmer, setDimmer] = useState(false);\n const [contentType, setContentType] = useState('');\n\n useEffect(() => {\n if (props.src && !props.preview) {\n fetch(props.src)\n .then((response) => response.blob())\n .then((blob) => setContentType(blob.type));\n }\n }, [props.preview, props.src]);\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 { props.preview && (\n <Image\n {...props.image}\n src={props.preview}\n size={props.size}\n />\n )}\n { !props.preview && props.src && contentType === 'application/pdf' && (\n <Image\n {...props.image}\n size={props.size}\n >\n <Document\n file={props.src}\n >\n <Page\n pageNumber={1}\n />\n </Document>\n </Image>\n )}\n { !props.preview && (!props.src || contentType !== 'application/pdf') && (\n <Image\n {...props.image}\n className='placeholder-image'\n size={props.size}\n >\n <Icon\n name='file alternate 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 <DownloadButton\n content={i18n.t('LazyDocument.buttons.download')}\n icon='cloud download'\n primary\n url={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 preview: undefined,\n size: 'medium',\n src: undefined\n};\n\nexport default LazyDocument;\n","// @flow\n\nimport React from 'react';\nimport { Image, Modal } from 'semantic-ui-react';\nimport ModalContext from '../context/ModalContext';\nimport './PhotoViewer.css';\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 <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 <Image\n alt={props.alt}\n fluid\n src={props.image}\n />\n </Modal.Content>\n </Modal>\n )}\n </ModalContext.Consumer>\n);\n\nPhotoViewer.defaultProps = {\n size: 'small'\n};\n\nexport default PhotoViewer;\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 PhotoViewer from './PhotoViewer';\nimport './LazyImage.css';\n\ntype Props = {\n children?: Node,\n dimmable: boolean,\n duration?: number,\n image?: any,\n preview?: string,\n size?: string,\n src?: string\n};\n\nconst LazyImage = (props: Props) => {\n const [visible, setVisible] = useState(false);\n const [modal, setModal] = useState(false);\n const [dimmer, setDimmer] = 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-image'\n compact\n onBlur={() => setDimmer(false)}\n onMouseEnter={() => setDimmer(true)}\n onMouseLeave={() => setDimmer(false)}\n >\n { props.src && (\n <Image\n {...props.image}\n size={props.size}\n src={props.preview || props.src}\n />\n )}\n { !props.src && (\n <Image\n {...props.image}\n className='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.children }\n </div>\n </Dimmer>\n )}\n </Dimmer.Dimmable>\n </Transition>\n <PhotoViewer\n image={props.src || ''}\n onClose={() => setModal(false)}\n open={modal}\n size='large'\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, { type Element, useEffect, useRef } from 'react';\nimport { Embed, Modal, Ref } from 'semantic-ui-react';\nimport ModalContext from '../context/ModalContext';\nimport './VideoPlayer.css';\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 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 { 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 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, { useState, type Element, 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 VideoPlayer from './VideoPlayer';\nimport './LazyVideo.css';\n\ntype Props = {\n autoPlay?: boolean,\n children?: Node,\n dimmable: boolean,\n duration?: number,\n embedded?: boolean,\n icon?: string | Element<any>,\n image?: any,\n preview?: ?string,\n size?: string,\n src?: string\n};\n\nconst LazyVideo = (props: Props) => {\n const [visible, setVisible] = useState(false);\n const [modal, setModal] = useState(false);\n const [dimmer, setDimmer] = 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-video'\n compact\n onBlur={() => setDimmer(false)}\n onMouseEnter={() => setDimmer(true)}\n onMouseLeave={() => setDimmer(false)}\n >\n { props.preview && (\n <Image\n {...props.image}\n src={props.preview}\n size={props.size}\n />\n )}\n { !props.preview && props.src && (\n <Image\n {...props.image}\n size={props.size}\n >\n <video\n src={props.src}\n />\n </Image>\n )}\n { !props.preview && !props.src && (\n <Image\n {...props.image}\n className='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.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 { type EditContainerProps } from '@performant-software/shared-components';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n type Element\n} from 'react';\nimport uuid from 'react-uuid';\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};\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 Operators = {\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 OperatorsByType = {\n [FilterTypes.boolean]: [\n Operators.equal\n ],\n [FilterTypes.date]: [\n Operators.equal\n ],\n [FilterTypes.relationship]: [\n Operators.equal,\n Operators.notEqual,\n Operators.empty,\n Operators.notEmpty\n ],\n [FilterTypes.select]: [\n Operators.equal,\n Operators.notEqual,\n Operators.empty,\n Operators.notEmpty\n ],\n [FilterTypes.string]: [\n Operators.equal,\n Operators.notEqual,\n Operators.contain,\n Operators.notContain,\n Operators.empty,\n Operators.notEmpty\n ],\n [FilterTypes.text]: [\n Operators.contain,\n Operators.notContain,\n Operators.empty,\n Operators.notEmpty\n ]\n};\n\nconst OperatorOptions = [{\n key: Operators.equal,\n value: Operators.equal,\n text: i18n.t('ListFilters.operators.equal')\n}, {\n key: Operators.notEqual,\n value: Operators.notEqual,\n text: i18n.t('ListFilters.operators.notEqual')\n}, {\n key: Operators.contain,\n value: Operators.contain,\n text: i18n.t('ListFilters.operators.contain')\n}, {\n key: Operators.notContain,\n value: Operators.notContain,\n text: i18n.t('ListFilters.operators.notContain')\n}, {\n key: Operators.empty,\n value: Operators.empty,\n text: i18n.t('ListFilters.operators.empty')\n}, {\n key: Operators.notEmpty,\n value: Operators.notEmpty,\n text: i18n.t('ListFilters.operators.notEmpty')\n}, {\n key: Operators.greaterThan,\n value: Operators.greaterThan,\n text: i18n.t('ListFilters.operators.greaterThan')\n}, {\n key: Operators.lessThan,\n value: Operators.lessThan,\n text: i18n.t('ListFilters.operators.lessThan')\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(OperatorOptions, (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 === Operators.empty || filter.operator === Operators.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', {\n ...filter,\n uid: uuid(),\n operator: Operators.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={() => {\n /*\n * If we're removing the last filter, call the onReset prop to ensure the UI doesn't display\n * as active.\n */\n if (props.item.filters && props.item.filters.length === 1) {\n props.onReset();\n } else {\n props.onDeleteChildAssociation('filters', filter);\n }\n }}\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};\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 { ReferenceCodesService } from '@performant-software/shared-components';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useState\n} from 'react';\nimport _ from 'underscore';\nimport { Dropdown } from 'semantic-ui-react';\n\ntype Item = {\n reference_table_id: number,\n key: string\n};\n\ntype Props = {\n fluid?: boolean,\n multiple?: boolean,\n onChange: (item: Item) => void,\n placeholder?: string,\n referenceTable: string,\n value: Item | Array<Item>\n};\n\nconst ReferenceCodeDropdown = (props: Props) => {\n const [loading, setLoading] = useState(false);\n const [options, setOptions] = useState([]);\n\n /**\n * Converts the passed ID to a reference code item.\n *\n * @type {function(*): {reference_code_id: *}}\n */\n const toItem = useCallback((id) => ({\n reference_code_id: id\n }), []);\n\n /**\n * Converts the passed reference code to a dropdown option.\n *\n * @type {function(*): {text: *, value: *, key: *}}\n */\n const toOption = useCallback((referenceCode) => ({\n key: referenceCode.id,\n value: referenceCode.id,\n text: referenceCode.name\n }), []);\n\n /**\n * Converts the selected values and calls the onChange prop.\n *\n * @type {(function(*, {value: *}): void)|*}\n */\n const onChange = useCallback((e, { value }) => {\n let values;\n\n if (props.multiple) {\n values = value;\n } else {\n values = _.compact([value]);\n }\n\n props.onChange(_.map(values, toItem));\n }, [toItem, props.multiple, props.onChange]);\n\n /**\n * Sets the \"value\" variable for the Dropdown component.\n */\n const value = useMemo(() => {\n const v = _.pluck(_.filter(props.value, (x) => !x._destroy), 'reference_code_id');\n return props.multiple ? v : _.first(v);\n }, [props.multiple, props.value]);\n\n /**\n * Loads the list of reference codes from the server.\n */\n useEffect(() => {\n setLoading(true);\n\n const params = {\n per_page: 0,\n reference_table: props.referenceTable,\n sort_by: 'name'\n };\n\n ReferenceCodesService\n .fetchAll(params)\n .then(({ data }) => setOptions(_.map(data.reference_codes, toOption)))\n .finally(() => setLoading(false));\n }, [toOption]);\n\n return (\n <Dropdown\n clearable\n disabled={loading}\n fluid={props.fluid}\n loading={loading}\n multiple={props.multiple}\n onChange={onChange}\n options={options}\n placeholder={props.placeholder}\n search\n selection\n selectOnBlur={false}\n value={value}\n />\n );\n};\n\nReferenceCodeDropdown.defaultProps = {\n fluid: true,\n multiple: false,\n placeholder: undefined\n};\n\nexport default ReferenceCodeDropdown;\n","// @flow\n\nimport React, { type ComponentType } from 'react';\nimport { withTranslation } from 'react-i18next';\nimport {\n Button,\n Header,\n Icon,\n Popup\n} from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\n\ntype Props = {\n label: string,\n onClick: () => void,\n referenceTable: string\n};\n\nconst ReferenceCodeFormLabel: ComponentType<any> = withTranslation()((props: Props) => (\n <div>\n <label\n htmlFor={props.referenceTable}\n >\n { props.label }\n </label>\n <Popup\n hoverable\n trigger={(\n <Icon\n name='info circle'\n style={{\n marginLeft: '0.3em'\n }}\n />\n )}\n >\n <Header\n content={props.label}\n />\n <p>{ i18n.t('ReferenceCodeFormLabel.content', { name: props.label })}</p>\n <Button\n content={i18n.t('Common.buttons.edit')}\n icon='edit'\n primary\n onClick={props.onClick}\n />\n </Popup>\n </div>\n));\n\nexport default ReferenceCodeFormLabel;\n","// @flow\n\nimport type { EditContainerProps } from '@performant-software/shared-components';\nimport React from 'react';\nimport { Form, Modal } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport ModalContext from '../context/ModalContext';\n\nconst ReferenceCodeModal = (props: EditContainerProps) => (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n as={Form}\n centered={false}\n mountNode={mountNode}\n open\n >\n <Modal.Header\n content={props.item.id\n ? i18n.t('ReferenceCodeModal.title.edit')\n : i18n.t('ReferenceCodeModal.title.add')}\n />\n <Modal.Content>\n <Form.Input\n error={props.isError('name')}\n label={i18n.t('ReferenceCodeModal.labels.name')}\n onChange={props.onTextInputChange.bind(this, 'name')}\n required={props.isRequired('name')}\n value={props.item.name}\n />\n </Modal.Content>\n { props.children }\n </Modal>\n )}\n </ModalContext.Consumer>\n);\n\nexport default ReferenceCodeModal;\n","// @flow\n\nimport type { EditContainerProps } from '@performant-software/shared-components';\nimport React from 'react';\nimport { Form, Header, Modal } from 'semantic-ui-react';\nimport i18n from '../i18n/i18n';\nimport EmbeddedList from './EmbeddedList';\nimport ModalContext from '../context/ModalContext';\nimport ReferenceCodeModal from './ReferenceCodeModal';\n\nconst ReferenceTableModal = (props: EditContainerProps) => (\n <ModalContext.Consumer>\n { (mountNode) => (\n <Modal\n as={Form}\n centered={false}\n className='reference-table-modal'\n mountNode={mountNode}\n open\n >\n <Modal.Header\n content={props.item.id\n ? i18n.t('ReferenceTableModal.title.edit')\n : i18n.t('ReferenceTableModal.title.add')}\n />\n <Modal.Content>\n <Form.Input\n error={props.isError('name')}\n label={i18n.t('ReferenceTableModal.labels.name')}\n onChange={props.onTextInputChange.bind(this, 'name')}\n required={props.isRequired('name')}\n value={props.item.name}\n />\n <Form.Input\n error={props.isError('key')}\n label={i18n.t('ReferenceTableModal.labels.key')}\n onChange={props.onTextInputChange.bind(this, 'key')}\n required={props.isRequired('key')}\n value={props.item.key}\n />\n <Header\n content={i18n.t('ReferenceTableModal.labels.referenceCodes')}\n />\n <EmbeddedList\n actions={[{\n name: 'edit'\n }, {\n name: 'copy'\n }, {\n name: 'delete'\n }]}\n columns={[{\n name: 'name',\n label: i18n.t('ReferenceTableModal.referenceCodes.columns.name')\n }]}\n items={props.item.reference_codes}\n modal={{\n component: ReferenceCodeModal,\n props: {\n required: ['name']\n }\n }}\n onDelete={props.onDeleteChildAssociation.bind(this, 'reference_codes')}\n onSave={props.onSaveChildAssociation.bind(this, 'reference_codes')}\n />\n </Modal.Content>\n { props.children }\n </Modal>\n )}\n </ModalContext.Consumer>\n);\n\nexport default ReferenceTableModal;\n","// @flow\n\nimport { ReferenceTablesService } from '@performant-software/shared-components';\nimport React, { type ComponentType, useState } from 'react';\nimport { Form } from 'semantic-ui-react';\nimport EditModal from './EditModal';\nimport ReferenceCodeDropdown from './ReferenceCodeDropdown';\nimport ReferenceCodeFormLabel from './ReferenceCodeFormLabel';\nimport ReferenceTableModal from './ReferenceTableModal';\n\ntype Props = {\n error?: boolean,\n label?: string,\n required?: boolean,\n referenceTable: string\n};\n\nconst ReferenceCodeFormDropdown: ComponentType<any> = (props: Props) => {\n const {\n error,\n label,\n required,\n referenceTable,\n ...rest\n } = props;\n\n const [modal, setModal] = useState(false);\n const [dropdownKey, setDropdownKey] = useState(0);\n\n return (\n <>\n <Form.Input\n error={error}\n label={(\n <ReferenceCodeFormLabel\n label={label}\n onClick={() => setModal(true)}\n referenceTable={referenceTable}\n />\n )}\n required={required}\n >\n <ReferenceCodeDropdown\n {...rest}\n id={referenceTable}\n referenceTable={referenceTable}\n key={dropdownKey}\n />\n </Form.Input>\n { modal && (\n <EditModal\n component={ReferenceTableModal}\n item={{ id: referenceTable, key: referenceTable }}\n onClose={() => setModal(false)}\n onInitialize={(key) => (\n ReferenceTablesService\n .fetchByKey(key)\n .then(({ data }) => ({\n ...data.reference_table,\n key\n }))\n )}\n onSave={(record) => (\n ReferenceTablesService\n .save(record)\n .then(({ data }) => data.reference_table)\n .then(() => setDropdownKey((prevKey) => prevKey + 1))\n .finally(() => setModal(false))\n )}\n />\n )}\n </>\n );\n};\n\nexport default ReferenceCodeFormDropdown;\n","// @flow\n\nimport { ReferenceTablesService } from '@performant-software/shared-components';\nimport React from 'react';\nimport ListTable from './ListTable';\nimport ReferenceTableModal from './ReferenceTableModal';\n\nconst ReferenceTablesList = () => (\n <ListTable\n actions={[{\n name: 'edit'\n }, {\n name: 'copy'\n }, {\n name: 'delete'\n }]}\n collectionName='reference_tables'\n columns={[{\n name: 'name',\n label: 'Name',\n sortable: true\n }, {\n name: 'key',\n label: 'Key',\n sortable: true\n }]}\n modal={{\n component: ReferenceTableModal,\n props: {\n onInitialize: (id) => (\n ReferenceTablesService\n .fetchOne(id)\n .then(({ data }) => data.reference_table)\n ),\n required: ['name', 'key']\n }\n }}\n onDelete={(referenceTable) => ReferenceTablesService.delete(referenceTable)}\n onLoad={(params) => ReferenceTablesService.fetchAll(params)}\n onSave={(referenceTable) => ReferenceTablesService.save(referenceTable)}\n />\n);\n\nexport default ReferenceTablesList;\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 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 useState,\n type ComponentType,\n type Element\n} from 'react';\nimport {\n Button,\n Form,\n Grid,\n Icon,\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,\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 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 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.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 [selectedItem, setSelectedItem] = useState();\n const [selectedItems, setSelectedItems] = useState(props.selectedItems || []);\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 * @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 (!props.multiple) {\n setSelectedItems([item]);\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 <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 { 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","var __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 = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(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 = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(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 = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\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(function(id) { return 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], function() { return __webpack_require__(790); })\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","pollingInterval","initializeState","polling","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","session","restoreSession","defaults","defaultPerPage","perPageOptions","defaultSearch","defaultSort","defaultSortDirection","error","value","ObjectUtils","selectedItem","onDelete","afterDelete","catch","onError","Promise","resolve","onDeleteAll","afterDeleteAll","resolveErrors","onChange","activePage","onSave","direction","component","isFilterActive","onFilterChange","onPageChange","onPerPageChange","onSort","onInit","renderSearch","content","searchable","Input","input","onKeyDown","Timer","onKeyUp","onSearch","onSearchChange","size","getSessionKey","sessionStorage","getItem","JSON","parse","setItem","stringify","DropdownButton","dropdownRef","useRef","basic","color","text","disabled","current","handleClick","Dropdown","floating","options","ref","scrolling","selectOnBlur","trigger","EditModal","OuterComponent","showToaster","setShowToaster","hasErrors","errors","showLoading","Dimmer","Loader","Modal","saving","primary","inline","onClose","useEditContainer","modalDelete","modalDeleteAll","modalEdit","modalFilter","location","buttons","addButton","deleteButton","modal","selectable","render","renderAddButton","renderDeleteAllButton","button","include","copy","onCopy","renderHeader","actions","getActions","renderEmptyMessage","renderFooter","renderEditModal","renderDeleteModal","renderDeleteAllModal","renderFilterModal","action","name","onEditButton","onCopyButton","onDeleteButton","onAddButton","Icon","index","accept","onDeleteAllButton","Confirm","header","Header","onCancel","onConfirm","open","Trans","i18nKey","onFilterButton","onSaveFilter","getButtons","hasPages","showCount","showRecordCount","Grid","columns","textAlign","renderRecordCount","renderPagination","renderListHeader","verticalAlign","renderButton","Menu","borderless","secondary","renderFilterButton","renderPerPage","Pagination","firstItem","lastItem","totalPages","Number","toLocaleString","onColumnClick","renderEmptyRow","useList","renderActions","useCallback","title","renderCheckbox","Checkbox","el","onRowSelect","checked","selectedRows","find","r","useDataList","useMemo","getRootItems","sortDropdown","sortValue","sort","renderSort","fontSize","AccordionList","modalAdd","searchQuery","onAddItem","loaded","lazyLoad","selectedPage","parentId","pagination","pageCount","autoFocus","renderHeaderAddButton","map","b","renderSubHeader","renderAddModal","canAddItem","onSelectAll","selectedRowIds","toBeSelected","reduce","tbs","includes","renderSelectAll","canDeleteItem","canEditItem","canCopyItem","hideAddRootButton","recordCount","selected","renderEditButton","renderCopyButton","renderDeleteButton","renderSelectCheckbox","React","Segment","isSelected","AccordionSelector","selectedItems","isSelectable","multiple","mountNode","width","onItemSelection","withTranslation","vertical","onRight","onLeft","AssociatedDropdown","clearTimeout","onSelection","option","renderOption","onBlur","onOptionSelection","onOpen","placeholder","searchInput","selection","upward","renderClearButton","renderModal","required","onClear","onInitialize","record","setTimeout","ColorButton","cursor","height","ColorPickerModal","selectedColor","SketchPicker","disableAlpha","onChangeComplete","onMouseDown","role","drop","useDrop","hover","monitor","dragIndex","hoverIndex","hoverBoundingRect","getBoundingClientRect","hoverMiddleY","bottom","top","hoverClientY","getClientOffset","y","onDrag","useDrag","collect","isDragging","drag","opacity","Ref","innerRef","DataTable","columnRefs","onMouseMove","onMouseUp","resize","activePanel","initializeColumnRefs","onPreventClick","onColumnResize","afterColumnResize","Browser","document","addEventListener","c","createRef","removeEventListener","columnCount","columnRef","offset","pageX","allSelected","isRowSelected","Table","tableProps","renderSelectHeader","renderHeaderCell","renderActionsHeader","renderEmptyTableRow","renderLoading","actionButton","popup","Popup","hideOnScroll","mouseEnterDelay","position","filter","renderActionButton","column","hidden","colSpan","getColumnCount","sorted","label","offsetWidth","renderCell","expandableRows","target","nodeName","expandPanel","anchoredColumns","splice","closeOnBlur","onColumnCheckbox","DropdownMenu","setOpen","onMouseEnter","onMouseLeave","setAttribute","renderDropdownItem","renderMenuItem","renderDropdown","contextRef","renderMenu","fixed","List","activeSort","setActiveSort","onSortChange","newSort","sorts","celled","DataView","activeItem","setActiveItem","selectedRecord","setSelectedRecord","setColumns","menu","setMenu","paddingLeft","setPaddingLeft","setKey","menuRef","url","substr","lastIndexOf","mergeColumns","keys","flatten","uniq","cols","col","columnValue","defaultValue","trim","replace","toUpperCase","replaceAll","sortable","resolveValue","axios","itemKey","response","attribute","Boolean","toString","group","menuItems","headers","layout","marginLeft","as","Form","centered","closeIcon","doubling","ListTable","prevColumns","Hooks","sortableColumn","configurable","DatabaseView","selectedTable","setSelectedTable","tables","setTables","service","getColumns","getData","getTables","column_name","dataType","data_type","Date","toLocaleDateString","table_name","test","table","overflow","MAX_SAFE_INTEGER","date","iconPosition","readOnly","display","locale","formatOptions","preventDefault","DatePicker","calendar","setCalendar","calendarWrapper","onDocumentClick","event","calendarInstance","contains","zIndex","closeOnSelection","next2AriaLabel","next2Label","nextAriaLabel","nextLabel","prev2AriaLabel","prev2Label","prevAriaLabel","prevLabel","DescriptorField","popupContent","hoverable","delayInterval","renderPopup","wide","filename","download","uuid","href","EditPage","currentTab","tab","noValidate","renderButtons","renderComponent","renderToaster","EmbeddedList","_destroy","uid","getItems","orderBy","property","sortProperty","split","ordered","reverse","FileInputButton","buttonProps","fileInputRef","click","fileList","array","toArray","files","FileUpload","fileInput","filePattern","fileTypes","RegExp","dataTransfer","validate","onFilesAdded","onClickDropzone","onDragLeave","onDragOver","onDrop","onDropFiles","tabIndex","maxSize","validFiles","file","valid","match","exec","FileUploadModal","getInitialState","includeButton","onAddFile","idAttribute","validateItem","save","renderErrors","onAddFiles","renderItems","onDismissErrors","renderMessageItem","FileItem","itemComponent","isError","isRequired","onAssociationInputChange","onTextInputChange","onUpdate","Item","divided","relaxed","fields","FuzzyDate","Calendar","initializeDate","startDate","endDate","dateComponent","convertToDate","format","accuracy","description","range","parseDate","setDisplay","onAccuracyChange","getDefaultDate","month","getDefaultMonth","setEndDate","toDate","year","parseInt","onEdit","radio","renderYear","renderMonth","renderDate","onRangeChange","TextArea","onDescriptionChange","daysInMonth","onDateChange","onMonthChange","listMonths","m","onYearChange","getDisplayDate","addYear","addMonth","addDate","navigator","language","GoogleMap","Map","defaultCenter","center","setCenter","setMap","defaultZoom","onDragEnd","latLng","lat","bounds","getBounds","mapContainerClassName","mapContainerStyle","containerStyle","zoom","Marker","draggable","searchBox","setSearchBox","onPlacesChanged","place","getPlaces","geometry","formatted_address","onLocationSelection","result","StandaloneSearchBox","s","HorizontalCards","marginWidth","setMarginWidth","pageWidth","setPageWidth","scrollPage","setScrollPage","scrollPages","setScrollPages","instance","clientWidth","scrollWidth","Math","ceil","child","firstChild","window","getComputedStyle","leftMargin","parseFloat","rightMargin","marginRight","scrollTo","left","behavior","increment","nextPage","getCardStyle","flex","renderImage","image","Image","alt","src","objectFit","Card","link","inlineImage","renderMeta","renderDescription","renderExtra","extra","circular","Items","getClassName","renderList","renderGrid","renderEmptyList","card","actionIndex","resolveColor","resolveIcon","padded","view","renderCard","listItem","resolveName","renderAdditionalContent","getSortValue","ItemCollection","endIndex","slice","onBottomReached","InfiniteScroll","context","scrollOffset","ItemList","htmlFor","KeyboardField","showKeyboard","renderLabel","onInputChange","hide","show","Keyboard","onKeyboardChange","keyboardClass","onRemoveItem","findIndex","onUpdateItem","withBatchEdit","LazyDocument","dimmer","setDimmer","contentType","setContentType","preview","fetch","blob","Document","Page","pageNumber","dimmable","Visibility","fireOnMount","onTopVisible","PhotoViewer","LazyImage","setModal","VideoPlayer","embedRef","placeholderAlt","querySelector","embedded","Embed","autoPlay","iframe","allow","video","controls","LazyVideo","FilterTypes","boolean","integer","relationship","select","string","Operators","OperatorsByType","OperatorOptions","getOperatorsByType","operators","onDefaultSort","renderInput","operator","onSaveChildAssociation","renderSearchQuery","onReset","onDeleteChildAssociation","dimmed","LoginModal","loginFailed","onUsernameChange","onPasswordChange","onLogin","MasonryLayout","columnWrapper","columnIndex","marginBottom","gap","MasonryTile","dimmerActive","setDimmerActive","setHeight","random","subheader","subtitle","renderEmpty","PlayButton","setVideo","mountOnShow","onPrevious","onNext","setItems","stackable","transform","ModalDropdown","modalVisible","ReferenceCodeDropdown","setLoading","setOptions","toItem","reference_code_id","toOption","referenceCode","values","v","x","reference_table","referenceTable","ReferenceCodesService","reference_codes","finally","clearable","ReferenceCodeModal","rest","dropdownKey","setDropdownKey","ReferenceTableModal","ReferenceTablesService","prevKey","RemoteDropdown","dropdown","Array","isArray","getValues","getOption","allowAdditions","renderAddOption","renderLoadMoreOption","getOptions","close","getClassNames","getSearchOptions","Section","Divider","SelectizeGrid","renderCheckmark","onSelect","Selectize","setSelectedItem","setSelectedItems","prevItems","TabbedModal","Element","Tab","classes","inlineTabs","tabs","t","getModalClasses","getHeaderClasses","float","renderTab","displayName","pointing","onTabClick","tags","tag","Label","config","background","Thumbnail","visibility","VideoFrameSelector","setDuration","defaultInterval","interval","time","setTime","videoRef","currentTime","crossOrigin","onLoadedMetadata","min","max","step","canvas","createElement","videoWidth","videoHeight","getContext","drawImage","toBlob","File","lastModified","getTime","ViewXML","showModal","setShowModal","OpenerComponent","opener","openerProps","highlighter","xml","maxHeight","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","Object","every","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","self","forEach","__webpack_exports__"],"sourceRoot":""}
|