segmented2.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. var vue = require('vue');
  4. var core = require('@vueuse/core');
  5. var segmented = require('./segmented.js');
  6. var pluginVue_exportHelper = require('../../../_virtual/plugin-vue_export-helper.js');
  7. var index = require('../../../hooks/use-namespace/index.js');
  8. var index$1 = require('../../../hooks/use-id/index.js');
  9. var useFormCommonProps = require('../../form/src/hooks/use-form-common-props.js');
  10. var useFormItem = require('../../form/src/hooks/use-form-item.js');
  11. var shared = require('@vue/shared');
  12. var error = require('../../../utils/error.js');
  13. var event = require('../../../constants/event.js');
  14. const __default__ = vue.defineComponent({
  15. name: "ElSegmented"
  16. });
  17. const _sfc_main = /* @__PURE__ */ vue.defineComponent({
  18. ...__default__,
  19. props: segmented.segmentedProps,
  20. emits: segmented.segmentedEmits,
  21. setup(__props, { emit }) {
  22. const props = __props;
  23. const ns = index.useNamespace("segmented");
  24. const segmentedId = index$1.useId();
  25. const segmentedSize = useFormCommonProps.useFormSize();
  26. const _disabled = useFormCommonProps.useFormDisabled();
  27. const { formItem } = useFormItem.useFormItem();
  28. const { inputId, isLabeledByFormItem } = useFormItem.useFormItemInputId(props, {
  29. formItemContext: formItem
  30. });
  31. const segmentedRef = vue.ref(null);
  32. const activeElement = core.useActiveElement();
  33. const state = vue.reactive({
  34. isInit: false,
  35. width: 0,
  36. height: 0,
  37. translateX: 0,
  38. translateY: 0,
  39. focusVisible: false
  40. });
  41. const handleChange = (item) => {
  42. const value = getValue(item);
  43. emit(event.UPDATE_MODEL_EVENT, value);
  44. emit(event.CHANGE_EVENT, value);
  45. };
  46. const aliasProps = vue.computed(() => ({ ...segmented.defaultProps, ...props.props }));
  47. const getValue = (item) => {
  48. return shared.isObject(item) ? item[aliasProps.value.value] : item;
  49. };
  50. const getLabel = (item) => {
  51. return shared.isObject(item) ? item[aliasProps.value.label] : item;
  52. };
  53. const getDisabled = (item) => {
  54. return !!(_disabled.value || (shared.isObject(item) ? item[aliasProps.value.disabled] : false));
  55. };
  56. const getSelected = (item) => {
  57. return props.modelValue === getValue(item);
  58. };
  59. const getOption = (value) => {
  60. return props.options.find((item) => getValue(item) === value);
  61. };
  62. const getItemCls = (item) => {
  63. return [
  64. ns.e("item"),
  65. ns.is("selected", getSelected(item)),
  66. ns.is("disabled", getDisabled(item))
  67. ];
  68. };
  69. const updateSelect = () => {
  70. if (!segmentedRef.value)
  71. return;
  72. const selectedItem = segmentedRef.value.querySelector(".is-selected");
  73. const selectedItemInput = segmentedRef.value.querySelector(".is-selected input");
  74. if (!selectedItem || !selectedItemInput) {
  75. state.width = 0;
  76. state.height = 0;
  77. state.translateX = 0;
  78. state.translateY = 0;
  79. state.focusVisible = false;
  80. return;
  81. }
  82. const rect = selectedItem.getBoundingClientRect();
  83. state.isInit = true;
  84. if (props.direction === "vertical") {
  85. state.height = rect.height;
  86. state.translateY = selectedItem.offsetTop;
  87. } else {
  88. state.width = rect.width;
  89. state.translateX = selectedItem.offsetLeft;
  90. }
  91. try {
  92. state.focusVisible = selectedItemInput.matches(":focus-visible");
  93. } catch (e) {
  94. }
  95. };
  96. const segmentedCls = vue.computed(() => [
  97. ns.b(),
  98. ns.m(segmentedSize.value),
  99. ns.is("block", props.block)
  100. ]);
  101. const selectedStyle = vue.computed(() => ({
  102. width: props.direction === "vertical" ? "100%" : `${state.width}px`,
  103. height: props.direction === "vertical" ? `${state.height}px` : "100%",
  104. transform: props.direction === "vertical" ? `translateY(${state.translateY}px)` : `translateX(${state.translateX}px)`,
  105. display: state.isInit ? "block" : "none"
  106. }));
  107. const selectedCls = vue.computed(() => [
  108. ns.e("item-selected"),
  109. ns.is("disabled", getDisabled(getOption(props.modelValue))),
  110. ns.is("focus-visible", state.focusVisible)
  111. ]);
  112. const name = vue.computed(() => {
  113. return props.name || segmentedId.value;
  114. });
  115. core.useResizeObserver(segmentedRef, updateSelect);
  116. vue.watch(activeElement, updateSelect);
  117. vue.watch(() => props.modelValue, () => {
  118. var _a;
  119. updateSelect();
  120. if (props.validateEvent) {
  121. (_a = formItem == null ? void 0 : formItem.validate) == null ? void 0 : _a.call(formItem, "change").catch((err) => error.debugWarn(err));
  122. }
  123. }, {
  124. flush: "post"
  125. });
  126. return (_ctx, _cache) => {
  127. return _ctx.options.length ? (vue.openBlock(), vue.createElementBlock("div", {
  128. key: 0,
  129. id: vue.unref(inputId),
  130. ref_key: "segmentedRef",
  131. ref: segmentedRef,
  132. class: vue.normalizeClass(vue.unref(segmentedCls)),
  133. role: "radiogroup",
  134. "aria-label": !vue.unref(isLabeledByFormItem) ? _ctx.ariaLabel || "segmented" : void 0,
  135. "aria-labelledby": vue.unref(isLabeledByFormItem) ? vue.unref(formItem).labelId : void 0
  136. }, [
  137. vue.createElementVNode("div", {
  138. class: vue.normalizeClass([vue.unref(ns).e("group"), vue.unref(ns).m(props.direction)])
  139. }, [
  140. vue.createElementVNode("div", {
  141. style: vue.normalizeStyle(vue.unref(selectedStyle)),
  142. class: vue.normalizeClass(vue.unref(selectedCls))
  143. }, null, 6),
  144. (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(_ctx.options, (item, index) => {
  145. return vue.openBlock(), vue.createElementBlock("label", {
  146. key: index,
  147. class: vue.normalizeClass(getItemCls(item))
  148. }, [
  149. vue.createElementVNode("input", {
  150. class: vue.normalizeClass(vue.unref(ns).e("item-input")),
  151. type: "radio",
  152. name: vue.unref(name),
  153. disabled: getDisabled(item),
  154. checked: getSelected(item),
  155. onChange: ($event) => handleChange(item)
  156. }, null, 42, ["name", "disabled", "checked", "onChange"]),
  157. vue.createElementVNode("div", {
  158. class: vue.normalizeClass(vue.unref(ns).e("item-label"))
  159. }, [
  160. vue.renderSlot(_ctx.$slots, "default", { item }, () => [
  161. vue.createTextVNode(vue.toDisplayString(getLabel(item)), 1)
  162. ])
  163. ], 2)
  164. ], 2);
  165. }), 128))
  166. ], 2)
  167. ], 10, ["id", "aria-label", "aria-labelledby"])) : vue.createCommentVNode("v-if", true);
  168. };
  169. }
  170. });
  171. var Segmented = /* @__PURE__ */ pluginVue_exportHelper["default"](_sfc_main, [["__file", "segmented.vue"]]);
  172. exports["default"] = Segmented;
  173. //# sourceMappingURL=segmented2.js.map