Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
FOUR-19237: Cases list Pagination
  • Loading branch information
hjonathan committed Sep 23, 2024
commit 45d47f504948c4098e829dcfad4b2f6a57169279
26 changes: 24 additions & 2 deletions resources/jscomposition/base/form/Dropdown.vue
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
<transition :name="animation">
<div
v-if="show"
ref="containerRef"
class="tw-fixed tw-mt-1 tw-rounded-lg tw-z-10 tw-shadow-lg tw-bg-white tw-ring-1 tw-ring-inset tw-ring-gray-300"
:style="{ width: `${widthContainer}px`, top: `${top}px` }">
<ul class="tw-list-none tw-overflow-hidden tw-rounded">
Expand Down Expand Up @@ -92,6 +93,8 @@ export default defineComponent({
emits: ["input", "change"],
setup(props, { emit }) {
const inputRef = ref();
const containerRef = ref();

const show = ref(false);
const widthContainer = ref(100);
const top = ref(0);
Expand Down Expand Up @@ -121,8 +124,18 @@ export default defineComponent({
emit("change", option);
};

/**
* This method calculates the new position for dropdown menu
* Considers:
* - Space down in relation to viewport
*
* Increase other use cases
*/
const calculatePosition = () => {
const rect = inputRef.value?.getBoundingClientRect();
const containerRect = containerRef.value.getBoundingClientRect();
const viewportWidth = window.innerWidth;
const viewportHeight = window.innerHeight;

widthContainer.value = rect.width || 100;

Expand All @@ -137,6 +150,14 @@ export default defineComponent({
container = container.parentElement;
}

// Check: Does the dropdown menu have space down?
if (rect.top + containerRect.height > viewportHeight) {
topPosition = rect.top - containerRect.height;

top.value = topPosition;
return;
}

top.value = inputRef.value.offsetTop - topPosition;
};

Expand All @@ -145,10 +166,10 @@ export default defineComponent({
};

const toogleShow = ($event) => {
calculatePosition($event);
show.value = !show.value;

nextTick(() => {
show.value = !show.value;
calculatePosition($event);
});
};

Expand All @@ -161,6 +182,7 @@ export default defineComponent({
});

return {
containerRef,
show,
data,
inputRef,
Expand Down
272 changes: 214 additions & 58 deletions resources/jscomposition/base/table/Pagination.vue
Comment thread
pmPaulis marked this conversation as resolved.
Resolved
Comment thread
pmPaulis marked this conversation as resolved.
Resolved
Comment thread
pmPaulis marked this conversation as resolved.
Resolved
Original file line number Diff line number Diff line change
@@ -1,82 +1,238 @@
<template>
<div
class="tw-flex tw-items-center tw-justify-start tw-space-x-2 tw-bg-white">
<div>
<svg
class="tw-h-5 tw-w-5"
viewBox="0 0 20 20"
fill="currentColor"
aria-hidden="true">
class="tw-flex tw-items-center tw-justify-start tw-space-x-2 tw-text-gray-500 tw-text-sm">
<svg
:class="{
'hover:tw-cursor-pointer hover:tw-bg-gray-100': pageModel >0
}"
class=" tw-rounded-md"
width="20"
height="20"
viewBox="0 0 20 20"
fill="none"
xmlns="http://www.w3.org/2000/svg"
@click="first">
<g id="chevron-double-left">
<path
fill-rule="evenodd"
d="M12.79 5.23a.75.75 0 01-.02 1.06L8.832 10l3.938 3.71a.75.75 0 11-1.04 1.08l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 011.06.02z"
clip-rule="evenodd" />
</svg>
</div>
id="Shape"
d="M10 15L5 10L10 5M15 15L10 10L15 5"
stroke="#9FA8B5"
stroke-width="1.25"
stroke-linecap="round"
stroke-linejoin="round" />
</g>
</svg>

<div>
<svg
class="tw-h-5 tw-w-5"
viewBox="0 0 20 20"
fill="currentColor"
aria-hidden="true">
<svg
:class="{
'hover:tw-cursor-pointer hover:tw-bg-gray-100 ': pageModel >0
}"
class="tw-rounded-md"
width="20"
height="20"
viewBox="0 0 20 20"
fill="none"
xmlns="http://www.w3.org/2000/svg"
@click="prev">
<g id="chevron-left">
<path
fill-rule="evenodd"
d="M12.79 5.23a.75.75 0 01-.02 1.06L8.832 10l3.938 3.71a.75.75 0 11-1.04 1.08l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 011.06.02z"
clip-rule="evenodd" />
</svg>
</div>
id="Shape"
d="M12.5 15L7.5 10L12.5 5"
stroke="#9FA8B5"
stroke-width="1.25"
stroke-linecap="round"
stroke-linejoin="round" />
</g>
</svg>

<div>
<div
class="tw-flex tw-border-1 tw-rounded-md tw-ring-1 tw-ring-inset tw-ring-gray-300">
<input
class="tw-block tw-flex-1 tw-border-0 tw-bg-transparent tw-pl-1 focus-visible:tw-outline-none placeholder:tw-text-gray-400"
placeholder="1" />
</div>
<div
class="tw-flex tw-border-1 tw-rounded-md tw-ring-1 tw-ring-inset tw-ring-gray-300">
<input
inputmode="numeric"
pattern="\d*"
:value="pageModel"
class="tw-block tw-w-10 tw-text-center tw-flex-1 tw-border-0 tw-bg-transparent tw-pl-1
focus-visible:tw-outline-none placeholder:tw-text-gray-400"
placeholder="1"
@change="$emit('go',parseInt($event.target.value))">
</div>

<div>
<svg
class="tw-h-5 tw-w-5"
viewBox="0 0 20 20"
fill="currentColor"
aria-hidden="true">
<svg
:class="{
'hover:tw-cursor-pointer hover:tw-bg-gray-100': pageModel < pages-1
}"
class="tw-rounded-md"
width="20"
height="20"
viewBox="0 0 20 20"
fill="none"
xmlns="http://www.w3.org/2000/svg"
@click="next">
<g id="chevron-right">
<path
fill-rule="evenodd"
d="M12.79 5.23a.75.75 0 01-.02 1.06L8.832 10l3.938 3.71a.75.75 0 11-1.04 1.08l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 011.06.02z"
clip-rule="evenodd" />
</svg>
</div>
id="Shape"
d="M7.5 5L12.5 10L7.5 15"
stroke="#9FA8B5"
stroke-width="1.25"
stroke-linecap="round"
stroke-linejoin="round" />
</g>
</svg>

<div>
<svg
class="tw-h-5 tw-w-5"
viewBox="0 0 20 20"
fill="currentColor"
aria-hidden="true">
<svg
:class="{
'hover:tw-cursor-pointer hover:tw-bg-gray-100': pageModel < pages-1
}"
class="tw-rounded-md"
width="20"
height="20"
viewBox="0 0 20 20"
fill="none"
xmlns="http://www.w3.org/2000/svg"
@click="last">
<g id="chevron-double-right">
<path
fill-rule="evenodd"
d="M12.79 5.23a.75.75 0 01-.02 1.06L8.832 10l3.938 3.71a.75.75 0 11-1.04 1.08l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 011.06.02z"
clip-rule="evenodd" />
</svg>
</div>
id="Shape"
d="M10 5L15 10L10 15M5 5L10 10L5 15"
stroke="#9FA8B5"
stroke-width="1.25"
stroke-linecap="round"
stroke-linejoin="round" />
</g>
</svg>

<div>
<span> 153 items </span>
<div class="tw-px-2">
<span>{{ `${totalModel} items` }} </span>
</div>

<div>
<span> 15 per page</span>
<Dropdown
v-model="selectedOption"
class="tw-w-40"
:options="options"
@change="onChangeOption">
<template #input="{toogleShow}">
<div
class="tw-flex tw-full tw-items-center tw-space-x-2"
@click.prevent.stop="toogleShow()">
<span>
{{ `${selectedOption.value} per page` }}
</span>

<i
class=" hover:tw-bg-gray-100 tw-rounded-md hover:tw-cursor-pointer tw-p-1 fas fa-chevron-down" />
</div>
</template>
</Dropdown>
</div>
</div>
</template>
<script>
import { defineComponent } from "vue";
import { defineComponent, ref, computed } from "vue";
import { Dropdown } from "../form";

const optionsPerPage = [
{
value: 15,
label: "15 items",
},
{
value: 30,
label: "30 items",
},
{
value: 50,
label: "50 items",

},
];

export default defineComponent({
setup() {
return {};
components: {
Dropdown,
},
props: {
total: {
type: Number,
default: () => (0),
},
page: {
type: Number,
default: () => (0),
},
pages: {
type: Number,
default: () => (0),
},
},
emits: ["perPage", "go"],
setup(props, { emit }) {
const options = ref(optionsPerPage);
const totalModel = computed(() => props.total);
const pageModel = ref(props.page);

const selectedOption = ref({
value: 15,
label: "15 items",
});

const first = () => {
if (pageModel.value > 0) {
pageModel.value = 0;
emit("go", 0);
}
};

const prev = () => {
if (pageModel.value > 0) {
pageModel.value -= 1;
emit("go", pageModel.value);
}
};

const next = () => {
if (pageModel.value < props.pages - 1) {
pageModel.value += 1;
emit("go", pageModel.value);
}
};

const last = () => {
if (pageModel.value < props.pages - 1) {
pageModel.value = props.pages - 1;
emit("go", pageModel.value);
}
};

const onChangeOption = (e) => {
selectedOption.value = e;
emit("perPage", e.value);
};

return {
options,
selectedOption,
totalModel,
pageModel,
first,
last,
next,
onChangeOption,
prev,
};
},
});
</script>
<style scoped>
/* Chrome, Safari, Edge, Opera */
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}

/* Firefox */
input[type=number] {
-moz-appearance: textfield;
}
</style>
13 changes: 12 additions & 1 deletion resources/jscomposition/base/table/TCell.vue
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@
</slot>
</div>
<component
:is="getComponent()"
v-else
:is="column.cellRenderer()"
v-bind="getParams()"
:columns="columns"
:column="column"
:row="row" />
Expand Down Expand Up @@ -45,7 +46,17 @@ export default defineComponent({
}
return get(props.row, props.column?.field) || "";
};

const getComponent = () => props.column.cellRenderer().component;

const getParams = () => {
console.log("BREAK POINT AQUIII renderer");
Comment thread
pmPaulis marked this conversation as resolved.
Resolved
return props.column.cellRenderer().params || {};
};

return {
getComponent,
getParams,
getValue,
};
},
Expand Down
Loading