Sider.js 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.siderProps = exports.default = void 0;
  7. var _vue = require("vue");
  8. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  9. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  10. var _classNames2 = _interopRequireDefault(require("../_util/classNames"));
  11. var _vueTypes = _interopRequireDefault(require("../_util/vue-types"));
  12. var _type = require("../_util/type");
  13. var _initDefaultProps = _interopRequireDefault(require("../_util/props-util/initDefaultProps"));
  14. var _isNumeric = _interopRequireDefault(require("../_util/isNumeric"));
  15. var _BarsOutlined = _interopRequireDefault(require("@ant-design/icons-vue/lib/icons/BarsOutlined"));
  16. var _RightOutlined = _interopRequireDefault(require("@ant-design/icons-vue/lib/icons/RightOutlined"));
  17. var _LeftOutlined = _interopRequireDefault(require("@ant-design/icons-vue/lib/icons/LeftOutlined"));
  18. var _useConfigInject2 = _interopRequireDefault(require("../_util/hooks/useConfigInject"));
  19. var _injectionKey = require("./injectionKey");
  20. var dimensionMaxMap = {
  21. xs: '479.98px',
  22. sm: '575.98px',
  23. md: '767.98px',
  24. lg: '991.98px',
  25. xl: '1199.98px',
  26. xxl: '1599.98px',
  27. xxxl: '1999.98px'
  28. };
  29. var siderProps = function siderProps() {
  30. return {
  31. prefixCls: String,
  32. collapsible: {
  33. type: Boolean,
  34. default: undefined
  35. },
  36. collapsed: {
  37. type: Boolean,
  38. default: undefined
  39. },
  40. defaultCollapsed: {
  41. type: Boolean,
  42. default: undefined
  43. },
  44. reverseArrow: {
  45. type: Boolean,
  46. default: undefined
  47. },
  48. zeroWidthTriggerStyle: {
  49. type: Object,
  50. default: undefined
  51. },
  52. trigger: _vueTypes.default.any,
  53. width: _vueTypes.default.oneOfType([_vueTypes.default.number, _vueTypes.default.string]),
  54. collapsedWidth: _vueTypes.default.oneOfType([_vueTypes.default.number, _vueTypes.default.string]),
  55. breakpoint: _vueTypes.default.oneOf((0, _type.tuple)('xs', 'sm', 'md', 'lg', 'xl', 'xxl', 'xxxl')),
  56. theme: _vueTypes.default.oneOf((0, _type.tuple)('light', 'dark')).def('dark'),
  57. onBreakpoint: Function,
  58. onCollapse: Function
  59. };
  60. };
  61. exports.siderProps = siderProps;
  62. var generateId = function () {
  63. var i = 0;
  64. return function () {
  65. var prefix = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
  66. i += 1;
  67. return "".concat(prefix).concat(i);
  68. };
  69. }();
  70. var _default = (0, _vue.defineComponent)({
  71. compatConfig: {
  72. MODE: 3
  73. },
  74. name: 'ALayoutSider',
  75. inheritAttrs: false,
  76. props: (0, _initDefaultProps.default)(siderProps(), {
  77. collapsible: false,
  78. defaultCollapsed: false,
  79. reverseArrow: false,
  80. width: 200,
  81. collapsedWidth: 80
  82. }),
  83. emits: ['breakpoint', 'update:collapsed', 'collapse'],
  84. setup: function setup(props, _ref) {
  85. var emit = _ref.emit,
  86. attrs = _ref.attrs,
  87. slots = _ref.slots;
  88. var _useConfigInject = (0, _useConfigInject2.default)('layout-sider', props),
  89. prefixCls = _useConfigInject.prefixCls;
  90. var siderHook = (0, _vue.inject)(_injectionKey.SiderHookProviderKey, undefined);
  91. var collapsed = (0, _vue.ref)(!!(props.collapsed !== undefined ? props.collapsed : props.defaultCollapsed));
  92. var below = (0, _vue.ref)(false);
  93. (0, _vue.watch)(function () {
  94. return props.collapsed;
  95. }, function () {
  96. collapsed.value = !!props.collapsed;
  97. });
  98. (0, _vue.provide)(_injectionKey.SiderCollapsedKey, collapsed);
  99. var handleSetCollapsed = function handleSetCollapsed(value, type) {
  100. if (props.collapsed === undefined) {
  101. collapsed.value = value;
  102. }
  103. emit('update:collapsed', value);
  104. emit('collapse', value, type);
  105. };
  106. // ========================= Responsive =========================
  107. var responsiveHandlerRef = (0, _vue.ref)(function (mql) {
  108. below.value = mql.matches;
  109. emit('breakpoint', mql.matches);
  110. if (collapsed.value !== mql.matches) {
  111. handleSetCollapsed(mql.matches, 'responsive');
  112. }
  113. });
  114. var mql;
  115. function responsiveHandler(mql) {
  116. return responsiveHandlerRef.value(mql);
  117. }
  118. var uniqueId = generateId('ant-sider-');
  119. siderHook && siderHook.addSider(uniqueId);
  120. (0, _vue.onMounted)(function () {
  121. (0, _vue.watch)(function () {
  122. return props.breakpoint;
  123. }, function () {
  124. try {
  125. var _mql;
  126. (_mql = mql) === null || _mql === void 0 ? void 0 : _mql.removeEventListener('change', responsiveHandler);
  127. } catch (error) {
  128. var _mql2;
  129. (_mql2 = mql) === null || _mql2 === void 0 ? void 0 : _mql2.removeListener(responsiveHandler);
  130. }
  131. if (typeof window !== 'undefined') {
  132. var _window = window,
  133. matchMedia = _window.matchMedia;
  134. if (matchMedia && props.breakpoint && props.breakpoint in dimensionMaxMap) {
  135. mql = matchMedia("(max-width: ".concat(dimensionMaxMap[props.breakpoint], ")"));
  136. try {
  137. mql.addEventListener('change', responsiveHandler);
  138. } catch (error) {
  139. mql.addListener(responsiveHandler);
  140. }
  141. responsiveHandler(mql);
  142. }
  143. }
  144. }, {
  145. immediate: true
  146. });
  147. });
  148. (0, _vue.onBeforeUnmount)(function () {
  149. try {
  150. var _mql3;
  151. (_mql3 = mql) === null || _mql3 === void 0 ? void 0 : _mql3.removeEventListener('change', responsiveHandler);
  152. } catch (error) {
  153. var _mql4;
  154. (_mql4 = mql) === null || _mql4 === void 0 ? void 0 : _mql4.removeListener(responsiveHandler);
  155. }
  156. siderHook && siderHook.removeSider(uniqueId);
  157. });
  158. var toggle = function toggle() {
  159. handleSetCollapsed(!collapsed.value, 'clickTrigger');
  160. };
  161. return function () {
  162. var _slots$trigger, _classNames, _slots$default;
  163. var pre = prefixCls.value;
  164. var collapsedWidth = props.collapsedWidth,
  165. width = props.width,
  166. reverseArrow = props.reverseArrow,
  167. zeroWidthTriggerStyle = props.zeroWidthTriggerStyle,
  168. _props$trigger = props.trigger,
  169. trigger = _props$trigger === void 0 ? (_slots$trigger = slots.trigger) === null || _slots$trigger === void 0 ? void 0 : _slots$trigger.call(slots) : _props$trigger,
  170. collapsible = props.collapsible,
  171. theme = props.theme;
  172. var rawWidth = collapsed.value ? collapsedWidth : width;
  173. // use "px" as fallback unit for width
  174. var siderWidth = (0, _isNumeric.default)(rawWidth) ? "".concat(rawWidth, "px") : String(rawWidth);
  175. // special trigger when collapsedWidth == 0
  176. var zeroWidthTrigger = parseFloat(String(collapsedWidth || 0)) === 0 ? (0, _vue.createVNode)("span", {
  177. "onClick": toggle,
  178. "class": (0, _classNames2.default)("".concat(pre, "-zero-width-trigger"), "".concat(pre, "-zero-width-trigger-").concat(reverseArrow ? 'right' : 'left')),
  179. "style": zeroWidthTriggerStyle
  180. }, [trigger || (0, _vue.createVNode)(_BarsOutlined.default, null, null)]) : null;
  181. var iconObj = {
  182. expanded: reverseArrow ? (0, _vue.createVNode)(_RightOutlined.default, null, null) : (0, _vue.createVNode)(_LeftOutlined.default, null, null),
  183. collapsed: reverseArrow ? (0, _vue.createVNode)(_LeftOutlined.default, null, null) : (0, _vue.createVNode)(_RightOutlined.default, null, null)
  184. };
  185. var status = collapsed.value ? 'collapsed' : 'expanded';
  186. var defaultTrigger = iconObj[status];
  187. var triggerDom = trigger !== null ? zeroWidthTrigger || (0, _vue.createVNode)("div", {
  188. "class": "".concat(pre, "-trigger"),
  189. "onClick": toggle,
  190. "style": {
  191. width: siderWidth
  192. }
  193. }, [trigger || defaultTrigger]) : null;
  194. var divStyle = [attrs.style, {
  195. flex: "0 0 ".concat(siderWidth),
  196. maxWidth: siderWidth,
  197. minWidth: siderWidth,
  198. width: siderWidth
  199. }];
  200. var siderCls = (0, _classNames2.default)(pre, "".concat(pre, "-").concat(theme), (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(pre, "-collapsed"), !!collapsed.value), (0, _defineProperty2.default)(_classNames, "".concat(pre, "-has-trigger"), collapsible && trigger !== null && !zeroWidthTrigger), (0, _defineProperty2.default)(_classNames, "".concat(pre, "-below"), !!below.value), (0, _defineProperty2.default)(_classNames, "".concat(pre, "-zero-width"), parseFloat(siderWidth) === 0), _classNames), attrs.class);
  201. return (0, _vue.createVNode)("aside", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, attrs), {}, {
  202. "class": siderCls,
  203. "style": divStyle
  204. }), [(0, _vue.createVNode)("div", {
  205. "class": "".concat(pre, "-children")
  206. }, [(_slots$default = slots.default) === null || _slots$default === void 0 ? void 0 : _slots$default.call(slots)]), collapsible || below.value && zeroWidthTrigger ? triggerDom : null]);
  207. };
  208. }
  209. });
  210. exports.default = _default;