hadron-document
Advanced tools
Comparing version 0.0.0-next-69151f1cbaff4886cc4e85eaacaaf1b0ff732a2a to 0.0.0-next-69ce0b244a6ecc1c2f0a1aca2901a101bbd4a400
@@ -9,3 +9,11 @@ import type { Element } from './element'; | ||
Cancel: string; | ||
Expanded: string; | ||
Collapsed: string; | ||
VisibleElementsChanged: string; | ||
EditingStarted: string; | ||
EditingFinished: string; | ||
MarkedForDeletion: string; | ||
DeletionFinished: string; | ||
}; | ||
export declare const DEFAULT_VISIBLE_ELEMENTS = 25; | ||
export declare class Document extends EventEmitter { | ||
@@ -20,2 +28,6 @@ uuid: string; | ||
size: number | null; | ||
expanded: boolean; | ||
maxVisibleElementsCount: number; | ||
editing: boolean; | ||
markedForDeletion: boolean; | ||
cancel(): void; | ||
@@ -51,4 +63,20 @@ constructor(doc: BSONObject, cloned?: boolean); | ||
toEJSON(source?: 'original' | 'current', options?: HadronEJSONOptions): string; | ||
expand(): void; | ||
collapse(): void; | ||
getVisibleElements(): Element[]; | ||
setMaxVisibleElementsCount(newCount: number): void; | ||
getTotalVisibleElementsCount(): number; | ||
startEditing(elementId?: string, field?: 'key' | 'value' | 'type'): void; | ||
finishEditing(): void; | ||
onUpdateStart(): void; | ||
onUpdateSuccess(doc: Record<string, unknown>): void; | ||
onUpdateBlocked(): void; | ||
onUpdateError(error: Error): void; | ||
markForDeletion(): void; | ||
finishDeletion(): void; | ||
onRemoveStart(): void; | ||
onRemoveSuccess(): void; | ||
onRemoveError(error: Error): void; | ||
} | ||
export default Document; | ||
//# sourceMappingURL=document.d.ts.map |
@@ -6,3 +6,3 @@ 'use strict'; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.Document = exports.Events = void 0; | ||
exports.Document = exports.DEFAULT_VISIBLE_ELEMENTS = exports.Events = void 0; | ||
const element_1 = require("./element"); | ||
@@ -13,6 +13,15 @@ const eventemitter3_1 = __importDefault(require("eventemitter3")); | ||
const utils_1 = require("./utils"); | ||
const _1 = require("."); | ||
exports.Events = { | ||
Cancel: 'Document::Cancel', | ||
Expanded: 'Document::Expanded', | ||
Collapsed: 'Document::Collapsed', | ||
VisibleElementsChanged: 'Document::VisibleElementsChanged', | ||
EditingStarted: 'Document::EditingStarted', | ||
EditingFinished: 'Document::EditingFinished', | ||
MarkedForDeletion: 'Document::MarkedForDeletion', | ||
DeletionFinished: 'Document::DeletionFinished', | ||
}; | ||
const ID = '_id'; | ||
exports.DEFAULT_VISIBLE_ELEMENTS = 25; | ||
class Document extends eventemitter3_1.default { | ||
@@ -28,2 +37,6 @@ cancel() { | ||
this.size = null; | ||
this.expanded = false; | ||
this.maxVisibleElementsCount = exports.DEFAULT_VISIBLE_ELEMENTS; | ||
this.editing = false; | ||
this.markedForDeletion = false; | ||
this.uuid = new bson_1.UUID().toHexString(); | ||
@@ -125,2 +138,3 @@ this.doc = doc; | ||
newElement._bubbleUp(element_1.Events.Added, newElement, this); | ||
this.emit(exports.Events.VisibleElementsChanged, this); | ||
return newElement; | ||
@@ -131,2 +145,3 @@ } | ||
newElement._bubbleUp(element_1.Events.Added, newElement, this); | ||
this.emit(exports.Events.VisibleElementsChanged, this); | ||
return newElement; | ||
@@ -137,2 +152,3 @@ } | ||
newElement?._bubbleUp(element_1.Events.Added, newElement, this); | ||
this.emit(exports.Events.VisibleElementsChanged, this); | ||
return newElement; | ||
@@ -179,2 +195,78 @@ } | ||
} | ||
expand() { | ||
this.expanded = true; | ||
for (const element of this.elements) { | ||
element.expand(true); | ||
} | ||
this.emit(exports.Events.Expanded); | ||
this.emit(exports.Events.VisibleElementsChanged, this); | ||
} | ||
collapse() { | ||
this.expanded = false; | ||
for (const element of this.elements) { | ||
element.collapse(); | ||
} | ||
this.emit(exports.Events.Collapsed); | ||
this.emit(exports.Events.VisibleElementsChanged, this); | ||
} | ||
getVisibleElements() { | ||
return [...this.elements].slice(0, this.maxVisibleElementsCount); | ||
} | ||
setMaxVisibleElementsCount(newCount) { | ||
this.maxVisibleElementsCount = newCount; | ||
this.emit(exports.Events.VisibleElementsChanged, this); | ||
} | ||
getTotalVisibleElementsCount() { | ||
const visibleElements = this.getVisibleElements(); | ||
return visibleElements.reduce((totalVisibleChildElements, element) => { | ||
return (totalVisibleChildElements + 1 + element.getTotalVisibleElementsCount()); | ||
}, 0); | ||
} | ||
startEditing(elementId, field) { | ||
if (!this.editing) { | ||
this.editing = true; | ||
this.emit(_1.DocumentEvents.EditingStarted, elementId, field); | ||
} | ||
} | ||
finishEditing() { | ||
if (this.editing) { | ||
this.editing = false; | ||
this.emit(_1.DocumentEvents.EditingFinished); | ||
} | ||
} | ||
onUpdateStart() { | ||
this.emit('update-start'); | ||
} | ||
onUpdateSuccess(doc) { | ||
this.emit('update-success', doc); | ||
this.finishEditing(); | ||
} | ||
onUpdateBlocked() { | ||
this.emit('update-blocked'); | ||
} | ||
onUpdateError(error) { | ||
this.emit('update-error', error.message); | ||
} | ||
markForDeletion() { | ||
if (!this.markedForDeletion) { | ||
this.markedForDeletion = true; | ||
this.emit(_1.DocumentEvents.MarkedForDeletion); | ||
} | ||
} | ||
finishDeletion() { | ||
if (this.markedForDeletion) { | ||
this.markedForDeletion = false; | ||
this.emit(_1.DocumentEvents.DeletionFinished); | ||
} | ||
} | ||
onRemoveStart() { | ||
this.emit('remove-start'); | ||
} | ||
onRemoveSuccess() { | ||
this.emit('remove-success'); | ||
this.finishDeletion(); | ||
} | ||
onRemoveError(error) { | ||
this.emit('remove-error', error.message); | ||
} | ||
} | ||
@@ -181,0 +273,0 @@ exports.Document = Document; |
@@ -59,5 +59,9 @@ "use strict"; | ||
_formattedValue() { | ||
return new Date(this.element.currentValue) | ||
.toISOString() | ||
.replace('Z', '+00:00'); | ||
const date = new Date(this.element.currentValue); | ||
try { | ||
return date.toISOString().replace('Z', '+00:00'); | ||
} | ||
catch { | ||
return String(date); | ||
} | ||
} | ||
@@ -64,0 +68,0 @@ } |
@@ -9,4 +9,7 @@ declare const _default: { | ||
readonly Valid: "Element::Valid"; | ||
readonly Expanded: "Element::Expanded"; | ||
readonly Collapsed: "Element::Collapsed"; | ||
readonly VisibleElementsChanged: "Element::VisibleElementsChanged"; | ||
}; | ||
export default _default; | ||
//# sourceMappingURL=element-events.d.ts.map |
@@ -11,3 +11,6 @@ "use strict"; | ||
Valid: 'Element::Valid', | ||
Expanded: 'Element::Expanded', | ||
Collapsed: 'Element::Collapsed', | ||
VisibleElementsChanged: 'Element::VisibleElementsChanged', | ||
}; | ||
//# sourceMappingURL=element-events.js.map |
@@ -11,2 +11,4 @@ import EventEmitter from 'eventemitter3'; | ||
export declare function isInternalFieldPath(path: string | number): boolean; | ||
export declare const DEFAULT_VISIBLE_ELEMENTS = 25; | ||
export declare function isValueExpandable(value: BSONValue): value is BSONObject | BSONArray; | ||
export declare class Element extends EventEmitter { | ||
@@ -29,2 +31,4 @@ uuid: string; | ||
decrypted: boolean; | ||
expanded: boolean; | ||
maxVisibleElementsCount: number; | ||
cancel(): void; | ||
@@ -56,2 +60,3 @@ constructor(key: string | number, value: BSONValue | number, parent?: Element | Document | null, added?: boolean); | ||
_isObjectIdEqual(): boolean; | ||
_isExpandable(): boolean; | ||
isLast(): boolean; | ||
@@ -76,2 +81,4 @@ isRenamed(): boolean; | ||
revert(): void; | ||
expand(expandChildren?: boolean): void; | ||
collapse(): void; | ||
_bubbleUp(evt: typeof Events[keyof typeof Events], ...data: BSONArray): void; | ||
@@ -81,5 +88,8 @@ _convertToEmptyObject(): void; | ||
_isElementEmpty(element: Element | undefined | null): boolean; | ||
_isExpandable(value: BSONValue): value is BSONObject | BSONArray; | ||
_generateElements(object: BSONObject | BSONArray): ElementList; | ||
_removeAddedElements(): void; | ||
getVisibleElements(): Element[]; | ||
setMaxVisibleElementsCount(newCount: number): void; | ||
getTotalVisibleElementsCount(): number; | ||
private emitVisibleElementsChanged; | ||
static get Events(): typeof ElementEvents; | ||
@@ -86,0 +96,0 @@ } |
@@ -6,3 +6,3 @@ 'use strict'; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.ElementList = exports.Element = exports.isInternalFieldPath = exports.Events = exports.DATE_FORMAT = void 0; | ||
exports.ElementList = exports.Element = exports.isValueExpandable = exports.DEFAULT_VISIBLE_ELEMENTS = exports.isInternalFieldPath = exports.Events = exports.DATE_FORMAT = void 0; | ||
const eventemitter3_1 = __importDefault(require("eventemitter3")); | ||
@@ -35,2 +35,7 @@ const lodash_1 = require("lodash"); | ||
]; | ||
exports.DEFAULT_VISIBLE_ELEMENTS = 25; | ||
function isValueExpandable(value) { | ||
return (0, lodash_1.isPlainObject)(value) || (0, lodash_1.isArray)(value); | ||
} | ||
exports.isValueExpandable = isValueExpandable; | ||
class Element extends eventemitter3_1.default { | ||
@@ -49,2 +54,4 @@ cancel() { | ||
super(); | ||
this.expanded = false; | ||
this.maxVisibleElementsCount = exports.DEFAULT_VISIBLE_ELEMENTS; | ||
this.uuid = new bson_1.UUID().toHexString(); | ||
@@ -63,3 +70,3 @@ this.key = key; | ||
} | ||
if (this._isExpandable(value)) { | ||
if (isValueExpandable(value)) { | ||
this.originalExpandableValue = value; | ||
@@ -100,7 +107,7 @@ this.elements = this._generateElements(value); | ||
this.currentType = hadron_type_checker_1.default.type(value); | ||
if (this._isExpandable(value) && !this._isExpandable(this.currentValue)) { | ||
if (isValueExpandable(value) && !isValueExpandable(this.currentValue)) { | ||
this.currentValue = null; | ||
this.elements = this._generateElements(value); | ||
} | ||
else if (!this._isExpandable(value) && this.elements) { | ||
else if (!isValueExpandable(value) && this.elements) { | ||
this.currentValue = value; | ||
@@ -181,2 +188,3 @@ this.elements = undefined; | ||
newElement._bubbleUp(element_events_1.default.Added, newElement, this); | ||
this.emitVisibleElementsChanged(); | ||
return newElement; | ||
@@ -190,2 +198,3 @@ } | ||
this._bubbleUp(element_events_1.default.Added, newElement); | ||
this.emitVisibleElementsChanged(); | ||
return newElement; | ||
@@ -260,2 +269,5 @@ } | ||
} | ||
_isExpandable() { | ||
return this.currentType === 'Array' || this.currentType === 'Object'; | ||
} | ||
isLast() { | ||
@@ -361,2 +373,3 @@ return this.parent?.elements?.lastElement === this; | ||
this._bubbleUp(element_events_1.default.Removed, this, this.parent); | ||
this.emitVisibleElementsChanged(this.parent); | ||
} | ||
@@ -368,2 +381,5 @@ } | ||
this._bubbleUp(element_events_1.default.Removed, this, this.parent); | ||
if (this.parent) { | ||
this.emitVisibleElementsChanged(this.parent); | ||
} | ||
delete this.parent; | ||
@@ -392,2 +408,28 @@ } | ||
} | ||
expand(expandChildren = false) { | ||
if (!this._isExpandable()) { | ||
return; | ||
} | ||
this.expanded = true; | ||
if (expandChildren && this.elements) { | ||
for (const element of this.elements) { | ||
element.expand(expandChildren); | ||
} | ||
} | ||
this.emit(_1.ElementEvents.Expanded, this); | ||
this.emitVisibleElementsChanged(); | ||
} | ||
collapse() { | ||
if (!this._isExpandable()) { | ||
return; | ||
} | ||
this.expanded = false; | ||
if (this.elements) { | ||
for (const element of this.elements) { | ||
element.collapse(); | ||
} | ||
} | ||
this.emit(_1.ElementEvents.Collapsed, this); | ||
this.emitVisibleElementsChanged(); | ||
} | ||
_bubbleUp(evt, ...data) { | ||
@@ -416,5 +458,2 @@ this.emit(evt, ...data); | ||
} | ||
_isExpandable(value) { | ||
return (0, lodash_1.isPlainObject)(value) || (0, lodash_1.isArray)(value); | ||
} | ||
_generateElements(object) { | ||
@@ -432,2 +471,31 @@ return new ElementList(this, object); | ||
} | ||
getVisibleElements() { | ||
if (!this.elements || !this.expanded) { | ||
return []; | ||
} | ||
return [...this.elements].slice(0, this.maxVisibleElementsCount); | ||
} | ||
setMaxVisibleElementsCount(newCount) { | ||
if (!this._isExpandable()) { | ||
return; | ||
} | ||
this.maxVisibleElementsCount = newCount; | ||
this.emitVisibleElementsChanged(); | ||
} | ||
getTotalVisibleElementsCount() { | ||
if (!this.elements || !this.expanded) { | ||
return 0; | ||
} | ||
return this.getVisibleElements().reduce((totalVisibleChildElements, element) => { | ||
return (totalVisibleChildElements + 1 + element.getTotalVisibleElementsCount()); | ||
}, 0); | ||
} | ||
emitVisibleElementsChanged(targetElement = this) { | ||
if (targetElement.isRoot()) { | ||
targetElement.emit(_1.DocumentEvents.VisibleElementsChanged, targetElement); | ||
} | ||
else if (targetElement.expanded) { | ||
targetElement._bubbleUp(element_events_1.default.VisibleElementsChanged, targetElement, targetElement.getRoot()); | ||
} | ||
} | ||
static get Events() { | ||
@@ -434,0 +502,0 @@ return _1.ElementEvents; |
@@ -1,3 +0,3 @@ | ||
import Document, { Events as DocumentEvents } from './document'; | ||
import Element, { Events as ElementEvents, isInternalFieldPath } from './element'; | ||
import Document, { Events as DocumentEvents, DEFAULT_VISIBLE_ELEMENTS as DEFAULT_VISIBLE_DOCUMENT_ELEMENTS } from './document'; | ||
import Element, { Events as ElementEvents, isInternalFieldPath, DEFAULT_VISIBLE_ELEMENTS } from './element'; | ||
import ElementEditor from './editor'; | ||
@@ -8,3 +8,3 @@ import type { Editor } from './editor'; | ||
export type { Editor }; | ||
export { Document, DocumentEvents, Element, ElementEvents, ElementEditor, isInternalFieldPath, getDefaultValueForType, objectToIdiomaticEJSON, }; | ||
export { Document, DocumentEvents, DEFAULT_VISIBLE_DOCUMENT_ELEMENTS, Element, ElementEvents, DEFAULT_VISIBLE_ELEMENTS, ElementEditor, isInternalFieldPath, getDefaultValueForType, objectToIdiomaticEJSON, }; | ||
//# sourceMappingURL=index.d.ts.map |
@@ -29,6 +29,7 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.objectToIdiomaticEJSON = exports.getDefaultValueForType = exports.isInternalFieldPath = exports.ElementEditor = exports.ElementEvents = exports.Element = exports.DocumentEvents = exports.Document = void 0; | ||
exports.objectToIdiomaticEJSON = exports.getDefaultValueForType = exports.isInternalFieldPath = exports.ElementEditor = exports.DEFAULT_VISIBLE_ELEMENTS = exports.ElementEvents = exports.Element = exports.DEFAULT_VISIBLE_DOCUMENT_ELEMENTS = exports.DocumentEvents = exports.Document = void 0; | ||
const document_1 = __importStar(require("./document")); | ||
exports.Document = document_1.default; | ||
Object.defineProperty(exports, "DocumentEvents", { enumerable: true, get: function () { return document_1.Events; } }); | ||
Object.defineProperty(exports, "DEFAULT_VISIBLE_DOCUMENT_ELEMENTS", { enumerable: true, get: function () { return document_1.DEFAULT_VISIBLE_ELEMENTS; } }); | ||
const element_1 = __importStar(require("./element")); | ||
@@ -38,2 +39,3 @@ exports.Element = element_1.default; | ||
Object.defineProperty(exports, "isInternalFieldPath", { enumerable: true, get: function () { return element_1.isInternalFieldPath; } }); | ||
Object.defineProperty(exports, "DEFAULT_VISIBLE_ELEMENTS", { enumerable: true, get: function () { return element_1.DEFAULT_VISIBLE_ELEMENTS; } }); | ||
const editor_1 = __importDefault(require("./editor")); | ||
@@ -40,0 +42,0 @@ exports.ElementEditor = editor_1.default; |
@@ -10,3 +10,3 @@ { | ||
"homepage": "https://github.com/mongodb-js/compass", | ||
"version": "0.0.0-next-69151f1cbaff4886cc4e85eaacaaf1b0ff732a2a", | ||
"version": "0.0.0-next-69ce0b244a6ecc1c2f0a1aca2901a101bbd4a400", | ||
"repository": { | ||
@@ -37,3 +37,3 @@ "type": "git", | ||
"compile": "tsc -p tsconfig.json", | ||
"depcheck": "depcheck", | ||
"depcheck": "compass-scripts check-peer-deps && depcheck", | ||
"eslint": "eslint", | ||
@@ -48,16 +48,15 @@ "prettier": "prettier", | ||
"test-ci": "npm run test-cov", | ||
"reformat": "npm run prettier -- --write . && npm run eslint . --fix" | ||
"reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." | ||
}, | ||
"dependencies": { | ||
"bson": "^6.0.0", | ||
"debug": "^4.2.0", | ||
"bson": "^6.7.0", | ||
"eventemitter3": "^4.0.0", | ||
"hadron-type-checker": "0.0.0-next-69151f1cbaff4886cc4e85eaacaaf1b0ff732a2a", | ||
"hadron-type-checker": "0.0.0-next-69ce0b244a6ecc1c2f0a1aca2901a101bbd4a400", | ||
"lodash": "^4.17.21" | ||
}, | ||
"devDependencies": { | ||
"@mongodb-js/eslint-config-compass": "0.0.0-next-69151f1cbaff4886cc4e85eaacaaf1b0ff732a2a", | ||
"@mongodb-js/mocha-config-compass": "0.0.0-next-69151f1cbaff4886cc4e85eaacaaf1b0ff732a2a", | ||
"@mongodb-js/prettier-config-compass": "0.0.0-next-69151f1cbaff4886cc4e85eaacaaf1b0ff732a2a", | ||
"@mongodb-js/tsconfig-compass": "0.0.0-next-69151f1cbaff4886cc4e85eaacaaf1b0ff732a2a", | ||
"@mongodb-js/eslint-config-compass": "0.0.0-next-69ce0b244a6ecc1c2f0a1aca2901a101bbd4a400", | ||
"@mongodb-js/mocha-config-compass": "0.0.0-next-69ce0b244a6ecc1c2f0a1aca2901a101bbd4a400", | ||
"@mongodb-js/prettier-config-compass": "0.0.0-next-69ce0b244a6ecc1c2f0a1aca2901a101bbd4a400", | ||
"@mongodb-js/tsconfig-compass": "0.0.0-next-69ce0b244a6ecc1c2f0a1aca2901a101bbd4a400", | ||
"chai": "^4.2.0", | ||
@@ -69,5 +68,6 @@ "depcheck": "^1.4.1", | ||
"moment": "^2.29.4", | ||
"prettier": "^2.7.1" | ||
"prettier": "^2.7.1", | ||
"sinon": "^17.0.1" | ||
}, | ||
"gitHead": "69151f1cbaff4886cc4e85eaacaaf1b0ff732a2a" | ||
"gitHead": "69ce0b244a6ecc1c2f0a1aca2901a101bbd4a400" | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
175532
4
2060
12
+ Addedhadron-type-checker@0.0.0-next-69ce0b244a6ecc1c2f0a1aca2901a101bbd4a400(transitive)
- Removeddebug@^4.2.0
- Removeddebug@4.4.0(transitive)
- Removedhadron-type-checker@0.0.0-next-69151f1cbaff4886cc4e85eaacaaf1b0ff732a2a(transitive)
- Removedms@2.1.3(transitive)
Updatedbson@^6.7.0
Updatedhadron-type-checker@0.0.0-next-69ce0b244a6ecc1c2f0a1aca2901a101bbd4a400