UNPKG

@bnorth/components

Version:

bnorth, components, react

327 lines (266 loc) 11.1 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime-corejs2/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault"); var _Object$defineProperty2 = require("@babel/runtime-corejs2/core-js/object/define-property"); _Object$defineProperty2(exports, "__esModule", { value: true }); exports.PanelIcon = exports.default = void 0; var _defineProperties = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/define-properties")); var _getOwnPropertyDescriptors = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors")); var _getOwnPropertyDescriptor = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor")); var _getOwnPropertySymbols = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols")); var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/define-property")); var _typeof2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/typeof")); var _from = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/array/from")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/toConsumableArray")); var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/extends")); require("core-js/modules/es6.array.fill"); require("core-js/modules/es7.array.includes"); require("core-js/modules/es6.string.includes"); require("core-js/modules/es6.regexp.split"); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/slicedToArray")); var _defineProperty3 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty")); require("core-js/modules/es6.function.name"); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/objectWithoutProperties")); var _react = _interopRequireDefault(require("react")); var _animation = require("@bnorth/rich.css/lib/styles/animation"); var _BaseComponent3 = _interopRequireDefault(require("./BaseComponent")); var _Panel = _interopRequireWildcard(require("./Panel")); function ownKeys(object, enumerableOnly) { var keys = (0, _keys.default)(object); if (_getOwnPropertySymbols.default) { var symbols = (0, _getOwnPropertySymbols.default)(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return (0, _getOwnPropertyDescriptor.default)(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { (0, _defineProperty3.default)(target, key, source[key]); }); } else if (_getOwnPropertyDescriptors.default) { (0, _defineProperties.default)(target, (0, _getOwnPropertyDescriptors.default)(source)); } else { ownKeys(source).forEach(function (key) { (0, _defineProperty2.default)(target, key, (0, _getOwnPropertyDescriptor.default)(source, key)); }); } } return target; } /** * 图标组件 * * 支持多种模式的图标和样式,包括 svg 字体库图标,图片图标,字符图标和形状图标,样式固定在字体大小的宽度和高度 * @component * @exportdefault * @augments module:BaseComponent.BaseComponent * @augments module:Panel.Panel */ var _Icon = function Icon(aprops) { var _BaseComponent = (0, _BaseComponent3.default)(aprops, _Icon), names = _BaseComponent.names, nameMaps = _BaseComponent.nameMaps, shapes = _BaseComponent.shapes, name = _BaseComponent.name, src = _BaseComponent.src, char = _BaseComponent.char, shape = _BaseComponent.shape, rotate = _BaseComponent.rotate, component = _BaseComponent.component, classNamePre = _BaseComponent.classNamePre, stylePre = _BaseComponent.stylePre, props = (0, _objectWithoutProperties2.default)(_BaseComponent, ["names", "nameMaps", "shapes", "name", "src", "char", "shape", "rotate", "component", "classNamePre", "stylePre"]); classNamePre = _objectSpread({ 'display-inline width-1em height-1em': true }, classNamePre); stylePre = rotate ? _objectSpread({}, (0, _animation.transform)('rotate', String(rotate) + 'deg'), {}, stylePre) : stylePre || {}; if (name) { var _name$split = name.split(':'), _name$split2 = (0, _slicedToArray2.default)(_name$split, 2), nameSvg = _name$split2[0], defaultNameSvg = _name$split2[1]; nameSvg = nameMaps[nameSvg] || nameSvg; if (!names.includes(nameSvg)) { char = defaultNameSvg || nameSvg; nameSvg = undefined; } name = nameSvg; } if (shape) { shape = shapes[shape] || shape; } if (name) { if (!component) component = 'svg'; stylePre.strokeWidth = 0; stylePre.stroke = 'currentColor'; stylePre.fill = 'currentColor'; props.dangerouslySetInnerHTML = { __html: "<use xlink:href=\"#".concat(name, "\"></use>") }; props.children = null; } else if (src) { if (!component) component = 'img'; props.src = src; props.alt = ''; } else if (shape) { if (!component) component = 'svg'; stylePre.strokeWidth = 0; stylePre.stroke = 'currentColor'; stylePre.fill = 'currentColor'; props.preserveAspectRatio = "none"; props.viewBox = "0 0 100 100"; props.children = typeof shape === 'function' ? shape() : _react.default.createElement("path", { d: shape }); } else if (char) { if (!component) component = 'span'; classNamePre['display-inlineblock text-align-center line-height-1em'] = true; props.children = char[0]; } else { classNamePre = []; } return _react.default.createElement(_Panel.default, (0, _extends2.default)({ component: component, classNamePre: classNamePre, stylePre: stylePre }, props)); }; _Icon.defaultProps = {}; /** * 设置 svg 字体库图标的图标映射名称,如果设置没有 svg 图标时的默认字符,使用 : 分隔符,比如 name="star:^" * @attribute module:Icon.Icon.name * @type {string} */ /** * 设置图片图片的图片路径 * @attribute module:Icon.Icon.src * @type {string} */ /** * 设置字符图标的字符,需要是单字符 * @attribute module:Icon.Icon.char * @type {string} */ /** * 设置图形图标的图形函数名称或者图形的 svg path 路径 * @attribute module:Icon.Icon.shape * @type {string} */ /** * 设置浮动的容器。 * @attribute module:Icon.Icon.rotate * @type {string} */ /** * svg 图标名字数组 * @type {string[]} */ _Icon.defaultProps.names = []; /** * svg 图标的名称映射 * @type {object} */ _Icon.defaultProps.nameMaps = {}; /** * 图形图标的图形函数与图形路径映射 * @type {object} */ _Icon.defaultProps.shapes = { triangle: 'M50 10 L90 90 L10 90 Z' }; /** * 将 svg 字体库文件内容生成字体库元素和字体库名称数组 * @param {string} - svg 字体库文件内容 */ _Icon.appendSvgIcons = function (svgStr) { var x = document.createElement('x'); x.innerHTML = svgStr; var svg = x.querySelector('svg'); if (!svg) return; _Icon.defaultProps.names = [].concat((0, _toConsumableArray2.default)(_Icon.defaultProps.names), (0, _toConsumableArray2.default)((0, _from.default)(svg.querySelectorAll('defs symbol')).map(function (v) { return v.id; }))); return document.body.appendChild(svg); }; /** * 设置字体库名称映射 * @param {string|object} - 字体库映射对象或者单个映射的值 * @param {string} - 单个映射的名称,val 为 object 时,该参数无意义 */ _Icon.appendMap = function (val, name) { if (!val) return; if ((0, _typeof2.default)(val) === 'object') { _Icon.defaultProps.nameMaps = _objectSpread({}, _Icon.defaultProps.nameMaps, {}, val); } else { _Icon.defaultProps.nameMaps[name] = val; } }; (0, _defineProperty2.default)(_Icon, "Icon", { get: function get() { return _Icon; }, set: function set(val) { _Icon = val; } }); _Icon.isBnorth = true; _Icon.defaultProps['b-precast'] = {}; var _default = _Icon; /** * 图标小面板组件,扩展小面板组件,提供图标组件与面板内容混排的能力 * @component * @augments module:BaseComponent.BaseComponent * @augments module:Container~Container */ exports.default = _default; var PanelIcon = function PanelIcon(aprops) { var _BaseComponent2 = (0, _BaseComponent3.default)(aprops), selected = _BaseComponent2.selected, name = _BaseComponent2.name, src = _BaseComponent2.src, char = _BaseComponent2.char, shape = _BaseComponent2.shape, iconSelected = _BaseComponent2.iconSelected, rotate = _BaseComponent2.rotate, iconProps = _BaseComponent2.iconProps, title = _BaseComponent2.title, titleProps = _BaseComponent2.titleProps, children = _BaseComponent2.children, props = (0, _objectWithoutProperties2.default)(_BaseComponent2, ["selected", "name", "src", "char", "shape", "iconSelected", "rotate", "iconProps", "title", "titleProps", "children"]); return _react.default.createElement(_Panel.PanelContainer, (0, _extends2.default)({ panelContainerProps: aprops, ctype: "flex", position: "left", justify: "center", align: "center", selected: selected }, props), _react.default.createElement(_Icon, (0, _extends2.default)({ name: name && (selected && iconSelected ? iconSelected : name), src: src && (selected && iconSelected ? iconSelected : src), char: char && (selected && iconSelected ? iconSelected : char), shape: shape && (selected && iconSelected ? iconSelected : shape), rotate: rotate }, iconProps)), title || children ? _react.default.createElement(_Panel.default, (0, _extends2.default)({ "bc-text-truncate-1": true }, titleProps), title, children) : null); }; exports.PanelIcon = PanelIcon; PanelIcon.defaultProps = {}; /** * Icon 的属性,参见 Icon * @attribute module:Icon~PanelIcon.icon* * @type {string} */ /** * 设置 icon,src,char 或 shape 在选中时的对应属性,不设置则选中不选中没有区别 * @attribute module:Icon~PanelIcon.iconSelected * @type {string} */ /** * 设置图标子组件的属性 * @attribute module:Icon~PanelIcon.iconProps * @type {object} */ /** * 设置标题内容,也可以使用 children * @attribute module:Icon~PanelIcon.title * @type {string} */ /** * 设置标题内容子组件的属性 * @attribute module:Icon~PanelIcon.titleProps * @type {object} */ (0, _defineProperty2.default)(_Icon, "PanelIcon", { get: function get() { return PanelIcon; }, set: function set(val) { exports.PanelIcon = PanelIcon = val; } }); PanelIcon.isBnorth = true; PanelIcon.defaultProps['b-precast'] = {};