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'));