function()

in kahuna/public/js/metadata-templates/metadata-templates.js [26:204]


  function ($filter, $scope, $window, editsService, collections, leaseService) {

  let ctrl = this;

  ctrl.$onInit = () => {
    ctrl.templateSelected = false;
    ctrl.metadataTemplates = window._clientConfig.metadataTemplates;

    const filterNonEmpty = (list) => list.filter(s => (typeof s === 'string' && s !== "" && s !== " "));

    function resolvePlaceholders(str) {
      const placeHolderValues = {
        uploadDate: $filter('date')(ctrl.image.data.uploadTime, 'd MMM yyyy'),
        uploadTime: $filter('date')(ctrl.image.data.uploadTime, 'd MMM yyyy, HH:mm'),
        uploadedBy: ctrl.image.data.uploadedBy
      };

      return str.replace(/{\s*(\w+?)\s*}/g, (_, key) => placeHolderValues[key]);
    }

    function resolve(strategy, originalValue, changeToApply) {
      let resolvedValue = originalValue;

      if (strategy === 'replace') {
        resolvedValue = changeToApply;
      } else if (strategy === 'append') {
        resolvedValue = filterNonEmpty([originalValue, changeToApply]).join(' ');
      } else if (strategy === 'prepend') {
        resolvedValue = filterNonEmpty([changeToApply, originalValue]).join(' ');
      }

      return resolvePlaceholders(resolvedValue);
    }

    function toLease(templateLease) {
      const lease = {
        createdAt: new Date(),
        access: templateLease.leaseType,
        notes: templateLease.notes ? resolvePlaceholders(templateLease.notes) : undefined
      };

      if (templateLease.durationInMillis !== undefined) {
        const leaseDuration = moment.duration(templateLease.durationInMillis);

        lease.startDate = new Date();
        lease.endDate = moment(lease.startDate).add(leaseDuration).toDate();
      }

      if (ctrl.access === 'allow-syndication') {
        lease.endDate = null;
      }

      if (lease.access === 'deny-syndication') {
        lease.startDate = null;
      }

      return lease;
    }

    function verifyTemplateCollection(collectionNode, templateCollection) {
      if (templateCollection.every(node => collectionNode.data.fullPath.includes(node))) {
        return collectionNode;
      } else if (collectionNode.data.children.length > 0) {
        let i;
        let result = null;

        for (i = 0; result == null && i < collectionNode.data.children.length; i++) {
          result = verifyTemplateCollection(collectionNode.data.children[i], templateCollection);
        }
        return result;
      }
    }

    function applyTemplateToMetadata(templateMetadataFields) {
      if (templateMetadataFields && templateMetadataFields.length > 0) {
        const metadata = angular.copy(ctrl.originalMetadata);
        templateMetadataFields.forEach(field => {
          metadata[field.name] = resolve(field.resolveStrategy, metadata[field.name], field.value);
        });

        return metadata;
      }
    }

    function applyTemplateToUsageRights(templateUsageRights) {
      if (templateUsageRights && templateUsageRights.hasOwnProperty('category')) {
        return {
          ...templateUsageRights,
          creator: templateUsageRights.creator ? resolvePlaceholders(templateUsageRights.creator) : undefined,
          photographer: templateUsageRights.photographer ? resolvePlaceholders(templateUsageRights.photographer) : undefined,
          restrictions: templateUsageRights.restrictions ? resolvePlaceholders(templateUsageRights.restrictions) : undefined
        };
      } else {
        return ctrl.originalUsageRights;
      }
    }

    function applyTemplateToLeases(templateLeases) {
      if (templateLeases && templateLeases.leases.length > 0) {
        return templateLeases.leases.map(templateLease => toLease(templateLease));
      }
    }

    ctrl.selectTemplate = () => {
      if (ctrl.metadataTemplate) {
        collections.getCollections().then(existingCollections => {
          const collection = ctrl.metadataTemplate.collectionFullPath.length > 0 ? verifyTemplateCollection(existingCollections, ctrl.metadataTemplate.collectionFullPath) : undefined;
          const leases = applyTemplateToLeases(ctrl.metadataTemplate.templateLeases);
          const metadata = applyTemplateToMetadata(ctrl.metadataTemplate.metadataFields);
          const usageRights = applyTemplateToUsageRights(ctrl.metadataTemplate.usageRights);

          const leasesWithConfig = leases ? {replace: ctrl.metadataTemplate.templateLeases.replace, leases: leases} : undefined;
          ctrl.onMetadataTemplateSelected({metadata, usageRights, collection, leasesWithConfig});
        });
      } else {
        ctrl.cancel();
      }
    };

    ctrl.cancel = () => {
      ctrl.metadataTemplate = null;
      ctrl.saving = false;
      ctrl.onMetadataTemplateCancelled({metadata: ctrl.originalMetadata, usageRights: ctrl.originalUsageRights});
    };

    ctrl.applyTemplate = () => {
      ctrl.saving = true;
      if (ctrl.metadataTemplate.templateLeases) {
        ctrl.onMetadataTemplateApplying({leases: ctrl.metadataTemplate.templateLeases.leases});
      }

      let promise = Promise.resolve();

      promise.then(() => {
        if (ctrl.metadataTemplate.metadataFields.length > 0) {
          return editsService
            .update(ctrl.image.data.userMetadata.data.metadata, applyTemplateToMetadata(ctrl.metadataTemplate.metadataFields), ctrl.image);
        }
      })
      .then(() => {
        if (ctrl.metadataTemplate.collectionFullPath.length > 0) {
          return collections.addCollectionToImage(ctrl.image, ctrl.metadataTemplate.collectionFullPath);
        }
      })
      .then(() => {
        if (ctrl.metadataTemplate.usageRights) {
          return editsService
            .update(ctrl.image.data.userMetadata.data.usageRights, applyTemplateToUsageRights(ctrl.metadataTemplate.usageRights), ctrl.image)
            .then(() => editsService.updateMetadataFromUsageRights(ctrl.image, false));
        }
      })
      .then(() => {
        if (ctrl.metadataTemplate.templateLeases) {
          const leases = ctrl.metadataTemplate.templateLeases.leases.map(lease => toLease(lease));

          if (ctrl.metadataTemplate.templateLeases.replace){
            return leaseService.replace(ctrl.image, leases);
          } else {
            return leaseService.addLeases(ctrl.image, leases);
          }
        }
      })
      .catch((e) => {
        console.error(e);
      })
      .finally(() => {
        ctrl.metadataTemplate = null;
        ctrl.saving = false;
        ctrl.onMetadataTemplateApplied();
      });
    };

    $scope.$watch('ctrl.originalMetadata', (originalMetadata) => {
      if (originalMetadata && ctrl.metadataTemplate) {
        ctrl.selectTemplate();
      }
    });
  };
}]);