| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 | /** * Helper functions for integrating original position tracking into existing Wekan templates *//** * Add original position tracking to swimlane templates */export function addOriginalPositionToSwimlane(swimlaneId) {  if (!swimlaneId) return;    // Track original position when swimlane is created or first accessed  Meteor.call('positionHistory.trackSwimlane', swimlaneId, (error) => {    if (error) {      console.warn('Failed to track original position for swimlane:', error);    }  });}/** * Add original position tracking to list templates */export function addOriginalPositionToList(listId) {  if (!listId) return;    // Track original position when list is created or first accessed  Meteor.call('positionHistory.trackList', listId, (error) => {    if (error) {      console.warn('Failed to track original position for list:', error);    }  });}/** * Add original position tracking to card templates */export function addOriginalPositionToCard(cardId) {  if (!cardId) return;    // Track original position when card is created or first accessed  Meteor.call('positionHistory.trackCard', cardId, (error) => {    if (error) {      console.warn('Failed to track original position for card:', error);    }  });}/** * Get original position description for display in templates */export function getOriginalPositionDescription(entityId, entityType) {  return new Promise((resolve, reject) => {    const methodName = `positionHistory.get${entityType.charAt(0).toUpperCase() + entityType.slice(1)}Description`;        Meteor.call(methodName, entityId, (error, result) => {      if (error) {        reject(error);      } else {        resolve(result);      }    });  });}/** * Check if an entity has moved from its original position */export function hasEntityMoved(entityId, entityType) {  return new Promise((resolve, reject) => {    const methodName = `positionHistory.has${entityType.charAt(0).toUpperCase() + entityType.slice(1)}Moved`;        Meteor.call(methodName, entityId, (error, result) => {      if (error) {        reject(error);      } else {        resolve(result);      }    });  });}/** * Template helper for displaying original position info */Template.registerHelper('originalPositionInfo', function(entityId, entityType) {  if (!entityId || !entityType) return null;    const description = getOriginalPositionDescription(entityId, entityType);  const hasMoved = hasEntityMoved(entityId, entityType);    return {    description: description,    hasMoved: hasMoved,    entityId: entityId,    entityType: entityType  };});/** * Template helper for checking if entity has moved */Template.registerHelper('hasEntityMoved', function(entityId, entityType) {  if (!entityId || !entityType) return false;    return hasEntityMoved(entityId, entityType);});/** * Template helper for getting original position description */Template.registerHelper('getOriginalPositionDescription', function(entityId, entityType) {  if (!entityId || !entityType) return 'No original position data';    return getOriginalPositionDescription(entityId, entityType);});
 |