Sider.js 8.0 KB

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