@aglyn/plugins-data 1.0.0-beta.234 → 1.0.0-beta.235

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -40,6 +40,7 @@ import { DatasetRecordDialog } from "./dataset-record-dialog.component.js";
40
40
  import { datasetRecordFilter, planRecordQuery, recordColumn } from "./dataset-record-filter.js";
41
41
  import { coerceDocumentValues, datasetIntegrityUpdate, datasetValueToInput, effectiveDatasetModel, formatDatasetValue, modelFromFieldEntries, validateDocument } from "../model/dataset-models.js";
42
42
  import { fillRecordAddresses } from "../record-pages/record-pages.js";
43
+ import { planReferenceFixups, referencingFieldIds, restrictedDeleteMessage } from "../model/dataset-record-delete-plan.js";
43
44
  import { datasetDisplayName, parseDatasetFieldEntries } from "../model/datasets.js";
44
45
  import { datasetTransferResourceKey } from "../transfer/dataset-transfer-key.js";
45
46
  /**
@@ -861,11 +862,7 @@ export function newDatasetSharingNote(siteOnly) {
861
862
  * is not consulted; only a server route could close that.
862
863
  */ for (const other of datasets){
863
864
  const otherModel = effectiveDatasetModel(other);
864
- const referencing = otherModel.order.filter((fieldId)=>{
865
- var _otherModel_fields_fieldId, _otherModel_fields_fieldId_reference, _otherModel_fields_fieldId1;
866
- return ((_otherModel_fields_fieldId = otherModel.fields[fieldId]) == null ? void 0 : _otherModel_fields_fieldId.type) === 'reference' && ((_otherModel_fields_fieldId1 = otherModel.fields[fieldId]) == null ? void 0 : (_otherModel_fields_fieldId_reference = _otherModel_fields_fieldId1.reference) == null ? void 0 : _otherModel_fields_fieldId_reference.datasetId) === selected.$id;
867
- });
868
- if (!referencing.length) continue;
865
+ if (!referencingFieldIds(otherModel, selected.$id).length) continue;
869
866
  let snapshot;
870
867
  try {
871
868
  snapshot = await getDocs(query(collection(firestore, dataScope[0], dataScope[1], 'datasets', other.$id, 'records'), where('referencedIds', 'array-contains', record.$id)));
@@ -874,18 +871,16 @@ export function newDatasetSharingNote(siteOnly) {
874
871
  variant: 'error'
875
872
  });
876
873
  }
877
- const hits = snapshot.docs.filter((docSnapshot)=>referencing.some((fieldId)=>{
878
- var _docSnapshot_get;
879
- const stored = (_docSnapshot_get = docSnapshot.get('values')) == null ? void 0 : _docSnapshot_get[fieldId];
880
- return Array.isArray(stored) ? stored.includes(record.$id) : stored === record.$id;
881
- }));
882
- if (!hits.length) continue;
883
- const restricted = referencing.some((fieldId)=>{
884
- var _otherModel_fields_fieldId_reference, _otherModel_fields_fieldId;
885
- return ((_otherModel_fields_fieldId = otherModel.fields[fieldId]) == null ? void 0 : (_otherModel_fields_fieldId_reference = _otherModel_fields_fieldId.reference) == null ? void 0 : _otherModel_fields_fieldId_reference.onDelete) === 'restrict';
886
- });
887
- if (restricted) {
888
- return void enqueueSnackbar(`Cannot delete: referenced by ${hits.length} document` + `${hits.length === 1 ? '' : 's'} in "${datasetDisplayName(other)}"`, {
874
+ // The verdict is shared with `/api/orgs/datasets` `delete-record`
875
+ // (`planReferenceFixups`): the per-field test keeps the query EXACT,
876
+ // since `referencedIds` is the union across every reference field.
877
+ const plan = planReferenceFixups(otherModel, selected.$id, record.$id, snapshot.docs.map((docSnapshot)=>({
878
+ id: docSnapshot.id,
879
+ values: docSnapshot.get('values')
880
+ })));
881
+ if (plan.kind === 'none') continue;
882
+ if (plan.kind === 'restricted') {
883
+ return void enqueueSnackbar(restrictedDeleteMessage(plan.holders, datasetDisplayName(other)), {
889
884
  variant: 'warning',
890
885
  persist: false
891
886
  });
@@ -893,22 +888,14 @@ export function newDatasetSharingNote(siteOnly) {
893
888
  // Chunked under Firestore's 500-writes-per-batch cap. The query is no
894
889
  // longer bounded by a page size, so the number of holders is whatever
895
890
  // the collection really holds.
896
- for(let start = 0; start < hits.length; start += 400){
891
+ for(let start = 0; start < plan.updates.length; start += 400){
897
892
  const batch = writeBatch(firestore);
898
- for (const hit of hits.slice(start, start + 400)){
899
- var _hit_get;
900
- const values = _extends({}, (_hit_get = hit.get('values')) != null ? _hit_get : {});
901
- for (const fieldId of referencing){
902
- const stored = values[fieldId];
903
- if (Array.isArray(stored)) {
904
- values[fieldId] = stored.filter((id)=>id !== record.$id);
905
- } else if (stored === record.$id) {
906
- delete values[fieldId];
907
- }
908
- }
909
- batch.update(hit.ref, _extends({
910
- values
911
- }, datasetIntegrityUpdate(otherModel, values, deleteField())));
893
+ for (const update of plan.updates.slice(start, start + 400)){
894
+ const holder = snapshot.docs.find((docSnapshot)=>docSnapshot.id === update.id);
895
+ if (!holder) continue;
896
+ batch.update(holder.ref, _extends({
897
+ values: update.values
898
+ }, datasetIntegrityUpdate(otherModel, update.values, deleteField())));
912
899
  }
913
900
  await batch.commit();
914
901
  }