diff --git a/src/components/EntityGrid.vue b/src/components/EntityGrid.vue
index 6c84eb7b..42d93eed 100644
--- a/src/components/EntityGrid.vue
+++ b/src/components/EntityGrid.vue
@@ -307,14 +307,14 @@ export default class EntityGrid extends Vue {
}
/**
- * Get the 3 most recently added contacts (when showing contacts and not searching)
+ * Get the most recently added contacts (when showing contacts and not searching)
*/
get recentContacts(): Contact[] {
if (this.entityType !== "people" || this.searchTerm.trim()) {
return [];
}
// Entities are already sorted by date added (newest first)
- return (this.entities as Contact[]).slice(0, 3);
+ return (this.entities as Contact[]).slice(0, RECENT_CONTACTS_COUNT);
}
/**
@@ -325,16 +325,16 @@ export default class EntityGrid extends Vue {
if (this.entityType !== "people" || this.searchTerm.trim()) {
return [];
}
- // Skip the first 3 (recent contacts) and sort the rest alphabetically
+ // Skip the first few (recent contacts) and sort the rest alphabetically
// Create a copy to avoid mutating the original array
- const remaining = (this.entities as Contact[]).slice(RECENT_CONTACTS_COUNT);
+ const remaining = this.entities as Contact[];
const sorted = [...remaining].sort((a: Contact, b: Contact) => {
// Sort alphabetically by name, falling back to DID if name is missing
const nameA = (a.name || a.did).toLowerCase();
const nameB = (b.name || b.did).toLowerCase();
return nameA.localeCompare(nameB);
});
- // Apply infinite scroll: show based on displayedCount (minus the 3 recent)
+ // Apply infinite scroll: show based on displayedCount (minus the recent contacts)
const toShow = Math.max(0, this.displayedCount - RECENT_CONTACTS_COUNT);
return sorted.slice(0, toShow);
}
@@ -531,9 +531,8 @@ export default class EntityGrid extends Vue {
}
// People: check if more alphabetical contacts available
- // Total available = 3 recent + all alphabetical
- const remaining = (this.entities as Contact[]).slice(RECENT_CONTACTS_COUNT);
- const totalAvailable = RECENT_CONTACTS_COUNT + remaining.length;
+ // Total available = recent + all alphabetical
+ const totalAvailable = RECENT_CONTACTS_COUNT + this.entities.length;
return this.displayedCount < totalAvailable;
}
diff --git a/src/components/ProjectRepresentativeDialog.vue b/src/components/ProjectRepresentativeDialog.vue
new file mode 100644
index 00000000..51afcb5f
--- /dev/null
+++ b/src/components/ProjectRepresentativeDialog.vue
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
diff --git a/src/views/NewEditProjectView.vue b/src/views/NewEditProjectView.vue
index d732045f..8f93aa4b 100644
--- a/src/views/NewEditProjectView.vue
+++ b/src/views/NewEditProjectView.vue
@@ -60,12 +60,60 @@
Beware!
@@ -232,9 +280,12 @@ import { LMap, LMarker, LTileLayer } from "@vue-leaflet/vue-leaflet";
import { RouteLocationNormalizedLoaded, Router } from "vue-router";
import { LeafletMouseEvent } from "leaflet";
+import EntityIcon from "../components/EntityIcon.vue";
import ImageMethodDialog from "../components/ImageMethodDialog.vue";
+import ProjectRepresentativeDialog from "../components/ProjectRepresentativeDialog.vue";
import QuickNav from "../components/QuickNav.vue";
import {
+ AppString,
DEFAULT_IMAGE_API_SERVER,
DEFAULT_PARTNER_API_SERVER,
NotificationIface,
@@ -268,6 +319,7 @@ import {
retrieveAccountCount,
retrieveFullyDecryptedAccount,
} from "../libs/util";
+import { Contact } from "../db/tables/contacts";
import {
EventTemplate,
@@ -323,7 +375,15 @@ import { logger } from "../utils/logger";
*/
@Component({
- components: { ImageMethodDialog, LMap, LMarker, LTileLayer, QuickNav },
+ components: {
+ EntityIcon,
+ ImageMethodDialog,
+ ProjectRepresentativeDialog,
+ LMap,
+ LMarker,
+ LTileLayer,
+ QuickNav,
+ },
mixins: [PlatformServiceMixin],
})
export default class NewEditProjectView extends Vue {
@@ -334,6 +394,9 @@ export default class NewEditProjectView extends Vue {
// Notification helpers
private notify!: ReturnType