Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ae12f243ec | |||
| 85c93c060a | |||
| da0f9e7581 |
@@ -6,6 +6,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
|
||||
## [0.3.55] - 2025.02.07
|
||||
### Added
|
||||
- End time for projects
|
||||
|
||||
|
||||
## [0.3.54] - 2025.02.06
|
||||
### Added
|
||||
- Group onboarding meetings
|
||||
|
||||
@@ -74,7 +74,7 @@ TIME_SAFARI_APP_TITLE="TimeSafari_Test" VITE_APP_SERVER=https://test.timesafari.
|
||||
|
||||
(The plain `npm run build` uses the .env.production file.)
|
||||
|
||||
* Back up the time-safari/dist folder, then `mv time-safari/dist time-safari-dist-prev.0 && mv crowd-funder-for-time-pwa/dist time-safari/`
|
||||
* Back up the time-safari/dist folder & deploy: `mv time-safari/dist time-safari-dist-prev.0 && mv crowd-funder-for-time-pwa/dist time-safari/`
|
||||
|
||||
* Record the new hash in the changelog. Edit package.json to increment version & add "-beta", `npm install`, and commit. Also record what version is on production.
|
||||
|
||||
|
||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "TimeSafari",
|
||||
"version": "0.3.54",
|
||||
"version": "0.3.55",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "TimeSafari",
|
||||
"version": "0.3.54",
|
||||
"version": "0.3.55",
|
||||
"dependencies": {
|
||||
"@capacitor/android": "^6.1.2",
|
||||
"@capacitor/cli": "^6.1.2",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "TimeSafari",
|
||||
"version": "0.3.54",
|
||||
"version": "0.3.55",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"serve": "vite preview",
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
</div>
|
||||
<div>
|
||||
<fa icon="calendar" class="fa-fw text-slate-400" />
|
||||
Recorded
|
||||
{{ veriClaim.issuedAt?.replace(/T/, " ").replace(/Z/, " UTC") }}
|
||||
</div>
|
||||
<div v-if="veriClaim.claim.image" class="flex justify-center">
|
||||
|
||||
@@ -71,17 +71,17 @@
|
||||
|
||||
<textarea
|
||||
placeholder="Description"
|
||||
class="block w-full rounded border border-slate-400 mb-4 px-3 py-2"
|
||||
class="block w-full rounded border border-slate-400 px-3 py-2"
|
||||
rows="5"
|
||||
v-model="fullClaim.description"
|
||||
maxlength="5000"
|
||||
></textarea>
|
||||
<div class="text-xs text-slate-500 italic -mt-3 mb-4">
|
||||
<div class="text-xs text-slate-500 italic">
|
||||
If you want to be contacted, be sure to include your contact information
|
||||
-- just remember that this information is public and saved in a public
|
||||
history.
|
||||
</div>
|
||||
<div class="text-xs text-slate-500 italic -mt-3 mb-4">
|
||||
<div class="text-xs text-slate-500 italic">
|
||||
{{ fullClaim.description?.length }}/5000 max. characters
|
||||
</div>
|
||||
|
||||
@@ -89,28 +89,55 @@
|
||||
v-model="fullClaim.url"
|
||||
placeholder="Website"
|
||||
autocapitalize="none"
|
||||
class="block w-full rounded border border-slate-400 mb-4 px-3 py-2"
|
||||
class="block w-full rounded border border-slate-400 mt-4 px-3 py-2"
|
||||
/>
|
||||
|
||||
<div class="flex mb-4 columns-3 w-full">
|
||||
<input
|
||||
v-model="startDateInput"
|
||||
placeholder="Start Date"
|
||||
type="date"
|
||||
class="col-span-1 w-full rounded border border-slate-400 px-3 py-2"
|
||||
/>
|
||||
<input
|
||||
:disabled="!startDateInput"
|
||||
placeholder="Start Time"
|
||||
v-model="startTimeInput"
|
||||
type="time"
|
||||
class="col-span-1 w-full rounded border border-slate-400 ml-2 px-3 py-2"
|
||||
/>
|
||||
<span class="col-span-1 w-full flex justify-center">{{ zoneName }}</span>
|
||||
<div>
|
||||
<div class="flex items-center mt-4">
|
||||
<span class="mr-2">Starts At</span>
|
||||
<input
|
||||
v-model="startDateInput"
|
||||
placeholder="Start Date"
|
||||
type="date"
|
||||
class="rounded border border-slate-400 px-3 py-2"
|
||||
/>
|
||||
<input
|
||||
:disabled="!startDateInput"
|
||||
placeholder="Start Time"
|
||||
v-model="startTimeInput"
|
||||
type="time"
|
||||
class="rounded border border-slate-400 ml-2 px-3 py-2"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="flex w-full justify-end items-center">
|
||||
<span class="w-full flex justify-end items-center">
|
||||
{{ zoneName }} time zone
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center">
|
||||
<div class="mr-2">
|
||||
<span>Ends at</span>
|
||||
</div>
|
||||
<input
|
||||
v-model="endDateInput"
|
||||
placeholder="End Date"
|
||||
type="date"
|
||||
class="ml-2 rounded border border-slate-400 px-3 py-2"
|
||||
/>
|
||||
<input
|
||||
:disabled="!endDateInput"
|
||||
placeholder="End Time"
|
||||
v-model="endTimeInput"
|
||||
type="time"
|
||||
class="rounded border border-slate-400 ml-2 px-3 py-2"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="flex items-center mb-4"
|
||||
class="flex items-center mt-4"
|
||||
@click="includeLocation = !includeLocation"
|
||||
>
|
||||
<input type="checkbox" class="mr-2" v-model="includeLocation" />
|
||||
@@ -251,6 +278,8 @@ export default class NewEditProjectView extends Vue {
|
||||
activeDid = "";
|
||||
agentDid = "";
|
||||
apiServer = "";
|
||||
endDateInput?: string;
|
||||
endTimeInput?: string;
|
||||
errorMessage = "";
|
||||
fullClaim: PlanVerifiableCredential = {
|
||||
"@context": "https://schema.org",
|
||||
@@ -325,6 +354,13 @@ export default class NewEditProjectView extends Vue {
|
||||
this.startDateInput = localDateTime.toFormat("yyyy-MM-dd");
|
||||
this.startTimeInput = localDateTime.toFormat("HH:mm");
|
||||
}
|
||||
if (this.fullClaim.endTime) {
|
||||
const localDateTime = DateTime.fromISO(
|
||||
this.fullClaim.endTime as string,
|
||||
).toLocal();
|
||||
this.endDateInput = localDateTime.toFormat("yyyy-MM-dd");
|
||||
this.endTimeInput = localDateTime.toFormat("HH:mm");
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Got error retrieving that project", error);
|
||||
@@ -460,7 +496,7 @@ export default class NewEditProjectView extends Vue {
|
||||
group: "alert",
|
||||
type: "danger",
|
||||
title: "Date Error",
|
||||
text: "The date was invalid so it was not set.",
|
||||
text: "The start date was invalid so it was not set.",
|
||||
},
|
||||
5000,
|
||||
);
|
||||
@@ -468,6 +504,28 @@ export default class NewEditProjectView extends Vue {
|
||||
} else {
|
||||
delete vcClaim.startTime;
|
||||
}
|
||||
if (this.endDateInput) {
|
||||
try {
|
||||
const endTimeFull = this.endTimeInput || "23:59:59";
|
||||
const fullTimeString = this.endDateInput + " " + endTimeFull;
|
||||
// throw an error on an invalid date or time string
|
||||
vcClaim.endTime = new Date(fullTimeString).toISOString(); // ensure timezone is part of it
|
||||
} catch {
|
||||
// it's not a valid date so erase it and tell the user
|
||||
delete vcClaim.endTime;
|
||||
this.$notify(
|
||||
{
|
||||
group: "alert",
|
||||
type: "danger",
|
||||
title: "Date Error",
|
||||
text: "The end date was invalid so it was not set.",
|
||||
},
|
||||
5000,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
delete vcClaim.endTime;
|
||||
}
|
||||
const vcJwt = await createEndorserJwtVcFromClaim(this.activeDid, vcClaim);
|
||||
|
||||
// Make the xhr request payload
|
||||
|
||||
@@ -69,7 +69,11 @@
|
||||
</div>
|
||||
<div v-if="startTime">
|
||||
<fa icon="calendar" class="fa-fw text-slate-400"></fa>
|
||||
{{ startTime }}
|
||||
Starts {{ startTime }}
|
||||
</div>
|
||||
<div v-if="endTime">
|
||||
<fa icon="calendar" class="fa-fw text-slate-400"></fa>
|
||||
Ends {{ endTime }}
|
||||
</div>
|
||||
<div v-if="latitude || longitude">
|
||||
<fa icon="location-dot" class="fa-fw text-slate-400"></fa>
|
||||
@@ -541,6 +545,7 @@ export default class ProjectViewView extends Vue {
|
||||
apiServer = "";
|
||||
checkingConfirmationForJwtId = "";
|
||||
description = "";
|
||||
endTime = "";
|
||||
expanded = false;
|
||||
fulfilledByThis: PlanSummaryRecord | null = null;
|
||||
fulfillersToThis: Array<PlanSummaryRecord> = [];
|
||||
@@ -641,6 +646,14 @@ export default class ProjectViewView extends Vue {
|
||||
" " +
|
||||
startDateTime.toLocaleTimeString();
|
||||
}
|
||||
const endTime = resp.data.claim?.endTime;
|
||||
if (endTime != null) {
|
||||
const endDateTime = new Date(endTime);
|
||||
this.endTime =
|
||||
endDateTime.toLocaleDateString() +
|
||||
" " +
|
||||
endDateTime.toLocaleTimeString();
|
||||
}
|
||||
this.agentDid = resp.data.claim?.agent?.identifier;
|
||||
this.agentDidVisibleToDids =
|
||||
resp.data.claim?.agent?.identifierVisibleToDids || [];
|
||||
|
||||
@@ -2,7 +2,6 @@ import { test, expect } from '@playwright/test';
|
||||
import { importUser } from './testUtils';
|
||||
|
||||
test('Create new project, then search for it', async ({ page }) => {
|
||||
test.slow();
|
||||
|
||||
// Generate a random string of 16 characters
|
||||
let randomString = Math.random().toString(36).substring(2, 18);
|
||||
|
||||
@@ -2,7 +2,7 @@ import { test, expect } from '@playwright/test';
|
||||
import { importUser, createUniqueStringsArray } from './testUtils';
|
||||
|
||||
test('Create 10 new projects', async ({ page }) => {
|
||||
test.setTimeout(40000); // Set timeout longer since it often fails at 30 seconds
|
||||
test.slow(); // Set timeout longer since it often fails at 30 seconds
|
||||
|
||||
const projectCount = 10;
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@ import { test, expect } from '@playwright/test';
|
||||
import { importUser } from './testUtils';
|
||||
|
||||
test('Record an offer', async ({ page }) => {
|
||||
test.setTimeout(45000);
|
||||
|
||||
// Generate a random string of 3 characters, skipping the "0." at the beginning
|
||||
const randomString = Math.random().toString(36).substring(2, 5);
|
||||
// Standard title prefix
|
||||
|
||||
Reference in New Issue
Block a user