-
Notifications
You must be signed in to change notification settings - Fork 0
/
ConnectedStandaloneRouting~IHEInvokeImageDisplay~StudyListRouting~ViewerLocalFileData~ViewerRouting.bundle.306eae980b062b935343.js.map
1 lines (1 loc) · 29.4 KB
/
ConnectedStandaloneRouting~IHEInvokeImageDisplay~StudyListRouting~ViewerLocalFileData~ViewerRouting.bundle.306eae980b062b935343.js.map
1
{"version":3,"sources":["webpack:///./components/UserPreferences/hotkeysConfig.js","webpack:///./components/UserPreferences/hotkeysValidators.js","webpack:///./components/UserPreferences/HotkeysPreferences.js","webpack:///./components/UserPreferences/WindowLevelPreferences.js","webpack:///./components/UserPreferences/GeneralPreferences.js","webpack:///./components/UserPreferences/UserPreferences.js","webpack:///./components/Header/Header.js","webpack:///./connectedComponents/ConnectedHeader.js"],"names":["MODIFIER_KEYS","DISALLOWED_COMBINATIONS","alt","shift","ctrl","formatPressedKeys","pressedKeysArray","join","ERROR_MESSAGES","hotkeysValidators","pressedKeys","length","hasError","errorMessage","lastPressedKey","includes","commandName","conflictingCommand","hotkeys","currentCommandName","firstConflictingCommand","undefined","formatedPressedHotkeys","toolHotkeys","keys","findConflictingCommand","label","modifierCommand","slice","disallowedCombination","initialState","hotkeyDefinitions","errors","validateCommandKey","validation","validator","splitHotkeys","splitedHotkeys","arrayHotkeys","Object","entries","halfwayThrough","Math","ceil","push","HotkeysPreferences","onClose","t","useTranslation","hotkeyDefaults","hotkeysManager","useState","state","setState","snackbar","useSnackbarContext","hasErrors","some","key","hasHotkeys","Fragment","className","map","index","hotkey","hotkeyDefinition","data-key","classnames","modifier_keys","handleChange","prevState","onHotkeyChanged","classNames","onResetPreferences","defaultHotKeyDefinitions","item","values","onSave","setHotkeys","localStorage","setItem","JSON","stringify","show","message","type","onCancel","propTypes","PropTypes","func","actions","redux","WindowLevelPreferences","dispatch","useDispatch","windowLevelData","useSelector","preferences","handleInputChange","event","$target","target","dataset","inputname","inputValue","value","description","data-inputname","onChange","window","level","setUserPreferences","GeneralPreferences","currentLanguage","i18n","language","availableLanguages","setLanguage","htmlFor","onLanguageChange","languages","defaultLanguage","changeLanguage","tabs","name","Component","customProps","UserPreferences","hide","Header","props","user","userManager","modal","useLargeLogo","linkPath","linkText","location","children","options","setOptions","hasLink","useEffect","optionsValue","title","icon","onClick","content","AboutContent","signoutRedirect","studyLink","to","pathname","list","align","string","bool","object","isRequired","node","defaultProps","OHIFLogo","withTranslation","withRouter","withModal","ConnectedHeader","connect","oidc"],"mappings":"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","file":"ConnectedStandaloneRouting~IHEInvokeImageDisplay~StudyListRouting~ViewerLocalFileData~ViewerRouting.bundle.306eae980b062b935343.js","sourcesContent":["const range = (start, end) => {\n return new Array(end - start).fill().map((d, i) => i + start);\n};\n\nexport const MODIFIER_KEYS = ['ctrl', 'alt', 'shift'];\n\nexport const DISALLOWED_COMBINATIONS = {\n '': [],\n alt: ['space'],\n shift: [],\n ctrl: [\n 'f4',\n 'f5',\n 'f11',\n 'w',\n 'r',\n 't',\n 'o',\n 'p',\n 'a',\n 'd',\n 'f',\n 'g',\n 'h',\n 'j',\n 'l',\n 'z',\n 'x',\n 'c',\n 'v',\n 'b',\n 'n',\n 'pagedown',\n 'pageup',\n ],\n 'ctrl+shift': ['q', 'w', 'r', 't', 'p', 'a', 'h', 'v', 'b', 'n'],\n};\n\nexport const SPECIAL_KEYS = {\n 8: 'backspace',\n 9: 'tab',\n 13: 'return',\n 16: 'shift',\n 17: 'ctrl',\n 18: 'alt',\n 19: 'pause',\n 20: 'capslock',\n 27: 'esc',\n 32: 'space',\n 33: 'pageup',\n 34: 'pagedown',\n 35: 'end',\n 36: 'home',\n 37: 'left',\n 38: 'up',\n 39: 'right',\n 40: 'down',\n 45: 'insert',\n 46: 'del',\n 96: '0',\n 97: '1',\n 98: '2',\n 99: '3',\n 100: '4',\n 101: '5',\n 102: '6',\n 103: '7',\n 104: '8',\n 105: '9',\n 106: '*',\n 107: '+',\n 109: '-',\n 110: '.',\n 111: '/',\n 112: 'f1',\n 113: 'f2',\n 114: 'f3',\n 115: 'f4',\n 116: 'f5',\n 117: 'f6',\n 118: 'f7',\n 119: 'f8',\n 120: 'f9',\n 121: 'f10',\n 122: 'f11',\n 123: 'f12',\n 144: 'numlock',\n 145: 'scroll',\n 191: '/',\n 224: 'meta',\n};\n","import { MODIFIER_KEYS, DISALLOWED_COMBINATIONS } from './hotkeysConfig';\n\nconst formatPressedKeys = pressedKeysArray => pressedKeysArray.join('+');\n\nconst findConflictingCommand = (hotkeys, currentCommandName, pressedKeys) => {\n let firstConflictingCommand = undefined;\n const formatedPressedHotkeys = formatPressedKeys(pressedKeys);\n\n for (const commandName in hotkeys) {\n const toolHotkeys = hotkeys[commandName].keys;\n const formatedToolHotkeys = formatPressedKeys(toolHotkeys);\n\n if (\n formatedPressedHotkeys === formatedToolHotkeys &&\n commandName !== currentCommandName\n ) {\n firstConflictingCommand = hotkeys[commandName];\n break;\n }\n }\n\n return firstConflictingCommand;\n};\n\nconst ERROR_MESSAGES = {\n MODIFIER:\n \"It's not possible to define only modifier keys (ctrl, alt and shift) as a shortcut\",\n EMPTY: \"Field can't be empty.\",\n};\n\n// VALIDATORS\n\nconst modifierValidator = ({ pressedKeys }) => {\n const lastPressedKey = pressedKeys[pressedKeys.length - 1];\n // Check if it has a valid modifier\n const isModifier = MODIFIER_KEYS.includes(lastPressedKey);\n if (isModifier) {\n return {\n hasError: true,\n errorMessage: ERROR_MESSAGES.MODIFIER,\n };\n }\n};\n\nconst emptyValidator = ({ pressedKeys = [] }) => {\n if (!pressedKeys.length) {\n return {\n hasError: true,\n errorMessage: ERROR_MESSAGES.EMPTY,\n };\n }\n};\n\nconst conflictingValidator = ({ commandName, pressedKeys, hotkeys }) => {\n const conflictingCommand = findConflictingCommand(\n hotkeys,\n commandName,\n pressedKeys\n );\n\n if (conflictingCommand) {\n return {\n hasError: true,\n errorMessage: `\"${conflictingCommand.label}\" is already using the \"${pressedKeys}\" shortcut.`,\n };\n }\n};\n\nconst disallowedValidator = ({ pressedKeys = [] }) => {\n const lastPressedKey = pressedKeys[pressedKeys.length - 1];\n const modifierCommand = formatPressedKeys(\n pressedKeys.slice(0, pressedKeys.length - 1)\n );\n\n const disallowedCombination = DISALLOWED_COMBINATIONS[modifierCommand];\n const hasDisallowedCombinations = disallowedCombination\n ? disallowedCombination.includes(lastPressedKey)\n : false;\n\n if (hasDisallowedCombinations) {\n return {\n hasError: true,\n errorMessage: `\"${formatPressedKeys(\n pressedKeys\n )}\" shortcut combination is not allowed`,\n };\n }\n};\n\nconst hotkeysValidators = [\n emptyValidator,\n modifierValidator,\n conflictingValidator,\n disallowedValidator,\n];\n\nexport { hotkeysValidators };\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\n\nimport { useSnackbarContext, TabFooter, HotkeyField } from '@ohif/ui';\nimport { useTranslation } from 'react-i18next';\n\nimport { hotkeysValidators } from './hotkeysValidators';\nimport { MODIFIER_KEYS } from './hotkeysConfig';\n\nimport { hotkeysManager } from '../../App';\n\nimport './HotkeysPreferences.styl';\n/**\n * Take hotkeyDefenintions and build an initialState to be used into the component state\n *\n * @param {Object} hotkeyDefinitions\n * @returns {Object} initialState\n */\nconst initialState = hotkeyDefinitions => ({\n hotkeys: { ...hotkeyDefinitions },\n errors: {},\n});\n/**\n * Take the updated command and keys and validate the changes with all validators\n *\n * @param {Object} arguments\n * @param {string} arguments.commandName command name string to be updated\n * @param {array} arguments.pressedKeys new array of keys to be added for the commandName\n * @param {array} arguments.hotkeys all hotkeys currently into the app\n * @returns {Object} {errorMessage} errorMessage coming from any of the validator or undefined if none\n */\nconst validateCommandKey = ({ commandName, pressedKeys, hotkeys }) => {\n for (const validator of hotkeysValidators) {\n const validation = validator({\n commandName,\n pressedKeys,\n hotkeys,\n });\n if (validation && validation.hasError) {\n return validation;\n }\n }\n\n return {\n errorMessage: undefined,\n };\n};\n\n/**\n * Take all hotkeys and split the list into two lists\n *\n * @param {array} hotkeys list of all hotkeys\n * @returns {array} array containing two arrays of keys\n */\nconst splitHotkeys = hotkeys => {\n const splitedHotkeys = [];\n const arrayHotkeys = Object.entries(hotkeys);\n\n if (arrayHotkeys.length) {\n const halfwayThrough = Math.ceil(arrayHotkeys.length / 2);\n splitedHotkeys.push(arrayHotkeys.slice(0, halfwayThrough));\n splitedHotkeys.push(\n arrayHotkeys.slice(halfwayThrough, arrayHotkeys.length)\n );\n }\n\n return splitedHotkeys;\n};\n\n/**\n * HotkeysPreferences tab\n * It renders all hotkeys displayed into columns/rows\n *\n * It stores current state and whenever it changes, component messages parent of new value (through function callback)\n * @param {object} props component props\n * @param {string} props.onClose\n */\nfunction HotkeysPreferences({ onClose }) {\n const { t } = useTranslation('UserPreferencesModal');\n const { hotkeyDefaults, hotkeyDefinitions } = hotkeysManager;\n\n const [state, setState] = useState(initialState(hotkeyDefinitions));\n\n const snackbar = useSnackbarContext();\n\n const onResetPreferences = () => {\n const defaultHotKeyDefinitions = {};\n\n hotkeyDefaults.map(item => {\n const { commandName, ...values } = item;\n defaultHotKeyDefinitions[commandName] = { ...values };\n });\n\n setState(initialState(defaultHotKeyDefinitions));\n };\n\n const onSave = () => {\n const { hotkeys } = state;\n\n hotkeysManager.setHotkeys(hotkeys);\n\n localStorage.setItem('hotkey-definitions', JSON.stringify(hotkeys));\n\n onClose();\n\n snackbar.show({\n message: t('SaveMessage'),\n type: 'success',\n });\n };\n\n const onHotkeyChanged = (commandName, hotkeyDefinition, keys) => {\n const { errorMessage } = validateCommandKey({\n commandName,\n pressedKeys: keys,\n hotkeys: state.hotkeys,\n });\n\n setState(prevState => ({\n hotkeys: {\n ...prevState.hotkeys,\n [commandName]: { ...hotkeyDefinition, keys },\n },\n errors: {\n ...prevState.errors,\n [commandName]: errorMessage,\n },\n }));\n };\n\n const hasErrors = Object.keys(state.errors).some(key => !!state.errors[key]);\n const hasHotkeys = Object.keys(state.hotkeys).length;\n const splitedHotkeys = splitHotkeys(state.hotkeys);\n\n return (\n <React.Fragment>\n <div className=\"HotkeysPreferences\">\n {hasHotkeys ? (\n <div className=\"hotkeyTable\">\n {splitedHotkeys.map((hotkeys, index) => {\n return (\n <div className=\"hotkeyColumn\" key={index}>\n <div className=\"hotkeyHeader\">\n <div className=\"headerItemText text-right\">Function</div>\n <div className=\"headerItemText text-center\">Shortcut</div>\n </div>\n {hotkeys.map(hotkey => {\n const commandName = hotkey[0];\n const hotkeyDefinition = hotkey[1];\n const { keys, label } = hotkeyDefinition;\n const errorMessage = state.errors[hotkey[0]];\n const handleChange = keys => {\n onHotkeyChanged(commandName, hotkeyDefinition, keys);\n };\n\n return (\n <div key={commandName} className=\"hotkeyRow\">\n <div className=\"hotkeyLabel\">{label}</div>\n <div\n data-key=\"defaultTool\"\n className={classnames(\n 'wrapperHotkeyInput',\n errorMessage ? 'stateError' : ''\n )}\n >\n <HotkeyField\n keys={keys}\n modifier_keys={MODIFIER_KEYS}\n handleChange={handleChange}\n classNames={'preferencesInput'}\n ></HotkeyField>\n <span className=\"preferencesInputErrorMessage\">\n {errorMessage}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n ) : (\n 'Hotkeys definitions is empty'\n )}\n </div>\n <TabFooter\n onResetPreferences={onResetPreferences}\n onSave={onSave}\n onCancel={onClose}\n hasErrors={hasErrors}\n t={t}\n />\n </React.Fragment>\n );\n}\n\nHotkeysPreferences.propTypes = {\n onClose: PropTypes.func,\n};\n\nexport { HotkeysPreferences };\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { redux } from '@ohif/core';\n\nimport { TabFooter, useSnackbarContext } from '@ohif/ui';\nimport { useTranslation } from 'react-i18next';\n\nconst { actions } = redux;\n\nimport './WindowLevelPreferences.styl';\n\nfunction WindowLevelPreferences({ onClose }) {\n const dispatch = useDispatch();\n\n const windowLevelData = useSelector(state => {\n const { preferences = {} } = state;\n const { windowLevelData } = preferences;\n\n return windowLevelData;\n });\n\n const [state, setState] = useState({\n values: { ...windowLevelData },\n });\n\n const { t } = useTranslation('UserPreferencesModal');\n const onResetPreferences = () => {};\n const hasErrors = false;\n const onSave = () => {\n dispatch(actions.setUserPreferences({ windowLevelData: state.values }));\n\n onClose();\n\n snackbar.show({\n message: t('SaveMessage'),\n type: 'success',\n });\n };\n\n const snackbar = useSnackbarContext();\n\n const handleInputChange = event => {\n const $target = event.target;\n const { key, inputname } = $target.dataset;\n const inputValue = $target.value;\n\n if (!state.values[key] || !state.values[key][inputname]) {\n return;\n }\n\n setState(prevState => ({\n ...prevState,\n values: {\n ...prevState.values,\n [key]: {\n ...prevState.values[key],\n [inputname]: inputValue,\n },\n },\n }));\n };\n\n return (\n <React.Fragment>\n <div className=\"WindowLevelPreferences\">\n <div className=\"wlColumn\">\n <div className=\"wlRow header\">\n <div className=\"wlColumn preset\">Preset</div>\n <div className=\"wlColumn description\">Description</div>\n <div className=\"wlColumn window\">Window</div>\n <div className=\"wlColumn level\">Level</div>\n </div>\n {Object.keys(state.values).map((key, index) => {\n return (\n <div className=\"wlRow\" key={key}>\n <div className=\"wlColumn preset\">{key}</div>\n <div className=\"wlColumn description\">\n <input\n type=\"text\"\n className=\"preferencesInput\"\n value={state.values[key].description}\n data-key={key}\n data-inputname=\"description\"\n onChange={handleInputChange}\n />\n </div>\n <div className=\"wlColumn window\">\n <input\n type=\"number\"\n className=\"preferencesInput\"\n value={state.values[key].window}\n data-key={key}\n data-inputname=\"window\"\n onChange={handleInputChange}\n />\n </div>\n <div className=\"wlColumn level\">\n <input\n type=\"number\"\n className=\"preferencesInput\"\n value={state.values[key].level}\n data-key={key}\n data-inputname=\"level\"\n onChange={handleInputChange}\n />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n <TabFooter\n onResetPreferences={onResetPreferences}\n onSave={onSave}\n onCancel={onClose}\n hasErrors={hasErrors}\n t={t}\n />\n </React.Fragment>\n );\n}\n\nWindowLevelPreferences.propTypes = {\n onClose: PropTypes.func,\n};\n\nexport { WindowLevelPreferences };\n","import React, { useState, useSelector } from 'react';\nimport PropTypes from 'prop-types';\n\nimport i18n from '@ohif/i18n';\n\nimport { TabFooter, LanguageSwitcher, useSnackbarContext } from '@ohif/ui';\nimport { useTranslation } from 'react-i18next';\n\nimport './GeneralPreferences.styl';\n\n/**\n * General Preferences tab\n * It renders the General Preferences content\n *\n * @param {object} props component props\n * @param {function} props.onClose\n */\nfunction GeneralPreferences({ onClose }) {\n const { t } = useTranslation('UserPreferencesModal');\n const snackbar = useSnackbarContext();\n const currentLanguage = i18n.language;\n const { availableLanguages } = i18n;\n\n const [language, setLanguage] = useState(currentLanguage);\n\n const onResetPreferences = () => {\n setLanguage(i18n.defaultLanguage);\n };\n\n const onSave = () => {\n i18n.changeLanguage(language);\n\n onClose();\n\n snackbar.show({\n message: t('SaveMessage'),\n type: 'success',\n });\n };\n\n const hasErrors = false;\n\n return (\n <React.Fragment>\n <div className=\"GeneralPreferences\">\n <div className=\"language\">\n <label htmlFor=\"language-select\" className=\"languageLabel\">\n Language\n </label>\n <LanguageSwitcher\n language={language}\n onLanguageChange={setLanguage}\n languages={availableLanguages}\n />\n </div>\n </div>\n <TabFooter\n onResetPreferences={onResetPreferences}\n onSave={onSave}\n onCancel={onClose}\n hasErrors={hasErrors}\n t={t}\n />\n </React.Fragment>\n );\n}\n\nGeneralPreferences.propTypes = {\n onClose: PropTypes.func,\n};\n\nexport { GeneralPreferences };\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { TabComponents } from '@ohif/ui';\n\n// Tabs\nimport { HotkeysPreferences } from './HotkeysPreferences';\nimport { WindowLevelPreferences } from './WindowLevelPreferences';\nimport { GeneralPreferences } from './GeneralPreferences';\n\nimport './UserPreferences.styl';\n\nconst tabs = [\n {\n name: 'Hotkeys',\n Component: HotkeysPreferences,\n customProps: {},\n },\n {\n name: 'General',\n Component: GeneralPreferences,\n customProps: {},\n },\n {\n name: 'Window Level',\n Component: WindowLevelPreferences,\n customProps: {},\n },\n];\n\nfunction UserPreferences({ hide }) {\n const customProps = {\n onClose: hide,\n };\n return <TabComponents tabs={tabs} customProps={customProps} />;\n}\n\nUserPreferences.propTypes = {\n hide: PropTypes.func,\n};\n\nexport { UserPreferences };\n","import React, { useState, useEffect } from 'react';\nimport { Link, withRouter } from 'react-router-dom';\nimport { withTranslation } from 'react-i18next';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { Dropdown, AboutContent, withModal } from '@ohif/ui';\n//\nimport { UserPreferences } from './../UserPreferences';\nimport OHIFLogo from '../OHIFLogo/OHIFLogo.js';\nimport './Header.css';\n\nfunction Header(props) {\n const {\n t,\n user,\n userManager,\n modal: { show },\n useLargeLogo,\n linkPath,\n linkText,\n location,\n children,\n } = props;\n\n const [options, setOptions] = useState([]);\n const hasLink = linkText && linkPath;\n\n useEffect(() => {\n const optionsValue = [\n {\n title: t('About'),\n icon: { name: 'info' },\n onClick: () =>\n show({\n content: AboutContent,\n title: t('OHIF Viewer - About'),\n }),\n },\n {\n title: t('Preferences'),\n icon: {\n name: 'user',\n },\n onClick: () =>\n show({\n content: UserPreferences,\n title: t('User Preferences'),\n }),\n },\n ];\n\n if (user && userManager) {\n optionsValue.push({\n title: t('Logout'),\n icon: { name: 'power-off' },\n onClick: () => userManager.signoutRedirect(),\n });\n }\n\n setOptions(optionsValue);\n }, [setOptions, show, t, user, userManager]);\n\n return (\n <>\n <div\n className={classNames('entry-header', { 'header-big': useLargeLogo })}\n >\n <div className=\"header-left-box\">\n {location && location.studyLink && (\n <Link\n to={location.studyLink}\n className=\"header-btn header-viewerLink\"\n >\n {t('Back to Viewer')}\n </Link>\n )}\n\n {children}\n\n {hasLink && (\n <Link\n className=\"header-btn header-studyListLinkSection\"\n to={{\n pathname: linkPath,\n state: { studyLink: location.pathname },\n }}\n >\n {t(linkText)}\n </Link>\n )}\n </div>\n\n <div className=\"header-menu\">\n <Dropdown title={t('Options')} list={options} align=\"right\" />\n </div>\n </div>\n </>\n );\n}\n\nHeader.propTypes = {\n // Study list, /\n linkText: PropTypes.string,\n linkPath: PropTypes.string,\n useLargeLogo: PropTypes.bool,\n //\n location: PropTypes.object.isRequired,\n children: PropTypes.node,\n t: PropTypes.func.isRequired,\n userManager: PropTypes.object,\n user: PropTypes.object,\n modal: PropTypes.object,\n};\n\nHeader.defaultProps = {\n useLargeLogo: false,\n children: OHIFLogo(),\n};\n\nexport default withTranslation(['Header', 'AboutModal'])(\n withRouter(withModal(Header))\n);\n","import Header from '../components/Header/Header.js';\nimport { connect } from 'react-redux';\n\nconst mapStateToProps = state => {\n return {\n user: state.oidc && state.oidc.user,\n };\n};\n\nconst ConnectedHeader = connect(mapStateToProps)(Header);\n\nexport default ConnectedHeader;\n"],"sourceRoot":""}