Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CED-1762 create v3 EsViewMore #1520

Merged
merged 5 commits into from
Sep 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
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
63 changes: 63 additions & 0 deletions es-ds-components/components/es-view-more.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<script setup lang="ts">
import truncate from 'html-truncate';

const props = defineProps({
/**
* Full text content
*/
content: {
type: String,
required: true,
},
/**
* Maximum character length of text before it is truncated
*/
length: {
type: Number,
required: true,
},
/**
* Text for button to show more text
*/
clamp: {
type: String,
required: false,
default: 'Show more',
},
/**
* Text for button to hide text
*/
less: {
type: String,
required: false,
default: 'Show less',
},
});

const isClamped = ref(true);

const truncatedContent = computed(() => truncate(props.content, props.length));
const isTruncated = computed(() => truncatedContent.value !== props.content);
const buttonText = computed(() => (isClamped.value ? props.clamp : props.less));
const bodyContent = computed(() => {
if (isClamped.value) {
return truncatedContent.value;
}
return props.content;
});
</script>

<template>
<div>
<!-- eslint-disable-next-line vue/no-v-html -->
<span v-html="bodyContent" />
<es-button
v-if="isTruncated"
inline
variant="link"
class="ml-50 p-0"
@click="isClamped = !isClamped">
{{ buttonText }}
</es-button>
</div>
</template>
9 changes: 9 additions & 0 deletions es-ds-components/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion es-ds-components/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
"primevue": "^3.53.0",
"nuxt-primevue": "^3.0.0",
"prismjs": "^1.29.0",
"vue": "^3.4.34"
"vue": "^3.4.34",
"html-truncate": "^1.2.2"
},
"devDependencies": {
"@eslint/js": "^9.9.0",
Expand Down
3 changes: 3 additions & 0 deletions es-ds-docs/components/ds-molecules-list.vue
Original file line number Diff line number Diff line change
Expand Up @@ -63,5 +63,8 @@
<li>
<ds-link to="/molecules/text-input"> Text input </ds-link>
</li>
<li>
<ds-link to="/molecules/view-more"> View more </ds-link>
</li>
</ul>
</template>
4 changes: 2 additions & 2 deletions es-ds-docs/pages/molecules/support.vue
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,8 @@ const supportProps = [

<ds-doc-source
:comp-code="compCode"
comp-source="es-ds-components/components/es-pagination.vue"
comp-source="es-ds-components/components/es-support.vue"
lgeggleston marked this conversation as resolved.
Show resolved Hide resolved
:doc-code="docCode"
doc-source="es-ds-docs/pages/molecules/pagination.vue" />
doc-source="es-ds-docs/pages/molecules/support.vue" />
</div>
</template>
85 changes: 85 additions & 0 deletions es-ds-docs/pages/molecules/view-more.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
<script setup>
const { $prism } = useNuxtApp();
const compCode = ref('');
const docCode = ref('');
if ($prism) {
const compSource = await import('@energysage/es-ds-components/components/es-view-more.vue?raw');
// eslint-disable-next-line import/no-self-import
const docSource = await import('./view-more.vue?raw');
compCode.value = $prism.normalizeCode(compSource.default);
docCode.value = $prism.normalizeCode(docSource.default);
$prism.highlight();
}

const viewMoreProps = [
[
'content',
'String',
'n/a',
`
Required. Full content of text to be truncated.
`,
],
[
'length',
'Number',
'n/a',
`
Required. Maximum character length of text before it is truncated
`,
],
[
'clamp',
'String',
'Show more',
`
Text on button to expand content
`,
],
[
'less',
'String',
'Show less',
`
Text on button to truncate content
`,
],
];
</script>

<template>
<div>
<h1>View more</h1>
<p>
Using
<nuxt-link
href="https://www.npmjs.com/package/html-truncate"
target="_blank">
html-truncate</nuxt-link
>.
</p>

lgeggleston marked this conversation as resolved.
Show resolved Hide resolved
<es-view-more
class="my-500"
:length="100"
:content="`Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi in aliquam ex.
Nullam vestibulum ex mi, ut suscipit libero condimentum id. Pellentesque eu diam vel nisi
molestie porta eget sed odio. Quisque congue risus id metus facilisis, non imperdiet libero rutrum.
Mauris vitae ante porttitor, consectetur purus faucibus, euismod ex. Orci varius natoque penatibus
et magnis dis parturient montes, nascetur ridiculus mus. Nulla ullamcorper elit sed viverra finibus.
Mauris vitae tortor mauris. Cras suscipit nibh nec nisi cursus ornare. Maecenas quis turpis sit amet
sapien dapibus sollicitudin viverra eu justo. Vivamus posuere metus sit amet purus tempus volutpat.
Donec eleifend elit quam. `" />

<div class="mb-500">
<h2>EsViewMore props</h2>
<ds-prop-table :rows="viewMoreProps" />
</div>

<ds-doc-source
lgeggleston marked this conversation as resolved.
Show resolved Hide resolved
:comp-code="compCode"
comp-source="es-ds-components/components/es-view-more.vue"
:doc-code="docCode"
doc-source="es-ds-docs/pages/molecules/view-more.vue" />
</div>
</template>
Loading