-
-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathframework7.feeds.min.js
14 lines (13 loc) · 8.56 KB
/
framework7.feeds.min.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* Framework7 Plugin Feeds 3.0.0
* Framework7 Feeds plugin brings easy RSS feeds integration into Framework7 app
* http://framework7.io/plugins/
*
* Copyright 2014-2021 Vladimir Kharlampidi
*
* Released under the MIT License
*
* Released on: November 29, 2021
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Framework7Feeds=t()}(this,(function(){"use strict";let e;return{name:"feeds",install(){var t;t=this.Class,e=class extends t{constructor(e,t){super(t,[e]);const n=e.utils,a=e.$,r=e.request,s=this;s.app=e;const i=n.extend({on:{}},e.params.feeds);s.params=n.extend(i,t);const l=a(s.params.el);if(!l.length)return s;let o;function d(e){e.preventDefault();const t=a(this).data("index");s.open(s.data.items[t])}function p(){s.refreshFeed()}return o=s.params.view?s.params.view:e.views.get(l),o||(o=e.views.main),n.extend(s,{app:e,request:r,$el:l,el:l[0],view:o,url:s.params.url,data:{},opened:!1}),s.attachEvents=function(){s.$el.on("click","a.feeds-item-link",d),s.$el.parents(".ptr-content").on("ptr:refresh",p)},s.detachEvents=function(){s.$el.off("click","a.feeds-item-link",d),s.$el.parents(".ptr-content").off("ptr:refresh",p)},l[0].f7Feeds=s,s.init(),s}formatDate(e){const t=this;if(t.params.formatDate)return t.params.formatDate.call(t,e);const n=new Date(e);return`${"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" ")[n.getMonth(n)]} ${n.getDate(n)}, ${n.getFullYear()}`}parseData(e){const t=this,n=t.app.$,a=(new window.DOMParser).parseFromString(e,"text/xml"),r=n(a).find("rss > channel");if(0===r.length)return{};const s={title:r.children("title").text(),link:r.children("link").text(),description:r.children("description").text().replace("<![CDATA[","").replace("]]>",""),copyright:r.children("copyright").text(),image:{url:r.children("image").children("url").text(),title:r.children("image").children("title").text(),link:r.children("image").children("link").text(),width:r.children("image").children("width").text(),height:r.children("image").children("height").text()},items:[]};return r.find("item").each((e=>{const a=n(e),r={title:a.children("title").text().replace("<![CDATA[","").replace("]]>",""),link:a.children("link").text(),description:a.children("description").text().replace("<![CDATA[","").replace("]]>",""),pubDate:a.children("pubDate").text(),formattedDate:t.formatDate(a.children("pubDate").text()),guid:a.children("guid").text(),index:s.items.length};t.params.customItemFields&&t.params.customItemFields.length>0&&a.children().each((e=>{for(let a=0;a<t.params.customItemFields.length;a+=1){const s=t.params.customItemFields[a].split("||")[0],i=t.params.customItemFields[a].split("||")[1];e.nodeName===s&&(r[s.replace(/:/g,"")]=i?e.getAttribute(i):n(e).text().replace("<![CDATA[","").replace("]]>",""))}})),s.items.push(r)})),s}loadFeed(e){const t=this,n=t.app;t.emit("local::ajaxStart feedsAjaxStart",t),t.request.get(t.params.feedUrl,(a=>{if(t.emit("local::ajaxComplete feedsAjaxComplete",t,a),t.data=t.parseData(a),t.params.virtualList)if(e)t.virtualList.replaceAllItems(t.data.items);else{let e;e="true"===t.params.virtualList||!0===t.params.virtualList?{}:n.utils.extend({},t.params.virtualList),e.el=t.el,e.items=t.data.items,e.renderItem=t.renderVirtualListItem,t.$el.html(""),t.virtualList=n.virtualList.create(e)}else t.$el.html(t.renderList(t.data));e&&n.ptr.done(t.$el.parents(".ptr-content"))}))}renderVirtualListItem(e,t){const n=this;return n.params.renderVirtualListItem?n.params.renderVirtualListItem.call(n,e,t):`\n <li>\n <a href="#" class="item-link item-content feeds-item-link" data-index="${t}">\n <div class="item-inner">\n <div class="item-title">${e.title}</div>\n <div class="item-after">${e.formattedDate}</div>\n </div>\n </a>\n </li>\n `.trim()}renderList(e){const t=this;return t.params.renderList?t.params.renderList.call(t,e):`\n <ul>\n ${e.items.map(((e,t)=>`\n <li>\n <a href="#" class="item-link item-content feeds-item-link" data-index="${t}">\n <div class="item-inner">\n <div class="item-title">${e.title}</div>\n <div class="item-after">${e.formattedDate}</div>\n </div>\n </a>\n </li>\n `)).join("")}\n </ul>\n `.trim()}renderItemNavbar(e){const t=this;return t.params.renderItemNavbar?t.params.renderItemNavbar.call(t,e):`\n <div class="navbar">\n <div class="navbar-inner sliding">\n ${"page"===t.params.openIn?`\n <div class="left">\n <a href="#" class="link back">\n <i class="icon icon-back"></i>\n <span class="ios-only">${t.params.pageBackLinkText}</span>\n </a>\n </div>\n `:""}\n <div class="title">${e.title}</div>\n ${"popup"===t.params.openIn?`\n <div class="right">\n <a href="#" class="link popup-close" data-popup=".feeds-popup">${t.params.popupCloseLinkText}</a>\n </div>\n `:""}\n </div>\n </div>\n `.trim()}renderItemPopup(e){const t=this;return t.params.renderPopup?t.params.renderPopup.call(t,e):`\n <div class="popup feeds-popup">\n <div class="view view-init">\n ${t.renderItemPage(e)}\n </div>\n </div>\n `.trim()}renderItemPage(e){const t=this;return t.params.renderPage?t.params.renderPage.call(t,e):`\n <div class="page feeds-page" data-page="feeds-page-${e.index}">\n ${t.renderItemNavbar(e)}\n <div class="page-content">\n <div class="block">\n <a href="${e.link}" class="external" target="_blank">${e.title}</a><br>\n <small>${e.formattedDate}</small>\n </div>\n <div class="block block-strong">${e.description}</div>\n </div>\n </div>\n `.trim()}refreshFeed(){return this.loadFeed(!0)}onOpen(e,t){const n=this,a=n.app.$(t);n.$openedItemEl=a,n.openedItemEl=a[0],n.openedIn=e,n.opened=!0,n.emit("local::open feedsOpen",n)}onOpened(){this.emit("local::opened feedsOpened",this)}onClose(){const e=this;e.destroyed||e.emit("local::close feedsClose",e)}onClosed(){const e=this;e.destroyed||(e.opened=!1,e.$openedItemEl=null,e.openedItemEl=null,delete e.$openedItemEl,delete e.openedItemEl,e.emit("local::closed feedsClosed",e))}openPopup(e){const t=this;if(t.opened)return t;const n={content:t.renderItemPopup(e),on:{popupOpen(e){t.onOpen("popup",e.el)},popupOpened(e){t.onOpened("popup",e.el)},popupClose(e){t.onClose("popup",e.el)},popupClosed(e){t.onClosed("popup",e.el)}}};return t.params.routableModals?t.view.router.navigate({url:t.url,route:{path:t.url,popup:n}}):t.modal=t.app.popup.create(n).open(),t}openPage(e){const t=this;if(t.opened)return t;const n=t.renderItemPage(e);return t.view.router.navigate({url:t.url,route:{content:n,path:t.url,on:{pageBeforeIn(e,n){t.onOpen("page",n.el)},pageAfterIn(e,n){t.onOpened("page",n.el)},pageBeforeOut(e,n){t.onClose("page",n.el)},pageAfterOut(e,n){t.onClosed("page",n.el)}}}}),t}open(e){const t=this;return t.opened?t:"popup"===t.params.openIn?t.openPopup(e):t.openPage(e)}close(){const e=this;return e.opened?(e.params.routableModals||"page"===e.openedIn?e.view.router.back():(e.modal.once("modalClosed",(()=>{e.app.utils.nextTick((()=>{e.modal.destroy(),delete e.modal}))})),e.modal.close()),e):e}init(){this.loadFeed(),this.attachEvents()}destroy(){const e=this;e.emit("local::beforeDestroy feedsBeforeDestroy",e),e.detachEvents(),e.virtualList&&e.virtualList.destroy&&e.virtualList.destroy(),delete e.$el[0].f7Feeds,e.app.utils.deleteProps(e),e.destroyed=!0}},this.Feeds=e},params:{feeds:{openIn:"page",url:"feed/",routableModals:!0,view:null,feedUrl:null,formatDate:null,customItemFields:[],virtualList:!1,pageBackLinkText:"Back",popupCloseLinkText:"Close",renderList:null,renderVirtualListItem:null,renderItemPage:null,renderItemPopup:null}},create(){const t=this;t.feeds={create:n=>new e(t,n),get(n){if(n instanceof e)return n;const a=t.$(n);return a.length>0&&a[0]&&a[0].f7Feeds?a[0].f7Feeds:void 0},destroy(n){if(n instanceof e)return void(n.destroy&&n.destroy());const a=t.$(n);a.length&&a[0]&&a[0].f7Feeds&&a[0].f7Feeds.destroy&&a[0].f7Feeds.destroy()}}},on:{pageInit(e){const t=e.app,n=t.$,a=t.utils;e.$el.find(".feeds-init").each((e=>{const r=n(e);t.feeds.create(a.extend({el:e},r.dataset()))}))},pageBeforeRemove(e){const t=e.app;e.$el.find(".feeds-init").each((e=>{t.feeds.destroy(e)}))}}}}));
//# sourceMappingURL=framework7.feeds.min.js.map