File indexing completed on 2024-05-12 06:01:03

0001 window.appHelpers = function () {
0002 
0003   function getEnv(domain) {
0004     let env;
0005     if (this.splitByLastDot(domain) === 'com') {
0006       env = 'live';
0007     } else {
0008       env = 'test';
0009     }
0010     return env;
0011   }
0012 
0013   function getDeviceWidth(width) {
0014     let device;
0015     if (width > 1720) {
0016       device = "very-huge";
0017     } else if (width < 1720 && width > 1500) {
0018       device = "huge";
0019     } else if (width < 1500 && width > 1250) {
0020       device = "full";
0021     } else if (width < 1250 && width >= 1000) {
0022       device = "large";
0023     } else if (width < 1000 && width >= 661) {
0024       device = "mid";
0025     } else if (width < 661 && width >= 400) {
0026       device = "tablet";
0027     } else if (width < 400) {
0028       device = "phone";
0029     }
0030     return device;
0031   }
0032 
0033   function splitByLastDot(text) {
0034     var index = text.lastIndexOf('.');
0035     return text.slice(index + 1);
0036   }
0037 
0038   function getTimeAgo(datetime) {
0039     const a = timeago().format(datetime);
0040     return a;
0041   }
0042 
0043   function getFileSize(size) {
0044     if (isNaN(size)) size = 0;
0045 
0046     if (size < 1024) return size + ' Bytes';
0047 
0048     size /= 1024;
0049 
0050     if (size < 1024) return size.toFixed(2) + ' Kb';
0051 
0052     size /= 1024;
0053 
0054     if (size < 1024) return size.toFixed(2) + ' Mb';
0055 
0056     size /= 1024;
0057 
0058     if (size < 1024) return size.toFixed(2) + ' Gb';
0059 
0060     size /= 1024;
0061 
0062     return size.toFixed(2) + ' Tb';
0063   }
0064 
0065   function generateFilterUrl(location, currentCat) {
0066     let link = {};
0067     if (currentCat && currentCat !== 0) {
0068       link.base = "/browse/cat/" + currentCat + "/ord/";
0069     } else {
0070       link.base = "/browse/ord/";
0071     }
0072     if (location.search) link.search = location.search;
0073     return link;
0074   }
0075 
0076   function generateFileDownloadHash(file, env) {
0077     let salt;
0078     if (env === "test") {
0079       salt = "vBHnf7bbdhz120bhNsd530LsA2mkMvh6sDsCm4jKlm23D186Fj";
0080     } else {
0081       salt = "Kcn6cv7&dmvkS40Hna§4ffcvl=021nfMs2sdlPs123MChf4s0K";
0082     }
0083 
0084     const timestamp = Math.floor(new Date().getTime() / 1000 + 3600);
0085     const hash = md5(salt, file.collection_id + timestamp);
0086     return hash;
0087   }
0088 
0089   return {
0090     getEnv,
0091     getDeviceWidth,
0092     splitByLastDot,
0093     getTimeAgo,
0094     getFileSize,
0095     generateFilterUrl,
0096     generateFileDownloadHash
0097   };
0098 }();
0099 window.productHelpers = function () {
0100 
0101   function getNumberOfProducts(device, numRows) {
0102     let num;
0103     if (device === "very-huge") {
0104       num = 7;
0105     } else if (device === "huge") {
0106       num = 6;
0107     } else if (device === "full") {
0108       num = 5;
0109     } else if (device === "large") {
0110       num = 4;
0111     } else if (device === "mid") {
0112       num = 3;
0113     } else if (device === "tablet") {
0114       num = 2;
0115     } else if (device === "phone") {
0116       num = 1;
0117     }
0118     if (numRows) num = num * numRows;
0119     return num;
0120   }
0121 
0122   function generatePaginationObject(numPages, pathname, currentCategoy, order, page) {
0123     let pagination = [];
0124 
0125     let baseHref = "/browse";
0126     if (pathname.indexOf('cat') > -1) {
0127       baseHref += "/cat/" + currentCategoy;
0128     }
0129 
0130     if (page > 1) {
0131       const prev = {
0132         number: 'previous',
0133         link: baseHref + "/page/" + parseInt(page - 1) + "/ord/" + order
0134       };
0135       pagination.push(prev);
0136     }
0137 
0138     for (var i = 0; i < numPages; i++) {
0139       const p = {
0140         number: parseInt(i + 1),
0141         link: baseHref + "/page/" + parseInt(i + 1) + "/ord/" + order
0142       };
0143       pagination.push(p);
0144     }
0145 
0146     if (page < numPages) {
0147       const next = {
0148         number: 'next',
0149         link: baseHref + "/page/" + parseInt(page + 1) + "/ord/" + order
0150       };
0151       pagination.push(next);
0152     }
0153 
0154     return pagination;
0155   }
0156 
0157   function calculateProductRatings(ratings) {
0158     let pRating;
0159     let totalUp = 0,
0160         totalDown = 0;
0161     ratings.forEach(function (r, index) {
0162       if (r.rating_active === "1") {
0163         if (r.user_like === "1") {
0164           totalUp += 1;
0165         } else if (r.user_dislike === "1") {
0166           totalDown += 1;
0167         }
0168       }
0169     });
0170     pRating = 100 / ratings.length * (totalUp - totalDown);
0171     return pRating;
0172   }
0173 
0174   function getActiveRatingsNumber(ratings) {
0175     let activeRatingsNumber = 0;
0176     ratings.forEach(function (r, index) {
0177       if (r.rating_active === "1") {
0178         activeRatingsNumber += 1;
0179       }
0180     });
0181     return activeRatingsNumber;
0182   }
0183 
0184   function getFilesSummary(files) {
0185     let summery = {
0186       downloads: 0,
0187       archived: 0,
0188       fileSize: 0,
0189       total: 0,
0190       archived: 0
0191     };
0192     files.forEach(function (file, index) {
0193       if (file.active === "1") {
0194         summery.total += 1;
0195       } else {
0196         summery.archived += 1;
0197       }
0198       summery.fileSize += parseInt(file.size);
0199       summery.downloads += parseInt(file.downloaded_count);
0200     });
0201 
0202     return summery;
0203   }
0204 
0205   function checkIfLikedByUser(user, likes) {
0206     let likedByUser = false;
0207     likes.forEach(function (like, index) {
0208       if (user.member_id === like.member_id) {
0209         likedByUser = true;
0210       }
0211     });
0212     return likedByUser;
0213   }
0214 
0215   function getLoggedUserRatingOnProduct(user, ratings) {
0216     let userRating = -1;
0217     ratings.forEach(function (r, index) {
0218       if (r.member_id === user.member_id) {
0219         if (r.user_like === "1") {
0220           userRating = 1;
0221         } else {
0222           userRating = 0;
0223         }
0224       }
0225     });
0226     return userRating;
0227   }
0228 
0229   function calculateProductLaplaceScore(ratings) {
0230     let laplace_score = 0;
0231     let upvotes = 0;
0232     let downvotes = 0;
0233     ratings.forEach(function (rating, index) {
0234       if (rating.rating_active === "1") {
0235         if (rating.user_like === "1") {
0236           upvotes += 1;
0237         } else if (rating.user_like === "0") {
0238           downvotes += 1;
0239         }
0240       }
0241     });
0242     laplace_score = Math.round((upvotes + 6) / (upvotes + downvotes + 12), 2) * 100;
0243     return laplace_score;
0244   }
0245 
0246   function generateOcsInstallLink(f, xdgType, downloadUrl) {
0247     let ocsUrl,
0248         osId = '',
0249         link = '',
0250         licenseId = '',
0251         license = '',
0252         packagetypeId = '',
0253         architectureId = '',
0254         filesTags,
0255         fileDescription = '';
0256 
0257     if (f.description) {
0258       fileDescription = f.description;
0259     }
0260 
0261     if (f.tags) {
0262       fileTags = f.tags.split(',');
0263       fileTags.forEach(function (tag, index) {
0264         let tagStr;
0265         if (tag.length > 0) {
0266           if (tag.indexOf("##") == -1) {
0267             tagStr = tag.split('-');
0268             if (tagStr.length == 2 && tagStr[0] == 'os') {
0269               osId = tagStr[1];
0270             } else if (tagStr.length == 2 && tagStr[0] == 'licensetype') {
0271               licenseId = tagStr[1];
0272             } else if (tagStr.length == 2 && tagStr[0] == 'packagetypeid') {
0273               packagetypeId = tagStr[1];
0274             } else if (tagStr.length == 2 && tagStr[0] == 'architectureid') {
0275               architectureId = tagStr[1];
0276             }
0277           } else {
0278             tagStr = tag.split('##');
0279             if (tagStr.length == 2 && tagStr[0] == 'link') {
0280               link = tagStr[1];
0281             } else if (tagStr.length == 2 && tagStr[0] == 'license') {
0282               license = tagStr[1];
0283               license = Base64.decode(license);
0284             } else if (tagStr.length == 2 && tagStr[0] == 'packagetypeid') {
0285               packagetypeId = tagStr[1];
0286             } else if (tagStr.length == 2 && tagStr[0] == 'architectureid') {
0287               architectureId = tagStr[1];
0288             }
0289           }
0290         }
0291       });
0292     }
0293 
0294     if (typeof link !== 'undefined' && link) {
0295       ocsUrl = generateOcsUrl(decodeURIComponent(link), xdgType);
0296     } else if (!link) {
0297       ocsUrl = generateOcsUrl(downloadUrl, xdgType, f.name);
0298     }
0299 
0300     function generateOcsUrl(url, type, filename) {
0301       if (!url || !type) {
0302         return '';
0303       }
0304       if (!filename) {
0305         filename = url.split('/').pop().split('?').shift();
0306       }
0307       return 'ocs://install' + '?url=' + encodeURIComponent(url) + '&type=' + encodeURIComponent(type) + '&filename=' + encodeURIComponent(filename);
0308     }
0309 
0310     return ocsUrl;
0311   }
0312 
0313   function getFileWithLongestTitle(files) {
0314     let longestTitleFile;
0315     let maxTitleLength = 0;
0316     files.forEach(function (file, index) {
0317       if (file.title.length > maxTitleLength) {
0318         longestTitleFile = file;
0319         maxTitleLength = file.title.length;
0320       }
0321     });
0322     return longestTitleFile;
0323   }
0324 
0325   return {
0326     getNumberOfProducts,
0327     generatePaginationObject,
0328     calculateProductRatings,
0329     getActiveRatingsNumber,
0330     getFilesSummary,
0331     checkIfLikedByUser,
0332     getLoggedUserRatingOnProduct,
0333     calculateProductLaplaceScore,
0334     generateOcsInstallLink,
0335     getFileWithLongestTitle
0336   };
0337 }();
0338 class GetIt extends React.Component {
0339   constructor(props) {
0340     super(props);
0341     this.state = {
0342       product: window.product,
0343       files: window.filesJson,
0344       xdgType: window.xdgTypeJson,
0345       env: appHelpers.getEnv(window.location.hostname)
0346     };
0347   }
0348 
0349   render() {
0350 
0351     return React.createElement(
0352       "div",
0353       { id: "get-it" },
0354       React.createElement(
0355         "button",
0356         {
0357           "data-toggle": "modal",
0358           "data-target": "#get-it-modal-window",
0359           style: { "width": "100%" },
0360           id: "project_btn_getit", className: "btn dropdown-toggle active btn-primary  ",
0361           type: "button" },
0362         "Get it"
0363       ),
0364       React.createElement(
0365         "div",
0366         { className: "modal fade", id: "get-it-modal-window", tabIndex: "-1", role: "dialog", "aria-labelledby": "myModalLabel" },
0367         React.createElement(
0368           "div",
0369           { id: "get-it-modal", className: "modal-dialog", role: "document" },
0370           React.createElement(GetItFilesList, {
0371             files: this.state.files,
0372             product: this.state.product,
0373             env: this.state.env,
0374             xdgType: this.state.xdgType
0375           })
0376         )
0377       )
0378     );
0379   }
0380 }
0381 
0382 class GetItFilesList extends React.Component {
0383   constructor(props) {
0384     super(props);
0385     this.state = {
0386       activeTab: 'active'
0387     };
0388     this.toggleActiveTab = this.toggleActiveTab.bind(this);
0389   }
0390 
0391   toggleActiveTab(tab) {
0392     this.setState({ activeTab: tab });
0393   }
0394 
0395   componentDidMount() {}
0396 
0397   render() {
0398 
0399     const tableHeader = React.createElement(
0400       "thead",
0401       null,
0402       React.createElement(
0403         "tr",
0404         null,
0405         React.createElement(
0406           "th",
0407           null,
0408           "File"
0409         ),
0410         React.createElement(
0411           "th",
0412           null,
0413           "Version"
0414         ),
0415         React.createElement(
0416           "th",
0417           null,
0418           "Description"
0419         ),
0420         React.createElement(
0421           "th",
0422           null,
0423           "Packagetype"
0424         ),
0425         React.createElement(
0426           "th",
0427           null,
0428           "Architecture"
0429         ),
0430         React.createElement(
0431           "th",
0432           null,
0433           "Downloads"
0434         ),
0435         React.createElement(
0436           "th",
0437           null,
0438           "Date"
0439         ),
0440         React.createElement(
0441           "th",
0442           null,
0443           "Filesize"
0444         ),
0445         React.createElement(
0446           "th",
0447           null,
0448           "Action"
0449         )
0450       )
0451     );
0452 
0453     const activeFiles = this.props.files.filter(file => file.active == "1").map((f, index) => React.createElement(GetItFilesListItem, {
0454       product: this.props.product,
0455       xdgType: this.props.xdgType,
0456       env: this.props.env,
0457       key: index,
0458       file: f
0459     }));
0460 
0461     const archivedFiles = this.props.files.filter(file => file.active == "0").map((f, index) => React.createElement(GetItFilesListItem, {
0462       product: this.props.product,
0463       xdgType: this.props.xdgType,
0464       env: this.props.env,
0465       key: index,
0466       file: f
0467     }));
0468 
0469     const summeryRow = productHelpers.getFilesSummary(this.props.files);
0470     const summeryRowDisplay = React.createElement(
0471       "tr",
0472       null,
0473       React.createElement(
0474         "td",
0475         null,
0476         summeryRow.total,
0477         " files (",
0478         summeryRow.archived,
0479         " archived)"
0480       ),
0481       React.createElement("td", null),
0482       React.createElement("td", null),
0483       React.createElement("td", null),
0484       React.createElement("td", null),
0485       React.createElement(
0486         "td",
0487         null,
0488         summeryRow.downloads
0489       ),
0490       React.createElement("td", null),
0491       React.createElement(
0492         "td",
0493         null,
0494         appHelpers.getFileSize(summeryRow.fileSize)
0495       ),
0496       React.createElement("td", null),
0497       React.createElement("td", null)
0498     );
0499 
0500     let tableFilesDisplay;
0501     if (this.state.activeTab === "active") {
0502       tableFilesDisplay = React.createElement(
0503         "tbody",
0504         null,
0505         activeFiles,
0506         summeryRowDisplay
0507       );
0508     } else if (this.state.activeTab === "archived") {
0509       tableFilesDisplay = React.createElement(
0510         "tbody",
0511         null,
0512         archivedFiles,
0513         summeryRowDisplay
0514       );
0515     }
0516 
0517     return React.createElement(
0518       "div",
0519       { id: "files-tabs-container" },
0520       React.createElement(
0521         "button",
0522         { type: "button", className: "close", "data-dismiss": "modal", "aria-label": "Close" },
0523         React.createElement(
0524           "span",
0525           { "aria-hidden": "true" },
0526           "\xD7"
0527         )
0528       ),
0529       React.createElement(
0530         "div",
0531         { className: "files-tabs-header" },
0532         React.createElement(
0533           "h2",
0534           null,
0535           "Thanks for your support!"
0536         )
0537       ),
0538       React.createElement(
0539         "div",
0540         { className: "tabs-menu" },
0541         React.createElement(
0542           "ul",
0543           { className: "nav nav-tabs", role: "tablist" },
0544           React.createElement(
0545             "li",
0546             { role: "presentation", className: this.state.activeTab === "active" ? "active" : "" },
0547             React.createElement(
0548               "a",
0549               { onClick: () => this.toggleActiveTab('active') },
0550               "Files (",
0551               summeryRow.total,
0552               ")"
0553             )
0554           ),
0555           React.createElement(
0556             "li",
0557             { role: "presentation", className: this.state.activeTab === "archived" ? "active pull-right" : "pull-right" },
0558             React.createElement(
0559               "a",
0560               { onClick: () => this.toggleActiveTab('archived') },
0561               "Archive (",
0562               summeryRow.archived,
0563               ")"
0564             )
0565           )
0566         )
0567       ),
0568       React.createElement(
0569         "div",
0570         { id: "files-tab", className: "product-tab" },
0571         React.createElement(
0572           "table",
0573           { id: "files-table" },
0574           tableHeader,
0575           tableFilesDisplay
0576         )
0577       )
0578     );
0579   }
0580 }
0581 
0582 class GetItFilesListItem extends React.Component {
0583   constructor(props) {
0584     super(props);
0585     this.state = { downloadLink: "" };
0586   }
0587 
0588   componentDidMount() {
0589     let downloadLinkUrlAttr;
0590     if (this.props.env === 'live') {
0591       downloadLinkUrlAttr = "https%3A%2F%dl.opendesktop.org%2Fapi%2F";
0592     } else {
0593       downloadLinkUrlAttr = "https%3A%2F%2Fcc.ppload.com%2Fapi%2F";
0594     }
0595     const baseUrl = window.location.host;
0596     const f = this.props.file;
0597     const timestamp = Math.floor(new Date().getTime() / 1000 + 3600);
0598     const fileDownloadHash = appHelpers.generateFileDownloadHash(f, this.props.env);
0599     const downloadLink = "https://" + baseUrl + "/p/" + this.props.product.project_id + "/startdownload?file_id=" + f.id + "&file_name=" + f.title + "&file_type=" + f.type + "&file_size=" + f.size + "&url=" + downloadLinkUrlAttr + "files%2Fdownload%2Fid%2F" + f.id + "%2Fs%2F" + fileDownloadHash + "%2Ft%2F" + timestamp + "%2Fu%2F" + this.props.product.member_id + "%2F" + f.title;
0600 
0601     const ocsInstallLink = productHelpers.generateOcsInstallLink(f, this.props.xdgType, downloadLink);
0602     this.setState({
0603       downloadLink: downloadLink,
0604       ocsInstallLink: ocsInstallLink
0605     });
0606   }
0607 
0608   render() {
0609     const f = this.props.file;
0610 
0611     let ocsInstallLinkDisplay;
0612     if (this.state.ocsInstallLink) {
0613       ocsInstallLinkDisplay = React.createElement(
0614         "span",
0615         null,
0616         "\xA0 - or - \xA0",
0617         React.createElement(
0618           "a",
0619           { href: this.state.ocsInstallLink },
0620           "Install"
0621         )
0622       );
0623     }
0624 
0625     const date = new Date(f.created_timestamp); // Date 2011-05-09T06:08:45.178Z
0626     const year = date.getFullYear();
0627     const month = ("0" + (date.getMonth() + 1)).slice(-2);
0628     const day = ("0" + date.getDate()).slice(-2);
0629     const fDate = year + '-' + month + '-' + day;
0630 
0631     return React.createElement(
0632       "tr",
0633       null,
0634       React.createElement(
0635         "td",
0636         null,
0637         React.createElement(
0638           "a",
0639           { href: this.state.downloadLink },
0640           f.title
0641         )
0642       ),
0643       React.createElement(
0644         "td",
0645         null,
0646         f.version
0647       ),
0648       React.createElement(
0649         "td",
0650         null,
0651         f.description
0652       ),
0653       React.createElement(
0654         "td",
0655         null,
0656         f.packagename
0657       ),
0658       React.createElement(
0659         "td",
0660         null,
0661         f.archname
0662       ),
0663       React.createElement(
0664         "td",
0665         null,
0666         f.downloaded_count
0667       ),
0668       React.createElement(
0669         "td",
0670         null,
0671         fDate
0672       ),
0673       React.createElement(
0674         "td",
0675         null,
0676         appHelpers.getFileSize(f.size)
0677       ),
0678       React.createElement(
0679         "td",
0680         null,
0681         React.createElement(
0682           "a",
0683           { href: this.state.downloadLink },
0684           "Download"
0685         ),
0686         ocsInstallLinkDisplay
0687       )
0688     );
0689   }
0690 }
0691 
0692 ReactDOM.render(React.createElement(GetIt, null), document.getElementById('get-it-container'));