precyx
3/6/2020 - 7:18 AM

Office App Links

Generate Office App Links for:

  • Word
  • Powerpoint
  • Excel
  • Visio
  • Project
  • Publisher

enum OfficeAppType {
  Word = "ms-word:",
  Powerpoint = "ms-powerpoint:",
  Excel = "ms-excel:",
  Visio = "ms-visio:",
  Project = "ms-project:",
  Publisher = "ms-publisher:",
}

export enum OfficeOpeningMode {
  View = "ofe|u|",
  Edit = "ofv|u|",
  New = "nft|u|",
}

const FileTypeMap = {
  // word
  'doc': OfficeAppType.Word,
  'docm': OfficeAppType.Word,
  'docx': OfficeAppType.Word,
  'docb': OfficeAppType.Word,
  'dot': OfficeAppType.Word,
  'dotm': OfficeAppType.Word,
  'dotx': OfficeAppType.Word,

  // powerpoint
  'pps': OfficeAppType.Powerpoint,
  'ppsm': OfficeAppType.Powerpoint,
  'ppsx': OfficeAppType.Powerpoint,
  'ppt': OfficeAppType.Powerpoint,
  'pptm': OfficeAppType.Powerpoint,
  'pptx': OfficeAppType.Powerpoint,
  'sldx': OfficeAppType.Powerpoint,
  'sldm': OfficeAppType.Powerpoint,

  // excel
  'xlc': OfficeAppType.Excel,
  'xls': OfficeAppType.Excel,
  'xlsb': OfficeAppType.Excel,
  'xlsm': OfficeAppType.Excel,
  'xlsx': OfficeAppType.Excel,
  'xlt': OfficeAppType.Excel,
  'xltm': OfficeAppType.Excel,
  'xltx': OfficeAppType.Excel,

  // visio
  'vdx': OfficeAppType.Visio,
  'vsd': OfficeAppType.Visio,
  'vsdm': OfficeAppType.Visio,
  'vsdx': OfficeAppType.Visio,
  'vsw': OfficeAppType.Visio,
  'vdw': OfficeAppType.Visio,
  'vss': OfficeAppType.Visio,
  'vssm': OfficeAppType.Visio,
  'vssx': OfficeAppType.Visio,
  'vst': OfficeAppType.Visio,
  'vstm': OfficeAppType.Visio,
  'vstx': OfficeAppType.Visio,
  'vsx': OfficeAppType.Visio,

  // project
  'mpp': OfficeAppType.Project,

  // publisher
  'pub': OfficeAppType.Publisher
}


/**
 * Generates a link that opens the file based on the filetype in the correct office app
 * @see - Office URI Schemes:  https://docs.microsoft.com/en-us/office/client-developer/office-uri-schemes
 * @see - Office File Formats: https://github.com/OfficeDev/office-ui-fabric-react/blob/master/packages/file-type-icons/src/FileTypeIconMap.ts
 * @param url base link to use
 * @param fileType filetype e.g. doc, docx, xls
 *
 * @example - converts URL:
 * from   -> https://advisprojectpoc1.sharepoint.com/sites/STS_POC/BereichInformatik/word003.docx?d=w26b61b083aa6401f8a9f828a3339c506
 * to     -> ms-word:ofe|u|https://advisprojectpoc1.sharepoint.com/sites/STS_POC/BereichInformatik/word003.docx
 */
 // prettier-ignore
export const generateOfficeAppLink = (url:string, fileType:string, openingMode:OfficeOpeningMode = OfficeOpeningMode.Edit):string | null => {
    let _newUrl = url.substring(0, url.indexOf('?'));
    let _fileTypeSplit = fileType.split(".");
    let _fileType = _fileTypeSplit[_fileTypeSplit.length-1];
    let _officeAppType = FileTypeMap[_fileType];

    if(!_officeAppType) return null;
    _newUrl = `${_officeAppType}${openingMode}${_newUrl}`;
    return _newUrl;
}