Sider.js 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.SiderProps = undefined;
  6. var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
  7. var _defineProperty3 = _interopRequireDefault(_defineProperty2);
  8. var _classnames = require('classnames');
  9. var _classnames2 = _interopRequireDefault(_classnames);
  10. var _vueTypes = require('../_util/vue-types');
  11. var _vueTypes2 = _interopRequireDefault(_vueTypes);
  12. var _propsUtil = require('../_util/props-util');
  13. var _BaseMixin = require('../_util/BaseMixin');
  14. var _BaseMixin2 = _interopRequireDefault(_BaseMixin);
  15. var _isNumeric = require('../_util/isNumeric');
  16. var _isNumeric2 = _interopRequireDefault(_isNumeric);
  17. var _configConsumerProps = require('../config-provider/configConsumerProps');
  18. var _icon = require('../icon');
  19. var _icon2 = _interopRequireDefault(_icon);
  20. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
  21. // matchMedia polyfill for
  22. // https://github.com/WickyNilliams/enquire.js/issues/82
  23. if (typeof window !== 'undefined') {
  24. var matchMediaPolyfill = function matchMediaPolyfill(mediaQuery) {
  25. return {
  26. media: mediaQuery,
  27. matches: false,
  28. addListener: function addListener() {},
  29. removeListener: function removeListener() {}
  30. };
  31. };
  32. window.matchMedia = window.matchMedia || matchMediaPolyfill;
  33. }
  34. var dimensionMaxMap = {
  35. xs: '479.98px',
  36. sm: '575.98px',
  37. md: '767.98px',
  38. lg: '991.98px',
  39. xl: '1199.98px',
  40. xxl: '1599.98px'
  41. };
  42. // export type CollapseType = 'clickTrigger' | 'responsive';
  43. var SiderProps = exports.SiderProps = {
  44. prefixCls: _vueTypes2['default'].string,
  45. collapsible: _vueTypes2['default'].bool,
  46. collapsed: _vueTypes2['default'].bool,
  47. defaultCollapsed: _vueTypes2['default'].bool,
  48. reverseArrow: _vueTypes2['default'].bool,
  49. // onCollapse?: (collapsed: boolean, type: CollapseType) => void;
  50. zeroWidthTriggerStyle: _vueTypes2['default'].object,
  51. trigger: _vueTypes2['default'].any,
  52. width: _vueTypes2['default'].oneOfType([_vueTypes2['default'].number, _vueTypes2['default'].string]),
  53. collapsedWidth: _vueTypes2['default'].oneOfType([_vueTypes2['default'].number, _vueTypes2['default'].string]),
  54. breakpoint: _vueTypes2['default'].oneOf(['xs', 'sm', 'md', 'lg', 'xl', 'xxl']),
  55. theme: _vueTypes2['default'].oneOf(['light', 'dark']).def('dark')
  56. };
  57. // export interface SiderState {
  58. // collapsed?: boolean;
  59. // below: boolean;
  60. // belowShow?: boolean;
  61. // }
  62. // export interface SiderContext {
  63. // siderCollapsed: boolean;
  64. // }
  65. var generateId = function () {
  66. var i = 0;
  67. return function () {
  68. var prefix = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
  69. i += 1;
  70. return '' + prefix + i;
  71. };
  72. }();
  73. exports['default'] = {
  74. name: 'ALayoutSider',
  75. __ANT_LAYOUT_SIDER: true,
  76. mixins: [_BaseMixin2['default']],
  77. model: {
  78. prop: 'collapsed',
  79. event: 'collapse'
  80. },
  81. props: (0, _propsUtil.initDefaultProps)(SiderProps, {
  82. collapsible: false,
  83. defaultCollapsed: false,
  84. reverseArrow: false,
  85. width: 200,
  86. collapsedWidth: 80
  87. }),
  88. data: function data() {
  89. this.uniqueId = generateId('ant-sider-');
  90. var matchMedia = void 0;
  91. if (typeof window !== 'undefined') {
  92. matchMedia = window.matchMedia;
  93. }
  94. var props = (0, _propsUtil.getOptionProps)(this);
  95. if (matchMedia && props.breakpoint && props.breakpoint in dimensionMaxMap) {
  96. this.mql = matchMedia('(max-width: ' + dimensionMaxMap[props.breakpoint] + ')');
  97. }
  98. var sCollapsed = void 0;
  99. if ('collapsed' in props) {
  100. sCollapsed = props.collapsed;
  101. } else {
  102. sCollapsed = props.defaultCollapsed;
  103. }
  104. return {
  105. sCollapsed: sCollapsed,
  106. below: false,
  107. belowShow: false
  108. };
  109. },
  110. provide: function provide() {
  111. return {
  112. layoutSiderContext: this // menu组件中使用
  113. };
  114. },
  115. inject: {
  116. siderHook: { 'default': function _default() {
  117. return {};
  118. } },
  119. configProvider: { 'default': function _default() {
  120. return _configConsumerProps.ConfigConsumerProps;
  121. } }
  122. },
  123. // getChildContext() {
  124. // return {
  125. // siderCollapsed: this.state.collapsed,
  126. // collapsedWidth: this.props.collapsedWidth,
  127. // };
  128. // }
  129. watch: {
  130. collapsed: function collapsed(val) {
  131. this.setState({
  132. sCollapsed: val
  133. });
  134. }
  135. },
  136. mounted: function mounted() {
  137. var _this = this;
  138. this.$nextTick(function () {
  139. if (_this.mql) {
  140. _this.mql.addListener(_this.responsiveHandler);
  141. _this.responsiveHandler(_this.mql);
  142. }
  143. if (_this.siderHook.addSider) {
  144. _this.siderHook.addSider(_this.uniqueId);
  145. }
  146. });
  147. },
  148. beforeDestroy: function beforeDestroy() {
  149. if (this.mql) {
  150. this.mql.removeListener(this.responsiveHandler);
  151. }
  152. if (this.siderHook.removeSider) {
  153. this.siderHook.removeSider(this.uniqueId);
  154. }
  155. },
  156. methods: {
  157. responsiveHandler: function responsiveHandler(mql) {
  158. this.setState({ below: mql.matches });
  159. this.$emit('breakpoint', mql.matches);
  160. if (this.sCollapsed !== mql.matches) {
  161. this.setCollapsed(mql.matches, 'responsive');
  162. }
  163. },
  164. setCollapsed: function setCollapsed(collapsed, type) {
  165. if (!(0, _propsUtil.hasProp)(this, 'collapsed')) {
  166. this.setState({
  167. sCollapsed: collapsed
  168. });
  169. }
  170. this.$emit('collapse', collapsed, type);
  171. },
  172. toggle: function toggle() {
  173. var collapsed = !this.sCollapsed;
  174. this.setCollapsed(collapsed, 'clickTrigger');
  175. },
  176. belowShowChange: function belowShowChange() {
  177. this.setState({ belowShow: !this.belowShow });
  178. }
  179. },
  180. render: function render() {
  181. var _classNames;
  182. var h = arguments[0];
  183. var _getOptionProps = (0, _propsUtil.getOptionProps)(this),
  184. customizePrefixCls = _getOptionProps.prefixCls,
  185. theme = _getOptionProps.theme,
  186. collapsible = _getOptionProps.collapsible,
  187. reverseArrow = _getOptionProps.reverseArrow,
  188. width = _getOptionProps.width,
  189. collapsedWidth = _getOptionProps.collapsedWidth,
  190. zeroWidthTriggerStyle = _getOptionProps.zeroWidthTriggerStyle;
  191. var getPrefixCls = this.configProvider.getPrefixCls;
  192. var prefixCls = getPrefixCls('layout-sider', customizePrefixCls);
  193. var trigger = (0, _propsUtil.getComponentFromProp)(this, 'trigger');
  194. var rawWidth = this.sCollapsed ? collapsedWidth : width;
  195. // use "px" as fallback unit for width
  196. var siderWidth = (0, _isNumeric2['default'])(rawWidth) ? rawWidth + 'px' : String(rawWidth);
  197. // special trigger when collapsedWidth == 0
  198. var zeroWidthTrigger = parseFloat(String(collapsedWidth || 0)) === 0 ? h(
  199. 'span',
  200. {
  201. on: {
  202. 'click': this.toggle
  203. },
  204. 'class': prefixCls + '-zero-width-trigger ' + prefixCls + '-zero-width-trigger-' + (reverseArrow ? 'right' : 'left'),
  205. style: zeroWidthTriggerStyle
  206. },
  207. [h(_icon2['default'], {
  208. attrs: { type: 'bars' }
  209. })]
  210. ) : null;
  211. var iconObj = {
  212. expanded: reverseArrow ? h(_icon2['default'], {
  213. attrs: { type: 'right' }
  214. }) : h(_icon2['default'], {
  215. attrs: { type: 'left' }
  216. }),
  217. collapsed: reverseArrow ? h(_icon2['default'], {
  218. attrs: { type: 'left' }
  219. }) : h(_icon2['default'], {
  220. attrs: { type: 'right' }
  221. })
  222. };
  223. var status = this.sCollapsed ? 'collapsed' : 'expanded';
  224. var defaultTrigger = iconObj[status];
  225. var triggerDom = trigger !== null ? zeroWidthTrigger || h(
  226. 'div',
  227. { 'class': prefixCls + '-trigger', on: {
  228. 'click': this.toggle
  229. },
  230. style: { width: siderWidth } },
  231. [trigger || defaultTrigger]
  232. ) : null;
  233. var divStyle = {
  234. // ...style,
  235. flex: '0 0 ' + siderWidth,
  236. maxWidth: siderWidth, // Fix width transition bug in IE11
  237. minWidth: siderWidth, // https://github.com/ant-design/ant-design/issues/6349
  238. width: siderWidth
  239. };
  240. var siderCls = (0, _classnames2['default'])(prefixCls, prefixCls + '-' + theme, (_classNames = {}, (0, _defineProperty3['default'])(_classNames, prefixCls + '-collapsed', !!this.sCollapsed), (0, _defineProperty3['default'])(_classNames, prefixCls + '-has-trigger', collapsible && trigger !== null && !zeroWidthTrigger), (0, _defineProperty3['default'])(_classNames, prefixCls + '-below', !!this.below), (0, _defineProperty3['default'])(_classNames, prefixCls + '-zero-width', parseFloat(siderWidth) === 0), _classNames));
  241. var divProps = {
  242. on: (0, _propsUtil.getListeners)(this),
  243. 'class': siderCls,
  244. style: divStyle
  245. };
  246. return h(
  247. 'aside',
  248. divProps,
  249. [h(
  250. 'div',
  251. { 'class': prefixCls + '-children' },
  252. [this.$slots['default']]
  253. ), collapsible || this.below && zeroWidthTrigger ? triggerDom : null]
  254. );
  255. }
  256. };