VExpansionPanel.mjs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import { createVNode as _createVNode } from "vue";
  2. // Components
  3. import { VExpansionPanelSymbol } from "./shared.mjs";
  4. import { makeVExpansionPanelTextProps, VExpansionPanelText } from "./VExpansionPanelText.mjs";
  5. import { makeVExpansionPanelTitleProps, VExpansionPanelTitle } from "./VExpansionPanelTitle.mjs";
  6. import { VDefaultsProvider } from "../VDefaultsProvider/index.mjs"; // Composables
  7. import { useBackgroundColor } from "../../composables/color.mjs";
  8. import { makeElevationProps, useElevation } from "../../composables/elevation.mjs";
  9. import { makeGroupItemProps, useGroupItem } from "../../composables/group.mjs";
  10. import { makeRoundedProps, useRounded } from "../../composables/rounded.mjs";
  11. import { makeTagProps } from "../../composables/tag.mjs"; // Utilities
  12. import { computed, provide } from 'vue';
  13. import { genericComponent, propsFactory, useRender } from "../../util/index.mjs";
  14. export const makeVExpansionPanelProps = propsFactory({
  15. title: String,
  16. text: String,
  17. bgColor: String,
  18. ...makeElevationProps(),
  19. ...makeGroupItemProps(),
  20. ...makeRoundedProps(),
  21. ...makeTagProps(),
  22. ...makeVExpansionPanelTitleProps(),
  23. ...makeVExpansionPanelTextProps()
  24. }, 'VExpansionPanel');
  25. export const VExpansionPanel = genericComponent()({
  26. name: 'VExpansionPanel',
  27. props: makeVExpansionPanelProps(),
  28. emits: {
  29. 'group:selected': val => true
  30. },
  31. setup(props, _ref) {
  32. let {
  33. slots
  34. } = _ref;
  35. const groupItem = useGroupItem(props, VExpansionPanelSymbol);
  36. const {
  37. backgroundColorClasses,
  38. backgroundColorStyles
  39. } = useBackgroundColor(props, 'bgColor');
  40. const {
  41. elevationClasses
  42. } = useElevation(props);
  43. const {
  44. roundedClasses
  45. } = useRounded(props);
  46. const isDisabled = computed(() => groupItem?.disabled.value || props.disabled);
  47. const selectedIndices = computed(() => groupItem.group.items.value.reduce((arr, item, index) => {
  48. if (groupItem.group.selected.value.includes(item.id)) arr.push(index);
  49. return arr;
  50. }, []));
  51. const isBeforeSelected = computed(() => {
  52. const index = groupItem.group.items.value.findIndex(item => item.id === groupItem.id);
  53. return !groupItem.isSelected.value && selectedIndices.value.some(selectedIndex => selectedIndex - index === 1);
  54. });
  55. const isAfterSelected = computed(() => {
  56. const index = groupItem.group.items.value.findIndex(item => item.id === groupItem.id);
  57. return !groupItem.isSelected.value && selectedIndices.value.some(selectedIndex => selectedIndex - index === -1);
  58. });
  59. provide(VExpansionPanelSymbol, groupItem);
  60. useRender(() => {
  61. const hasText = !!(slots.text || props.text);
  62. const hasTitle = !!(slots.title || props.title);
  63. const expansionPanelTitleProps = VExpansionPanelTitle.filterProps(props);
  64. const expansionPanelTextProps = VExpansionPanelText.filterProps(props);
  65. return _createVNode(props.tag, {
  66. "class": ['v-expansion-panel', {
  67. 'v-expansion-panel--active': groupItem.isSelected.value,
  68. 'v-expansion-panel--before-active': isBeforeSelected.value,
  69. 'v-expansion-panel--after-active': isAfterSelected.value,
  70. 'v-expansion-panel--disabled': isDisabled.value
  71. }, roundedClasses.value, backgroundColorClasses.value, props.class],
  72. "style": [backgroundColorStyles.value, props.style]
  73. }, {
  74. default: () => [_createVNode("div", {
  75. "class": ['v-expansion-panel__shadow', ...elevationClasses.value]
  76. }, null), _createVNode(VDefaultsProvider, {
  77. "defaults": {
  78. VExpansionPanelTitle: {
  79. ...expansionPanelTitleProps
  80. },
  81. VExpansionPanelText: {
  82. ...expansionPanelTextProps
  83. }
  84. }
  85. }, {
  86. default: () => [hasTitle && _createVNode(VExpansionPanelTitle, {
  87. "key": "title"
  88. }, {
  89. default: () => [slots.title ? slots.title() : props.title]
  90. }), hasText && _createVNode(VExpansionPanelText, {
  91. "key": "text"
  92. }, {
  93. default: () => [slots.text ? slots.text() : props.text]
  94. }), slots.default?.()]
  95. })]
  96. });
  97. });
  98. return {
  99. groupItem
  100. };
  101. }
  102. });
  103. //# sourceMappingURL=VExpansionPanel.mjs.map