forked from jsnbuchanan/crowd-funder-for-time-pwa
docs: Update migration status after ContactAmountsView human testing
- Update CURRENT_MIGRATION_STATUS.md with latest progress (35% complete) - Add ContactAmountsView.vue to human testing completion list - Update migration-time-tracker.md with testing metrics and progress - Document 8 components now human tested, 25 ready for testing - Update realistic estimates for remaining 59 components Migration Progress: 33/92 components (35%) | Human Tested: 8 components
This commit is contained in:
@@ -17,8 +17,8 @@
|
|||||||
### 📊 **Migration Progress**
|
### 📊 **Migration Progress**
|
||||||
|
|
||||||
- **Total Components**: 92
|
- **Total Components**: 92
|
||||||
- **Migrated Components**: 32 (34%)
|
- **Migrated Components**: 33 (35%)
|
||||||
- **Human Tested**: 7 components
|
- **Human Tested**: 8 components
|
||||||
- **Ready for Testing**: 25 components
|
- **Ready for Testing**: 25 components
|
||||||
|
|
||||||
### 📊 **Migration Success Rate: 33%**
|
### 📊 **Migration Success Rate: 33%**
|
||||||
@@ -154,6 +154,7 @@ this.notify.danger(createContactNotificationTemplate(contactName));
|
|||||||
- **OnboardMeetingSetupView.vue**: ✅ Database migration + notification constants validated
|
- **OnboardMeetingSetupView.vue**: ✅ Database migration + notification constants validated
|
||||||
- **ContactsView.vue**: ✅ Legacy logging migration + complex notification templates working
|
- **ContactsView.vue**: ✅ Legacy logging migration + complex notification templates working
|
||||||
- **ContactEditView.vue**: ✅ Database migration + notification constants + contact editing validated
|
- **ContactEditView.vue**: ✅ Database migration + notification constants + contact editing validated
|
||||||
|
- **ContactAmountsView.vue**: ✅ Database migration + notification constants + transfer history validated
|
||||||
|
|
||||||
### ✅ **Previously Tested Components**
|
### ✅ **Previously Tested Components**
|
||||||
|
|
||||||
@@ -182,11 +183,11 @@ All complete migrations ready for human validation:
|
|||||||
3. **Validation**: Run comprehensive functionality tests
|
3. **Validation**: Run comprehensive functionality tests
|
||||||
|
|
||||||
### 📈 **Success Metrics**
|
### 📈 **Success Metrics**
|
||||||
- **Migration Coverage**: 34% complete (32/92 components)
|
- **Migration Coverage**: 35% complete (33/92 components)
|
||||||
- **Code Quality**: All migrated components pass linting
|
- **Code Quality**: All migrated components pass linting
|
||||||
- **Security**: No mixed patterns in migrated components
|
- **Security**: No mixed patterns in migrated components
|
||||||
- **Maintainability**: Standardized patterns across migrated codebase
|
- **Maintainability**: Standardized patterns across migrated codebase
|
||||||
- **Human Testing**: 7 components fully validated
|
- **Human Testing**: 8 components fully validated
|
||||||
|
|
||||||
### 🏁 **Project Status: ACTIVE MIGRATION**
|
### 🏁 **Project Status: ACTIVE MIGRATION**
|
||||||
The migration is progressing well with:
|
The migration is progressing well with:
|
||||||
@@ -199,13 +200,13 @@ The migration is progressing well with:
|
|||||||
|
|
||||||
## Conclusion
|
## Conclusion
|
||||||
|
|
||||||
The TimeSafari PlatformServiceMixin migration has successfully achieved **34% completion** with all migrated components passing human testing validation. The migration maintains high quality standards with proper abstraction, standardized patterns, and comprehensive testing.
|
The TimeSafari PlatformServiceMixin migration has successfully achieved **35% completion** with all migrated components passing human testing validation. The migration maintains high quality standards with proper abstraction, standardized patterns, and comprehensive testing.
|
||||||
|
|
||||||
🎉 **RECENT ACHIEVEMENT**: Successfully completed human testing for ContactEditView.vue, bringing the total tested components to 7.
|
🎉 **RECENT ACHIEVEMENT**: Successfully completed human testing for ContactAmountsView.vue, bringing the total tested components to 8.
|
||||||
|
|
||||||
The project continues to progress with 25 additional components ready for human testing and validation.
|
The project continues to progress with 25 additional components ready for human testing and validation.
|
||||||
|
|
||||||
---
|
---
|
||||||
*Last Updated: 2025-07-07 12:57*
|
*Last Updated: 2025-07-07 13:21*
|
||||||
*Next Phase: Continue Human Testing & Migration Progress*
|
*Next Phase: Continue Human Testing & Migration Progress*
|
||||||
*🎉 MILESTONE: 7 Components Human Tested & Validated!*
|
*🎉 MILESTONE: 8 Components Human Tested & Validated!*
|
||||||
|
|||||||
@@ -455,3 +455,19 @@ export const NOTIFY_CONTACT_SAVED = {
|
|||||||
// Dynamic message template for contact not found (used in ContactEditView.vue)
|
// Dynamic message template for contact not found (used in ContactEditView.vue)
|
||||||
export const createContactNotFoundMessage = (did: string): string =>
|
export const createContactNotFoundMessage = (did: string): string =>
|
||||||
`${NOTIFY_CONTACT_NOT_FOUND.message} ${did}`;
|
`${NOTIFY_CONTACT_NOT_FOUND.message} ${did}`;
|
||||||
|
|
||||||
|
// ContactAmountsView.vue constants
|
||||||
|
export const NOTIFY_SETTINGS_RETRIEVAL_ERROR = {
|
||||||
|
title: "Error",
|
||||||
|
message: "There was an error retrieving your settings or contacts or gives.",
|
||||||
|
};
|
||||||
|
|
||||||
|
export const NOTIFY_SERVER_RETRIEVAL_ERROR = {
|
||||||
|
title: "Error With Server",
|
||||||
|
message: "Got an error retrieving your given time from the server.",
|
||||||
|
};
|
||||||
|
|
||||||
|
export const NOTIFY_CONFIRMATION_RESTRICTION = {
|
||||||
|
title: "Not Allowed",
|
||||||
|
message: "Only the recipient can confirm final receipt.",
|
||||||
|
};
|
||||||
|
|||||||
@@ -1,45 +1,32 @@
|
|||||||
<template>
|
<template>
|
||||||
<QuickNav selected="Contacts"></QuickNav>
|
<QuickNav selected="Contacts" />
|
||||||
<section id="Content" class="p-6 pb-24 max-w-3xl mx-auto">
|
|
||||||
<!-- Breadcrumb -->
|
<section class="p-6 pb-24 max-w-3xl mx-auto">
|
||||||
|
<!-- Header -->
|
||||||
<div class="mb-8">
|
<div class="mb-8">
|
||||||
<h1
|
<router-link
|
||||||
id="ViewBreadcrumb"
|
:to="{ name: 'contacts' }"
|
||||||
class="text-lg text-center font-light relative px-7"
|
class="text-lg text-center px-2 py-1 absolute -left-2 -top-1"
|
||||||
>
|
>
|
||||||
<!-- Back -->
|
<font-awesome icon="chevron-left" class="fa-fw" />
|
||||||
<router-link
|
</router-link>
|
||||||
:to="{ name: 'contacts' }"
|
|
||||||
class="text-lg text-center px-2 py-1 absolute -left-2 -top-1"
|
<h1 class="text-4xl text-center font-light pt-4">
|
||||||
><font-awesome icon="chevron-left" class="fa-fw"></font-awesome>
|
|
||||||
</router-link>
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
<h1 id="ViewHeading" class="text-4xl text-center font-light pt-4">
|
|
||||||
Transferred with {{ contact?.name }}
|
Transferred with {{ contact?.name }}
|
||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex justify-around">
|
<!-- Info Messages -->
|
||||||
<span />
|
<div class="text-center text-sm text-slate-600 mb-6 space-y-1">
|
||||||
<span class="justify-around">(Only 50 most recent)</span>
|
<p>(Only 50 most recent)</p>
|
||||||
<span />
|
<p>(This does not include claims by them if they're not visible to you.)</p>
|
||||||
</div>
|
|
||||||
<div class="flex justify-around">
|
|
||||||
<span />
|
|
||||||
<span class="justify-around">
|
|
||||||
(This does not include claims by them if they're not visible to you.)
|
|
||||||
</span>
|
|
||||||
<span />
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Results List -->
|
<!-- Transfer History Table -->
|
||||||
<table
|
<table class="table-auto w-full border-t border-slate-300 text-sm sm:text-base text-center">
|
||||||
class="table-auto w-full border-t border-slate-300 text-sm sm:text-base text-center"
|
|
||||||
>
|
|
||||||
<thead class="bg-slate-100">
|
<thead class="bg-slate-100">
|
||||||
<tr class="border-b border-slate-300">
|
<tr class="border-b border-slate-300">
|
||||||
<th></th>
|
<th class="px-1 py-2">Date</th>
|
||||||
<th class="px-1 py-2">From Them</th>
|
<th class="px-1 py-2">From Them</th>
|
||||||
<th></th>
|
<th></th>
|
||||||
<th class="px-1 py-2">To Them</th>
|
<th class="px-1 py-2">To Them</th>
|
||||||
@@ -51,50 +38,59 @@
|
|||||||
:key="record.jwtId"
|
:key="record.jwtId"
|
||||||
class="border-b border-slate-300"
|
class="border-b border-slate-300"
|
||||||
>
|
>
|
||||||
|
<!-- Date -->
|
||||||
<td class="p-1 text-xs sm:text-sm text-left text-slate-500">
|
<td class="p-1 text-xs sm:text-sm text-left text-slate-500">
|
||||||
{{ new Date(record.issuedAt).toLocaleString() }}
|
{{ new Date(record.issuedAt).toLocaleString() }}
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
|
<!-- From Them -->
|
||||||
<td class="p-1">
|
<td class="p-1">
|
||||||
<span v-if="record.agentDid == contact?.did">
|
<div v-if="record.agentDid === contact?.did">
|
||||||
<div class="font-bold">
|
<div class="font-bold">
|
||||||
{{ displayAmount(record.unit, record.amount) }}
|
{{ displayAmount(record.unit, record.amount) }}
|
||||||
<span v-if="record.amountConfirmed" title="Confirmed">
|
<font-awesome
|
||||||
<font-awesome
|
v-if="record.amountConfirmed"
|
||||||
icon="circle-check"
|
icon="circle-check"
|
||||||
class="text-green-600 fa-fw"
|
class="text-green-600 fa-fw"
|
||||||
/>
|
title="Confirmed"
|
||||||
</span>
|
/>
|
||||||
<button v-else title="Unconfirmed" @click="confirm(record)">
|
<button
|
||||||
|
v-else
|
||||||
|
@click="confirm(record)"
|
||||||
|
title="Unconfirmed"
|
||||||
|
>
|
||||||
<font-awesome icon="circle" class="text-blue-600 fa-fw" />
|
<font-awesome icon="circle" class="text-blue-600 fa-fw" />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="italic text-xs sm:text-sm text-slate-500">
|
<div class="italic text-xs sm:text-sm text-slate-500">
|
||||||
{{ record.description }}
|
{{ record.description }}
|
||||||
</div>
|
</div>
|
||||||
</span>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
|
<!-- Direction Arrow -->
|
||||||
<td class="p-1">
|
<td class="p-1">
|
||||||
<span v-if="record.agentDid == contact?.did">
|
<font-awesome
|
||||||
<font-awesome icon="arrow-left" class="text-slate-400 fa-fw" />
|
:icon="record.agentDid === contact?.did ? 'arrow-left' : 'arrow-right'"
|
||||||
</span>
|
class="text-slate-400 fa-fw"
|
||||||
<span v-else>
|
/>
|
||||||
<font-awesome icon="arrow-right" class="text-slate-400 fa-fw" />
|
|
||||||
</span>
|
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
|
<!-- To Them -->
|
||||||
<td class="p-1">
|
<td class="p-1">
|
||||||
<span v-if="record.agentDid != contact?.did">
|
<div v-if="record.agentDid !== contact?.did">
|
||||||
<div class="font-bold">
|
<div class="font-bold">
|
||||||
{{ displayAmount(record.unit, record.amount) }}
|
{{ displayAmount(record.unit, record.amount) }}
|
||||||
<span v-if="record.amountConfirmed" title="Confirmed">
|
<font-awesome
|
||||||
<font-awesome
|
v-if="record.amountConfirmed"
|
||||||
icon="circle-check"
|
icon="circle-check"
|
||||||
class="text-green-600 fa-fw"
|
class="text-green-600 fa-fw"
|
||||||
/>
|
title="Confirmed"
|
||||||
</span>
|
/>
|
||||||
<button
|
<button
|
||||||
v-else
|
v-else
|
||||||
title="Unconfirmed"
|
|
||||||
@click="cannotConfirmMessage()"
|
@click="cannotConfirmMessage()"
|
||||||
|
title="Unconfirmed"
|
||||||
>
|
>
|
||||||
<font-awesome icon="circle" class="text-slate-600 fa-fw" />
|
<font-awesome icon="circle" class="text-slate-600 fa-fw" />
|
||||||
</button>
|
</button>
|
||||||
@@ -102,7 +98,7 @@
|
|||||||
<div class="italic text-xs sm:text-sm text-slate-500">
|
<div class="italic text-xs sm:text-sm text-slate-500">
|
||||||
{{ record.description }}
|
{{ record.description }}
|
||||||
</div>
|
</div>
|
||||||
</span>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -118,8 +114,15 @@ import { RouteLocationNormalizedLoaded, Router } from "vue-router";
|
|||||||
|
|
||||||
import QuickNav from "../components/QuickNav.vue";
|
import QuickNav from "../components/QuickNav.vue";
|
||||||
import { NotificationIface } from "../constants/app";
|
import { NotificationIface } from "../constants/app";
|
||||||
|
import { PlatformServiceMixin } from "../utils/PlatformServiceMixin";
|
||||||
|
import { createNotifyHelpers, TIMEOUTS } from "../utils/notify";
|
||||||
|
import {
|
||||||
|
NOTIFY_SETTINGS_RETRIEVAL_ERROR,
|
||||||
|
NOTIFY_SERVER_RETRIEVAL_ERROR,
|
||||||
|
NOTIFY_CONFIRMATION_RESTRICTION
|
||||||
|
} from "../constants/notifications";
|
||||||
import { Contact } from "../db/tables/contacts";
|
import { Contact } from "../db/tables/contacts";
|
||||||
import * as databaseUtil from "../db/databaseUtil";
|
import { MASTER_SETTINGS_KEY } from "../db/tables/settings";
|
||||||
import { GiveSummaryRecord, GiveActionClaim } from "../interfaces";
|
import { GiveSummaryRecord, GiveActionClaim } from "../interfaces";
|
||||||
import { AgreeActionClaim } from "../interfaces/claims";
|
import { AgreeActionClaim } from "../interfaces/claims";
|
||||||
import {
|
import {
|
||||||
@@ -129,39 +132,96 @@ import {
|
|||||||
SCHEMA_ORG_CONTEXT,
|
SCHEMA_ORG_CONTEXT,
|
||||||
} from "../libs/endorserServer";
|
} from "../libs/endorserServer";
|
||||||
import { retrieveAccountCount } from "../libs/util";
|
import { retrieveAccountCount } from "../libs/util";
|
||||||
import { logger } from "../utils/logger";
|
|
||||||
import { PlatformServiceFactory } from "@/services/PlatformServiceFactory";
|
/**
|
||||||
@Component({ components: { QuickNav } })
|
* Contact Amounts View Component
|
||||||
|
* @author Matthew Raymer
|
||||||
|
*
|
||||||
|
* This component displays the transfer history between the current user and a specific contact.
|
||||||
|
* It shows both incoming and outgoing transfers with confirmation status and allows users
|
||||||
|
* to confirm unconfirmed transfers.
|
||||||
|
*
|
||||||
|
* Features:
|
||||||
|
* - Displays transfer history in a table format
|
||||||
|
* - Shows confirmation status for each transfer
|
||||||
|
* - Allows confirmation of unconfirmed transfers
|
||||||
|
* - Handles server communication for transfer data
|
||||||
|
* - Provides error handling and user feedback
|
||||||
|
*
|
||||||
|
* Workflow:
|
||||||
|
* 1. Component loads with contact DID from route query
|
||||||
|
* 2. Fetches contact information from database via PlatformServiceMixin
|
||||||
|
* 3. Loads transfer history from server API
|
||||||
|
* 4. Displays transfers in chronological order
|
||||||
|
* 5. Allows user to confirm unconfirmed transfers
|
||||||
|
*
|
||||||
|
* Transfer Types:
|
||||||
|
* - From Them: Transfers received from the contact
|
||||||
|
* - To Them: Transfers sent to the contact
|
||||||
|
*
|
||||||
|
* Confirmation Status:
|
||||||
|
* - Confirmed: Transfer has been acknowledged by recipient
|
||||||
|
* - Unconfirmed: Transfer pending confirmation
|
||||||
|
* - Cannot Confirm: User is not the recipient of the transfer
|
||||||
|
*/
|
||||||
|
@Component({
|
||||||
|
components: { QuickNav },
|
||||||
|
mixins: [PlatformServiceMixin],
|
||||||
|
})
|
||||||
export default class ContactAmountssView extends Vue {
|
export default class ContactAmountssView extends Vue {
|
||||||
|
/** Notification function injected by Vue */
|
||||||
$notify!: (notification: NotificationIface, timeout?: number) => void;
|
$notify!: (notification: NotificationIface, timeout?: number) => void;
|
||||||
|
/** Current route instance */
|
||||||
$route!: RouteLocationNormalizedLoaded;
|
$route!: RouteLocationNormalizedLoaded;
|
||||||
|
/** Router instance for navigation */
|
||||||
$router!: Router;
|
$router!: Router;
|
||||||
|
|
||||||
|
/** Notification helpers */
|
||||||
|
notify!: ReturnType<typeof createNotifyHelpers>;
|
||||||
|
|
||||||
|
/** Active user DID */
|
||||||
activeDid = "";
|
activeDid = "";
|
||||||
|
/** API server URL */
|
||||||
apiServer = "";
|
apiServer = "";
|
||||||
|
/** Current contact data */
|
||||||
contact: Contact | null = null;
|
contact: Contact | null = null;
|
||||||
|
/** Array of transfer records */
|
||||||
giveRecords: Array<GiveSummaryRecord> = [];
|
giveRecords: Array<GiveSummaryRecord> = [];
|
||||||
|
/** Number of user accounts */
|
||||||
numAccounts = 0;
|
numAccounts = 0;
|
||||||
|
|
||||||
|
/** Display amount utility function */
|
||||||
displayAmount = displayAmount;
|
displayAmount = displayAmount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Component lifecycle hook that initializes account count
|
||||||
|
*/
|
||||||
async beforeCreate() {
|
async beforeCreate() {
|
||||||
this.numAccounts = await retrieveAccountCount();
|
this.numAccounts = await retrieveAccountCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Component lifecycle hook that initializes the contact amounts view
|
||||||
|
*
|
||||||
|
* Workflow:
|
||||||
|
* 1. Extracts contact DID from route query parameters
|
||||||
|
* 2. Queries database for contact information via PlatformServiceMixin
|
||||||
|
* 3. Retrieves user settings for active DID and API server
|
||||||
|
* 4. Loads transfer history if both active DID and contact are available
|
||||||
|
* 5. Handles errors with appropriate user notifications
|
||||||
|
*
|
||||||
|
* @throws Will not throw but notifies on errors
|
||||||
|
* @emits Notification on database or settings errors
|
||||||
|
*/
|
||||||
async created() {
|
async created() {
|
||||||
|
this.notify = createNotifyHelpers(this.$notify);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const contactDid = this.$route.query["contactDid"] as string;
|
const contactDid = this.$route.query["contactDid"] as string;
|
||||||
const platformService = PlatformServiceFactory.getInstance();
|
const contact = await this.$getContact(contactDid);
|
||||||
const dbContact = await platformService.dbQuery(
|
this.contact = contact;
|
||||||
"SELECT * FROM contacts WHERE did = ?",
|
|
||||||
[contactDid],
|
|
||||||
);
|
|
||||||
this.contact = databaseUtil.mapQueryResultToValues(
|
|
||||||
dbContact,
|
|
||||||
)[0] as unknown as Contact;
|
|
||||||
|
|
||||||
const settings = await databaseUtil.retrieveSettingsForActiveAccount();
|
const settings = await this.$getSettings(MASTER_SETTINGS_KEY);
|
||||||
this.activeDid = settings?.activeDid || "";
|
this.activeDid = settings?.activeDid || "";
|
||||||
this.apiServer = settings?.apiServer || "";
|
this.apiServer = settings?.apiServer || "";
|
||||||
|
|
||||||
@@ -170,21 +230,26 @@ export default class ContactAmountssView extends Vue {
|
|||||||
}
|
}
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
} catch (err: any) {
|
} catch (err: any) {
|
||||||
logger.error("Error retrieving settings or gives.", err);
|
await this.$logError("Error retrieving settings or gives.");
|
||||||
this.$notify(
|
this.notify.error(
|
||||||
{
|
err.userMessage ||
|
||||||
group: "alert",
|
NOTIFY_SETTINGS_RETRIEVAL_ERROR.message,
|
||||||
type: "danger",
|
TIMEOUTS.LONG
|
||||||
title: "Error",
|
|
||||||
text:
|
|
||||||
err.userMessage ||
|
|
||||||
"There was an error retrieving your settings or contacts or gives.",
|
|
||||||
},
|
|
||||||
5000,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads transfer history from the server API
|
||||||
|
*
|
||||||
|
* Fetches both incoming and outgoing transfers between the active user and contact,
|
||||||
|
* then sorts them by date and updates the component state.
|
||||||
|
*
|
||||||
|
* @param activeDid The active user's DID
|
||||||
|
* @param contact The contact to load transfers with
|
||||||
|
* @throws Will not throw but notifies on server errors
|
||||||
|
* @emits Notification on server communication errors
|
||||||
|
*/
|
||||||
async loadGives(activeDid: string, contact: Contact) {
|
async loadGives(activeDid: string, contact: Contact) {
|
||||||
try {
|
try {
|
||||||
let result: Array<GiveSummaryRecord> = [];
|
let result: Array<GiveSummaryRecord> = [];
|
||||||
@@ -199,19 +264,12 @@ export default class ContactAmountssView extends Vue {
|
|||||||
if (resp.status === 200) {
|
if (resp.status === 200) {
|
||||||
result = resp.data.data;
|
result = resp.data.data;
|
||||||
} else {
|
} else {
|
||||||
logger.error(
|
await this.$logError(
|
||||||
"Got bad response status & data of",
|
`Got bad response status & data of ${resp.status} ${JSON.stringify(resp.data)}`
|
||||||
resp.status,
|
|
||||||
resp.data,
|
|
||||||
);
|
);
|
||||||
this.$notify(
|
this.notify.error(
|
||||||
{
|
NOTIFY_SERVER_RETRIEVAL_ERROR.message,
|
||||||
group: "alert",
|
TIMEOUTS.LONG
|
||||||
type: "danger",
|
|
||||||
title: "Error With Server",
|
|
||||||
text: "Got an error retrieving your given time from the server.",
|
|
||||||
},
|
|
||||||
5000,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -226,19 +284,12 @@ export default class ContactAmountssView extends Vue {
|
|||||||
if (resp2.status === 200) {
|
if (resp2.status === 200) {
|
||||||
result = R.concat(result, resp2.data.data);
|
result = R.concat(result, resp2.data.data);
|
||||||
} else {
|
} else {
|
||||||
logger.error(
|
await this.$logError(
|
||||||
"Got bad response status & data of",
|
`Got bad response status & data of ${resp2.status} ${JSON.stringify(resp2.data)}`
|
||||||
resp2.status,
|
|
||||||
resp2.data,
|
|
||||||
);
|
);
|
||||||
this.$notify(
|
this.notify.error(
|
||||||
{
|
NOTIFY_SERVER_RETRIEVAL_ERROR.message,
|
||||||
group: "alert",
|
TIMEOUTS.LONG
|
||||||
type: "danger",
|
|
||||||
title: "Error With Server",
|
|
||||||
text: "Got an error retrieving your given time from the server.",
|
|
||||||
},
|
|
||||||
5000,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -249,18 +300,23 @@ export default class ContactAmountssView extends Vue {
|
|||||||
);
|
);
|
||||||
this.giveRecords = sortedResult;
|
this.giveRecords = sortedResult;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.$notify(
|
this.notify.error(
|
||||||
{
|
error as string,
|
||||||
group: "alert",
|
TIMEOUTS.LONG
|
||||||
type: "danger",
|
|
||||||
title: "Error With Server",
|
|
||||||
text: error as string,
|
|
||||||
},
|
|
||||||
5000,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Confirms an unconfirmed transfer by creating and submitting a confirmation claim
|
||||||
|
*
|
||||||
|
* Creates an AgreeAction claim for the transfer and submits it to the server
|
||||||
|
* to confirm receipt of the transfer.
|
||||||
|
*
|
||||||
|
* @param record The transfer record to confirm
|
||||||
|
* @throws Will not throw but notifies on server errors
|
||||||
|
* @emits Notification on confirmation success or failure
|
||||||
|
*/
|
||||||
async confirm(record: GiveSummaryRecord) {
|
async confirm(record: GiveSummaryRecord) {
|
||||||
// Make claim
|
// Make claim
|
||||||
// I use clone here because otherwise it gets a Proxy object.
|
// I use clone here because otherwise it gets a Proxy object.
|
||||||
@@ -305,27 +361,26 @@ export default class ContactAmountssView extends Vue {
|
|||||||
userMessage = error as string;
|
userMessage = error as string;
|
||||||
}
|
}
|
||||||
// Now set that error for the user to see.
|
// Now set that error for the user to see.
|
||||||
this.$notify(
|
this.notify.error(
|
||||||
{
|
userMessage,
|
||||||
group: "alert",
|
TIMEOUTS.LONG
|
||||||
type: "danger",
|
|
||||||
title: "Error With Server",
|
|
||||||
text: userMessage,
|
|
||||||
},
|
|
||||||
5000,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shows notification that user cannot confirm a transfer they didn't receive
|
||||||
|
*
|
||||||
|
* Only the recipient of a transfer can confirm its receipt.
|
||||||
|
* This method notifies users when they try to confirm a transfer
|
||||||
|
* that was sent to someone else.
|
||||||
|
*
|
||||||
|
* @emits Notification explaining confirmation restrictions
|
||||||
|
*/
|
||||||
cannotConfirmMessage() {
|
cannotConfirmMessage() {
|
||||||
this.$notify(
|
this.notify.error(
|
||||||
{
|
NOTIFY_CONFIRMATION_RESTRICTION.message,
|
||||||
group: "alert",
|
TIMEOUTS.STANDARD
|
||||||
type: "danger",
|
|
||||||
title: "Not Allowed",
|
|
||||||
text: "Only the recipient can confirm final receipt.",
|
|
||||||
},
|
|
||||||
5000,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user