forked from jsnbuchanan/crowd-funder-for-time-pwa
docs: add comprehensive JSDoc documentation to views
Changes: - Add detailed JSDoc headers to ContactImportView - Add component-level documentation to ProjectViewView - Document state management and data flow - Add security considerations and usage examples - Improve test script documentation and organization - Add interface documentation for deep linking This improves code maintainability by documenting component architecture, workflows and integration points.
This commit is contained in:
@@ -568,6 +568,37 @@ import * as serverUtil from "../libs/endorserServer";
|
||||
import { retrieveAccountDids } from "../libs/util";
|
||||
import HiddenDidDialog from "../components/HiddenDidDialog.vue";
|
||||
|
||||
/**
|
||||
* Project View Component
|
||||
* @author Matthew Raymer
|
||||
*
|
||||
* This component displays detailed project information and manages interactions including:
|
||||
* - Project metadata (name, description, dates, location)
|
||||
* - Issuer information and verification
|
||||
* - Project contributions and fulfillments
|
||||
* - Offers and gifts tracking
|
||||
* - Contact interactions
|
||||
*
|
||||
* Data Flow:
|
||||
* 1. Component loads with project ID from route
|
||||
* 2. Fetches project data, contacts, and account settings
|
||||
* 3. Loads related data (offers, gifts, fulfillments)
|
||||
* 4. Updates UI with paginated results
|
||||
*
|
||||
* Security Features:
|
||||
* - DID visibility controls
|
||||
* - JWT validation for imports
|
||||
* - Permission checks for actions
|
||||
*
|
||||
* State Management:
|
||||
* - Maintains separate loading states for different data types
|
||||
* - Handles pagination limits
|
||||
* - Tracks confirmation states
|
||||
*
|
||||
* @see GiftedDialog for gift creation
|
||||
* @see OfferDialog for offer creation
|
||||
* @see HiddenDidDialog for DID privacy explanations
|
||||
*/
|
||||
@Component({
|
||||
components: {
|
||||
EntityIcon,
|
||||
@@ -580,49 +611,103 @@ import HiddenDidDialog from "../components/HiddenDidDialog.vue";
|
||||
},
|
||||
})
|
||||
export default class ProjectViewView extends Vue {
|
||||
/** Notification function injected by Vue */
|
||||
$notify!: (notification: NotificationIface, timeout?: number) => void;
|
||||
/** Router instance for navigation */
|
||||
$router!: Router;
|
||||
|
||||
// Account and Settings State
|
||||
/** Currently active DID */
|
||||
activeDid = "";
|
||||
/** Project agent DID */
|
||||
agentDid = "";
|
||||
/** DIDs that can see the agent DID */
|
||||
agentDidVisibleToDids: Array<string> = [];
|
||||
/** All DIDs associated with current account */
|
||||
allMyDids: Array<string> = [];
|
||||
/** All known contacts */
|
||||
allContacts: Array<Contact> = [];
|
||||
/** API server endpoint */
|
||||
apiServer = "";
|
||||
checkingConfirmationForJwtId = "";
|
||||
description = "";
|
||||
endTime = "";
|
||||
expanded = false;
|
||||
fulfilledByThis: PlanSummaryRecord | null = null;
|
||||
fulfillersToThis: Array<PlanSummaryRecord> = [];
|
||||
fulfillersToHitLimit = false;
|
||||
givesToThis: Array<GiveSummaryRecord> = [];
|
||||
givesHitLimit = false;
|
||||
givesProvidedByThis: Array<GiveSummaryRecord> = [];
|
||||
givesProvidedByHitLimit = false;
|
||||
imageUrl = "";
|
||||
/** Registration status of current user */
|
||||
isRegistered = false;
|
||||
|
||||
// Project Data
|
||||
/** Project description */
|
||||
description = "";
|
||||
/** Project end time */
|
||||
endTime = "";
|
||||
/** Text expansion state */
|
||||
expanded = false;
|
||||
/** Project fulfilled by this project */
|
||||
fulfilledByThis: PlanSummaryRecord | null = null;
|
||||
/** Projects fulfilling this project */
|
||||
fulfillersToThis: Array<PlanSummaryRecord> = [];
|
||||
/** Flag for fulfiller pagination */
|
||||
fulfillersToHitLimit = false;
|
||||
/** Project image URL */
|
||||
imageUrl = "";
|
||||
/** Project issuer DID */
|
||||
issuer = "";
|
||||
/** Cached issuer information */
|
||||
issuerInfoObject: {
|
||||
known: boolean;
|
||||
displayName: string;
|
||||
profileImageUrl?: string;
|
||||
} | null = null;
|
||||
/** DIDs that can see issuer information */
|
||||
issuerVisibleToDids: Array<string> = [];
|
||||
/** Project location data */
|
||||
latitude = 0;
|
||||
longitude = 0;
|
||||
/** Project name */
|
||||
name = "";
|
||||
offersToThis: Array<OfferSummaryRecord> = [];
|
||||
offersHitLimit = false;
|
||||
projectId = ""; // handle ID
|
||||
recentlyCheckedAndUnconfirmableJwts: string[] = [];
|
||||
/** Project ID (handle) */
|
||||
projectId = "";
|
||||
/** Project start time */
|
||||
startTime = "";
|
||||
truncatedDesc = "";
|
||||
truncateLength = 40;
|
||||
/** Project URL */
|
||||
url = "";
|
||||
|
||||
// Interaction Data
|
||||
/** Gifts to this project */
|
||||
givesToThis: Array<GiveSummaryRecord> = [];
|
||||
/** Flag for gifts pagination */
|
||||
givesHitLimit = false;
|
||||
/** Gifts from this project */
|
||||
givesProvidedByThis: Array<GiveSummaryRecord> = [];
|
||||
/** Flag for provided gifts pagination */
|
||||
givesProvidedByHitLimit = false;
|
||||
/** Offers to this project */
|
||||
offersToThis: Array<OfferSummaryRecord> = [];
|
||||
/** Flag for offers pagination */
|
||||
offersHitLimit = false;
|
||||
|
||||
// UI State
|
||||
/** JWT being checked for confirmation */
|
||||
checkingConfirmationForJwtId = "";
|
||||
/** Recently checked unconfirmable JWTs */
|
||||
recentlyCheckedAndUnconfirmableJwts: string[] = [];
|
||||
truncatedDesc = "";
|
||||
/** Truncation length */
|
||||
truncateLength = 40;
|
||||
|
||||
// Utility References
|
||||
libsUtil = libsUtil;
|
||||
serverUtil = serverUtil;
|
||||
|
||||
/**
|
||||
* Component lifecycle hook that initializes the project view
|
||||
*
|
||||
* Workflow:
|
||||
* 1. Loads account settings and contacts
|
||||
* 2. Retrieves all account DIDs
|
||||
* 3. Extracts project ID from URL
|
||||
* 4. Initializes project data loading
|
||||
*
|
||||
* @throws Logs errors but continues loading
|
||||
* @emits Notification on profile loading errors
|
||||
*/
|
||||
async created() {
|
||||
const settings = await retrieveSettingsForActiveAccount();
|
||||
this.activeDid = settings.activeDid || "";
|
||||
@@ -656,23 +741,19 @@ export default class ProjectViewView extends Vue {
|
||||
this.loadProject(this.projectId, this.activeDid);
|
||||
}
|
||||
|
||||
onEditClick() {
|
||||
const route = {
|
||||
name: "new-edit-project",
|
||||
query: { projectId: this.projectId },
|
||||
};
|
||||
this.$router.push(route);
|
||||
}
|
||||
|
||||
// Isn't there a better way to make this available to the template?
|
||||
expandText() {
|
||||
this.expanded = true;
|
||||
}
|
||||
|
||||
collapseText() {
|
||||
this.expanded = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads project data and related information
|
||||
*
|
||||
* Workflow:
|
||||
* 1. Fetches project details from API
|
||||
* 2. Updates component state with project data
|
||||
* 3. Initializes related data loading (gifts, offers, fulfillments)
|
||||
*
|
||||
* @param projectId Project handle ID
|
||||
* @param userDid Active user's DID
|
||||
* @throws Logs errors and notifies user
|
||||
* @emits Notification on loading errors
|
||||
*/
|
||||
async loadProject(projectId: string, userDid: string) {
|
||||
this.projectId = projectId;
|
||||
|
||||
@@ -759,6 +840,15 @@ export default class ProjectViewView extends Vue {
|
||||
this.loadPlanFulfilledBy();
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads gifts made to this project
|
||||
*
|
||||
* Handles pagination and updates component state with results.
|
||||
* Uses beforeId for pagination based on last loaded gift.
|
||||
*
|
||||
* @throws Logs errors and notifies user
|
||||
* @emits Notification on loading errors
|
||||
*/
|
||||
async loadGives() {
|
||||
const givesUrl =
|
||||
this.apiServer +
|
||||
@@ -806,6 +896,15 @@ export default class ProjectViewView extends Vue {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads gifts provided by this project
|
||||
*
|
||||
* Similar to loadGives but for outgoing gifts.
|
||||
* Maintains separate pagination state.
|
||||
*
|
||||
* @throws Logs errors and notifies user
|
||||
* @emits Notification on loading errors
|
||||
*/
|
||||
async loadGivesProvidedBy() {
|
||||
const providedByUrl =
|
||||
this.apiServer +
|
||||
@@ -856,6 +955,15 @@ export default class ProjectViewView extends Vue {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads offers made to this project
|
||||
*
|
||||
* Handles pagination and filtering of valid offers.
|
||||
* Updates component state with results.
|
||||
*
|
||||
* @throws Logs errors and notifies user
|
||||
* @emits Notification on loading errors
|
||||
*/
|
||||
async loadOffers() {
|
||||
const offersUrl =
|
||||
this.apiServer +
|
||||
@@ -903,6 +1011,14 @@ export default class ProjectViewView extends Vue {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads projects that fulfill this project
|
||||
*
|
||||
* Manages pagination state and updates component with results.
|
||||
*
|
||||
* @throws Logs errors and notifies user
|
||||
* @emits Notification on loading errors
|
||||
*/
|
||||
async loadPlanFulfillersTo() {
|
||||
const fulfillsUrl =
|
||||
this.apiServer +
|
||||
@@ -951,6 +1067,14 @@ export default class ProjectViewView extends Vue {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads project that this project fulfills
|
||||
*
|
||||
* Updates fulfilledByThis state with result.
|
||||
*
|
||||
* @throws Logs errors and notifies user
|
||||
* @emits Notification on loading errors
|
||||
*/
|
||||
async loadPlanFulfilledBy() {
|
||||
const fulfilledByUrl =
|
||||
this.apiServer +
|
||||
@@ -990,6 +1114,23 @@ export default class ProjectViewView extends Vue {
|
||||
}
|
||||
}
|
||||
|
||||
onEditClick() {
|
||||
const route = {
|
||||
name: "new-edit-project",
|
||||
query: { projectId: this.projectId },
|
||||
};
|
||||
this.$router.push(route);
|
||||
}
|
||||
|
||||
// Isn't there a better way to make this available to the template?
|
||||
expandText() {
|
||||
this.expanded = true;
|
||||
}
|
||||
|
||||
collapseText() {
|
||||
this.expanded = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle clicking on a project entry found in the list
|
||||
* @param id of the project
|
||||
|
||||
Reference in New Issue
Block a user