timesafari
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

224 lines
5.5 KiB

<template>
<div>
<h2>EntityGrid Function Prop Test</h2>
<div class="mb-4">
<button @click="toggleCustomFunction">
{{ useCustomFunction ? "Use Default" : "Use Custom Function" }}
</button>
<span class="ml-2"
>Current: {{ useCustomFunction ? "Custom" : "Default" }}</span
>
</div>
<div class="mb-4">
<h3>
People Grid ({{ people.length }} total,
{{ displayedPeopleCount }} shown)
</h3>
<EntityGrid
entity-type="people"
:entities="people"
:max-items="5"
:active-did="activeDid"
:all-my-dids="allMyDids"
:all-contacts="people"
:conflict-checker="conflictChecker"
:display-entities-function="
useCustomFunction ? customPeopleFunction : undefined
"
@entity-selected="handleEntitySelected"
/>
</div>
<div class="mb-4">
<h3>
Projects Grid ({{ projects.length }} total,
{{ displayedProjectsCount }} shown)
</h3>
<EntityGrid
entity-type="projects"
:entities="projects"
:max-items="3"
:active-did="activeDid"
:all-my-dids="allMyDids"
:all-contacts="people"
:conflict-checker="conflictChecker"
:display-entities-function="
useCustomFunction ? customProjectsFunction : undefined
"
@entity-selected="handleEntitySelected"
/>
</div>
<div class="mt-4">
<h3>Selected Entity:</h3>
<pre>{{ selectedEntity }}</pre>
</div>
</div>
</template>
<script lang="ts">
import { Component, Vue } from "vue-facing-decorator";
import EntityGrid from "../components/EntityGrid.vue";
import { Contact } from "../db/tables/contacts";
import { PlanData } from "../interfaces/records";
/**
* Test component to demonstrate EntityGrid's new displayEntitiesFunction prop
*
* Shows how parent components can control which entities are displayed
* through function props instead of relying on computed properties.
*/
@Component({
components: {
EntityGrid,
},
})
export default class EntityGridFunctionPropTest extends Vue {
useCustomFunction = false;
selectedEntity: {
type: "person" | "project" | "special";
entityType?: string;
data: Contact | PlanData | { did?: string; name: string };
} | null = null;
// Test data
activeDid = "did:example:123";
allMyDids = ["did:example:123"];
people: Contact[] = [
{
did: "did:example:1",
name: "Alice",
profileImageUrl: "https://example.com/alice.jpg",
},
{ did: "did:example:2", name: "Bob", profileImageUrl: "" },
{
did: "did:example:3",
name: "Charlie",
profileImageUrl: "https://example.com/charlie.jpg",
},
{ did: "did:example:4", name: "Diana", profileImageUrl: "" },
{
did: "did:example:5",
name: "Eve",
profileImageUrl: "https://example.com/eve.jpg",
},
{
did: "did:example:6",
name: "Frank",
profileImageUrl: "https://example.com/frank.jpg",
},
{ did: "did:example:7", name: "Grace", profileImageUrl: "" },
];
projects: PlanData[] = [
{
handleId: "proj1",
name: "Zebra Project",
description: "A project about zebras",
issuerDid: "did:example:1",
},
{
handleId: "proj2",
name: "Alpha Project",
description: "The first project",
issuerDid: "did:example:2",
},
{
handleId: "proj3",
name: "Beta Project",
description: "The second project",
issuerDid: "did:example:3",
},
{
handleId: "proj4",
name: "Gamma Project",
description: "The third project",
issuerDid: "did:example:4",
},
{
handleId: "proj5",
name: "Delta Project",
description: "The fourth project",
issuerDid: "did:example:5",
},
];
/**
* Custom function for people: only show those with profile images
*/
customPeopleFunction = (
entities: Contact[],
_entityType: string,
maxItems: number,
): Contact[] => {
return entities
.filter((person) => person.profileImageUrl)
.slice(0, maxItems);
};
/**
* Custom function for projects: sort by name and limit to 3
*/
customProjectsFunction = (
entities: PlanData[],
_entityType: string,
_maxItems: number,
): PlanData[] => {
return entities.sort((a, b) => a.name.localeCompare(b.name)).slice(0, 3);
};
/**
* Simple conflict checker for testing
*/
conflictChecker = (did: string): boolean => {
return did === this.activeDid;
};
/**
* Toggle between custom and default display functions
*/
toggleCustomFunction(): void {
this.useCustomFunction = !this.useCustomFunction;
}
/**
* Handle entity selection
*/
handleEntitySelected(event: {
type: "person" | "project" | "special";
entityType?: string;
data: Contact | PlanData | { did?: string; name: string };
}): void {
this.selectedEntity = event;
}
/**
* Computed properties to show display counts
*/
get displayedPeopleCount(): number {
if (this.useCustomFunction) {
return this.customPeopleFunction(this.people, "people", 5).length;
}
return Math.min(5, this.people.length);
}
get displayedProjectsCount(): number {
if (this.useCustomFunction) {
return this.customProjectsFunction(this.projects, "projects", 3).length;
}
return Math.min(7, this.projects.length);
}
}
</script>
<style scoped>
pre {
background: #f5f5f5;
padding: 10px;
border-radius: 4px;
font-size: 12px;
}
</style>