diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index e6d8a6b7482a..7a320e409e4e 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -1311,6 +1311,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password updated", "description": "ex. Date this password was updated" diff --git a/apps/browser/src/popup/vault/view.component.html b/apps/browser/src/popup/vault/view.component.html index 5fa5d2aba6cc..ac117afd39d3 100644 --- a/apps/browser/src/popup/vault/view.component.html +++ b/apps/browser/src/popup/vault/view.component.html @@ -622,6 +622,10 @@

{{ "dateUpdated" | i18n }}: {{ cipher.revisionDate | date: "medium" }} +
+ {{ "dateCreated" | i18n }}: + {{ cipher.creationDate | date: "medium" }} +
{{ "datePasswordUpdated" | i18n }}: {{ cipher.passwordRevisionDisplayDate | date: "medium" }} diff --git a/apps/cli/src/models/response/cipherResponse.ts b/apps/cli/src/models/response/cipherResponse.ts index a52084de7729..9f44fbb38a8a 100644 --- a/apps/cli/src/models/response/cipherResponse.ts +++ b/apps/cli/src/models/response/cipherResponse.ts @@ -11,6 +11,7 @@ export class CipherResponse extends CipherWithIdExport implements BaseResponse { object: string; attachments: AttachmentResponse[]; revisionDate: Date; + creationDate: Date; deletedDate: Date; passwordHistory: PasswordHistoryResponse[]; @@ -22,6 +23,9 @@ export class CipherResponse extends CipherWithIdExport implements BaseResponse { this.attachments = o.attachments.map((a) => new AttachmentResponse(a)); } this.revisionDate = o.revisionDate; + if (o.creationDate != null) { + this.creationDate = o.creationDate; + } this.deletedDate = o.deletedDate; if (o.passwordHistory != null) { this.passwordHistory = o.passwordHistory.map((h) => new PasswordHistoryResponse(h)); diff --git a/apps/desktop/src/app/vault/view.component.html b/apps/desktop/src/app/vault/view.component.html index 69201a18d673..b25c947a9328 100644 --- a/apps/desktop/src/app/vault/view.component.html +++ b/apps/desktop/src/app/vault/view.component.html @@ -475,6 +475,10 @@

{{ "dateUpdated" | i18n }}: {{ cipher.revisionDate | date: "medium" }}

+
+ {{ "dateCreated" | i18n }}: + {{ cipher.creationDate | date: "medium" }} +
{{ "datePasswordUpdated" | i18n }}: {{ cipher.passwordRevisionDisplayDate | date: "medium" }} diff --git a/apps/desktop/src/locales/en/messages.json b/apps/desktop/src/locales/en/messages.json index 2c0967fa27db..b656c5b1964a 100644 --- a/apps/desktop/src/locales/en/messages.json +++ b/apps/desktop/src/locales/en/messages.json @@ -1266,6 +1266,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" diff --git a/apps/web/src/app/vault/add-edit.component.html b/apps/web/src/app/vault/add-edit.component.html index bec9064b8173..e936ef7ba621 100644 --- a/apps/web/src/app/vault/add-edit.component.html +++ b/apps/web/src/app/vault/add-edit.component.html @@ -787,6 +787,10 @@

{{ "collections" | i18n }}

{{ "dateUpdated" | i18n }}: {{ cipher.revisionDate | date: "medium" }}
+
+ {{ "dateCreated" | i18n }}: + {{ cipher.creationDate | date: "medium" }} +
{{ "datePasswordUpdated" | i18n }}: {{ cipher.passwordRevisionDisplayDate | date: "medium" }} diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 755eb80b7ae5..58215711d5ef 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -3313,6 +3313,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" diff --git a/libs/common/spec/models/domain/cipher.spec.ts b/libs/common/spec/models/domain/cipher.spec.ts index 763e57bb4e70..316a20e98f78 100644 --- a/libs/common/spec/models/domain/cipher.spec.ts +++ b/libs/common/spec/models/domain/cipher.spec.ts @@ -42,6 +42,7 @@ describe("Cipher DTO", () => { revisionDate: null, collectionIds: undefined, localData: null, + creationDate: null, deletedDate: null, reprompt: undefined, attachments: null, @@ -66,6 +67,7 @@ describe("Cipher DTO", () => { type: CipherType.Login, name: "EncryptedString", notes: "EncryptedString", + creationDate: "2022-01-01T12:00:00.000Z", deletedDate: null, reprompt: CipherRepromptType.None, login: { @@ -131,6 +133,7 @@ describe("Cipher DTO", () => { revisionDate: new Date("2022-01-31T12:00:00.000Z"), collectionIds: undefined, localData: null, + creationDate: new Date("2022-01-01T12:00:00.000Z"), deletedDate: null, reprompt: 0, login: { @@ -200,6 +203,7 @@ describe("Cipher DTO", () => { cipher.type = CipherType.Login; cipher.name = mockEnc("EncryptedString"); cipher.notes = mockEnc("EncryptedString"); + cipher.creationDate = new Date("2022-01-01T12:00:00.000Z"); cipher.deletedDate = null; cipher.reprompt = CipherRepromptType.None; @@ -230,6 +234,7 @@ describe("Cipher DTO", () => { passwordHistory: null, collectionIds: undefined, revisionDate: new Date("2022-01-31T12:00:00.000Z"), + creationDate: new Date("2022-01-01T12:00:00.000Z"), deletedDate: null, reprompt: 0, localData: undefined, @@ -253,6 +258,7 @@ describe("Cipher DTO", () => { type: CipherType.SecureNote, name: "EncryptedString", notes: "EncryptedString", + creationDate: "2022-01-01T12:00:00.000Z", deletedDate: null, reprompt: CipherRepromptType.None, secureNote: { @@ -278,6 +284,7 @@ describe("Cipher DTO", () => { revisionDate: new Date("2022-01-31T12:00:00.000Z"), collectionIds: undefined, localData: null, + creationDate: new Date("2022-01-01T12:00:00.000Z"), deletedDate: null, reprompt: 0, secureNote: { type: SecureNoteType.Generic }, @@ -305,6 +312,7 @@ describe("Cipher DTO", () => { cipher.type = CipherType.SecureNote; cipher.name = mockEnc("EncryptedString"); cipher.notes = mockEnc("EncryptedString"); + cipher.creationDate = new Date("2022-01-01T12:00:00.000Z"); cipher.deletedDate = null; cipher.reprompt = CipherRepromptType.None; cipher.secureNote = new SecureNote(); @@ -329,6 +337,7 @@ describe("Cipher DTO", () => { passwordHistory: null, collectionIds: undefined, revisionDate: new Date("2022-01-31T12:00:00.000Z"), + creationDate: new Date("2022-01-01T12:00:00.000Z"), deletedDate: null, reprompt: 0, localData: undefined, @@ -352,6 +361,7 @@ describe("Cipher DTO", () => { type: CipherType.Card, name: "EncryptedString", notes: "EncryptedString", + creationDate: "2022-01-01T12:00:00.000Z", deletedDate: null, reprompt: CipherRepromptType.None, card: { @@ -382,6 +392,7 @@ describe("Cipher DTO", () => { revisionDate: new Date("2022-01-31T12:00:00.000Z"), collectionIds: undefined, localData: null, + creationDate: new Date("2022-01-01T12:00:00.000Z"), deletedDate: null, reprompt: 0, card: { @@ -416,6 +427,7 @@ describe("Cipher DTO", () => { cipher.type = CipherType.Card; cipher.name = mockEnc("EncryptedString"); cipher.notes = mockEnc("EncryptedString"); + cipher.creationDate = new Date("2022-01-01T12:00:00.000Z"); cipher.deletedDate = null; cipher.reprompt = CipherRepromptType.None; @@ -446,6 +458,7 @@ describe("Cipher DTO", () => { passwordHistory: null, collectionIds: undefined, revisionDate: new Date("2022-01-31T12:00:00.000Z"), + creationDate: new Date("2022-01-01T12:00:00.000Z"), deletedDate: null, reprompt: 0, localData: undefined, @@ -469,6 +482,7 @@ describe("Cipher DTO", () => { type: CipherType.Identity, name: "EncryptedString", notes: "EncryptedString", + creationDate: "2022-01-01T12:00:00.000Z", deletedDate: null, reprompt: CipherRepromptType.None, identity: { @@ -511,6 +525,7 @@ describe("Cipher DTO", () => { revisionDate: new Date("2022-01-31T12:00:00.000Z"), collectionIds: undefined, localData: null, + creationDate: new Date("2022-01-01T12:00:00.000Z"), deletedDate: null, reprompt: 0, identity: { @@ -557,6 +572,7 @@ describe("Cipher DTO", () => { cipher.type = CipherType.Identity; cipher.name = mockEnc("EncryptedString"); cipher.notes = mockEnc("EncryptedString"); + cipher.creationDate = new Date("2022-01-01T12:00:00.000Z"); cipher.deletedDate = null; cipher.reprompt = CipherRepromptType.None; @@ -587,6 +603,7 @@ describe("Cipher DTO", () => { passwordHistory: null, collectionIds: undefined, revisionDate: new Date("2022-01-31T12:00:00.000Z"), + creationDate: new Date("2022-01-01T12:00:00.000Z"), deletedDate: null, reprompt: 0, localData: undefined, diff --git a/libs/common/src/models/data/cipherData.ts b/libs/common/src/models/data/cipherData.ts index aa82a5fd0be8..34815a65968c 100644 --- a/libs/common/src/models/data/cipherData.ts +++ b/libs/common/src/models/data/cipherData.ts @@ -30,6 +30,7 @@ export class CipherData { attachments?: AttachmentData[]; passwordHistory?: PasswordHistoryData[]; collectionIds?: string[]; + creationDate: string; deletedDate: string; reprompt: CipherRepromptType; @@ -50,6 +51,7 @@ export class CipherData { this.name = response.name; this.notes = response.notes; this.collectionIds = collectionIds != null ? collectionIds : response.collectionIds; + this.creationDate = response.creationDate; this.deletedDate = response.deletedDate; this.reprompt = response.reprompt; diff --git a/libs/common/src/models/domain/cipher.ts b/libs/common/src/models/domain/cipher.ts index ca792926c019..e2c15a12081c 100644 --- a/libs/common/src/models/domain/cipher.ts +++ b/libs/common/src/models/domain/cipher.ts @@ -38,6 +38,7 @@ export class Cipher extends Domain { fields: Field[]; passwordHistory: Password[]; collectionIds: string[]; + creationDate: Date; deletedDate: Date; reprompt: CipherRepromptType; @@ -72,6 +73,7 @@ export class Cipher extends Domain { this.revisionDate = obj.revisionDate != null ? new Date(obj.revisionDate) : null; this.collectionIds = obj.collectionIds; this.localData = localData; + this.creationDate = obj.creationDate != null ? new Date(obj.creationDate) : null; this.deletedDate = obj.deletedDate != null ? new Date(obj.deletedDate) : null; this.reprompt = obj.reprompt; @@ -200,6 +202,7 @@ export class Cipher extends Domain { c.revisionDate = this.revisionDate != null ? this.revisionDate.toISOString() : null; c.type = this.type; c.collectionIds = this.collectionIds; + c.creationDate = this.creationDate != null ? this.creationDate.toISOString() : null; c.deletedDate = this.deletedDate != null ? this.deletedDate.toISOString() : null; c.reprompt = this.reprompt; diff --git a/libs/common/src/models/response/cipherResponse.ts b/libs/common/src/models/response/cipherResponse.ts index 5b461438e976..8eba6f627314 100644 --- a/libs/common/src/models/response/cipherResponse.ts +++ b/libs/common/src/models/response/cipherResponse.ts @@ -29,6 +29,7 @@ export class CipherResponse extends BaseResponse { attachments: AttachmentResponse[]; passwordHistory: PasswordHistoryResponse[]; collectionIds: string[]; + creationDate: string; deletedDate: string; reprompt: CipherRepromptType; @@ -50,6 +51,7 @@ export class CipherResponse extends BaseResponse { this.organizationUseTotp = this.getResponseProperty("OrganizationUseTotp"); this.revisionDate = this.getResponseProperty("RevisionDate"); this.collectionIds = this.getResponseProperty("CollectionIds"); + this.creationDate = this.getResponseProperty("CreationDate"); this.deletedDate = this.getResponseProperty("DeletedDate"); const login = this.getResponseProperty("Login"); diff --git a/libs/common/src/models/view/cipherView.ts b/libs/common/src/models/view/cipherView.ts index 4181c11d3586..a835fa16aeb6 100644 --- a/libs/common/src/models/view/cipherView.ts +++ b/libs/common/src/models/view/cipherView.ts @@ -36,6 +36,7 @@ export class CipherView implements View { passwordHistory: PasswordHistoryView[] = null; collectionIds: string[] = null; revisionDate: Date = null; + creationDate: Date = null; deletedDate: Date = null; reprompt: CipherRepromptType = CipherRepromptType.None; @@ -55,6 +56,7 @@ export class CipherView implements View { this.localData = c.localData; this.collectionIds = c.collectionIds; this.revisionDate = c.revisionDate; + this.creationDate = c.creationDate; this.deletedDate = c.deletedDate; // Old locally stored ciphers might have reprompt == null. If so set it to None. this.reprompt = c.reprompt ?? CipherRepromptType.None;