UNPKG

@ant-design/pro-layout

Version:
518 lines (512 loc) 19.9 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.getFormatMessage = exports.SettingDrawer = void 0; var _regeneratorRuntime2 = _interopRequireDefault(require("@babel/runtime/helpers/regeneratorRuntime")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _icons = require("@ant-design/icons"); var _proUtils = require("@ant-design/pro-utils"); var _useParams = require("@umijs/use-params"); var _antd = require("antd"); var _useMergedState5 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState")); var _omit = _interopRequireDefault(require("rc-util/lib/omit")); var _react = _interopRequireWildcard(require("react")); var _defaultSettings = require("../../defaultSettings"); var _locales = require("../../locales"); var _utils = require("../../utils/utils"); var _BlockCheckbox = require("./BlockCheckbox"); var _LayoutChange = require("./LayoutChange"); var _RegionalChange = require("./RegionalChange"); var _ThemeColor = require("./ThemeColor"); var _group = require("./icon/group"); var _sub = require("./icon/sub"); var _index = require("./style/index"); var _jsxRuntime = require("react/jsx-runtime"); var Body = function Body(_ref) { var children = _ref.children, hashId = _ref.hashId, prefixCls = _ref.prefixCls, title = _ref.title; return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", { style: { marginBlockEnd: 12 }, children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h3", { className: "".concat(prefixCls, "-body-title ").concat(hashId).trim(), children: title }), children] }); }; var getDifferentSetting = function getDifferentSetting(state) { var stateObj = {}; Object.keys(state).forEach(function (key) { if (state[key] !== _defaultSettings.defaultSettings[key] && //@ts-ignore key !== 'collapse') { stateObj[key] = state[key]; } else { stateObj[key] = undefined; } if (key.includes('Render')) stateObj[key] = state[key] === false ? false : undefined; }); stateObj.menu = undefined; return stateObj; }; var getFormatMessage = exports.getFormatMessage = function getFormatMessage() { var formatMessage = function formatMessage(_ref2) { var id = _ref2.id; var locales = (0, _locales.gLocaleObject)(); return locales[id]; }; return formatMessage; }; /** * 初始化的时候需要做的工作 * * @param param0 */ var initState = function initState(urlParams, settings, onSettingChange) { if (!(0, _proUtils.isBrowser)()) return; var replaceSetting = {}; Object.keys(urlParams).forEach(function (key) { if (_defaultSettings.defaultSettings[key] || _defaultSettings.defaultSettings[key] === undefined) { if (key === 'colorPrimary') { replaceSetting[key] = (0, _utils.genStringToTheme)(urlParams[key]); return; } replaceSetting[key] = urlParams[key]; } }); var newSettings = (0, _proUtils.merge)({}, settings, replaceSetting); delete newSettings.menu; delete newSettings.title; delete newSettings.iconfontUrl; // 同步数据到外部 onSettingChange === null || onSettingChange === void 0 || onSettingChange(newSettings); }; var getParamsFromUrl = function getParamsFromUrl(urlParams, settings) { if (!(0, _proUtils.isBrowser)()) return _defaultSettings.defaultSettings; return (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, _defaultSettings.defaultSettings), settings || {}), urlParams); }; var genCopySettingJson = function genCopySettingJson(settingState) { return JSON.stringify((0, _omit.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, settingState), {}, { colorPrimary: settingState.colorPrimary }), ['colorWeak']), null, 2); }; /** * 可视化配置组件 * * @param props */ var SettingDrawer = exports.SettingDrawer = function SettingDrawer(props) { var _props$defaultSetting = props.defaultSettings, propsDefaultSettings = _props$defaultSetting === void 0 ? undefined : _props$defaultSetting, _props$settings = props.settings, propsSettings = _props$settings === void 0 ? undefined : _props$settings, hideHintAlert = props.hideHintAlert, hideCopyButton = props.hideCopyButton, _props$colorList = props.colorList, colorList = _props$colorList === void 0 ? [{ key: 'techBlue', color: '#1677FF' }, { key: 'daybreak', color: '#1890ff' }, { key: 'dust', color: '#F5222D' }, { key: 'volcano', color: '#FA541C' }, { key: 'sunset', color: '#FAAD14' }, { key: 'cyan', color: '#13C2C2' }, { key: 'green', color: '#52C41A' }, { key: 'geekblue', color: '#2F54EB' }, { key: 'purple', color: '#722ED1' }] : _props$colorList, getContainer = props.getContainer, onSettingChange = props.onSettingChange, enableDarkTheme = props.enableDarkTheme, _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? 'ant-pro' : _props$prefixCls, _props$pathname = props.pathname, pathname = _props$pathname === void 0 ? (0, _proUtils.isBrowser)() ? window.location.pathname : '' : _props$pathname, _props$disableUrlPara = props.disableUrlParams, disableUrlParams = _props$disableUrlPara === void 0 ? true : _props$disableUrlPara, themeOnly = props.themeOnly, drawerProps = props.drawerProps; var firstRender = (0, _react.useRef)(true); var _useMergedState = (0, _useMergedState5.default)(false, { value: props.collapse, onChange: props.onCollapseChange }), _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2), open = _useMergedState2[0], setOpen = _useMergedState2[1]; var _useState = (0, _react.useState)((0, _locales.getLanguage)()), _useState2 = (0, _slicedToArray2.default)(_useState, 2), language = _useState2[0], setLanguage = _useState2[1]; var _useUrlSearchParams = (0, _useParams.useUrlSearchParams)({}, { disabled: disableUrlParams }), _useUrlSearchParams2 = (0, _slicedToArray2.default)(_useUrlSearchParams, 2), urlParams = _useUrlSearchParams2[0], setUrlParams = _useUrlSearchParams2[1]; var _useMergedState3 = (0, _useMergedState5.default)(function () { return getParamsFromUrl(urlParams, propsSettings || propsDefaultSettings); }, { value: propsSettings, onChange: onSettingChange }), _useMergedState4 = (0, _slicedToArray2.default)(_useMergedState3, 2), settingState = _useMergedState4[0], setSettingState = _useMergedState4[1]; var _ref3 = settingState || {}, navTheme = _ref3.navTheme, colorPrimary = _ref3.colorPrimary, siderMenuType = _ref3.siderMenuType, layout = _ref3.layout, colorWeak = _ref3.colorWeak; (0, _react.useEffect)(function () { // 语言修改,这个是和 locale 是配置起来的 var onLanguageChange = function onLanguageChange() { if (language !== (0, _locales.getLanguage)()) { setLanguage((0, _locales.getLanguage)()); } }; /** 如果不是浏览器 都没有必要做了 */ if (!(0, _proUtils.isBrowser)()) return function () { return null; }; initState(getParamsFromUrl(urlParams, propsSettings), settingState, setSettingState); window.document.addEventListener('languagechange', onLanguageChange, { passive: true }); return function () { return window.document.removeEventListener('languagechange', onLanguageChange); }; // eslint-disable-next-line react-hooks/exhaustive-deps }, []); (0, _react.useEffect)(function () { if ((0, _proUtils.compareVersions)(_antd.version, '5.0.0') < 0) { _antd.ConfigProvider.config({ theme: { primaryColor: settingState.colorPrimary } }); } }, [settingState.colorPrimary, settingState.navTheme]); /** * 修改设置 * * @param key * @param value */ var changeSetting = function changeSetting(key, value) { var nextState = {}; nextState[key] = value; if (key === 'layout') { nextState.contentWidth = value === 'top' ? 'Fixed' : 'Fluid'; } if (key === 'layout' && value !== 'mix') { nextState.splitMenus = false; } if (key === 'layout' && value === 'mix') { nextState.navTheme = 'light'; } if (key === 'colorWeak' && value === true) { var dom = document.querySelector('body'); if (dom) { dom.dataset.prosettingdrawer = dom.style.filter; dom.style.filter = 'invert(80%)'; } } if (key === 'colorWeak' && value === false) { var _dom = document.querySelector('body'); if (_dom) { _dom.style.filter = _dom.dataset.prosettingdrawer || 'none'; delete _dom.dataset.prosettingdrawer; } } delete nextState.menu; delete nextState.title; delete nextState.iconfontUrl; delete nextState.logo; delete nextState.pwa; setSettingState((0, _objectSpread2.default)((0, _objectSpread2.default)({}, settingState), nextState)); }; var formatMessage = getFormatMessage(); (0, _react.useEffect)(function () { /** 如果不是浏览器 都没有必要做了 */ if (!(0, _proUtils.isBrowser)()) return; if (disableUrlParams) return; if (firstRender.current) { firstRender.current = false; return; } /** 每次从url拿最新的防止记忆 */ var urlSearchParams = new URLSearchParams(window.location.search); var params = Object.fromEntries(urlSearchParams.entries()); var diffParams = getDifferentSetting((0, _objectSpread2.default)((0, _objectSpread2.default)({}, params), settingState)); delete diffParams.logo; delete diffParams.menu; delete diffParams.title; delete diffParams.iconfontUrl; delete diffParams.pwa; setUrlParams(diffParams); }, [setUrlParams, settingState, urlParams, pathname, disableUrlParams]); var baseClassName = "".concat(prefixCls, "-setting-drawer"); var _useStyle = (0, _index.useStyle)(baseClassName), wrapSSR = _useStyle.wrapSSR, hashId = _useStyle.hashId; var drawerOpenProps = (0, _proUtils.openVisibleCompatible)(open); return wrapSSR( /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, { children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", { className: "".concat(baseClassName, "-handle ").concat(hashId).trim(), onClick: function onClick() { return setOpen(!open); }, style: { width: 48, height: 48 }, children: open ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.CloseOutlined, { style: { color: '#fff', fontSize: 20 } }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.SettingOutlined, { style: { color: '#fff', fontSize: 20 } }) }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Drawer, (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, drawerOpenProps), {}, { width: 300, onClose: function onClose() { return setOpen(false); }, closable: false, placement: "right", getContainer: getContainer, style: { zIndex: 999 } }, drawerProps), {}, { children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", { className: "".concat(baseClassName, "-drawer-content ").concat(hashId).trim(), children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(Body, { title: formatMessage({ id: 'app.setting.pagestyle', defaultMessage: 'Page style setting' }), hashId: hashId, prefixCls: baseClassName, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_BlockCheckbox.BlockCheckbox, { hashId: hashId, prefixCls: baseClassName, list: [{ key: 'light', title: formatMessage({ id: 'app.setting.pagestyle.light', defaultMessage: '亮色菜单风格' }) }, { key: 'realDark', title: formatMessage({ id: 'app.setting.pagestyle.realdark', defaultMessage: '暗色菜单风格' }) }].filter(function (item) { if (item.key === 'dark' && settingState.layout === 'mix') return false; if (item.key === 'realDark' && !enableDarkTheme) return false; return true; }), value: navTheme, configType: "theme", onChange: function onChange(value) { return changeSetting('navTheme', value); } }, "navTheme") }), colorList !== false && /*#__PURE__*/(0, _jsxRuntime.jsx)(Body, { hashId: hashId, title: formatMessage({ id: 'app.setting.themecolor', defaultMessage: 'Theme color' }), prefixCls: baseClassName, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ThemeColor.ThemeColor, { hashId: hashId, prefixCls: baseClassName, colorList: colorList, value: (0, _utils.genStringToTheme)(colorPrimary), formatMessage: formatMessage, onChange: function onChange(color) { return changeSetting('colorPrimary', color); } }) }), !themeOnly && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, { children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Divider, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(Body, { hashId: hashId, prefixCls: baseClassName, title: formatMessage({ id: 'app.setting.navigationmode' }), children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_BlockCheckbox.BlockCheckbox, { prefixCls: baseClassName, value: layout, hashId: hashId, configType: "layout", list: [{ key: 'side', title: formatMessage({ id: 'app.setting.sidemenu' }) }, { key: 'top', title: formatMessage({ id: 'app.setting.topmenu' }) }, { key: 'mix', title: formatMessage({ id: 'app.setting.mixmenu' }) }], onChange: function onChange(value) { return changeSetting('layout', value); } }, "layout") }), settingState.layout == 'side' || settingState.layout == 'mix' ? /*#__PURE__*/(0, _jsxRuntime.jsx)(Body, { hashId: hashId, prefixCls: baseClassName, title: formatMessage({ id: 'app.setting.sidermenutype' }), children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_BlockCheckbox.BlockCheckbox, { prefixCls: baseClassName, value: siderMenuType, hashId: hashId, configType: "siderMenuType", list: [{ key: 'sub', icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sub.SubIcon, {}), title: formatMessage({ id: 'app.setting.sidermenutype-sub' }) }, { key: 'group', icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_group.GroupIcon, {}), title: formatMessage({ id: 'app.setting.sidermenutype-group' }) }], onChange: function onChange(value) { return changeSetting('siderMenuType', value); } }, "siderMenuType") }) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_LayoutChange.LayoutSetting, { prefixCls: baseClassName, hashId: hashId, settings: settingState, changeSetting: changeSetting }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Divider, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(Body, { hashId: hashId, prefixCls: baseClassName, title: formatMessage({ id: 'app.setting.regionalsettings' }), children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_RegionalChange.RegionalSetting, { hashId: hashId, prefixCls: baseClassName, settings: settingState, changeSetting: changeSetting }) }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Divider, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(Body, { hashId: hashId, prefixCls: baseClassName, title: formatMessage({ id: 'app.setting.othersettings' }), children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.List, { className: "".concat(baseClassName, "-list ").concat(hashId).trim(), split: false, size: "small", renderItem: _LayoutChange.renderLayoutSettingItem, dataSource: [{ title: formatMessage({ id: 'app.setting.weakmode' }), action: /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Switch, { size: "small", className: "color-weak", checked: !!colorWeak, onChange: function onChange(checked) { changeSetting('colorWeak', checked); } }) }] }) }), hideHintAlert && hideCopyButton ? null : /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Divider, {}), hideHintAlert ? null : /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Alert, { type: "warning", message: formatMessage({ id: 'app.setting.production.hint' }), icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.NotificationOutlined, {}), showIcon: true, style: { marginBlockEnd: 16 } }), hideCopyButton ? null : /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Button, { block: true, icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.CopyOutlined, {}), style: { marginBlockEnd: 24 }, onClick: /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee() { return (0, _regeneratorRuntime2.default)().wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: _context.prev = 0; _context.next = 3; return navigator.clipboard.writeText(genCopySettingJson(settingState)); case 3: _antd.message.success(formatMessage({ id: 'app.setting.copyinfo' })); _context.next = 8; break; case 6: _context.prev = 6; _context.t0 = _context["catch"](0); case 8: case "end": return _context.stop(); } }, _callee, null, [[0, 6]]); })), children: formatMessage({ id: 'app.setting.copy' }) })] })] }) }))] })); };