grid-layout-plus
Version:
<p align="center"> <a href="https://grid-layout-plus.netlify.app/" target="_blank" rel="noopener noreferrer"> <img src="./docs/public/grid-layout-plus.svg" width="180" style="width: 120px;" /> </a> </p>
1 lines • 22.9 kB
Source Map (JSON)
{"version":3,"file":"grid-layout.vue.mjs","sources":["../../src/components/grid-layout.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n nextTick,\n onBeforeMount,\n onBeforeUnmount,\n onMounted,\n provide,\n reactive,\n ref,\n toRefs,\n watch\n} from 'vue'\n\nimport GridItem from './grid-item.vue'\nimport { useResize } from '@vexip-ui/hooks'\nimport { createEventEmitter, debounce, isNull } from '@vexip-ui/utils'\nimport {\n EMITTER_KEY,\n LAYOUT_KEY,\n bottom,\n cloneLayout,\n compact,\n getAllCollisions,\n getLayoutItem,\n moveElement,\n validateLayout\n} from '../helpers/common'\nimport {\n findOrGenerateResponsiveLayout,\n getBreakpointFromWidth,\n getColsFromBreakpoint\n} from '../helpers/responsive'\n\nimport type { PropType } from 'vue'\nimport type {\n Breakpoint,\n Breakpoints,\n Layout,\n LayoutInstance,\n ResponsiveLayout\n} from '../helpers/types'\n\nconst props = defineProps({\n autoSize: {\n type: Boolean,\n default: true\n },\n colNum: {\n type: Number,\n default: 12\n },\n rowHeight: {\n type: Number,\n default: 150\n },\n maxRows: {\n type: Number,\n default: Infinity\n },\n margin: {\n type: Array as PropType<number[]>,\n default: () => [10, 10]\n },\n isDraggable: {\n type: Boolean,\n default: true\n },\n isResizable: {\n type: Boolean,\n default: true\n },\n isMirrored: {\n type: Boolean,\n default: false\n },\n isBounded: {\n type: Boolean,\n default: false\n },\n useCssTransforms: {\n type: Boolean,\n default: true\n },\n verticalCompact: {\n type: Boolean,\n default: true\n },\n restoreOnDrag: {\n type: Boolean,\n default: false\n },\n layout: {\n type: Array as PropType<Layout>,\n required: true\n },\n responsive: {\n type: Boolean,\n default: false\n },\n responsiveLayouts: {\n type: Object as PropType<Partial<ResponsiveLayout>>,\n default: () => ({})\n },\n transformScale: {\n type: Number,\n default: 1\n },\n breakpoints: {\n type: Object as PropType<Breakpoints>,\n default: () => ({ lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0 })\n },\n cols: {\n type: Object as PropType<Breakpoints>,\n default: () => ({ lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 })\n },\n preventCollision: {\n type: Boolean,\n default: false\n },\n useStyleCursor: {\n type: Boolean,\n default: true\n }\n})\n\nconst emit = defineEmits([\n 'layout-before-mount',\n 'layout-mounted',\n 'layout-updated',\n 'breakpoint-changed',\n 'update:layout',\n 'layout-ready'\n])\n\nconst state = reactive({\n width: -1,\n mergedStyle: {},\n lastLayoutLength: 0,\n isDragging: false,\n placeholder: {\n x: 0,\n y: 0,\n w: 0,\n h: 0,\n i: '' as number | string\n },\n layouts: {} as Record<Breakpoint, Layout>, // array to store all layouts from different breakpoints\n lastBreakpoint: null as Breakpoint | null, // store last active breakpoint\n originalLayout: null! as Layout // store original Layout\n})\n\nconst itemInstances = new Map<number | string, any>()\n\nconst currentLayout = ref(props.layout)\nconst wrapper = ref<HTMLElement>()\n\nconst { observeResize, unobserveResize } = useResize()\nconst emitter = createEventEmitter()\n\nemitter.on('resizeEvent', resizeEventHandler)\nemitter.on('dragEvent', dragEventHandler)\n\nonBeforeMount(() => {\n emit('layout-before-mount', currentLayout.value)\n})\n\nonMounted(() => {\n emit('layout-mounted', currentLayout.value)\n\n nextTick(() => {\n validateLayout(currentLayout.value)\n\n state.originalLayout = currentLayout.value\n\n nextTick(() => {\n initResponsiveFeatures()\n wrapper.value && observeResize(wrapper.value, debounce(onWindowResize, 16))\n compact(currentLayout.value, props.verticalCompact)\n emit('layout-updated', currentLayout.value)\n updateHeight()\n onWindowResize()\n })\n })\n})\n\nonBeforeUnmount(() => {\n emitter.clearAll()\n wrapper.value && unobserveResize(wrapper.value)\n})\n\nfunction resizeEventHandler(\n eventType: string,\n i: number | string,\n x: number,\n y: number,\n h: number,\n w: number\n) {\n resizeEvent(eventType, i, x, y, h, w)\n}\n\nfunction dragEventHandler(\n eventType: string,\n i: number | string,\n x: number,\n y: number,\n h: number,\n w: number\n) {\n dragEvent(eventType, i, x, y, h, w)\n}\n\nwatch(\n () => state.width,\n (newVal, oldVal) => {\n nextTick(() => {\n emitter.emit('updateWidth', newVal)\n if (oldVal === -1) {\n /*\n If oldVal === -1 is when the width has never been\n set before. That only occurs when mounting is\n finished, and onWindowResize has been called and\n this.width has been changed the first time after it\n got set to null in the constructor. It is now time\n to issue layout-ready events as the GridItems have\n their sizes configured properly.\n\n The reason for emitting the layout-ready events on\n the next tick is to allow for the newly-emitted\n updateWidth event (above) to have reached the\n children GridItem-s and had their effect, so we're\n sure that they have the final size before we emit\n layout-ready (for this GridLayout) and\n item-layout-ready (for the GridItem-s).\n\n This way any client event handlers can reliably\n investigate stable sizes of GridItem-s.\n */\n nextTick(() => {\n emit('layout-ready', currentLayout.value)\n })\n }\n updateHeight()\n })\n }\n)\nwatch(\n () => [props.layout, props.layout.length],\n () => {\n currentLayout.value = props.layout\n layoutUpdate()\n }\n)\nwatch(\n () => props.colNum,\n val => {\n emitter.emit('setColNum', val)\n }\n)\nwatch(\n () => props.rowHeight,\n value => {\n emitter.emit('setRowHeight', value)\n }\n)\nwatch(\n () => props.isDraggable,\n value => {\n emitter.emit('setDraggable', value)\n }\n)\nwatch(\n () => props.isResizable,\n value => {\n emitter.emit('setResizable', value)\n }\n)\nwatch(\n () => props.isBounded,\n value => {\n emitter.emit('setBounded', value)\n }\n)\nwatch(\n () => props.transformScale,\n value => {\n emitter.emit('setTransformScale', value)\n }\n)\nwatch(\n () => props.responsive,\n value => {\n if (!value) {\n emit('update:layout', state.originalLayout)\n emitter.emit('setColNum', props.colNum)\n }\n onWindowResize()\n }\n)\nwatch(\n () => props.maxRows,\n value => {\n emitter.emit('setMaxRows', value)\n }\n)\nwatch([() => props.margin, () => props.margin[1]], updateHeight)\n\nprovide(\n LAYOUT_KEY,\n reactive({\n ...toRefs(props),\n ...toRefs(state),\n increaseItem,\n decreaseItem\n }) as LayoutInstance\n)\nprovide(EMITTER_KEY, emitter)\n\ndefineExpose({ state, getItem, resizeEvent, dragEvent })\n\nfunction increaseItem(item: any) {\n itemInstances.set(item.i, item)\n}\n\nfunction decreaseItem(item: any) {\n itemInstances.delete(item.i)\n}\n\nfunction getItem(id: number | string) {\n return itemInstances.get(id)\n}\n\nfunction layoutUpdate() {\n if (!isNull(currentLayout.value) && !isNull(state.originalLayout)) {\n if (currentLayout.value.length !== state.originalLayout.length) {\n const diff = findDifference(currentLayout.value, state.originalLayout)\n\n if (diff.length > 0) {\n if (currentLayout.value.length > state.originalLayout.length) {\n state.originalLayout = state.originalLayout.concat(diff)\n } else {\n const ids = new Set(diff.map(item => item.i))\n state.originalLayout = state.originalLayout.filter(item => !ids.has(item.i))\n }\n }\n\n state.lastLayoutLength = currentLayout.value.length\n initResponsiveFeatures()\n }\n\n compact(currentLayout.value, props.verticalCompact)\n emitter.emit('updateWidth', state.width)\n updateHeight()\n\n emit('layout-updated', currentLayout.value)\n }\n}\n\nfunction updateHeight() {\n state.mergedStyle = {\n height: containerHeight()\n }\n}\n\nfunction onWindowResize() {\n if (wrapper.value) {\n state.width = wrapper.value.offsetWidth\n }\n\n emitter.emit('resizeEvent')\n}\n\nfunction containerHeight() {\n if (!props.autoSize) return\n\n const marginY = parseFloat(props.margin[1] as any)\n const containerHeight = bottom(currentLayout.value) * (props.rowHeight + marginY) + marginY + 'px'\n return containerHeight\n}\n\nlet positionsBeforeDrag: Record<string, { x: number, y: number }> | undefined\n\nfunction dragEvent(\n eventName: string,\n id: number | string,\n x: number,\n y: number,\n h: number,\n w: number\n) {\n let l = getLayoutItem(currentLayout.value, id)!\n\n // GetLayoutItem sometimes returns null object\n if (isNull(l)) {\n l = { h: 0, w: 0, x: 0, y: 0, i: '' }\n }\n\n if (eventName === 'dragstart' && !props.verticalCompact) {\n positionsBeforeDrag = currentLayout.value.reduce(\n (result, { i, x, y }) => ({\n ...result,\n [i]: { x, y }\n }),\n {}\n )\n }\n\n if (eventName === 'dragmove' || eventName === 'dragstart') {\n state.placeholder.i = id\n state.placeholder.x = l.x\n state.placeholder.y = l.y\n state.placeholder.w = w\n state.placeholder.h = h\n\n nextTick(() => {\n state.isDragging = true\n })\n\n emitter.emit('updateWidth', state.width)\n } else {\n nextTick(() => {\n state.isDragging = false\n })\n }\n\n // Move the element to the dragged location.\n currentLayout.value = moveElement(currentLayout.value, l, x, y, true, props.preventCollision)\n\n if (props.restoreOnDrag) {\n // Do not compact items more than in layout before drag\n // Set moved item as static to avoid to compact it\n l.static = true\n compact(currentLayout.value, props.verticalCompact, positionsBeforeDrag)\n l.static = false\n } else {\n compact(currentLayout.value, props.verticalCompact)\n }\n\n // needed because vue can't detect changes on array element properties\n emitter.emit('compact')\n updateHeight()\n if (eventName === 'dragend') {\n positionsBeforeDrag = undefined\n emit('layout-updated', currentLayout.value)\n }\n}\n\nfunction resizeEvent(\n eventName: string,\n id: number | string,\n x: number,\n y: number,\n h: number,\n w: number\n) {\n let l = getLayoutItem(currentLayout.value, id)!\n // GetLayoutItem sometimes return null object\n if (isNull(l)) {\n l = { h: 0, w: 0, x: 0, y: 0, i: '' }\n }\n\n let hasCollisions\n if (props.preventCollision) {\n const collisions = getAllCollisions(currentLayout.value, { ...l, w, h }).filter(\n layoutItem => layoutItem.i !== l.i\n )\n hasCollisions = collisions.length > 0\n\n // If we're colliding, we need adjust the placeholder.\n if (hasCollisions) {\n // adjust w && h to maximum allowed space\n let leastX = Infinity\n let leastY = Infinity\n collisions.forEach(layoutItem => {\n if (layoutItem.x > l.x) leastX = Math.min(leastX, layoutItem.x)\n if (layoutItem.y > l.y) leastY = Math.min(leastY, layoutItem.y)\n })\n\n if (Number.isFinite(leastX)) l.w = leastX - l.x\n if (Number.isFinite(leastY)) l.h = leastY - l.y\n }\n }\n\n if (!hasCollisions) {\n // Set new width and height.\n l.w = w\n l.h = h\n }\n\n if (eventName === 'resizestart' || eventName === 'resizemove') {\n state.placeholder.i = id\n state.placeholder.x = x\n state.placeholder.y = y\n state.placeholder.w = l.w\n state.placeholder.h = l.h\n nextTick(() => {\n state.isDragging = true\n })\n // this.$broadcast(\"updateWidth\", this.width);\n emitter.emit('updateWidth', state.width)\n } else {\n nextTick(() => {\n state.isDragging = false\n })\n }\n\n if (props.responsive) responsiveGridLayout()\n\n compact(currentLayout.value, props.verticalCompact)\n emitter.emit('compact')\n updateHeight()\n\n if (eventName === 'resizeend') emit('layout-updated', currentLayout.value)\n}\n\nfunction responsiveGridLayout() {\n const newBreakpoint = getBreakpointFromWidth(props.breakpoints, state.width)\n const newCols = getColsFromBreakpoint(newBreakpoint, props.cols)\n\n // save actual layout in layouts\n if (!isNull(state.lastBreakpoint) && !state.layouts[state.lastBreakpoint]) {\n state.layouts[state.lastBreakpoint] = cloneLayout(currentLayout.value)\n }\n\n // Find or generate a new layout.\n const layout = findOrGenerateResponsiveLayout(\n state.originalLayout,\n state.layouts,\n props.breakpoints,\n newBreakpoint,\n state.lastBreakpoint!,\n newCols,\n props.verticalCompact\n )\n\n // Store the new layout.\n state.layouts[newBreakpoint] = layout\n\n if (state.lastBreakpoint !== newBreakpoint) {\n emit('breakpoint-changed', newBreakpoint, layout)\n }\n\n // new prop sync\n emit('update:layout', layout)\n\n state.lastBreakpoint = newBreakpoint\n emitter.emit('setColNum', getColsFromBreakpoint(newBreakpoint, props.cols))\n}\n\nfunction initResponsiveFeatures() {\n // clear layouts\n state.layouts = Object.assign({} as Record<Breakpoint, Layout>, props.responsiveLayouts)\n}\n\nfunction findDifference(layout: Layout, originalLayout: Layout) {\n const originalIds = new Set(originalLayout.map(item => item.i))\n const ids = new Set(layout.map(item => item.i))\n\n // Find values that are in result1 but not in result2\n const uniqueResultOne = layout.filter(item => !originalIds.has(item.i))\n\n // Find values that are in result2 but not in result1\n const uniqueResultTwo = originalLayout.filter(item => !ids.has(item.i))\n\n // Combine the two arrays of unique entries#\n return uniqueResultOne.concat(uniqueResultTwo)\n}\n</script>\n\n<template>\n <div ref=\"wrapper\" class=\"vgl-layout\" :style=\"state.mergedStyle\">\n <slot v-if=\"$slots.default\"></slot>\n <template v-else>\n <GridItem v-for=\"item in currentLayout\" :key=\"item.i\" v-bind=\"item\">\n <slot name=\"item\" :item=\"item\"></slot>\n </GridItem>\n </template>\n <GridItem\n v-show=\"state.isDragging\"\n class=\"vgl-item--placeholder\"\n :x=\"state.placeholder.x\"\n :y=\"state.placeholder.y\"\n :w=\"state.placeholder.w\"\n :h=\"state.placeholder.h\"\n :i=\"state.placeholder.i\"\n ></GridItem>\n </div>\n</template>\n"],"names":["props","__props","emit","__emit","state","reactive","itemInstances","currentLayout","ref","wrapper","observeResize","unobserveResize","useResize","emitter","createEventEmitter","resizeEventHandler","dragEventHandler","onBeforeMount","onMounted","nextTick","validateLayout","initResponsiveFeatures","debounce","onWindowResize","compact","updateHeight","onBeforeUnmount","eventType","i","x","y","h","w","resizeEvent","dragEvent","watch","newVal","oldVal","layoutUpdate","val","value","provide","LAYOUT_KEY","toRefs","increaseItem","decreaseItem","EMITTER_KEY","__expose","getItem","item","id","isNull","diff","findDifference","ids","containerHeight","marginY","bottom","positionsBeforeDrag","eventName","l","getLayoutItem","result","moveElement","hasCollisions","collisions","getAllCollisions","layoutItem","leastX","leastY","responsiveGridLayout","newBreakpoint","getBreakpointFromWidth","newCols","getColsFromBreakpoint","cloneLayout","layout","findOrGenerateResponsiveLayout","originalLayout","originalIds","uniqueResultOne","uniqueResultTwo"],"mappings":"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"}