├── .gitattributes ├── .gitignore ├── License.txt ├── README.md ├── mobile ├── PFT plugins install.txt ├── android_store │ ├── feature.png │ └── hires.png ├── config.xml ├── gulpfile.js ├── icon.png ├── lint.bat ├── readme mobile.txt ├── res │ ├── how to generate.txt │ ├── mipmap-mdpi │ │ └── icon.png │ ├── notif_pin │ │ ├── drawable-hdpi-v11 │ │ │ └── notif_pin.png │ │ ├── drawable-hdpi │ │ │ └── notif_pin.png │ │ ├── drawable-mdpi-v11 │ │ │ └── notif_pin.png │ │ ├── drawable-mdpi │ │ │ └── notif_pin.png │ │ ├── drawable-xhdpi-v11 │ │ │ └── notif_pin.png │ │ ├── drawable-xhdpi │ │ │ └── notif_pin.png │ │ ├── drawable-xxhdpi-v11 │ │ │ └── notif_pin.png │ │ ├── drawable-xxhdpi │ │ │ └── notif_pin.png │ │ ├── drawable-xxxhdpi-v11 │ │ │ └── notif_pin.png │ │ └── drawable-xxxhdpi │ │ │ └── notif_pin.png │ └── screen │ │ └── android │ │ └── splash.png ├── sw-precache-config.js └── www │ ├── apple-touch-icon.png │ ├── card.html │ ├── css │ ├── images │ │ ├── ajax-loader.gif │ │ └── icons-png │ │ │ ├── action-black.png │ │ │ ├── action-white.png │ │ │ ├── alert-black.png │ │ │ ├── alert-white.png │ │ │ ├── arrow-d-black.png │ │ │ ├── arrow-d-l-black.png │ │ │ ├── arrow-d-l-white.png │ │ │ ├── arrow-d-r-black.png │ │ │ ├── arrow-d-r-white.png │ │ │ ├── arrow-d-white.png │ │ │ ├── arrow-l-black.png │ │ │ ├── arrow-l-white.png │ │ │ ├── arrow-r-black.png │ │ │ ├── arrow-r-white.png │ │ │ ├── arrow-u-black.png │ │ │ ├── arrow-u-l-black.png │ │ │ ├── arrow-u-l-white.png │ │ │ ├── arrow-u-r-black.png │ │ │ ├── arrow-u-r-white.png │ │ │ ├── arrow-u-white.png │ │ │ ├── audio-black.png │ │ │ ├── audio-white.png │ │ │ ├── back-black.png │ │ │ ├── back-white.png │ │ │ ├── bars-black.png │ │ │ ├── bars-white.png │ │ │ ├── bullets-black.png │ │ │ ├── bullets-white.png │ │ │ ├── calendar-black.png │ │ │ ├── calendar-white.png │ │ │ ├── camera-black.png │ │ │ ├── camera-white.png │ │ │ ├── carat-d-black.png │ │ │ ├── carat-d-white.png │ │ │ ├── carat-l-black.png │ │ │ ├── carat-l-white.png │ │ │ ├── carat-r-black.png │ │ │ ├── carat-r-white.png │ │ │ ├── carat-u-black.png │ │ │ ├── carat-u-white.png │ │ │ ├── check-black.png │ │ │ ├── check-white.png │ │ │ ├── clock-black.png │ │ │ ├── clock-white.png │ │ │ ├── cloud-black.png │ │ │ ├── cloud-white.png │ │ │ ├── comment-black.png │ │ │ ├── comment-white.png │ │ │ ├── delete-black.png │ │ │ ├── delete-white.png │ │ │ ├── edit-black.png │ │ │ ├── edit-white.png │ │ │ ├── eye-black.png │ │ │ ├── eye-white.png │ │ │ ├── forbidden-black.png │ │ │ ├── forbidden-white.png │ │ │ ├── forward-black.png │ │ │ ├── forward-white.png │ │ │ ├── gear-black.png │ │ │ ├── gear-white.png │ │ │ ├── grid-black.png │ │ │ ├── grid-white.png │ │ │ ├── heart-black.png │ │ │ ├── heart-white.png │ │ │ ├── home-black.png │ │ │ ├── home-white.png │ │ │ ├── info-black.png │ │ │ ├── info-white.png │ │ │ ├── location-black.png │ │ │ ├── location-white.png │ │ │ ├── lock-black.png │ │ │ ├── lock-white.png │ │ │ ├── mail-black.png │ │ │ ├── mail-white.png │ │ │ ├── minus-black.png │ │ │ ├── minus-white.png │ │ │ ├── navigation-black.png │ │ │ ├── navigation-white.png │ │ │ ├── phone-black.png │ │ │ ├── phone-white.png │ │ │ ├── plus-black.png │ │ │ ├── plus-white.png │ │ │ ├── power-black.png │ │ │ ├── power-white.png │ │ │ ├── recycle-black.png │ │ │ ├── recycle-white.png │ │ │ ├── refresh-black.png │ │ │ ├── refresh-white.png │ │ │ ├── search-black.png │ │ │ ├── search-white.png │ │ │ ├── shop-black.png │ │ │ ├── shop-white.png │ │ │ ├── star-black.png │ │ │ ├── star-white.png │ │ │ ├── tag-black.png │ │ │ ├── tag-white.png │ │ │ ├── user-black.png │ │ │ ├── user-white.png │ │ │ ├── video-black.png │ │ │ └── video-white.png │ ├── index.css │ ├── jquery.mobile.icons.min.css │ ├── jquery.mobile.structure-1.4.5.min.css │ ├── trelloblue.min.css │ └── trelloblue.min.plus.css │ ├── favicon.ico │ ├── fd.bat │ ├── firebase.json │ ├── help.html │ ├── img │ ├── btn_donate_SM.gif │ ├── gear-white.png │ ├── icon.png │ ├── icon128.png │ ├── icon144.png │ ├── icon192.png │ ├── icon48.png │ ├── icon96.png │ ├── login.png │ ├── offline.png │ ├── sync.png │ └── trelloOpen.png │ ├── index.html │ ├── js │ ├── card.js │ ├── index.js │ ├── intellisense.js │ ├── lib │ │ ├── fastclick.js │ │ ├── jquery.js │ │ ├── jquery.mobile-1.4.5.min.js │ │ ├── lz-string.min.js │ │ └── markdown-converter.js │ ├── redirector.js │ ├── sharedlocal.js │ ├── sharedmobile.js │ ├── sharedsync.js │ └── trello.js │ ├── manifest.json │ ├── power-up │ ├── cardmenu.html │ ├── css │ │ ├── board-bar.css │ │ └── overlay.css │ ├── images │ │ └── logo.png │ ├── index.html │ ├── js │ │ ├── cardmenu.js │ │ └── template.js │ └── manifest.json │ ├── service-worker-extra.js │ ├── service-worker.js │ └── settings.html └── source ├── _locales ├── ar │ └── messages.json ├── da │ └── messages.json ├── en │ └── messages.json ├── es │ └── messages.json ├── fr │ └── messages.json ├── nl │ └── messages.json ├── pt_BR │ └── messages.json ├── pt_PT │ └── messages.json ├── ru │ └── messages.json ├── vi │ └── messages.json └── zh_CN │ └── messages.json ├── app.js ├── background.html ├── background.js ├── board.js ├── burndown.html ├── burndown.js ├── buttons.js ├── card.js ├── cardetransfer.js ├── cardwin.html ├── cardwin.js ├── commitsync.js ├── config.json ├── css ├── bsmselect.css ├── colors.css ├── dashboard.css ├── dialog-polyfill.css ├── grumble.css ├── images │ ├── asc.gif │ ├── bg.gif │ ├── desc.gif │ ├── ui-icons_444444_256x240.png │ ├── ui-icons_555555_256x240.png │ ├── ui-icons_777620_256x240.png │ ├── ui-icons_777777_256x240.png │ ├── ui-icons_cc0000_256x240.png │ └── ui-icons_ffffff_256x240.png ├── jquery-ui-custom.min.css ├── jquery.qtip.min.css ├── plottable.css ├── plottable.old.css ├── select2.min.css ├── style.css ├── tablesorter.css └── tooltip.css ├── dashboard.html ├── dashboard.js ├── help.js ├── images ├── back.png ├── bubble-sprite.png ├── cardht.png ├── cardplusbar.png ├── cardplusreport.png ├── cardsemodify.png ├── chart-sm.png ├── chromenu.png ├── close.png ├── copy.png ├── dimensions.png ├── dockout.png ├── dockoutlarge.png ├── dotswait.gif ├── help-spent-est-table.png ├── help-spent-table.png ├── helparrow.png ├── helptop.png ├── icon128.png ├── icon16.png ├── icon19.png ├── icon19New.png ├── icon19hilite.png ├── icon32alpha.png ├── icon48.png ├── iconLarge.png ├── iconaddse.png ├── iconspent.png ├── iconspenthelp.png ├── iconspenthelpwarn.png ├── minimize.png ├── new.png ├── newgray.png ├── plusbarlabeled.png ├── plusmenu.png ├── recurring.png ├── reloadchrome.png ├── report-sm.png ├── s1.png ├── s2.png ├── s3.png ├── s4.png ├── showsebar.png ├── sync.png ├── syncingNow.gif ├── timer-sm-on.png ├── timer.png └── wait.gif ├── intellisense.js ├── labels.js ├── language.js ├── libs ├── bsmselect.js ├── buy.js ├── d3.min.js ├── d3.min.old.js ├── dialog-polyfill.js ├── dom-to-image.min.js ├── embed.min.js ├── excellentexport.js ├── formatchart.js ├── jquery-ui.custom.min.js ├── jquery.cookie.js ├── jquery.grumble.js ├── jquery.min.js ├── jquery.qtip.min.js ├── jquery.tablesorter.js ├── jquery.zoomooz.js ├── jsapi.js ├── plottable.min.js ├── plottable.min.old.js └── select2.full.min.js ├── manifest.json ├── plus.js ├── plusconfig.js ├── plusfortrello.sln ├── plusmessages.html ├── plusmessages.js ├── popup.html ├── popup.js ├── prepare.bat ├── report.html ├── report.js ├── shared.js ├── sharedmobile.js ├── sharedsync.js ├── sql.js ├── stripe-wrap.js ├── timerwin.html ├── timerwin.js ├── tour.js ├── translations.js └── trellosync.js /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | *.sln merge=union 7 | *.csproj merge=union 8 | *.vbproj merge=union 9 | *.fsproj merge=union 10 | *.dbproj merge=union 11 | 12 | # Standard to msysgit 13 | *.doc diff=astextplain 14 | *.DOC diff=astextplain 15 | *.docx diff=astextplain 16 | *.DOCX diff=astextplain 17 | *.dot diff=astextplain 18 | *.DOT diff=astextplain 19 | *.pdf diff=astextplain 20 | *.PDF diff=astextplain 21 | *.rtf diff=astextplain 22 | *.RTF diff=astextplain 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ################# 2 | ## Eclipse 3 | ################# 4 | 5 | *.pydevproject 6 | .project 7 | .metadata 8 | bin/ 9 | tmp/ 10 | *.tmp 11 | *.bak 12 | *.swp 13 | *~.nib 14 | local.properties 15 | .classpath 16 | .settings/ 17 | .loadpath 18 | 19 | # External tool builders 20 | .externalToolBuilders/ 21 | 22 | # Locally stored "Eclipse launch configurations" 23 | *.launch 24 | 25 | # CDT-specific 26 | .cproject 27 | 28 | # PDT-specific 29 | .buildpath 30 | 31 | 32 | ################# 33 | ## Visual Studio 34 | ################# 35 | 36 | ## Ignore Visual Studio temporary files, build results, and 37 | ## files generated by popular Visual Studio add-ons. 38 | 39 | # User-specific files 40 | *.suo 41 | *.user 42 | *.sln.docstates 43 | .vc/ 44 | 45 | # Build results 46 | 47 | [Dd]ebug/ 48 | [Rr]elease/ 49 | x64/ 50 | build/ 51 | [Bb]in/ 52 | [Oo]bj/ 53 | 54 | # MSTest test Results 55 | [Tt]est[Rr]esult*/ 56 | [Bb]uild[Ll]og.* 57 | 58 | *_i.c 59 | *_p.c 60 | *.ilk 61 | *.meta 62 | *.obj 63 | *.pch 64 | *.pdb 65 | *.pgc 66 | *.pgd 67 | *.rsp 68 | *.sbr 69 | *.tlb 70 | *.tli 71 | *.tlh 72 | *.tmp 73 | *.tmp_proj 74 | *.log 75 | *.vspscc 76 | *.vssscc 77 | .builds 78 | *.pidb 79 | *.log 80 | *.scc 81 | 82 | # Visual C++ cache files 83 | ipch/ 84 | *.aps 85 | *.ncb 86 | *.opensdf 87 | *.sdf 88 | *.cachefile 89 | 90 | # Visual Studio profiler 91 | *.psess 92 | *.vsp 93 | *.vspx 94 | 95 | # Guidance Automation Toolkit 96 | *.gpState 97 | 98 | # ReSharper is a .NET coding add-in 99 | _ReSharper*/ 100 | *.[Rr]e[Ss]harper 101 | 102 | # TeamCity is a build add-in 103 | _TeamCity* 104 | 105 | # DotCover is a Code Coverage Tool 106 | *.dotCover 107 | 108 | # NCrunch 109 | *.ncrunch* 110 | .*crunch*.local.xml 111 | 112 | # Installshield output folder 113 | [Ee]xpress/ 114 | 115 | # DocProject is a documentation generator add-in 116 | DocProject/buildhelp/ 117 | DocProject/Help/*.HxT 118 | DocProject/Help/*.HxC 119 | DocProject/Help/*.hhc 120 | DocProject/Help/*.hhk 121 | DocProject/Help/*.hhp 122 | DocProject/Help/Html2 123 | DocProject/Help/html 124 | 125 | # Click-Once directory 126 | publish/ 127 | 128 | # Publish Web Output 129 | *.Publish.xml 130 | *.pubxml 131 | *.publishproj 132 | 133 | # NuGet Packages Directory 134 | ## TODO: If you have NuGet Package Restore enabled, uncomment the next line 135 | #packages/ 136 | 137 | # Windows Azure Build Output 138 | csx 139 | *.build.csdef 140 | 141 | # Windows Store app package directory 142 | AppPackages/ 143 | 144 | # Others 145 | sql/ 146 | *.Cache 147 | ClientBin/ 148 | [Ss]tyle[Cc]op.* 149 | ~$* 150 | *~ 151 | *.dbmdl 152 | *.[Pp]ublish.xml 153 | *.pfx 154 | *.publishsettings 155 | 156 | # RIA/Silverlight projects 157 | Generated_Code/ 158 | 159 | # Backup & report files from converting an old project file to a newer 160 | # Visual Studio version. Backup files are not needed, because we have git ;-) 161 | _UpgradeReport_Files/ 162 | Backup*/ 163 | UpgradeLog*.XML 164 | UpgradeLog*.htm 165 | 166 | # SQL Server files 167 | App_Data/*.mdf 168 | App_Data/*.ldf 169 | 170 | ############# 171 | ## Windows detritus 172 | ############# 173 | 174 | # Windows image file caches 175 | Thumbs.db 176 | ehthumbs.db 177 | 178 | # Folder config file 179 | Desktop.ini 180 | 181 | # Recycle Bin used on file shares 182 | $RECYCLE.BIN/ 183 | 184 | # Mac crap 185 | .DS_Store 186 | 187 | 188 | ############# 189 | ## Python 190 | ############# 191 | 192 | *.py[cod] 193 | 194 | # Packages 195 | *.egg 196 | *.egg-info 197 | dist/ 198 | build/ 199 | eggs/ 200 | parts/ 201 | var/ 202 | sdist/ 203 | develop-eggs/ 204 | .installed.cfg 205 | 206 | # Installer logs 207 | pip-log.txt 208 | 209 | # Unit test / coverage reports 210 | .coverage 211 | .tox 212 | 213 | #Translations 214 | *.mo 215 | 216 | #Mr Developer 217 | .mr.developer.cfg 218 | -------------------------------------------------------------------------------- /License.txt: -------------------------------------------------------------------------------- 1 | "Plus for Trello", both the browser extension and mobile app (the "software") is open source, licenced under the GNU GENERAL PUBLIC LICENSE, http://www.gnu.org/licenses/gpl-3.0.txt 2 | Copyright (c) 2013 Zig Mandel 3 | For licences of components that Plus uses (desktop and mobile) see http://plusfortrello.com/p/licences.html -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Plus-for-Trello 2 | =============== 3 | 4 | Plus for Trello - Chrome extension and Android app
5 | Add from the [Chrome store](https://chrome.google.com/webstore/detail/plus-for-trello-time-trac/gjjpophepkbhejnglcmkdnncmaanojkf?hl=en) and [Android Play](https://play.google.com/store/apps/details?id=com.zigmandel.plusfortrello)
6 | [Master branch](https://github.com/zmandel/Plus-for-Trello) at https://github.com/zmandel/Plus-for-Trello 7 | 8 | Webapp code is the same as the mobile app 9 | 10 | The code here may not be the latest one. To view the latest code, see: 11 | Chrome extension: Use [Chrome extension source code viewer](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin) 12 | 13 | Mobile app: https://app.plusfortrello.com 14 | 15 | Coding best practices 16 | We plan to eventually move to typescript. Keep in mind that: 17 | 18 | 1. This was my first nontrivial javascript chrome extension (2012) and I was just learning javascript then. 19 | 20 | 2. As a point to learn javascript, sometimes I did not use libraries or advanced time-saving features. Or maybe Chrome didnt support them at the time, since a Chrome extension is not a regular webapp. 21 | 22 | 3. That has changed over time as I became more familiar with more advanced javascript thus you will find a mix. 23 | 24 | 4. Chrome extensions as content scripts are special, sometimes you must overuse things like css "!important" because of existing trello styles or future-proofing against Trello changes. 25 | 26 | 5. Trello, over time, has changed quite a lot their page. Because they release changes to users over time we must support various trello DOM layouts while Trello does the transition. Thus something as simple as finding certain Trello DOM element might seem convoluted in the code. 27 | 28 | 6. The Plus "trello sync" algorithm is quite complex. It evolved as we added more features and also as Trello finalized their API. Initially we didnt use the Trello API (did not exist) and we extracted some details from the interface. Some of those remain and are used for certain scenarios (for example the user has turned off sync) 29 | 30 | 7. Priority is given to features with the biggest kick in the shortest time, as we are a very small team. 31 | 32 | Enjoy! 33 | -------------------------------------------------------------------------------- /mobile/PFT plugins install.txt: -------------------------------------------------------------------------------- 1 | plugins 2 | 3 | OK cordova plugin add https://github.com/florentvaldelievre/virtualartifacts-webIntent.git 4 | 5 | ok cordova plugin add https://github.com/katzer/cordova-plugin-local-notifications 6 | 7 | OK cordova plugin add cordova-plugin-app-version 8 | 9 | OK cordova plugin add cordova-plugin-x-toast 10 | 11 | OK cordova plugin add cordova-plugin-console 12 | 13 | OK cordova plugin add cordova-plugin-device 14 | 15 | OK cordova plugin add cordova-plugin-dialogs 16 | 17 | OK cordova plugin add cordova-plugin-inappbrowser 18 | 19 | OK cordova plugin add cordova-plugin-statusbar 20 | 21 | OK cordova plugin add https://github.com/46cl/cordova-android-focus-plugin 22 | 23 | OK cordova plugin add cordova-plugin-datepicker 24 | 25 | OK cordova plugin add cordova-plugin-customurlscheme --variable URL_SCHEME=plusfortrello 26 | 27 | android manifest debe tener para manejar card/board "send to" pft from trello app: 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /mobile/android_store/feature.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/android_store/feature.png -------------------------------------------------------------------------------- /mobile/android_store/hires.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/android_store/hires.png -------------------------------------------------------------------------------- /mobile/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Plus for Trello 4 | 5 | Companion for "Plus for Trello" at the Chrome store 6 | 7 | 8 | Plus for Trello team 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /mobile/gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require('gulp'); 2 | var concat = require('gulp-concat'); 3 | 4 | gulp.task('default', function() { 5 | return gulp.src(['./www/sw.tmp', './www/service-worker-extra.js']) 6 | .pipe(concat('service-worker.js')) 7 | .pipe(gulp.dest('./www/')); 8 | }); -------------------------------------------------------------------------------- /mobile/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/icon.png -------------------------------------------------------------------------------- /mobile/lint.bat: -------------------------------------------------------------------------------- 1 | @c: 2 | @cd "C:\Users\Zig\Desktop\cordova\plusfortrello\www\js\" 3 | @\jsl\jsl.exe -conf \jsl\jsl.default.conf -process *.js -nologo -nofilelisting 4 | grep -b -i 'review.*hipri' *.* -------------------------------------------------------------------------------- /mobile/readme mobile.txt: -------------------------------------------------------------------------------- 1 | This is a Cordova and webapp project which share the same www code. 2 | see plugins used in the licences page: http://www.plusfortrello.com/p/licences.html 3 | -------------------------------------------------------------------------------- /mobile/res/how to generate.txt: -------------------------------------------------------------------------------- 1 | https://romannurik.github.io/AndroidAssetStudio/icons-notification.html#source.type=image&source.space.trim=1&source.space.pad=0&name=notif_pin -------------------------------------------------------------------------------- /mobile/res/mipmap-mdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/res/mipmap-mdpi/icon.png -------------------------------------------------------------------------------- /mobile/res/notif_pin/drawable-hdpi-v11/notif_pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/res/notif_pin/drawable-hdpi-v11/notif_pin.png -------------------------------------------------------------------------------- /mobile/res/notif_pin/drawable-hdpi/notif_pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/res/notif_pin/drawable-hdpi/notif_pin.png -------------------------------------------------------------------------------- /mobile/res/notif_pin/drawable-mdpi-v11/notif_pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/res/notif_pin/drawable-mdpi-v11/notif_pin.png -------------------------------------------------------------------------------- /mobile/res/notif_pin/drawable-mdpi/notif_pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/res/notif_pin/drawable-mdpi/notif_pin.png -------------------------------------------------------------------------------- /mobile/res/notif_pin/drawable-xhdpi-v11/notif_pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/res/notif_pin/drawable-xhdpi-v11/notif_pin.png -------------------------------------------------------------------------------- /mobile/res/notif_pin/drawable-xhdpi/notif_pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/res/notif_pin/drawable-xhdpi/notif_pin.png -------------------------------------------------------------------------------- /mobile/res/notif_pin/drawable-xxhdpi-v11/notif_pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/res/notif_pin/drawable-xxhdpi-v11/notif_pin.png -------------------------------------------------------------------------------- /mobile/res/notif_pin/drawable-xxhdpi/notif_pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/res/notif_pin/drawable-xxhdpi/notif_pin.png -------------------------------------------------------------------------------- /mobile/res/notif_pin/drawable-xxxhdpi-v11/notif_pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/res/notif_pin/drawable-xxxhdpi-v11/notif_pin.png -------------------------------------------------------------------------------- /mobile/res/notif_pin/drawable-xxxhdpi/notif_pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/res/notif_pin/drawable-xxxhdpi/notif_pin.png -------------------------------------------------------------------------------- /mobile/res/screen/android/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/res/screen/android/splash.png -------------------------------------------------------------------------------- /mobile/sw-precache-config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | staticFileGlobs: [ 3 | '*.html', 4 | 'cordova.js', 5 | '*.ico', 6 | '*.png', 7 | 'js/!(intellisense).js', 8 | 'js/lib/*.js', 9 | 'img/*.*', 10 | 'css/*.css', 11 | 'css/images/*.*', 12 | 'power-up/**' 13 | ], 14 | ignoreUrlParametersMatching: [/./], 15 | directoryIndex: false, 16 | navigateFallback: "/index.html", 17 | navigateFallbackWhitelist: [/^\/$/], 18 | dontCacheBustUrlsMatching: /cloudflare|\/lib\/|-v[0-9]/, 19 | runtimeCaching: [{ 20 | urlPattern: /^https:\/\/cdnjs\.cloudflare\.com\/ajax\/libs\//, 21 | handler: 'cacheFirst' 22 | }, { 23 | urlPattern: /^https:\/\/trello-avatars\.s3\.amazonaws\.com\//, 24 | handler: 'networkFirst' 25 | }] 26 | }; -------------------------------------------------------------------------------- /mobile/www/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/apple-touch-icon.png -------------------------------------------------------------------------------- /mobile/www/card.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Plus for Trello 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 135 | 136 | 137 | -------------------------------------------------------------------------------- /mobile/www/css/images/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/ajax-loader.gif -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/action-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/action-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/action-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/action-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/alert-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/alert-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/alert-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/alert-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/arrow-d-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/arrow-d-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/arrow-d-l-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/arrow-d-l-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/arrow-d-l-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/arrow-d-l-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/arrow-d-r-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/arrow-d-r-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/arrow-d-r-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/arrow-d-r-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/arrow-d-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/arrow-d-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/arrow-l-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/arrow-l-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/arrow-l-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/arrow-l-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/arrow-r-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/arrow-r-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/arrow-r-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/arrow-r-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/arrow-u-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/arrow-u-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/arrow-u-l-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/arrow-u-l-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/arrow-u-l-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/arrow-u-l-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/arrow-u-r-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/arrow-u-r-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/arrow-u-r-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/arrow-u-r-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/arrow-u-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/arrow-u-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/audio-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/audio-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/audio-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/audio-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/back-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/back-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/back-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/back-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/bars-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/bars-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/bars-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/bars-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/bullets-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/bullets-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/bullets-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/bullets-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/calendar-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/calendar-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/calendar-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/calendar-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/camera-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/camera-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/camera-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/camera-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/carat-d-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/carat-d-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/carat-d-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/carat-d-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/carat-l-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/carat-l-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/carat-l-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/carat-l-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/carat-r-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/carat-r-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/carat-r-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/carat-r-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/carat-u-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/carat-u-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/carat-u-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/carat-u-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/check-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/check-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/check-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/check-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/clock-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/clock-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/clock-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/clock-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/cloud-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/cloud-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/cloud-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/cloud-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/comment-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/comment-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/comment-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/comment-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/delete-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/delete-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/delete-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/delete-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/edit-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/edit-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/edit-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/edit-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/eye-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/eye-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/eye-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/eye-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/forbidden-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/forbidden-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/forbidden-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/forbidden-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/forward-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/forward-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/forward-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/forward-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/gear-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/gear-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/gear-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/gear-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/grid-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/grid-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/grid-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/grid-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/heart-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/heart-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/heart-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/heart-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/home-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/home-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/home-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/home-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/info-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/info-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/info-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/info-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/location-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/location-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/location-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/location-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/lock-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/lock-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/lock-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/lock-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/mail-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/mail-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/mail-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/mail-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/minus-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/minus-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/minus-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/minus-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/navigation-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/navigation-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/navigation-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/navigation-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/phone-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/phone-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/phone-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/phone-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/plus-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/plus-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/plus-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/plus-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/power-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/power-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/power-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/power-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/recycle-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/recycle-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/recycle-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/recycle-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/refresh-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/refresh-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/refresh-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/refresh-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/search-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/search-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/search-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/search-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/shop-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/shop-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/shop-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/shop-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/star-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/star-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/star-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/star-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/tag-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/tag-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/tag-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/tag-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/user-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/user-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/user-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/user-white.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/video-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/video-black.png -------------------------------------------------------------------------------- /mobile/www/css/images/icons-png/video-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/css/images/icons-png/video-white.png -------------------------------------------------------------------------------- /mobile/www/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/favicon.ico -------------------------------------------------------------------------------- /mobile/www/fd.bat: -------------------------------------------------------------------------------- 1 | chcp 65001 2 | del index2.html 3 | \bin\sed "s/css\/jquery\.mobile\.icons\.min\.css/https:\/\/cdnjs\.cloudflare\.com\/ajax\/libs\/jquery-mobile\/1\.4\.5\/jquery\.mobile\.icons\.min\.css/; s/css\/jquery\.mobile\.structure-1\.4\.5\.min\.css/https:\/\/cdnjs\.cloudflare\.com\/ajax\/libs\/jquery-mobile\/1\.4\.5\/jquery\.mobile\.structure\.min\.css/; s/js\/lib\/jquery\.js/https:\/\/cdnjs\.cloudflare\.com\/ajax\/libs\/jquery\/1\.7\.1\/jquery\.min\.js/; s/js\/lib\/jquery\.mobile-1\.4\.5\.min\.js/https:\/\/cdnjs\.cloudflare\.com\/ajax\/libs\/jquery-mobile\/1\.4\.5\/jquery\.mobile\.min\.js/; s/js\/lib\/fastclick.js/https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/fastclick\/1.0.6\/fastclick.min.js/" index.html > index2.html 4 | del index.tmp 5 | rename index.html index.tmp 6 | rename index2.html index.html 7 | echo //empty > cordova.js 8 | call sw-precache --config=..\sw-precache-config.js 9 | del sw.tmp 10 | \bin\sed "s/css\/jquery\.mobile\.icons\.min\.css/https:\/\/cdnjs\.cloudflare\.com\/ajax\/libs\/jquery-mobile\/1\.4\.5\/jquery\.mobile\.icons\.min\.css/; s/css\/jquery\.mobile\.structure-1\.4\.5\.min\.css/https:\/\/cdnjs\.cloudflare\.com\/ajax\/libs\/jquery-mobile\/1\.4\.5\/jquery\.mobile\.structure\.min\.css/; s/js\/lib\/jquery\.js/https:\/\/cdnjs\.cloudflare\.com\/ajax\/libs\/jquery\/1\.7\.1\/jquery\.min\.js/; s/js\/lib\/jquery\.mobile-1\.4\.5\.min\.js/https:\/\/cdnjs\.cloudflare\.com\/ajax\/libs\/jquery-mobile\/1\.4\.5\/jquery\.mobile\.min\.js/; s/js\/lib\/fastclick.js/https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/fastclick\/1.0.6\/fastclick.min.js/" service-worker.js > sw.tmp 11 | del service-worker.js 12 | cd .. 13 | call gulp 14 | 15 | cd www 16 | call firebase deploy 17 | del index.html 18 | del service-worker.js 19 | rename index.tmp index.html 20 | del cordova.js 21 | -------------------------------------------------------------------------------- /mobile/www/firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "hosting": { 3 | "public": ".", 4 | "ignore": [ 5 | "firebase.json", 6 | "*.bat", 7 | "*.txt", 8 | "*.tmp", 9 | "**/.*", 10 | "css/images/icons-png/**", 11 | "jquery.*.*", 12 | "js/intellisense.js" 13 | ], 14 | "redirects": [ 15 | { 16 | "source": "/", 17 | "destination": "/index.html", 18 | "type": 301 19 | } 20 | ], 21 | "headers": [ 22 | { 23 | "source": "**", 24 | "headers": [ 25 | { 26 | "key": "Access-Control-Allow-Origin", 27 | "value": "https://trello.com" 28 | } 29 | ] 30 | }, 31 | { 32 | "source": "**/*.@(jpg|jpeg|gif|png|ico)", 33 | "headers": [ 34 | { 35 | "key": "Cache-Control", 36 | "value": "max-age=86400" 37 | } 38 | ] 39 | }, 40 | { 41 | "source": "js/lib/*.js", 42 | "headers": [ 43 | { 44 | "key": "Cache-Control", 45 | "value": "max-age=31536000" 46 | } 47 | ] 48 | }, 49 | { 50 | "source": "*.html", 51 | "headers": [ 52 | { 53 | "key": "Cache-Control", 54 | "value": "max-age=300" 55 | } 56 | ] 57 | }, 58 | { 59 | "source": "*.js", 60 | "headers": [ 61 | { 62 | "key": "Cache-Control", 63 | "value": "max-age=300" 64 | } 65 | ] 66 | }, 67 | { 68 | "source": "js/*.js", 69 | "headers": [ 70 | { 71 | "key": "Cache-Control", 72 | "value": "max-age=31536000" 73 | } 74 | ] 75 | }, 76 | { 77 | "source": "css/*.css", 78 | "headers": [ 79 | { 80 | "key": "Cache-Control", 81 | "value": "max-age=31536000" 82 | } 83 | ] 84 | }, 85 | { 86 | "source": "power-up/images/*.*", 87 | "headers": [ 88 | { 89 | "key": "Cache-Control", 90 | "value": "max-age=31536000" 91 | } 92 | ] 93 | }, 94 | { 95 | "source": "power-up/*.html", 96 | "headers": [ 97 | { 98 | "key": "Cache-Control", 99 | "value": "max-age=300" 100 | } 101 | ] 102 | }, 103 | { 104 | "source": "power-up/*.json", 105 | "headers": [ 106 | { 107 | "key": "Cache-Control", 108 | "value": "max-age=300" 109 | } 110 | ] 111 | }, 112 | { 113 | "source": "power-up/js/*.js", 114 | "headers": [ 115 | { 116 | "key": "Cache-Control", 117 | "value": "max-age=31536000" 118 | } 119 | ] 120 | }, 121 | { 122 | "source": "power-up/css/*.css", 123 | "headers": [ 124 | { 125 | "key": "Cache-Control", 126 | "value": "max-age=31536000" 127 | } 128 | ] 129 | } 130 | ] 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /mobile/www/help.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 |
15 |
16 | 17 | Companion for
Plus for Trello (chrome extension)
18 |
19 | Enter transfers in the Trello app with the Plus comment format

20 | Read about the Plus Spent/Estimate system

21 |
22 |
Storage used: .
23 |

24 | 25 | 26 |
27 |
28 |
29 | 30 | 31 | -------------------------------------------------------------------------------- /mobile/www/img/btn_donate_SM.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/img/btn_donate_SM.gif -------------------------------------------------------------------------------- /mobile/www/img/gear-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/img/gear-white.png -------------------------------------------------------------------------------- /mobile/www/img/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/img/icon.png -------------------------------------------------------------------------------- /mobile/www/img/icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/img/icon128.png -------------------------------------------------------------------------------- /mobile/www/img/icon144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/img/icon144.png -------------------------------------------------------------------------------- /mobile/www/img/icon192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/img/icon192.png -------------------------------------------------------------------------------- /mobile/www/img/icon48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/img/icon48.png -------------------------------------------------------------------------------- /mobile/www/img/icon96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/img/icon96.png -------------------------------------------------------------------------------- /mobile/www/img/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/img/login.png -------------------------------------------------------------------------------- /mobile/www/img/offline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/img/offline.png -------------------------------------------------------------------------------- /mobile/www/img/sync.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/img/sync.png -------------------------------------------------------------------------------- /mobile/www/img/trelloOpen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/img/trelloOpen.png -------------------------------------------------------------------------------- /mobile/www/index.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | Plus for Trello 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 49 | 56 | 57 | 80 | 81 |
82 |
83 |
    84 |
    85 |
    86 | 87 |
    88 |
    89 |
    90 |
      91 |
      92 |
      93 | 94 |
      95 |
      96 |
      97 |
        98 |
        99 |
        100 | 101 | 102 | 103 | -------------------------------------------------------------------------------- /mobile/www/js/intellisense.js: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | /// 4 | /// 5 | /// 6 | /// 7 | 8 | 9 | //https://msdn.microsoft.com/en-us/library/bb385682.aspx 10 | 11 | -------------------------------------------------------------------------------- /mobile/www/js/lib/lz-string.min.js: -------------------------------------------------------------------------------- 1 | var LZString = function () { function o(o, r) { if (!t[o]) { t[o] = {}; for (var n = 0; n < o.length; n++) t[o][o.charAt(n)] = n } return t[o][r] } var r = String.fromCharCode, n = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$", t = {}, i = { compressToBase64: function (o) { if (null == o) return ""; var r = i._compress(o, 6, function (o) { return n.charAt(o) }); switch (r.length % 4) { default: case 0: return r; case 1: return r + "==="; case 2: return r + "=="; case 3: return r + "=" } }, decompressFromBase64: function (r) { return null == r ? "" : "" == r ? null : i._decompress(r.length, 32, function (e) { return o(n, r.charAt(e)) }) }, compressToUTF16: function (o) { return null == o ? "" : i._compress(o, 15, function (o) { return r(o + 32) }) + " " }, decompressFromUTF16: function (o) { return null == o ? "" : "" == o ? null : i._decompress(o.length, 16384, function (r) { return o.charCodeAt(r) - 32 }) }, compressToUint8Array: function (o) { for (var r = i.compress(o), n = new Uint8Array(2 * r.length), e = 0, t = r.length; t > e; e++) { var s = r.charCodeAt(e); n[2 * e] = s >>> 8, n[2 * e + 1] = s % 256 } return n }, decompressFromUint8Array: function (o) { if (null === o || void 0 === o) return i.decompress(o); for (var n = new Array(o.length / 2), e = 0, t = n.length; t > e; e++) n[e] = 256 * o[2 * e] + o[2 * e + 1]; var s = []; return n.forEach(function (o) { s.push(r(o)) }), i.decompress(s.join("")) }, compressToEncodedURIComponent: function (o) { return null == o ? "" : i._compress(o, 6, function (o) { return e.charAt(o) }) }, decompressFromEncodedURIComponent: function (r) { return null == r ? "" : "" == r ? null : (r = r.replace(/ /g, "+"), i._decompress(r.length, 32, function (n) { return o(e, r.charAt(n)) })) }, compress: function (o) { return i._compress(o, 16, function (o) { return r(o) }) }, _compress: function (o, r, n) { if (null == o) return ""; var e, t, i, s = {}, p = {}, u = "", c = "", a = "", l = 2, f = 3, h = 2, d = [], m = 0, v = 0; for (i = 0; i < o.length; i += 1) if (u = o.charAt(i), Object.prototype.hasOwnProperty.call(s, u) || (s[u] = f++, p[u] = !0), c = a + u, Object.prototype.hasOwnProperty.call(s, c)) a = c; else { if (Object.prototype.hasOwnProperty.call(p, a)) { if (a.charCodeAt(0) < 256) { for (e = 0; h > e; e++) m <<= 1, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++; for (t = a.charCodeAt(0), e = 0; 8 > e; e++) m = m << 1 | 1 & t, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++, t >>= 1 } else { for (t = 1, e = 0; h > e; e++) m = m << 1 | t, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++, t = 0; for (t = a.charCodeAt(0), e = 0; 16 > e; e++) m = m << 1 | 1 & t, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++, t >>= 1 } l--, 0 == l && (l = Math.pow(2, h), h++), delete p[a] } else for (t = s[a], e = 0; h > e; e++) m = m << 1 | 1 & t, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++, t >>= 1; l--, 0 == l && (l = Math.pow(2, h), h++), s[c] = f++, a = String(u) } if ("" !== a) { if (Object.prototype.hasOwnProperty.call(p, a)) { if (a.charCodeAt(0) < 256) { for (e = 0; h > e; e++) m <<= 1, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++; for (t = a.charCodeAt(0), e = 0; 8 > e; e++) m = m << 1 | 1 & t, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++, t >>= 1 } else { for (t = 1, e = 0; h > e; e++) m = m << 1 | t, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++, t = 0; for (t = a.charCodeAt(0), e = 0; 16 > e; e++) m = m << 1 | 1 & t, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++, t >>= 1 } l--, 0 == l && (l = Math.pow(2, h), h++), delete p[a] } else for (t = s[a], e = 0; h > e; e++) m = m << 1 | 1 & t, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++, t >>= 1; l--, 0 == l && (l = Math.pow(2, h), h++) } for (t = 2, e = 0; h > e; e++) m = m << 1 | 1 & t, v == r - 1 ? (v = 0, d.push(n(m)), m = 0) : v++, t >>= 1; for (; ;) { if (m <<= 1, v == r - 1) { d.push(n(m)); break } v++ } return d.join("") }, decompress: function (o) { return null == o ? "" : "" == o ? null : i._decompress(o.length, 32768, function (r) { return o.charCodeAt(r) }) }, _decompress: function (o, n, e) { var t, i, s, p, u, c, a, l, f = [], h = 4, d = 4, m = 3, v = "", w = [], A = { val: e(0), position: n, index: 1 }; for (i = 0; 3 > i; i += 1) f[i] = i; for (p = 0, c = Math.pow(2, 2), a = 1; a != c;) u = A.val & A.position, A.position >>= 1, 0 == A.position && (A.position = n, A.val = e(A.index++)), p |= (u > 0 ? 1 : 0) * a, a <<= 1; switch (t = p) { case 0: for (p = 0, c = Math.pow(2, 8), a = 1; a != c;) u = A.val & A.position, A.position >>= 1, 0 == A.position && (A.position = n, A.val = e(A.index++)), p |= (u > 0 ? 1 : 0) * a, a <<= 1; l = r(p); break; case 1: for (p = 0, c = Math.pow(2, 16), a = 1; a != c;) u = A.val & A.position, A.position >>= 1, 0 == A.position && (A.position = n, A.val = e(A.index++)), p |= (u > 0 ? 1 : 0) * a, a <<= 1; l = r(p); break; case 2: return "" } for (f[3] = l, s = l, w.push(l) ; ;) { if (A.index > o) return ""; for (p = 0, c = Math.pow(2, m), a = 1; a != c;) u = A.val & A.position, A.position >>= 1, 0 == A.position && (A.position = n, A.val = e(A.index++)), p |= (u > 0 ? 1 : 0) * a, a <<= 1; switch (l = p) { case 0: for (p = 0, c = Math.pow(2, 8), a = 1; a != c;) u = A.val & A.position, A.position >>= 1, 0 == A.position && (A.position = n, A.val = e(A.index++)), p |= (u > 0 ? 1 : 0) * a, a <<= 1; f[d++] = r(p), l = d - 1, h--; break; case 1: for (p = 0, c = Math.pow(2, 16), a = 1; a != c;) u = A.val & A.position, A.position >>= 1, 0 == A.position && (A.position = n, A.val = e(A.index++)), p |= (u > 0 ? 1 : 0) * a, a <<= 1; f[d++] = r(p), l = d - 1, h--; break; case 2: return w.join("") } if (0 == h && (h = Math.pow(2, m), m++), f[l]) v = f[l]; else { if (l !== d) return null; v = s + s.charAt(0) } w.push(v), f[d++] = s + v.charAt(0), h--, s = v, 0 == h && (h = Math.pow(2, m), m++) } } }; return i }(); "function" == typeof define && define.amd ? define(function () { return LZString }) : "undefined" != typeof module && null != module && (module.exports = LZString); -------------------------------------------------------------------------------- /mobile/www/js/redirector.js: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | //CANNOT use any external functions here 4 | var PROP_NAVIDCARDLONG = "nav-idCardLong"; 5 | var PROP_NAVFROMPOWERUP = "nav-fromPowerup"; 6 | 7 | //using onload gives a chance for the page background to paint before we redirect, prevents white flash 8 | window.onload = function () { 9 | this.init = null; //dont call again 10 | if (typeof (cordova) != "undefined") 11 | return; 12 | //since our simple jqm doesnt support url navigation, a page refresh or direct link will 13 | //fail. So instead redirect those requests to home. Handle the common case of a card url (from a notification) 14 | var path = window.location.href; 15 | var pathStart = "/index.html"; 16 | var bRedirectHome = false; 17 | var parts = path.split("/"); 18 | if (parts.length > 0) { 19 | var partLast = parts.pop(); 20 | var pathExtracted = "/" + partLast; 21 | if (pathExtracted != pathStart) { 22 | bRedirectHome = true; 23 | var strCardDetect = "card.html?id="; 24 | var prePath = parts.join("/"); 25 | var postPath = ""; 26 | if (partLast.indexOf(strCardDetect) == 0) { 27 | var idCardLong = partLast.split(strCardDetect)[1]; 28 | if (idCardLong) { 29 | idCardLong = idCardLong.split("#")[0].split("&")[0]; //trello power-up adds extra parameters 30 | localStorage[PROP_NAVIDCARDLONG] = idCardLong; 31 | if (path.indexOf("powerup=true") >= 0) 32 | localStorage[PROP_NAVFROMPOWERUP] = "true"; //used for testing the powerup without trello 33 | } 34 | } 35 | } 36 | } 37 | if (bRedirectHome) 38 | window.location.replace(pathStart); 39 | }; 40 | 41 | 42 | -------------------------------------------------------------------------------- /mobile/www/js/sharedlocal.js: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | //CANNOT use any external functions here 4 | var PROP_NAVIDCARDLONG = "nav-idCardLong"; 5 | 6 | window.onload = function () { 7 | if (typeof (cordova) != "undefined") 8 | return; 9 | //since our simple jqm doesnt support url navigation, a page refresh or direct link will 10 | //fail. So instead redirect those requests to home, and handle the common case of a card url 11 | var path = window.location.href; 12 | var pathStart = "/index.html"; 13 | var parts = path.split("/"); 14 | if (parts.length > 0) { 15 | var partLast = parts.pop(); 16 | path = "/" + partLast; 17 | if (path != pathStart) { 18 | var strCardDetect = "card.html?id="; 19 | var prePath = parts.join("/"); 20 | var postPath = ""; 21 | if (partLast.indexOf(strCardDetect) == 0) { 22 | var idCardLong = partLast.split(strCardDetect)[1]; 23 | if (idCardLong) { 24 | localStorage[PROP_NAVIDCARDLONG] = idCardLong; 25 | window.location.replace(pathStart); 26 | } 27 | } 28 | } 29 | } 30 | }; 31 | 32 | -------------------------------------------------------------------------------- /mobile/www/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Plus for Trello", 3 | "name": "Plus for Trello", 4 | "icons": [ 5 | { 6 | "src": "img/icon48.png", 7 | "sizes": "48x48", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "img/icon96.png", 12 | "sizes": "96x96", 13 | "type": "image/png" 14 | }, 15 | { 16 | "src": "img/icon144.png", 17 | "sizes": "144x144", 18 | "type": "image/png" 19 | }, 20 | { 21 | "src": "img/icon192.png", 22 | "sizes": "192x192", 23 | "type": "image/png" 24 | }, 25 | { 26 | "src": "img/icon128.png", 27 | "sizes": "128x128", 28 | "type": "image/png" 29 | } 30 | ], 31 | "start_url": "/index.html", 32 | "display": "fullscreen", 33 | "orientation": "portrait-primary", 34 | "background_color": "#0079BF", 35 | "theme_color": "#0079BF", 36 | "prefer_related_applications": true, 37 | "related_applications": [ 38 | { 39 | "platform": "play", 40 | "url": "https://play.google.com/store/apps/details?id=com.zigmandel.plusfortrello", 41 | "id": "com.zigmandel.plusfortrello" 42 | }] 43 | } -------------------------------------------------------------------------------- /mobile/www/power-up/cardmenu.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 |
        8 |
          9 |
        • Add Estimate
        • 10 |
        • Add Spent
        • 11 |
        • View S/E
        • 12 |
        13 |
        14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /mobile/www/power-up/css/board-bar.css: -------------------------------------------------------------------------------- 1 | body { 2 | background: #0C3953; 3 | color: white; 4 | padding: 18px; 5 | } 6 | -------------------------------------------------------------------------------- /mobile/www/power-up/css/overlay.css: -------------------------------------------------------------------------------- 1 | body { 2 | background: rgba(0,0,0,.5); 3 | display: flex; 4 | align-items: center; 5 | justify-content: center; 6 | } 7 | #content { 8 | background: white; 9 | padding: 24px; 10 | width: 80%; 11 | max-width: 600px; 12 | max-height: 90%; 13 | } 14 | -------------------------------------------------------------------------------- /mobile/www/power-up/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/mobile/www/power-up/images/logo.png -------------------------------------------------------------------------------- /mobile/www/power-up/index.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /mobile/www/power-up/js/cardmenu.js: -------------------------------------------------------------------------------- 1 | var PROP_NAVIDCARDLONG = "nav-idCardLong"; //duplicated from redirector.js 2 | var t = TrelloPowerUp.iframe(); 3 | t.sizeTo('#content'); 4 | var g_idCard = t.arg('idCard'); 5 | 6 | // close overlay if user clicks outside our content 7 | document.addEventListener('click', function (e) { 8 | if (e.target.tagName == 'BODY') { 9 | t.closeOverlay().done(); 10 | } 11 | }); -------------------------------------------------------------------------------- /mobile/www/power-up/js/template.js: -------------------------------------------------------------------------------- 1 | /* global TrelloPowerUp */ 2 | var LOGOPLUS = './images/logo.png'; 3 | var PROP_NAVIDCARDLONG = "nav-idCardLong"; //from webapp 4 | var PROP_NAVFROMPOWERUP = "nav-fromPowerup"; //from webapp 5 | var PROP_CARDDATAPOWERUP = "cardData-powerup"; //from webapp 6 | 7 | TrelloPowerUp.initialize({ 8 | 'card-buttons': function (t, options) { 9 | return [ 10 | { 11 | icon: LOGOPLUS, 12 | text: 'Spent/Estimate', 13 | callback: function (t) { 14 | return t.card('id', 'members') 15 | .then(function (card) { 16 | var idCardLong = card.id; 17 | var members = card.members; 18 | localStorage[PROP_NAVIDCARDLONG] = idCardLong; 19 | localStorage[PROP_CARDDATAPOWERUP] = JSON.stringify({ 20 | idLong: idCardLong, 21 | members: members 22 | }); 23 | localStorage[PROP_NAVFROMPOWERUP] = "true"; 24 | var url = document.location.origin + '/index.html'; 25 | return t.popup({ 26 | title: 'Card', 27 | url: url, 28 | height: 320 29 | }); 30 | }) 31 | } 32 | } 33 | ] 34 | } 35 | }); -------------------------------------------------------------------------------- /mobile/www/power-up/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Plus for Trello", 3 | "description": "", 4 | "details": "**[Plus for Trello](http://www.plusfortrello.com) is free since 2013!** \n**Add card Points, Spent, Estimates.** \nAlso works on mobile and offline. \n \nThe Chrome extension has much more: timers, counts, charts, reports, scrum, burn-downs, projected end dates. \n***\nBurn-downs\n------ ![burndown](https://storage.googleapis.com/plusfortrello_images/power-up/1.png) \n***\nHome charts\n------ ![home](https://storage.googleapis.com/plusfortrello_images/power-up/2.png) \n***\nTimers\n------ ![home](https://storage.googleapis.com/plusfortrello_images/power-up/9.png) \n***\nSpent & Estimates\n------ ![SE](https://storage.googleapis.com/plusfortrello_images/power-up/22.png) \n***\nPivots\n------ ![pivotS](https://storage.googleapis.com/plusfortrello_images/power-up/4.png) \n***\nGroup\n------ ![bytag](https://storage.googleapis.com/plusfortrello_images/power-up/3.png) \n***\nFilter & Export\n------ ![report](https://storage.googleapis.com/plusfortrello_images/power-up/5.png) \n***\nEstimate changes\n------ ![echange](https://storage.googleapis.com/plusfortrello_images/power-up/6.png) \n***\nMeasure\n------ ![measure](https://storage.googleapis.com/plusfortrello_images/power-up/66.png) \n***\nBy user\n------ ![reportuser](https://storage.googleapis.com/plusfortrello_images/power-up/7.png) \n***\nReport columns\n------ ![report columns](https://storage.googleapis.com/plusfortrello_images/power-up/8.png)", 5 | "icon": { 6 | "url": "./images/logo.png" 7 | }, 8 | "author": "Plus for Trello", 9 | "capabilities": [ 10 | "callback", 11 | "card-buttons" 12 | ], 13 | "connectors": { 14 | "iframe": { 15 | "url": "./index.html" 16 | } 17 | }, 18 | "recommend": { 19 | "urls": [] 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /mobile/www/service-worker-extra.js: -------------------------------------------------------------------------------- 1 |  2 | 3 | self.addEventListener('notificationclick', function (event) { 4 | if (event.notification.data && event.notification.data.action == "pinnedCard") { 5 | //See if any existing client window has the card open. if so, focus it. 6 | //else, try to reuse an existing client window. 7 | //else, create a new window. 8 | event.waitUntil(clients.matchAll({ 9 | type: "window" 10 | }).then(function (clientList) { 11 | var idCardLong=event.notification.data.idCardLong; 12 | var strPrefix = 'card.html?id=' + idCardLong; 13 | 14 | var client = null; 15 | var clientLoop = null; 16 | for (var i = 0; i < clientList.length; i++) { 17 | clientLoop = clientList[i]; 18 | //frameType "top-level" when inside a trello power-up 19 | if (clientLoop.frameType && clientLoop.frameType != "top-level") { 20 | continue; 21 | } 22 | if (clientLoop.url && (clientLoop.url.indexOf(strPrefix) >= 0) && 'focus' in clientLoop) //the indexOf here isnt 100% perfect but chances are slim it will collide with another card 23 | return clientLoop.focus(); 24 | client= clientLoop; 25 | } 26 | if (client) { 27 | client.postMessage({ action: "pinnedCard", idCardLong: idCardLong }); 28 | if ('focus' in client) 29 | return client.focus(); 30 | } else if (clients.openWindow) 31 | return clients.openWindow(strPrefix); //see https://github.com/w3c/ServiceWorker/issues/720#issuecomment-269984307 32 | })); 33 | } 34 | }); 35 | 36 | -------------------------------------------------------------------------------- /mobile/www/service-worker.js: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | self.addEventListener('install', function (e) { 4 | console.log('[ServiceWorker] Install'); 5 | }); 6 | 7 | self.addEventListener('activate', function (e) { 8 | console.log('[ServiceWorker] Activate'); 9 | }); 10 | 11 | -------------------------------------------------------------------------------- /mobile/www/settings.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
        14 |
        15 |
        16 | Units: 17 | 22 |
        23 | 26 | 29 | 32 | 35 | Keywords 36 | Global user 37 | Help 38 | Exit app 39 | Logout from Trello 40 |
        41 |
        42 |
        43 |
        44 |
        45 | 46 | 47 | -------------------------------------------------------------------------------- /source/_locales/ar/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "extName": { 3 | "message": "Plus for Trello (تتبع الوقت, تقارير)" 4 | }, 5 | "extDescription": { 6 | "message": "تقارير، عداد، هاشتاج، دعم أوفلاين، رسم بياني، الوقت المتوقع والمنقضي." 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /source/_locales/da/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "extName": { 3 | "message": "Plus for Trello (tidsregistrering, rapporter)" 4 | }, 5 | "extDescription": { 6 | "message": "Rapporter, timere, hashtags, offline support, burn-downs, timeforbrug hhv. estimat pr. kort/liste/board/team, historik og mere!" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /source/_locales/en/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "extName": { 3 | "message": "Plus for Trello (time track, reports)" 4 | }, 5 | "extDescription": { 6 | "message": "Reports, Timers, hashtags, offline, burn-downs, spent vs estimate by card, list, board, user, team, history and more!" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /source/_locales/es/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "extName": { 3 | "message": "Plus for Trello (tiempos, reportes)" 4 | }, 5 | "extDescription": { 6 | "message": "Reportes, offline, burn-downs, estimación y tiempo gastado por tarjeta, lista, tabla, usuario, equipo, historial y mucho más!" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /source/_locales/fr/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "extName": { 3 | "message": "Plus for Trello (temps, rapports)" 4 | }, 5 | "extDescription": { 6 | "message": "Rapports, horodateurs, mots-clés, usage hors-ligne, graphique d'avancement, dépensé vs estimé par carte, liste, tableau et plus!" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /source/_locales/nl/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "extName": { 3 | "message": "Plus for Trello (tijd, rapporten)" 4 | }, 5 | "extDescription": { 6 | "message": "Rapporten, Timers, hashtags, offline ondersteuning, besteed vs geschat per kaart/lijst/bord/gebruiker/team, geschiedenis en meer!" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /source/_locales/pt_BR/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "extName": { 3 | "message": "Plus for Trello (tempo, relatórios)" 4 | }, 5 | "extDescription": { 6 | "message": "Tempo, Relátorios, hashtags, suporte offline, burn-downs, gasto x estimativa por cartão/lista/quadro/usuário/time, histórico e mais!" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /source/_locales/pt_PT/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "extName": { 3 | "message": "Plus for Trello (tempo, relatórios)" 4 | }, 5 | "extDescription": { 6 | "message": "Tempo, Relátorios, hashtags, suporte offline, burn-downs, gasto x estimativa por cartão/lista/quadro/usuário/time, histórico e mais!" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /source/_locales/ru/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "extName": { 3 | "message": "Plus for Trello (тайм-трекинг, отчёты)" 4 | }, 5 | "extDescription": { 6 | "message": "Отчёты,Таймеры,хештеги,работа в оффлайне,диаграммы,Затрачено-Оценка по карточкам/спискам/доскам/пользователям/командам,история и др." 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /source/_locales/vi/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "extName": { 3 | "message": "Plus for Trello (theo dõi thời gian, báo cáo)" 4 | }, 5 | "extDescription": { 6 | "message": "Các báo báo, Các bộ đếm thời gian, các thẻ , hỗ trợ, burn-downs, đã dùng vs ước lượng bằng thẻ/danh sách/bảng/người dùng/đội, lịch sử và hơn thế!" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /source/_locales/zh_CN/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "extName": { 3 | "message": "Plus for Trello (时间跟踪, 报告,规划)" 4 | }, 5 | "extDescription": { 6 | "message": "报告,计时器,标签,离线支持,燃尽图,对卡片/列表/任务版/用户/团队对时间和花费的预估, 历史记录, 更多功能等你探索!" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /source/background.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Plus for Trello background page 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 23 | 24 | 25 |
        26 | 27 | 28 |
        29 | 30 | -------------------------------------------------------------------------------- /source/burndown.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Plus Burndown 5 | 6 | 7 | 8 | 9 | 10 | 11 |

        Redirecting...

        12 | 13 | -------------------------------------------------------------------------------- /source/burndown.js: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | var g_bLoaded = false; //needed because DOMContentLoaded gets called again when we modify the page 4 | 5 | 6 | document.addEventListener('DOMContentLoaded', function () { 7 | loadBurndown(); 8 | }); 9 | 10 | 11 | function loadBurndown() { 12 | var iParams = window.location.href.indexOf("?"); 13 | if (iParams < 0) 14 | return; 15 | var strParams = window.location.href.substring(iParams); 16 | var url = chrome.extension.getURL("dashboard.html") + strParams; 17 | window.location.replace(url); 18 | } 19 | 20 | -------------------------------------------------------------------------------- /source/buttons.js: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | 4 | var HelpButton = { 5 | strClass: 'agile_help_button', 6 | create: function () { 7 | var bPlusDisplayDisabled = isPlusDisplayDisabled(); 8 | var b = $('').addClass('notranslate header-btn ' + this.strClass); 9 | b.hide(); 10 | 11 | var spanIcon = $('').css('cursor', 'help'); 12 | var spanTour = $('Tour'); 13 | hookTour(spanTour); 14 | var icon = $("").attr("src", chrome.extension.getURL(bPlusDisplayDisabled ? "images/iconspenthelpwarn.png" : "images/iconspenthelp.png")); 15 | icon.addClass("agile-spent-icon-header agile-main-plus-help-icon"); 16 | icon.attr("title", "Plus Help"); 17 | if (!bPlusDisplayDisabled) 18 | b.append(spanTour); 19 | spanIcon.append(icon); 20 | b.append(spanIcon); 21 | icon.click(function (evt) { 22 | Help.display(); 23 | }); 24 | 25 | configureSsLinks(b); 26 | setTimeout(function () { 27 | if (newerStoreVersion()) 28 | hiliteOnce(icon, null, null, 3); 29 | }, 1000); 30 | return b; 31 | }, 32 | display: function () { 33 | var header = $('div#header div.header-user'); 34 | if (header.find('.' + this.strClass).size() == 0) { 35 | var objThis = this.create(); 36 | header.prepend(objThis); 37 | } 38 | } 39 | }; 40 | 41 | 42 | var g_intervalCheckPlusFeed = null; 43 | function insertPlusFeed(bForce) { 44 | if (g_intervalCheckPlusFeed != null && !bForce) 45 | return; 46 | 47 | var stateFeed = { 48 | msLastPostRetrieved: 0, // date of most recent post retrieved 49 | msLastPostReadByUser: 0, // date of last post read by user 50 | msLastQuery: 0, // date we last made a query. shouldnt do more than once every 3 hours to prevent sync issues and api overuse. 51 | msUserClicked: 0 52 | }; 53 | 54 | var icon = $(".agile-icon-new-header"); 55 | 56 | if (icon.length > 0) 57 | return; 58 | 59 | function doGetFeed() { 60 | var key = "gplusfeeddata"; 61 | chrome.storage.sync.get(key, function (obj) { 62 | var data = obj[key]; 63 | if (data !== undefined) 64 | stateFeed = data; 65 | var msNow = Date.now(); 66 | var msWait = 1000 * 60 * 60 * 3; //3 hours (there is a quota of 50,000 queries/day for all users) code.google.com/apis/console/b/0/?noredirect#project:147493868263:stats 67 | //msWait = 1000; //1 sec, for test 68 | if (isPlusDisplayDisabled()) 69 | msWait = 1000 * 60 * 60 * 0.5; //half hour in case there is a new g+ post about an issue fixed 70 | if (msNow - stateFeed.msLastQuery > msWait) { 71 | setTimeout(function () { //delay a few seconds because usually happens on trello page load, wait until that settles 72 | sendExtensionMessage({ method: "getPlusFeed", msLastPostRetrieved: stateFeed.msLastPostReadByUser }, 73 | function (response) { 74 | if (response.status != STATUS_OK) { 75 | insertPlusFeedWorker(stateFeed, key); //use previous result 76 | return; 77 | } 78 | stateFeed.msLastPostRetrieved = response.msLastPostRetrieved; 79 | stateFeed.msLastQuery = msNow; 80 | var iitem = 0; 81 | var itemsSave = []; 82 | var iMax = Math.min(2, response.items.length); //prevent huge sync item 83 | for (; iitem < iMax; iitem++) { 84 | var item = response.items[iitem]; 85 | itemsSave.push({ d: item.msDatePublish, t:item.title }); 86 | } 87 | if (JSON.stringify(itemsSave).length > 500) //prevent huge sync item. should never happen since each item is small and we allow 2 only 88 | itemsSave = []; 89 | stateFeed.items = itemsSave; 90 | var objSave = {}; 91 | objSave[key] = stateFeed; 92 | if (true) { 93 | chrome.storage.sync.set(objSave, function () { 94 | if (chrome.runtime.lastError === undefined) 95 | insertPlusFeedWorker(stateFeed, key); 96 | }); 97 | } 98 | }); 99 | }, 3000); 100 | } else { 101 | insertPlusFeedWorker(stateFeed, key); 102 | } 103 | }); 104 | } 105 | 106 | setTimeout(function () { doGetFeed(); }, 1000); //use timeout so icon doesnt jump left after inserted (let plus header breathe) 107 | 108 | if (g_intervalCheckPlusFeed != null) 109 | return; 110 | //since feed is only updated if the tab is active etc, we check often if it needs updating. 111 | g_intervalCheckPlusFeed=setInterval(function () { 112 | if (!isTabVisible()) 113 | return; 114 | doGetFeed(); 115 | }, 1000 * 60 * 5); //every 5 minutes 116 | } 117 | 118 | function insertPlusFeedWorker(stateFeed, key) { 119 | var icon = $(".agile-icon-new-header"); 120 | var spanIcon = null; 121 | var bShowNewIcon= false; 122 | var bShowRecentIcon = false; //review: this can go away 123 | var pathImgRecent = "images/newgray.png"; 124 | var msNow = Date.now(); 125 | var dmsOldestShow = 1000 * 60 * 60 * 24 * 6; //6 days 126 | var titleTipBase = "New Plus features!"; 127 | 128 | if (stateFeed.msLastPostReadByUser < stateFeed.msLastPostRetrieved) { 129 | if (msNow - stateFeed.msLastPostRetrieved < dmsOldestShow) { 130 | if (g_msStartPlusUsage && stateFeed.msLastPostRetrieved').css('cursor', 'pointer'); 141 | spanIcon.hide(); 142 | icon = $(""); 143 | icon.addClass("agile-icon-new-header"); 144 | spanIcon.append(icon); 145 | parent.prepend(spanIcon); 146 | icon.click(function () { 147 | chrome.storage.sync.get(key, function (obj) { 148 | var stateOrig = cloneObject(stateFeed); 149 | var data = obj[key]; 150 | if (data !== undefined) 151 | stateFeed.msLastPostRetrieved = Math.max(data.msLastPostRetrieved, stateOrig.msLastPostRetrieved); 152 | stateFeed.msLastPostReadByUser = stateFeed.msLastPostRetrieved; 153 | stateFeed.msUserClicked = Date.now(); 154 | if (stateOrig.msLastPostRetrieved != stateFeed.msLastPostRetrieved || 155 | stateOrig.msLastPostReadByUser != stateFeed.msLastPostReadByUser || 156 | (stateFeed.msUserClicked - stateOrig.msUserClicked > 1000 * 60 * 5)) { //protect sync quota for 5min if only msUserClicked changed 157 | var objSave = {}; 158 | stateFeed.items = []; 159 | objSave[key] = stateFeed; 160 | chrome.storage.sync.set(objSave, function () { }); 161 | } 162 | }); 163 | icon.attr("src", chrome.extension.getURL(pathImgRecent)); 164 | icon.attr("title", titleTipBase); 165 | window.open('https://plus.google.com/collection/khxOc', '_blank'); 166 | if (newerStoreVersion()) 167 | sendDesktopNotification("Open the Plus help pane to update to the latest version now."); 168 | }); 169 | } else { 170 | spanIcon = icon.parent(); 171 | } 172 | icon.attr("src", chrome.extension.getURL(bShowNewIcon ? "images/new.png" : pathImgRecent)); 173 | var iitem = 0; 174 | var titleTip = titleTipBase; 175 | if (false) { //dont show preview 176 | for (; stateFeed.items && iitem < stateFeed.items.length; iitem++) { 177 | var item = stateFeed.items[iitem]; 178 | var datePub = new Date(item.d); 179 | titleTip += ("\n\n• " + datePub.toLocaleDateString() + ": " + item.t); 180 | } 181 | } 182 | icon.attr("title", titleTip); 183 | checkTrelloLogo(); 184 | spanIcon.fadeIn(600, function () { 185 | checkTrelloLogo(); 186 | if (bShowNewIcon) 187 | spanIcon.fadeOut(300, function () { 188 | spanIcon.fadeIn(300); 189 | }); 190 | }); 191 | } else { 192 | if (icon.length > 0) { 193 | spanIcon = icon.parent(); 194 | spanIcon.hide(); 195 | } 196 | } 197 | } -------------------------------------------------------------------------------- /source/cardwin.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Card 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
        16 |
        17 |
        18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /source/cardwin.js: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | var g_bLoaded = false; 4 | var g_sizeLast = { 5 | width: 0, 6 | height: 0}; 7 | 8 | document.addEventListener('DOMContentLoaded', function () { 9 | if (g_bLoaded) 10 | return; 11 | g_bLoaded = true; 12 | 13 | var params = getUrlParams(); 14 | var idCard = params.idCard; 15 | var url = "https://trello.com/c/" + idCard; 16 | var dockOut = $("#dockoutImg"); 17 | dockOut.attr("src", chrome.extension.getURL("images/dockoutlarge.png")); 18 | dockOut.show(); 19 | dockOut.css("cursor", "pointer"); 20 | dockOut.off().click(function () { //cant use setPopupClickHandler because url could have changed if user navigated inside 21 | sendExtensionMessage({ method: "openCardWindow", idCard: idCard, bForceTab: true }, function (response) { 22 | window.close(); 23 | }); 24 | return false; 25 | }); 26 | 27 | var elemIframe = $("#plus_card"); 28 | 29 | function loadTrello() { 30 | elemIframe.empty(); 31 | window.TrelloCards.create(url, elemIframe[0], { compact: params.cpt == CARDPOPUPTYPE.POPUP_NOACTIONS }); 32 | setupIframeWatch(); 33 | } 34 | 35 | if (navigator.onLine) 36 | loadTrello(); 37 | else { 38 | elemIframe.append($("
        Waiting for internet connection to load the card.
        ")); 39 | window.addEventListener("online", function () { loadTrello()}); 40 | } 41 | 42 | function setupIframeWatch() { 43 | var iframe = $('.trello-card'); 44 | if (iframe.length == 0) 45 | setTimeout(setupIframeWatch, 200); 46 | else { 47 | iframe[0].addEventListener("load", function () { 48 | setInterval(resize, 300); 49 | }); 50 | } 51 | } 52 | 53 | function resize() { 54 | var elem = $("#plus_card_container"); 55 | var width = elem.width(); 56 | var height = elem.height(); 57 | if (!width || !height) 58 | return; 59 | 60 | if (g_sizeLast.width == window.innerWidth && g_sizeLast.height == window.innerHeight) 61 | return; 62 | const extraWidth = window.outerWidth - window.innerWidth; 63 | const extraHeight = window.outerHeight - window.innerHeight; 64 | sendExtensionMessage({ 65 | method: "cardPopupWindowResize", idCard: idCard, 66 | width: width + extraWidth, 67 | height: height + extraHeight 68 | }, function (response) { 69 | g_sizeLast.width = width; 70 | g_sizeLast.height = height; 71 | }); 72 | } 73 | }); 74 | -------------------------------------------------------------------------------- /source/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "eqnull":true, 3 | "multistr":true, 4 | "latedef":"nofunc", 5 | "undef":true, 6 | "esversion":6 7 | } -------------------------------------------------------------------------------- /source/css/bsmselect.css: -------------------------------------------------------------------------------- 1 | .bsmContainer { 2 | /* container that surrounds entire bsmSelect widget */ 3 | } 4 | 5 | .bsmSelect { 6 | /* the newly created regular 'select' */ 7 | display: inline; 8 | } 9 | 10 | .bsmOptionDisabled { 11 | /* disabled options in new select */ 12 | color: #999; 13 | } 14 | 15 | .bsmHighlight { 16 | /* the highlight span */ 17 | float: right; 18 | padding: 0; 19 | margin: 0 0 0 1em; 20 | } 21 | 22 | .bsmList { 23 | /* html list that contains selected items */ 24 | margin: 0.25em 0 1em 0; 25 | position: relative; 26 | display: block; 27 | padding-left: 0; 28 | list-style: none; 29 | } 30 | 31 | .bsmListItem { 32 | /* li item from the html list above */ 33 | position: relative; 34 | margin-left: 0; 35 | padding-left: 0; 36 | list-style: none; 37 | background: #ddd; 38 | border: 1px solid #bbb; 39 | width: auto; 40 | margin: 0 0 -1px 0; 41 | line-height: 1em; 42 | } 43 | 44 | .bsmListItem:hover { 45 | background-color: #e5e5e5; 46 | } 47 | 48 | .bsmListItemLabel { 49 | /* this is a span that surrounds the text in the item, except for the remove link */ 50 | padding: 5px; 51 | display: block; 52 | } 53 | 54 | .bsmListSortable .bsmListItemLabel { 55 | cursor: ns-resize; 56 | } 57 | 58 | .bsmListItemRemove { 59 | /* the remove link in each list item */ 60 | position: absolute; 61 | right: 0; 62 | top: 0; 63 | padding: 5px; 64 | } 65 | 66 | .bsmScrollWorkaround { 67 | /* Fix a bug when the 'html' element has an overflow set to either 'scroll' or 'auto' on FF. */ 68 | padding-bottom: 1px; 69 | overflow: auto; 70 | } -------------------------------------------------------------------------------- /source/css/colors.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Colors 3 | */ 4 | -------------------------------------------------------------------------------- /source/css/dashboard.css: -------------------------------------------------------------------------------- 1 | .minichartBurndownXLine * { 2 | font-size:10px !important; 3 | } 4 | 5 | .minichartBurndownXLine line { 6 | stroke:#CDCDCD !important; 7 | } 8 | 9 | .timelineGridline line { 10 | stroke:#CDCDCD !important; 11 | } 12 | 13 | #timelineDetail { 14 | font-size: 0.8em !important; 15 | } 16 | 17 | .reportLinkClass { 18 | font-size:13px; 19 | text-decoration:none; 20 | line-height:1em !important; 21 | } 22 | 23 | .reportLinkClass:hover { 24 | text-decoration:underline !important; 25 | } -------------------------------------------------------------------------------- /source/css/dialog-polyfill.css: -------------------------------------------------------------------------------- 1 | dialog { 2 | position: absolute; 3 | left: 0; right: 0; 4 | margin: auto; 5 | border: solid; 6 | padding: 1em; 7 | background: white; 8 | color: #4D4D4D; 9 | 10 | width: -moz-fit-content; 11 | width: -webkit-fit-content; 12 | width: fit-content; 13 | 14 | height: -moz-fit-content; 15 | height: -webkit-fit-content; 16 | height: fit-content; 17 | 18 | display: none; 19 | } 20 | 21 | dialog[open] { 22 | display: block; 23 | } 24 | 25 | .backdrop { 26 | position: fixed; 27 | background-color:rgba(0,0,0,0.1); 28 | top: 0; 29 | bottom: 0; 30 | left: 0; 31 | right: 0; 32 | } 33 | -------------------------------------------------------------------------------- /source/css/grumble.css: -------------------------------------------------------------------------------- 1 | /** (c) 2011 James Cryer, Huddle (www.huddle.com) */ 2 | /** http://jamescryer.github.com/grumble.js/ */ 3 | 4 | .grumble{ 5 | position:absolute !important; 6 | background-repeat: no-repeat !important; 7 | z-index: 99998; 8 | } 9 | 10 | .grumble-textTallLines { 11 | line-height: 17px !important; 12 | } 13 | 14 | .grumble-text { 15 | position:absolute !important; 16 | text-align:center; 17 | z-index: 99998; 18 | display: table; 19 | overflow:hidden; 20 | font-size: 14px; 21 | line-height: 14px; 22 | } 23 | 24 | .ie7 .grumble-text, 25 | .ie6 .grumble-text { 26 | display:block !important; 27 | } 28 | .grumble-text .outer { 29 | display: table-cell !important; 30 | vertical-align: middle !important; 31 | color:white; 32 | } 33 | .ie7 .grumble-text .outer, 34 | .ie6 .grumble-text .outer { 35 | display: block !important; 36 | width: 85%; 37 | position: absolute !important; 38 | top: 48%; 39 | left: 0; 40 | } 41 | .ie7 .inner, 42 | .ie6 .inner { 43 | position: relative; 44 | top: -50% 45 | } 46 | 47 | .grumble-text50 .outer{padding:6px;} 48 | .grumble-text100 .outer{padding:8px;} 49 | .grumble-text150 .outer{padding:10px;} 50 | .grumble-text200 .outer{padding:12px;} 51 | 52 | .grumble50 {background-position: 0 0;} 53 | .grumble100 {background-position: 0 -50px; } 54 | .grumble150 {background-position: 0 -150px;} 55 | .grumble200 {background-position: 0 -300px; } 56 | 57 | .alt-grumble50 {background-position: -200px 0;} 58 | .alt-grumble100 { background-position: -200px -50px; } 59 | .alt-grumble150 {background-position: -200px -150px;} 60 | .alt-grumble200 {background-position: -200px -300px; } 61 | 62 | .grumble-button { 63 | position: absolute; 64 | width: 20px; 65 | height: 12px; 66 | 67 | -moz-border-radius: 3px; 68 | border-radius: 3px; 69 | 70 | background: #FF5C00; 71 | color: #fff; 72 | text-align:center; 73 | font-size: .8em; 74 | line-height: .9em; 75 | 76 | -moz-box-shadow: 1px 1px 1px #ccc; 77 | -webkit-box-shadow: 1px 1px 1px #ccc; 78 | box-shadow: 1px 1px 1px #ccc; 79 | 80 | cursor: pointer; 81 | 82 | z-index: 99998; 83 | } -------------------------------------------------------------------------------- /source/css/images/asc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/css/images/asc.gif -------------------------------------------------------------------------------- /source/css/images/bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/css/images/bg.gif -------------------------------------------------------------------------------- /source/css/images/desc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/css/images/desc.gif -------------------------------------------------------------------------------- /source/css/images/ui-icons_444444_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/css/images/ui-icons_444444_256x240.png -------------------------------------------------------------------------------- /source/css/images/ui-icons_555555_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/css/images/ui-icons_555555_256x240.png -------------------------------------------------------------------------------- /source/css/images/ui-icons_777620_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/css/images/ui-icons_777620_256x240.png -------------------------------------------------------------------------------- /source/css/images/ui-icons_777777_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/css/images/ui-icons_777777_256x240.png -------------------------------------------------------------------------------- /source/css/images/ui-icons_cc0000_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/css/images/ui-icons_cc0000_256x240.png -------------------------------------------------------------------------------- /source/css/images/ui-icons_ffffff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/css/images/ui-icons_ffffff_256x240.png -------------------------------------------------------------------------------- /source/css/jquery.qtip.min.css: -------------------------------------------------------------------------------- 1 | /* qTip2 v2.2.1 | Plugins: tips modal viewport svg imagemap ie6 | Styles: core basic css3 | qtip2.com | Licensed MIT | Sat Sep 06 2014 23:12:07 */ 2 | 3 | .qtip{position:absolute;left:-28000px;top:-28000px;display:none;max-width:280px;min-width:50px;font-size:10.5px;line-height:12px;direction:ltr;box-shadow:none;padding:0}.qtip-content{position:relative;padding:5px 9px;overflow:hidden;text-align:left;word-wrap:break-word}.qtip-titlebar{position:relative;padding:5px 35px 5px 10px;overflow:hidden;border-width:0 0 1px;font-weight:700}.qtip-titlebar+.qtip-content{border-top-width:0!important}.qtip-close{position:absolute;right:-9px;top:-9px;z-index:11;cursor:pointer;outline:0;border:1px solid transparent}.qtip-titlebar .qtip-close{right:4px;top:50%;margin-top:-9px}* html .qtip-titlebar .qtip-close{top:16px}.qtip-icon .ui-icon,.qtip-titlebar .ui-icon{display:block;text-indent:-1000em;direction:ltr}.qtip-icon,.qtip-icon .ui-icon{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;text-decoration:none}.qtip-icon .ui-icon{width:18px;height:14px;line-height:14px;text-align:center;text-indent:0;font:400 bold 10px/13px Tahoma,sans-serif;color:inherit;background:-100em -100em no-repeat}.qtip-default{border:1px solid #F1D031;background-color:#FFFFA3;color:#555}.qtip-default .qtip-titlebar{background-color:#FFEF93}.qtip-default .qtip-icon{border-color:#CCC;background:#F1F1F1;color:#777}.qtip-default .qtip-titlebar .qtip-close{border-color:#AAA;color:#111}.qtip-light{background-color:#fff;border-color:#E2E2E2;color:#454545}.qtip-light .qtip-titlebar{background-color:#f1f1f1}.qtip-dark{background-color:#505050;border-color:#303030;color:#f3f3f3}.qtip-dark .qtip-titlebar{background-color:#404040}.qtip-dark .qtip-icon{border-color:#444}.qtip-dark .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-cream{background-color:#FBF7AA;border-color:#F9E98E;color:#A27D35}.qtip-cream .qtip-titlebar{background-color:#F0DE7D}.qtip-cream .qtip-close .qtip-icon{background-position:-82px 0}.qtip-red{background-color:#F78B83;border-color:#D95252;color:#912323}.qtip-red .qtip-titlebar{background-color:#F06D65}.qtip-red .qtip-close .qtip-icon{background-position:-102px 0}.qtip-red .qtip-icon,.qtip-red .qtip-titlebar .ui-state-hover{border-color:#D95252}.qtip-green{background-color:#CAED9E;border-color:#90D93F;color:#3F6219}.qtip-green .qtip-titlebar{background-color:#B0DE78}.qtip-green .qtip-close .qtip-icon{background-position:-42px 0}.qtip-blue{background-color:#E5F6FE;border-color:#ADD9ED;color:#5E99BD}.qtip-blue .qtip-titlebar{background-color:#D0E9F5}.qtip-blue .qtip-close .qtip-icon{background-position:-2px 0}.qtip-shadow{-webkit-box-shadow:1px 1px 3px 1px rgba(0,0,0,.15);-moz-box-shadow:1px 1px 3px 1px rgba(0,0,0,.15);box-shadow:1px 1px 3px 1px rgba(0,0,0,.15)}.qtip-bootstrap,.qtip-rounded,.qtip-tipsy{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.qtip-rounded .qtip-titlebar{-moz-border-radius:4px 4px 0 0;-webkit-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.qtip-youtube{-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 0 3px #333;-moz-box-shadow:0 0 3px #333;box-shadow:0 0 3px #333;color:#fff;border:0 solid transparent;background:#4A4A4A;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#4A4A4A),color-stop(100%,#000));background-image:-webkit-linear-gradient(top,#4A4A4A 0,#000 100%);background-image:-moz-linear-gradient(top,#4A4A4A 0,#000 100%);background-image:-ms-linear-gradient(top,#4A4A4A 0,#000 100%);background-image:-o-linear-gradient(top,#4A4A4A 0,#000 100%)}.qtip-youtube .qtip-titlebar{background-color:transparent}.qtip-youtube .qtip-content{padding:.75em;font:12px "Helvetica Neue",Arial,Helvetica,sans-serif;filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#4a4a4a, EndColorStr=#000000);-ms-filter:"progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#4a4a4a,EndColorStr=#000000);"}.qtip-youtube .qtip-icon{border-color:#222}.qtip-youtube .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-jtools{background:#232323;background:rgba(0,0,0,.7);background-image:-webkit-gradient(linear,left top,left bottom,from(#717171),to(#232323));background-image:-moz-linear-gradient(top,#717171,#232323);background-image:-webkit-linear-gradient(top,#717171,#232323);background-image:-ms-linear-gradient(top,#717171,#232323);background-image:-o-linear-gradient(top,#717171,#232323);border:2px solid #ddd;border:2px solid rgba(241,241,241,1);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 0 12px #333;-moz-box-shadow:0 0 12px #333;box-shadow:0 0 12px #333}.qtip-jtools .qtip-titlebar{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171, endColorstr=#4A4A4A);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#4A4A4A)"}.qtip-jtools .qtip-content{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A, endColorstr=#232323);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A,endColorstr=#232323)"}.qtip-jtools .qtip-content,.qtip-jtools .qtip-titlebar{background:0 0;color:#fff;border:0 dashed transparent}.qtip-jtools .qtip-icon{border-color:#555}.qtip-jtools .qtip-titlebar .ui-state-hover{border-color:#333}.qtip-cluetip{-webkit-box-shadow:4px 4px 5px rgba(0,0,0,.4);-moz-box-shadow:4px 4px 5px rgba(0,0,0,.4);box-shadow:4px 4px 5px rgba(0,0,0,.4);background-color:#D9D9C2;color:#111;border:0 dashed transparent}.qtip-cluetip .qtip-titlebar{background-color:#87876A;color:#fff;border:0 dashed transparent}.qtip-cluetip .qtip-icon{border-color:#808064}.qtip-cluetip .qtip-titlebar .ui-state-hover{border-color:#696952;color:#696952}.qtip-tipsy{background:#000;background:rgba(0,0,0,.87);color:#fff;border:0 solid transparent;font-size:11px;font-family:'Lucida Grande',sans-serif;font-weight:700;line-height:16px;text-shadow:0 1px #000}.qtip-tipsy .qtip-titlebar{padding:6px 35px 0 10px;background-color:transparent}.qtip-tipsy .qtip-content{padding:6px 10px}.qtip-tipsy .qtip-icon{border-color:#222;text-shadow:none}.qtip-tipsy .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-tipped{border:3px solid #959FA9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background-color:#F9F9F9;color:#454545;font-weight:400;font-family:serif}.qtip-tipped .qtip-titlebar{border-bottom-width:0;color:#fff;background:#3A79B8;background-image:-webkit-gradient(linear,left top,left bottom,from(#3A79B8),to(#2E629D));background-image:-webkit-linear-gradient(top,#3A79B8,#2E629D);background-image:-moz-linear-gradient(top,#3A79B8,#2E629D);background-image:-ms-linear-gradient(top,#3A79B8,#2E629D);background-image:-o-linear-gradient(top,#3A79B8,#2E629D);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8, endColorstr=#2E629D);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8,endColorstr=#2E629D)"}.qtip-tipped .qtip-icon{border:2px solid #285589;background:#285589}.qtip-tipped .qtip-icon .ui-icon{background-color:#FBFBFB;color:#555}.qtip-bootstrap{font-size:14px;line-height:20px;color:#333;padding:1px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.qtip-bootstrap .qtip-titlebar{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.qtip-bootstrap .qtip-titlebar .qtip-close{right:11px;top:45%;border-style:none}.qtip-bootstrap .qtip-content{padding:9px 14px}.qtip-bootstrap .qtip-icon{background:0 0}.qtip-bootstrap .qtip-icon .ui-icon{width:auto;height:auto;float:right;font-size:20px;font-weight:700;line-height:18px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.qtip-bootstrap .qtip-icon .ui-icon:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}.qtip:not(.ie9haxors) div.qtip-content,.qtip:not(.ie9haxors) div.qtip-titlebar{filter:none;-ms-filter:none}.qtip .qtip-tip{margin:0 auto;overflow:hidden;z-index:10}.qtip .qtip-tip,x:-o-prefocus{visibility:hidden}.qtip .qtip-tip,.qtip .qtip-tip .qtip-vml,.qtip .qtip-tip canvas{position:absolute;color:#123456;background:0 0;border:0 dashed transparent}.qtip .qtip-tip canvas{top:0;left:0}.qtip .qtip-tip .qtip-vml{behavior:url(#default#VML);display:inline-block;visibility:visible}#qtip-overlay{position:fixed;left:0;top:0;width:100%;height:100%}#qtip-overlay.blurs{cursor:pointer}#qtip-overlay div{position:absolute;left:0;top:0;width:100%;height:100%;background-color:#000;opacity:.7;filter:alpha(opacity=70);-ms-filter:"alpha(Opacity=70)"}.qtipmodal-ie6fix{position:absolute!important} -------------------------------------------------------------------------------- /source/css/plottable.css: -------------------------------------------------------------------------------- 1 | 2 | .plottable-colors-0 { 3 | background-color: #5279c7; /* INDIGO */ 4 | } 5 | 6 | .plottable-colors-1 { 7 | background-color: #fd373e; /* CORAL_RED */ 8 | } 9 | 10 | .plottable-colors-2 { 11 | background-color: #63c261; /* FERN */ 12 | } 13 | 14 | .plottable-colors-3 { 15 | background-color: #fad419; /* BRIGHT_SUN */ 16 | } 17 | 18 | .plottable-colors-4 { 19 | background-color: #2c2b6f; /* JACARTA */ 20 | } 21 | 22 | .plottable-colors-5 { 23 | background-color: #ff7939; /* BURNING_ORANGE */ 24 | } 25 | 26 | .plottable-colors-6 { 27 | background-color: #db2e65; /* CERISE_RED */ 28 | } 29 | 30 | .plottable-colors-7 { 31 | background-color: #99ce50; /* CONIFER */ 32 | } 33 | 34 | .plottable-colors-8 { 35 | background-color: #962565; /* ROYAL_HEATH */ 36 | } 37 | 38 | .plottable-colors-9 { 39 | background-color: #06cccc; /* ROBINS_EGG_BLUE */ 40 | } 41 | 42 | /** 43 | * User-supplied renderTo element. 44 | */ 45 | .plottable { 46 | display: block; /* must be block elements for width/height calculations to work in Firefox. */ 47 | pointer-events: visibleFill; 48 | position: relative; 49 | /** 50 | * Pre 3.0, users could set the dimension of the root element in two ways: either using CSS 51 | * (inline or through a stylesheet), or using the SVG width/height attributes. By default, we 52 | * set the SVG width/height attributes to 100%. 53 | * 54 | * Post 3.0 the root element is always a normal div and the only way to set the dimensions is 55 | * to use CSS. To replicate the "100%-by-default" behavior, we apply width/height 100%. 56 | */ 57 | width: 100%; 58 | height: 100%; 59 | } 60 | 61 | /** 62 | * The _element that roots each Component's DOM. 63 | */ 64 | .plottable .component { 65 | /* Allow components to be positioned with explicit left/top/width/height styles */ 66 | position: absolute; 67 | } 68 | 69 | .plottable .background-container, 70 | .plottable .content, 71 | .plottable .foreground-container { 72 | position: absolute; 73 | width: 100%; 74 | height: 100%; 75 | } 76 | 77 | /** 78 | * Don't allow svg elements above the content to steal events 79 | */ 80 | .plottable .foreground-container { 81 | pointer-events: none; 82 | } 83 | 84 | .plottable .component-overflow-hidden { 85 | overflow: hidden; 86 | } 87 | 88 | .plottable .component-overflow-visible { 89 | overflow: visible; 90 | } 91 | 92 | .plottable .plot-canvas-container { 93 | width: 100%; 94 | height: 100%; 95 | overflow: hidden; 96 | } 97 | 98 | .plottable .plot-canvas { 99 | width: 100%; 100 | height: 100%; 101 | /** 102 | * Play well with deferred rendering. 103 | */ 104 | transform-origin: 0px 0px 0px; 105 | } 106 | 107 | .plottable text { 108 | text-rendering: geometricPrecision; 109 | } 110 | 111 | .plottable .label text { 112 | font-family: "Helvetica Neue", sans-serif; 113 | fill: #32313F; 114 | } 115 | 116 | .plottable .bar-label-text-area text { 117 | font-family: "Helvetica Neue", sans-serif; 118 | font-size: 12px; 119 | } 120 | 121 | .plottable .label-area text { 122 | fill: #32313F; 123 | font-family: "Helvetica Neue", sans-serif; 124 | font-size: 14px; 125 | } 126 | 127 | .plottable .light-label text { 128 | fill: white; 129 | } 130 | 131 | .plottable .dark-label text { 132 | fill: #32313F; 133 | } 134 | 135 | .plottable .off-bar-label text { 136 | fill: #32313F; 137 | } 138 | 139 | .plottable .stacked-bar-label text { 140 | fill: #32313F; 141 | font-style: normal; 142 | } 143 | 144 | .plottable .stacked-bar-plot .off-bar-label { 145 | /* HACKHACK #2795: correct off-bar label logic to be implemented on StackedBar */ 146 | visibility: hidden !important; 147 | } 148 | 149 | .plottable .axis-label text { 150 | font-size: 10px; 151 | font-weight: bold; 152 | letter-spacing: 1px; 153 | line-height: normal; 154 | text-transform: uppercase; 155 | } 156 | 157 | .plottable .title-label text { 158 | font-size: 20px; 159 | font-weight: bold; 160 | } 161 | 162 | .plottable .axis line.baseline { 163 | stroke: #CCC; 164 | stroke-width: 1px; 165 | } 166 | 167 | .plottable .axis line.tick-mark { 168 | stroke: #CCC; 169 | stroke-width: 1px; 170 | } 171 | 172 | .plottable .axis text { 173 | fill: #32313F; 174 | font-family: "Helvetica Neue", sans-serif; 175 | font-size: 12px; 176 | font-weight: 200; 177 | line-height: normal; 178 | } 179 | 180 | .plottable .axis .annotation-circle { 181 | fill: white; 182 | stroke-width: 1px; 183 | stroke: #CCC; 184 | } 185 | 186 | .plottable .axis .annotation-line { 187 | stroke: #CCC; 188 | stroke-width: 1px; 189 | } 190 | 191 | .plottable .axis .annotation-rect { 192 | stroke: #CCC; 193 | stroke-width: 1px; 194 | fill: white; 195 | } 196 | 197 | .plottable .bar-plot .baseline { 198 | stroke: #999; 199 | } 200 | 201 | .plottable .gridlines line { 202 | stroke: #3C3C3C; /* hackhack: gridlines should be solid; see #820 */ 203 | opacity: 0.25; 204 | stroke-width: 1px; 205 | } 206 | 207 | .plottable .selection-box-layer .selection-area { 208 | fill: black; 209 | fill-opacity: 0.03; 210 | stroke: #CCC; 211 | } 212 | /* DragBoxLayer */ 213 | .plottable .drag-box-layer.x-resizable .drag-edge-lr { 214 | cursor: ew-resize; 215 | } 216 | .plottable .drag-box-layer.y-resizable .drag-edge-tb { 217 | cursor: ns-resize; 218 | } 219 | 220 | .plottable .drag-box-layer.x-resizable.y-resizable .drag-corner-tl { 221 | cursor: nwse-resize; 222 | } 223 | .plottable .drag-box-layer.x-resizable.y-resizable .drag-corner-tr { 224 | cursor: nesw-resize; 225 | } 226 | .plottable .drag-box-layer.x-resizable.y-resizable .drag-corner-bl { 227 | cursor: nesw-resize; 228 | } 229 | .plottable .drag-box-layer.x-resizable.y-resizable .drag-corner-br { 230 | cursor: nwse-resize; 231 | } 232 | 233 | .plottable .drag-box-layer.movable .selection-area { 234 | cursor: move; /* IE fallback */ 235 | cursor: -moz-grab; 236 | cursor: -webkit-grab; 237 | cursor: grab; 238 | } 239 | 240 | .plottable .drag-box-layer.movable .selection-area:active { 241 | cursor: -moz-grabbing; 242 | cursor: -webkit-grabbing; 243 | cursor: grabbing; 244 | } 245 | /* /DragBoxLayer */ 246 | 247 | .plottable .guide-line-layer line.guide-line { 248 | stroke: #CCC; 249 | stroke-width: 1px; 250 | } 251 | 252 | .plottable .drag-line-layer.enabled.vertical line.drag-edge { 253 | cursor: ew-resize; 254 | } 255 | 256 | .plottable .drag-line-layer.enabled.horizontal line.drag-edge { 257 | cursor: ns-resize; 258 | } 259 | 260 | .plottable .legend text { 261 | fill: #32313F; 262 | font-family: "Helvetica Neue", sans-serif; 263 | font-size: 12px; 264 | font-weight: bold; 265 | line-height: normal; 266 | } 267 | 268 | .plottable .interpolated-color-legend rect.swatch-bounding-box { 269 | fill: none; 270 | stroke: #CCC; 271 | stroke-width: 1px; 272 | pointer-events: none; 273 | } 274 | 275 | .plottable .waterfall-plot line.connector { 276 | stroke: #CCC; 277 | stroke-width: 1px; 278 | } 279 | 280 | .plottable .pie-plot .arc.outline { 281 | stroke-linejoin: round; 282 | } 283 | -------------------------------------------------------------------------------- /source/css/plottable.old.css: -------------------------------------------------------------------------------- 1 | 2 | .plottable-colors-0 { 3 | background-color: #5279c7; /* INDIGO */ 4 | } 5 | 6 | .plottable-colors-1 { 7 | background-color: #fd373e; /* CORAL_RED */ 8 | } 9 | 10 | .plottable-colors-2 { 11 | background-color: #63c261; /* FERN */ 12 | } 13 | 14 | .plottable-colors-3 { 15 | background-color: #fad419; /* BRIGHT_SUN */ 16 | } 17 | 18 | .plottable-colors-4 { 19 | background-color: #2c2b6f; /* JACARTA */ 20 | } 21 | 22 | .plottable-colors-5 { 23 | background-color: #ff7939; /* BURNING_ORANGE */ 24 | } 25 | 26 | .plottable-colors-6 { 27 | background-color: #db2e65; /* CERISE_RED */ 28 | } 29 | 30 | .plottable-colors-7 { 31 | background-color: #99ce50; /* CONIFER */ 32 | } 33 | 34 | .plottable-colors-8 { 35 | background-color: #962565; /* ROYAL_HEATH */ 36 | } 37 | 38 | .plottable-colors-9 { 39 | background-color: #06cccc; /* ROBINS_EGG_BLUE */ 40 | } 41 | 42 | svg.plottable { 43 | display : block; /* SVGs must be block elements for width/height calculations to work in Firefox. */ 44 | } 45 | 46 | .plottable .background-fill { 47 | fill: none; 48 | } 49 | 50 | .plottable .bounding-box { 51 | /* Invisible pink bounding-box to allow for collision testing */ 52 | fill: pink; 53 | visibility: hidden; 54 | } 55 | 56 | .plottable .label text { 57 | font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; 58 | fill: #32313F; 59 | } 60 | 61 | .plottable .bar-label-text-area text { 62 | font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; 63 | font-size: 14px; 64 | } 65 | 66 | .plottable .label-area text { 67 | fill: #32313F; 68 | font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; 69 | font-size: 14px; 70 | } 71 | 72 | .plottable .light-label text { 73 | fill: white; 74 | } 75 | 76 | .plottable .dark-label text { 77 | fill: #32313F; 78 | } 79 | 80 | .plottable .axis-label text { 81 | font-size: 10px; 82 | font-weight: bold; 83 | letter-spacing: 1px; 84 | line-height: normal; 85 | text-transform: uppercase; 86 | } 87 | 88 | .plottable .title-label text { 89 | font-size: 20px; 90 | font-weight: bold; 91 | } 92 | 93 | .plottable .axis line.baseline { 94 | stroke: #CCC; 95 | stroke-width: 1px; 96 | } 97 | 98 | .plottable .axis line.tick-mark { 99 | stroke: #CCC; 100 | stroke-width: 1px; 101 | } 102 | 103 | .plottable .axis text { 104 | fill: #32313F; 105 | font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; 106 | font-size: 12px; 107 | font-weight: 200; 108 | line-height: normal; 109 | } 110 | 111 | .plottable .bar-plot .baseline { 112 | stroke: #999; 113 | } 114 | 115 | .plottable .gridlines line { 116 | stroke: #3C3C3C; /* hackhack: gridlines should be solid; see #820 */ 117 | opacity: 0.25; 118 | stroke-width: 1px; 119 | } 120 | 121 | .plottable .selection-box-layer .selection-area { 122 | fill: black; 123 | fill-opacity: 0.03; 124 | stroke: #CCC; 125 | } 126 | /* DragBoxLayer */ 127 | .plottable .drag-box-layer.x-resizable .drag-edge-lr { 128 | cursor: ew-resize; 129 | } 130 | .plottable .drag-box-layer.y-resizable .drag-edge-tb { 131 | cursor: ns-resize; 132 | } 133 | 134 | .plottable .drag-box-layer.x-resizable.y-resizable .drag-corner-tl { 135 | cursor: nwse-resize; 136 | } 137 | .plottable .drag-box-layer.x-resizable.y-resizable .drag-corner-tr { 138 | cursor: nesw-resize; 139 | } 140 | .plottable .drag-box-layer.x-resizable.y-resizable .drag-corner-bl { 141 | cursor: nesw-resize; 142 | } 143 | .plottable .drag-box-layer.x-resizable.y-resizable .drag-corner-br { 144 | cursor: nwse-resize; 145 | } 146 | /* /DragBoxLayer */ 147 | 148 | .plottable .legend text { 149 | fill: #32313F; 150 | font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; 151 | font-size: 12px; 152 | font-weight: bold; 153 | line-height: normal; 154 | } 155 | 156 | .plottable .interpolated-color-legend rect.swatch-bounding-box { 157 | fill: none; 158 | stroke: #CCC; 159 | stroke-width: 1px; 160 | } 161 | -------------------------------------------------------------------------------- /source/css/tablesorter.css: -------------------------------------------------------------------------------- 1 | /* tables */ 2 | 3 | table.tablesorter thead tr .header { 4 | background-repeat: no-repeat; 5 | background-position: center right; 6 | cursor: pointer; 7 | } 8 | 9 | table.tablesorter thead tr .headerSortUp { 10 | background-image: url('chrome-extension://__MSG_@@extension_id__/css/images/asc.gif'); 11 | } 12 | table.tablesorter thead tr .headerSortDown { 13 | background-image: url('chrome-extension://__MSG_@@extension_id__/css/images/desc.gif'); 14 | } 15 | table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp { 16 | background-color: #8dbdd8; 17 | } 18 | -------------------------------------------------------------------------------- /source/css/tooltip.css: -------------------------------------------------------------------------------- 1 | /* Copyright 2012 Google Inc. All Rights Reserved. */ 2 | 3 | .google-visualization-tooltip-action: hover { 4 | background-color: #eeeeee; 5 | } 6 | .google-visualization-tooltip { 7 | border:solid 1px #bdbdbd; 8 | border-radius: 2px; 9 | background-color: white; 10 | position: absolute; 11 | box-shadow: 0px 2px 2px 0px rgba(204, 204, 204, 0.6); 12 | font-size: 12px; 13 | padding: 0px; 14 | -moz-box-shadow: 0px 2px 2px 0px rgba(204, 204, 204, 0.6); 15 | -webkit-box-shadow: 0px 2px 2px 0px rgba(204, 204, 204, 0.6); 16 | } 17 | .google-visualization-tooltip-action-list { 18 | list-style-type: none; 19 | margin: 0; 20 | padding: 0.5em 0em 0.5em 0em; 21 | cursor: hand; 22 | } 23 | .google-visualization-tooltip-action { 24 | margin: 0; 25 | cursor: pointer; 26 | padding: 0.5em 2em 0.5em 1em; 27 | } 28 | .google-visualization-tooltip-action:hover { 29 | background-color: #eeeeee; 30 | } 31 | .google-visualization-tooltip-item-list { 32 | list-style-type: none; 33 | margin: 1em 0 1em 0; 34 | padding: 0em; 35 | } 36 | .google-visualization-tooltip-item { 37 | margin: 0.65em 0em 0.65em 0em; 38 | padding: 0em 2em 0em 1em; 39 | } 40 | .google-visualization-tooltip-item-list 41 | .google-visualization-tooltip-item:first-child { 42 | margin: 1em 0em 1em 0em; 43 | } 44 | .google-visualization-tooltip-separator { 45 | margin: 0; 46 | padding: 0; 47 | height: 1px; 48 | background-color: #dddddd; 49 | } 50 | .google-visualization-tooltip-square { 51 | display: inline-block; 52 | /* IE does not support inline-block fall back to float left */ 53 | float: left\9; 54 | clear: none; 55 | width: 0.5em; 56 | height: 0.5em; 57 | margin: 0.16em 0.7em 0em 0em; 58 | border-bottom: solid 0.1em white; 59 | } 60 | -------------------------------------------------------------------------------- /source/dashboard.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Plus Burndown 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |
        27 |
        28 | Plus Burndown 29 | Help 31 | Rate 32 |
        33 | 34 | 35 | 42 | 43 | 54 | 60 |
        61 | 67 |
        68 | 69 | 70 |
        71 |
        72 | 73 | 74 |
        75 |
        76 |
        77 | 78 |
        79 |
        80 |
        81 | 82 | -------------------------------------------------------------------------------- /source/images/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/back.png -------------------------------------------------------------------------------- /source/images/bubble-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/bubble-sprite.png -------------------------------------------------------------------------------- /source/images/cardht.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/cardht.png -------------------------------------------------------------------------------- /source/images/cardplusbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/cardplusbar.png -------------------------------------------------------------------------------- /source/images/cardplusreport.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/cardplusreport.png -------------------------------------------------------------------------------- /source/images/cardsemodify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/cardsemodify.png -------------------------------------------------------------------------------- /source/images/chart-sm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/chart-sm.png -------------------------------------------------------------------------------- /source/images/chromenu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/chromenu.png -------------------------------------------------------------------------------- /source/images/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/close.png -------------------------------------------------------------------------------- /source/images/copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/copy.png -------------------------------------------------------------------------------- /source/images/dimensions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/dimensions.png -------------------------------------------------------------------------------- /source/images/dockout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/dockout.png -------------------------------------------------------------------------------- /source/images/dockoutlarge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/dockoutlarge.png -------------------------------------------------------------------------------- /source/images/dotswait.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/dotswait.gif -------------------------------------------------------------------------------- /source/images/help-spent-est-table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/help-spent-est-table.png -------------------------------------------------------------------------------- /source/images/help-spent-table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/help-spent-table.png -------------------------------------------------------------------------------- /source/images/helparrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/helparrow.png -------------------------------------------------------------------------------- /source/images/helptop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/helptop.png -------------------------------------------------------------------------------- /source/images/icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/icon128.png -------------------------------------------------------------------------------- /source/images/icon16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/icon16.png -------------------------------------------------------------------------------- /source/images/icon19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/icon19.png -------------------------------------------------------------------------------- /source/images/icon19New.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/icon19New.png -------------------------------------------------------------------------------- /source/images/icon19hilite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/icon19hilite.png -------------------------------------------------------------------------------- /source/images/icon32alpha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/icon32alpha.png -------------------------------------------------------------------------------- /source/images/icon48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/icon48.png -------------------------------------------------------------------------------- /source/images/iconLarge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/iconLarge.png -------------------------------------------------------------------------------- /source/images/iconaddse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/iconaddse.png -------------------------------------------------------------------------------- /source/images/iconspent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/iconspent.png -------------------------------------------------------------------------------- /source/images/iconspenthelp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/iconspenthelp.png -------------------------------------------------------------------------------- /source/images/iconspenthelpwarn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/iconspenthelpwarn.png -------------------------------------------------------------------------------- /source/images/minimize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/minimize.png -------------------------------------------------------------------------------- /source/images/new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/new.png -------------------------------------------------------------------------------- /source/images/newgray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/newgray.png -------------------------------------------------------------------------------- /source/images/plusbarlabeled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/plusbarlabeled.png -------------------------------------------------------------------------------- /source/images/plusmenu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/plusmenu.png -------------------------------------------------------------------------------- /source/images/recurring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/recurring.png -------------------------------------------------------------------------------- /source/images/reloadchrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/reloadchrome.png -------------------------------------------------------------------------------- /source/images/report-sm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/report-sm.png -------------------------------------------------------------------------------- /source/images/s1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/s1.png -------------------------------------------------------------------------------- /source/images/s2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/s2.png -------------------------------------------------------------------------------- /source/images/s3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/s3.png -------------------------------------------------------------------------------- /source/images/s4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/s4.png -------------------------------------------------------------------------------- /source/images/showsebar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/showsebar.png -------------------------------------------------------------------------------- /source/images/sync.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/sync.png -------------------------------------------------------------------------------- /source/images/syncingNow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/syncingNow.gif -------------------------------------------------------------------------------- /source/images/timer-sm-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/timer-sm-on.png -------------------------------------------------------------------------------- /source/images/timer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/timer.png -------------------------------------------------------------------------------- /source/images/wait.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zmandel/Plus-for-Trello/aa35a8659841a9703c41df977fb88a0f26e65bec/source/images/wait.gif -------------------------------------------------------------------------------- /source/intellisense.js: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | /// 4 | /// 5 | /// 6 | /// 7 | /// 8 | /// 9 | /// 10 | /// 11 | /// 12 | /// 13 | /// 14 | /// 15 | /// 16 | /// 17 | /// 18 | /// 19 | /// 20 | /// 21 | /// 22 | /// 23 | /// 24 | /// 25 | /// 26 | /// 27 | 28 | //https://msdn.microsoft.com/en-us/library/bb385682.aspx 29 | 30 | -------------------------------------------------------------------------------- /source/labels.js: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | var LabelsManager = { 4 | reduceColor: function (part) { 5 | return Math.round(255-(255-part) / 8); 6 | }, 7 | update: function (card) { 8 | var color = "white"; 9 | var firstLabel = card.find('div.list-card-labels').children(':first'); 10 | if (firstLabel.size()) { 11 | var backgroundColor = firstLabel.css('background-color'); 12 | var m = backgroundColor.match(this.g_regexMatch); 13 | if (m) 14 | color = "rgb(" + this.reduceColor(m[1]) + "," + this.reduceColor(m[2]) + "," + this.reduceColor(m[3]) + ")"; 15 | } 16 | card.css("background-color", color); 17 | }, 18 | g_regexMatch: /^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i 19 | }; 20 | 21 | -------------------------------------------------------------------------------- /source/language.js: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | var Language = { 4 | NOINTERNETCONNECTION: "No internet connection.", 5 | FIRSTSYNC_PRE: "Sync is running for the first time and may take a few minutes to finish.\n" 6 | }; 7 | 8 | -------------------------------------------------------------------------------- /source/libs/buy.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | var f = this, g = function (a, d) { var c = a.split("."), b = window || f; c[0] in b || !b.execScript || b.execScript("var " + c[0]); for (var e; c.length && (e = c.shift()) ;) c.length || void 0 === d ? b = b[e] ? b[e] : b[e] = {} : b[e] = d }; var h = function (a) { var d = chrome.runtime.connect("nmmhkkegccagdldgiimedpiccmgmieda", {}), c = !1; d.onMessage.addListener(function (b) { c = !0; "response" in b && !("errorType" in b.response) ? a.success && a.success(b) : a.failure && a.failure(b) }); d.onDisconnect.addListener(function () { !c && a.failure && a.failure({ request: {}, response: { errorType: "INTERNAL_SERVER_ERROR" } }) }); d.postMessage(a) }; g("google.payments.inapp.buy", function (a) { a.method = "buy"; h(a) }); 3 | g("google.payments.inapp.consumePurchase", function (a) { a.method = "consumePurchase"; h(a); }); g("google.payments.inapp.getPurchases", function (a) { a.method = "getPurchases"; h(a); }); g("google.payments.inapp.getSkuDetails", function (a) { a.method = "getSkuDetails"; h(a); }); 4 | })(); -------------------------------------------------------------------------------- /source/libs/dom-to-image.min.js: -------------------------------------------------------------------------------- 1 | /*! dom-to-image 10-06-2017 */ 2 | !function(a){"use strict";function b(a,b){function c(a){return b.bgcolor&&(a.style.backgroundColor=b.bgcolor),b.width&&(a.style.width=b.width+"px"),b.height&&(a.style.height=b.height+"px"),b.style&&Object.keys(b.style).forEach(function(c){a.style[c]=b.style[c]}),a}return b=b||{},g(b),Promise.resolve(a).then(function(a){return i(a,b.filter,!0)}).then(j).then(k).then(c).then(function(c){return l(c,b.width||q.width(a),b.height||q.height(a))})}function c(a,b){return h(a,b||{}).then(function(b){return b.getContext("2d").getImageData(0,0,q.width(a),q.height(a)).data})}function d(a,b){return h(a,b||{}).then(function(a){return a.toDataURL()})}function e(a,b){return b=b||{},h(a,b).then(function(a){return a.toDataURL("image/jpeg",b.quality||1)})}function f(a,b){return h(a,b||{}).then(q.canvasToBlob)}function g(a){"undefined"==typeof a.imagePlaceholder?v.impl.options.imagePlaceholder=u.imagePlaceholder:v.impl.options.imagePlaceholder=a.imagePlaceholder,"undefined"==typeof a.cacheBust?v.impl.options.cacheBust=u.cacheBust:v.impl.options.cacheBust=a.cacheBust}function h(a,c){function d(a){var b=document.createElement("canvas");if(b.width=c.width||q.width(a),b.height=c.height||q.height(a),c.bgcolor){var d=b.getContext("2d");d.fillStyle=c.bgcolor,d.fillRect(0,0,b.width,b.height)}return b}return b(a,c).then(q.makeImage).then(q.delay(100)).then(function(b){var c=d(a);return c.getContext("2d").drawImage(b,0,0),c})}function i(a,b,c){function d(a){return a instanceof HTMLCanvasElement?q.makeImage(a.toDataURL()):a.cloneNode(!1)}function e(a,b,c){function d(a,b,c){var d=Promise.resolve();return b.forEach(function(b){d=d.then(function(){return i(b,c)}).then(function(b){b&&a.appendChild(b)})}),d}var e=a.childNodes;return 0===e.length?Promise.resolve(b):d(b,q.asArray(e),c).then(function(){return b})}function f(a,b){function c(){function c(a,b){function c(a,b){q.asArray(a).forEach(function(c){b.setProperty(c,a.getPropertyValue(c),a.getPropertyPriority(c))})}a.cssText?b.cssText=a.cssText:c(a,b)}c(window.getComputedStyle(a),b.style)}function d(){function c(c){function d(a,b,c){function d(a){var b=a.getPropertyValue("content");return a.cssText+" content: "+b+";"}function e(a){function b(b){return b+": "+a.getPropertyValue(b)+(a.getPropertyPriority(b)?" !important":"")}return q.asArray(a).map(b).join("; ")+";"}var f="."+a+":"+b,g=c.cssText?d(c):e(c);return document.createTextNode(f+"{"+g+"}")}var e=window.getComputedStyle(a,c),f=e.getPropertyValue("content");if(""!==f&&"none"!==f){var g=q.uid();b.className=b.className+" "+g;var h=document.createElement("style");h.appendChild(d(g,c,e)),b.appendChild(h)}}[":before",":after"].forEach(function(a){c(a)})}function e(){a instanceof HTMLTextAreaElement&&(b.innerHTML=a.value),a instanceof HTMLInputElement&&b.setAttribute("value",a.value)}function f(){b instanceof SVGElement&&(b.setAttribute("xmlns","http://www.w3.org/2000/svg"),b instanceof SVGRectElement&&["width","height"].forEach(function(a){var c=b.getAttribute(a);c&&b.style.setProperty(a,c)}))}return b instanceof Element?Promise.resolve().then(c).then(d).then(e).then(f).then(function(){return b}):b}return c||!b||b(a)?Promise.resolve(a).then(d).then(function(c){return e(a,c,b)}).then(function(b){return f(a,b)}):Promise.resolve()}function j(a){return s.resolveAll().then(function(b){var c=document.createElement("style");return a.appendChild(c),c.appendChild(document.createTextNode(b)),a})}function k(a){return t.inlineAll(a).then(function(){return a})}function l(a,b,c){return Promise.resolve(a).then(function(a){return a.setAttribute("xmlns","http://www.w3.org/1999/xhtml"),(new XMLSerializer).serializeToString(a)}).then(q.escapeXhtml).then(function(a){return''+a+""}).then(function(a){return''+a+""}).then(function(a){return"data:image/svg+xml;charset=utf-8,"+a})}function m(){function a(){var a="application/font-woff",b="image/jpeg";return{woff:a,woff2:a,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:b,jpeg:b,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml"}}function b(a){var b=/\.([^\.\/]*?)$/g.exec(a);return b?b[1]:""}function c(c){var d=b(c).toLowerCase();return a()[d]||""}function d(a){return a.search(/^(data:)/)!==-1}function e(a){return new Promise(function(b){for(var c=window.atob(a.toDataURL().split(",")[1]),d=c.length,e=new Uint8Array(d),f=0;f= t || r < 0 || O && n >= h } function f() { var e = g(); if (u(e)) return d(e); m = setTimeout(f, l(e)) } function d(e) { return m = void 0, C && p ? o(e) : (p = v = void 0, y) } function s() { var e = g(), r = u(e); if (p = arguments, v = this, T = e, r) { if (void 0 === m) return c(T); if (O) return m = setTimeout(f, t), o(T) } return void 0 === m && (m = setTimeout(f, t)), y } var p, v, h, y, m, T, j = 0, k = !1, O = !1, C = !0; if ("function" != typeof e) throw new TypeError(a); return t = i(t) || 0, r(n) && (k = !!n.leading, h = (O = "maxWait" in n) ? b(i(n.maxWait) || 0, t) : h, C = "trailing" in n ? !!n.trailing : C), s.cancel = function () { void 0 !== m && clearTimeout(m), j = 0, p = T = v = m = void 0 }, s.flush = function () { return void 0 === m ? y : d(g()) }, s } }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {}) }, {}], 2: [function (e, t, r) { function n(e, t) { for (var r = -1, n = e ? e.length : 0; ++r < n && !1 !== t(e[r], r, e) ;); return e } function o(e, t) { for (var r = -1, n = Array(e) ; ++r < e;) n[r] = t(r); return n } function i(e, t) { var r = K(e) || u(e) ? o(e.length, String) : [], n = r.length, i = !!n; for (var a in e) !t && !O.call(e, a) || i && ("length" == a || c(a, n)) || r.push(a); return r } function a(e) { if (!l(e)) return E(e); var t = []; for (var r in Object(e)) O.call(e, r) && "constructor" != r && t.push(r); return t } function c(e, t) { return !!(t = null == t ? b : t) && ("number" == typeof e || j.test(e)) && e > -1 && e % 1 == 0 && e < t } function l(e) { var t = e && e.constructor; return e === ("function" == typeof t && t.prototype || k) } function u(e) { return d(e) && O.call(e, "callee") && (!A.call(e, "callee") || C.call(e) == w) } function f(e) { return null != e && p(e.length) && !s(e) } function d(e) { return h(e) && f(e) } function s(e) { var t = v(e) ? C.call(e) : ""; return t == g || t == T } function p(e) { return "number" == typeof e && e > -1 && e % 1 == 0 && e <= b } function v(e) { var t = typeof e; return !!e && ("object" == t || "function" == t) } function h(e) { return !!e && "object" == typeof e } function y(e) { return f(e) ? i(e) : a(e) } function m(e) { return e } var b = 9007199254740991, w = "[object Arguments]", g = "[object Function]", T = "[object GeneratorFunction]", j = /^(?:0|[1-9]\d*)$/, k = Object.prototype, O = k.hasOwnProperty, C = k.toString, A = k.propertyIsEnumerable, E = function (e, t) { return function (r) { return e(t(r)) } }(Object.keys, Object), x = function (e, t) { return function (r, n) { if (null == r) return r; if (!f(r)) return e(r, n); for (var o = r.length, i = t ? o : -1, a = Object(r) ; (t ? i-- : ++i < o) && !1 !== n(a[i], i, a) ;); return r } }(function (e, t) { return e && I(e, t, y) }), I = function (e) { return function (t, r, n) { for (var o = -1, i = Object(t), a = n(t), c = a.length; c--;) { var l = a[e ? c : ++o]; if (!1 === r(i[l], l, i)) break } return t } }(), K = Array.isArray; t.exports = function (e, t) { return (K(e) ? n : x)(e, "function" == typeof t ? t : m) } }, {}], 3: [function (e, t, r) { "use strict"; function n(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } var o = function () { function e(e, t) { var r = [], n = !0, o = !1, i = void 0; try { for (var a, c = e[Symbol.iterator]() ; !(n = (a = c.next()).done) && (r.push(a.value), !t || r.length !== t) ; n = !0); } catch (e) { o = !0, i = e } finally { try { !n && c.return && c.return() } finally { if (o) throw i } } return r } return function (t, r) { if (Array.isArray(t)) return t; if (Symbol.iterator in Object(t)) return e(t, r); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), i = function () { function e(e, t) { for (var r = 0; r < t.length; r++) { var n = t[r]; n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n) } } return function (t, r, n) { return r && e(t.prototype, r), n && e(t, n), t } }(), a = e("lodash.debounce"), c = e("lodash.foreach"), l = function (e) { if (!document.body.contains(e)) return !1; var t = e.getBoundingClientRect(); return t.top <= window.innerHeight && t.top + t.height >= 0 && t.left <= window.innerWidth && t.left + t.width >= 0 }, u = function (e) { return "https://trello.com" === e }, f = /^(https:\/\/trello\.com)\/b\/([a-zA-Z0-9]+)/, d = /^(https:\/\/trello\.com)\/c\/([a-zA-Z0-9]+)/, s = function (e) { return /^[a-f0-9]{24}$/.test(e) || /^[a-zA-Z0-9]{8}$/.test(e) }, p = function (e, t, r, n) { e && e.contentWindow && e.contentWindow.postMessage({ secret: r, command: "polling", options: { enabled: n } }, t) }, v = function () { function e() { var t = this; n(this, e), this.activeCards = {}; window.addEventListener("message", function (e) { if (u(e.origin) && "resize" === e.data.command && e.data.secret) { var r = t.activeCards[e.data.secret]; if (!r || !r.el) return; var n = e.data.options.height; void 0 !== n && (r.el.height = n), p(r.el, e.origin, e.data.secret, l(r.el)) } }, !1), window.addEventListener("resize", a(function () { return t.reassessVisibility() }, 1e3)), window.addEventListener("scroll", a(function () { return t.reassessVisibility() }, 1e3)), "complete" === document.readyState ? this.load() : window.addEventListener("load", function () { return t.load() }) } return i(e, [{ key: "reassessVisibility", value: function () { c(this.activeCards, function (e, t) { var r = e.el, n = e.host; document.body.contains(r) && p(r, n, t, l(r)) }) } }, { key: "createCardIframe", value: function (e, t, r, n) { var o = arguments.length > 4 && void 0 !== arguments[4] ? arguments[4] : {}, i = document.createElement("iframe"), a = encodeURIComponent(window.location.origin), c = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", l = Array(24).join().split(",").map(function () { return c.charAt(Math.floor(Math.random() * c.length)) }).join(""); if (i.src = e + "/embed/card?id=" + t + "&targetOrigin=" + a + "&secret=" + l + "&compact=" + (!0 === n), i.width = 316, i.height = 152, i.style.border = "none", i.style.overflow = "hidden", i.className = "trello-card trello-card-rendered", n && i.classList.add("trello-card-compact"), o && o.apiToken && o.apiKey) { var u = o.apiKey, f = o.apiToken; i.name = JSON.stringify({ apiKey: u, apiToken: f }) } return this.activeCards[l] = { el: i, host: e }, i } }, { key: "create", value: function (e, t) { var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : { compact: !1 }, n = r.compact, i = r.apiKey, a = r.apiToken, c = "https://trello.com", l = e; if (d.test(l)) { var u = d.exec(l); if (!u || !u[1] || !u[2]) throw new Error("Invalid Trello card url"); var f = o(u, 3); c = f[1], l = f[2] } if (!s(l)) throw new Error("Invalid Trello card id"); var p = this.createCardIframe(c, l, "Trello Card", n, { apiKey: i, apiToken: a }); t.appendChild(p) } }, { key: "load", value: function (e) { var t = this, r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : { compact: !1, allAnchors: !1 }, n = r.allAnchors, o = r.compact, i = r.apiToken, a = r.apiKey, l = n ? "a" : "blockquote.trello-card>a, blockquote.trello-card-compact>a", u = (e || document).querySelectorAll(l); c(u, function (e) { var r = e.href, c = d.exec(r); if (c && c[1] && c[2]) { var l = c[1], u = c[2], f = e.innerText, s = !0 === o || e.parentElement.classList.contains("trello-card-compact"), p = t.createCardIframe(l, u, f, s, { apiKey: a, apiToken: i }); if (n) e.parentNode.replaceChild(p, e); else { var v = e.parentNode; v.parentNode.replaceChild(p, v) } } }) } }]), e }(), h = function () { function e() { var t = this; n(this, e), "complete" === document.readyState ? this.load() : window.addEventListener("load", function () { return t.load() }) } return i(e, [{ key: "createBoardIframe", value: function (e, t, r, n) { var o = arguments.length > 4 && void 0 !== arguments[4] ? arguments[4] : {}, i = document.createElement("iframe"), a = encodeURIComponent(window.location.origin), c = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", l = Array(24).join().split(",").map(function () { return c.charAt(Math.floor(Math.random() * c.length)) }).join(""); if (i.src = e + "/embed/board?id=" + t + "&targetOrigin=" + a + "&secret=" + l + "&compact=" + (!0 === n), i.width = 248, i.height = n ? 185 : 218, i.style.border = "none", i.style.overflow = "hidden", i.className = "trello-board trello-board-rendered", n && i.classList.add("trello-board-compact"), o && o.apiToken && o.apiKey) { var u = o.apiKey, f = o.apiToken; i.name = JSON.stringify({ apiKey: u, apiToken: f }) } return i } }, { key: "create", value: function (e, t) { var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, n = r.apiKey, i = r.apiToken, a = "https://trello.com", c = e; if (f.test(c)) { var l = f.exec(c); if (!l || !l[1] || !l[2]) throw new Error("Invalid Trello board url"); var u = o(l, 3); a = u[1], c = u[2] } if (!s(c)) throw new Error("Invalid Trello board id"); var d = this.createBoardIframe(a, c, "Trello Board", !0, { apiKey: n, apiToken: i }); t.appendChild(d) } }, { key: "load", value: function (e) { var t = this, r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : { allAnchors: !1 }, n = r.allAnchors, o = r.apiKey, i = r.apiToken, a = n ? "a" : "blockquote.trello-board-compact>a", l = (e || document).querySelectorAll(a); c(l, function (e) { var r = e.href, a = f.exec(r); if (a && a[1] && a[2]) { var c = a[1], l = a[2], u = e.innerText, d = t.createBoardIframe(c, l, u, !0, { apiKey: o, apiToken: i }); if (n) e.parentNode.replaceChild(d, e); else { var s = e.parentNode; s.parentNode.replaceChild(d, s) } } }) } }]), e }(); window.TrelloCards || (window.TrelloCards = new v), window.TrelloBoards || (window.TrelloBoards = new h) }, { "lodash.debounce": 1, "lodash.foreach": 2 }] }, {}, [3]); -------------------------------------------------------------------------------- /source/libs/excellentexport.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ExcellentExport 2.0.3 3 | * A client side Javascript export to Excel. 4 | * 5 | * @author: Jordi Burgos (jordiburgos@gmail.com) 6 | * @url: https://github.com/jmaister/excellentexport 7 | * 8 | * Modified by Zig Mandel to adapt to a Chrome extension 9 | */ 10 | /*jslint browser: true, bitwise: true, vars: true, white: true */ 11 | /*global define, exports, module */ 12 | 13 | (function (global) { 14 | 'use strict'; 15 | 16 | var ExcellentExport = (function () { 17 | 18 | function b64toBlob(b64Data, contentType, sliceSize) { 19 | // function taken from http://stackoverflow.com/a/16245768/2591950 20 | // author Jeremy Banks http://stackoverflow.com/users/1114/jeremy-banks 21 | contentType = contentType || ''; 22 | sliceSize = sliceSize || 512; 23 | 24 | var byteCharacters = window.atob(b64Data); 25 | var byteArrays = []; 26 | 27 | var offset; 28 | for (offset = 0; offset < byteCharacters.length; offset += sliceSize) { 29 | var slice = byteCharacters.slice(offset, offset + sliceSize); 30 | 31 | var byteNumbers = new Array(slice.length); 32 | var i; 33 | for (i = 0; i < slice.length; i = i + 1) { 34 | byteNumbers[i] = slice.charCodeAt(i); 35 | } 36 | 37 | var byteArray = new window.Uint8Array(byteNumbers); 38 | 39 | byteArrays.push(byteArray); 40 | } 41 | 42 | var blob = new window.Blob(byteArrays, { 43 | type: contentType 44 | }); 45 | return blob; 46 | } 47 | 48 | var version = "2.0.3"; 49 | var uri = { excel: 'data:application/vnd.ms-excel;base64,', csv: 'data:application/csv;base64,' }; 50 | var template = { excel: ' {table}
        ' }; 51 | var csvDelimiter = ","; 52 | var csvNewLine = "\r\n"; 53 | var base64 = function (s) { 54 | return window.btoa(window.unescape(encodeURIComponent(s))); 55 | }; 56 | var format = function (s, c) { 57 | return s.replace(new RegExp("{(\\w+)}", "g"), function (m, p) { 58 | return c[p]; 59 | }); 60 | }; 61 | 62 | var get = function (element) { 63 | if (!element.nodeType) { 64 | return document.getElementById(element); 65 | } 66 | return element; 67 | }; 68 | 69 | var fixCSVField = function (value) { 70 | var fixedValue = value; 71 | var addQuotes = (value.indexOf(csvDelimiter) !== -1) || (value.indexOf('\r') !== -1) || (value.indexOf('\n') !== -1); 72 | var replaceDoubleQuotes = (value.indexOf('"') !== -1); 73 | 74 | if (replaceDoubleQuotes) { 75 | fixedValue = fixedValue.replace(/"/g, '""'); 76 | } 77 | if (addQuotes || replaceDoubleQuotes) { 78 | fixedValue = '"' + fixedValue + '"'; 79 | } 80 | 81 | return fixedValue; 82 | }; 83 | 84 | var tableToCSV = function (table) { 85 | var data = ""; 86 | var i, j, row, col; 87 | for (i = 0; i < table.rows.length; i = i + 1) { 88 | row = table.rows[i]; 89 | for (j = 0; j < row.cells.length; j = j + 1) { 90 | col = row.cells[j]; 91 | data = data + (j ? csvDelimiter : '') + fixCSVField(col.textContent.trim()); 92 | } 93 | data = data + csvNewLine; 94 | } 95 | return data; 96 | }; 97 | 98 | function createDownloadLink(anchor, base64data, exporttype, filename) { 99 | var blob; 100 | //MODIFIED BY ZIG FOR CHROME EXTENSION 101 | if (window.URL.createObjectURL) { 102 | blob = b64toBlob(base64data, exporttype); 103 | 104 | var e = document.createEvent('MouseEvents'); 105 | var a = document.createElement('a'); 106 | 107 | a.download = filename; 108 | a.href = window.URL.createObjectURL(blob); 109 | a.dataset.downloadurl = [exporttype, a.download, a.href].join(':'); 110 | e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); 111 | a.dispatchEvent(e); 112 | } 113 | 114 | // Return true to allow the link to work 115 | return true; 116 | } 117 | 118 | var ee = { 119 | version: function () { 120 | return version; 121 | }, 122 | excel: function (anchor, table, name) { 123 | table = get(table); 124 | var ctx = { worksheet: name || 'worksheet', table: table.innerHTML }; 125 | var b64 = base64(format(template.excel, ctx)); 126 | return createDownloadLink(anchor, b64, 'application/vnd.ms-excel', 'report-plusfortrello.xls'); 127 | }, 128 | csv: function (anchor, table, delimiter, newLine) { 129 | if (delimiter !== undefined && delimiter) { 130 | csvDelimiter = delimiter; 131 | } 132 | if (newLine !== undefined && newLine) { 133 | csvNewLine = newLine; 134 | } 135 | 136 | table = get(table); 137 | var csvData = "\uFEFF" + tableToCSV(table); 138 | var b64 = base64(csvData); 139 | return createDownloadLink(anchor, b64, 'application/csv', 'report-plusfortrello.csv'); 140 | } 141 | }; 142 | 143 | return ee; 144 | }()); 145 | 146 | // AMD support 147 | if (typeof define === 'function' && define.amd) { 148 | define(function () { return ExcellentExport; }); 149 | // CommonJS and Node.js module support. 150 | } else if (typeof exports !== 'undefined') { 151 | // Support Node.js specific `module.exports` (which can be a function) 152 | if (typeof module !== 'undefined' && module.exports) { 153 | exports = module.exports = ExcellentExport; 154 | } 155 | // But always support CommonJS module 1.1.1 spec (`exports` cannot be a function) 156 | exports.ExcellentExport = ExcellentExport; 157 | } else { 158 | global.ExcellentExport = ExcellentExport; 159 | } 160 | })(this); 161 | -------------------------------------------------------------------------------- /source/libs/jquery.cookie.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery Cookie Plugin v1.4.1 3 | * https://github.com/carhartl/jquery-cookie 4 | * 5 | * Copyright 2013 Klaus Hartl 6 | * Released under the MIT license 7 | */ 8 | (function (factory) { 9 | if (typeof define === 'function' && define.amd) { 10 | // AMD 11 | define(['jquery'], factory); 12 | } else if (typeof exports === 'object') { 13 | // CommonJS 14 | factory(require('jquery')); 15 | } else { 16 | // Browser globals 17 | factory(jQuery); 18 | } 19 | }(function ($) { 20 | 21 | var pluses = /\+/g; 22 | 23 | function encode(s) { 24 | return config.raw ? s : encodeURIComponent(s); 25 | } 26 | 27 | function decode(s) { 28 | return config.raw ? s : decodeURIComponent(s); 29 | } 30 | 31 | function stringifyCookieValue(value) { 32 | return encode(config.json ? JSON.stringify(value) : String(value)); 33 | } 34 | 35 | function parseCookieValue(s) { 36 | if (s.indexOf('"') === 0) { 37 | // This is a quoted cookie as according to RFC2068, unescape... 38 | s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); 39 | } 40 | 41 | try { 42 | // Replace server-side written pluses with spaces. 43 | // If we can't decode the cookie, ignore it, it's unusable. 44 | // If we can't parse the cookie, ignore it, it's unusable. 45 | s = decodeURIComponent(s.replace(pluses, ' ')); 46 | return config.json ? JSON.parse(s) : s; 47 | } catch(e) {} 48 | } 49 | 50 | function read(s, converter) { 51 | var value = config.raw ? s : parseCookieValue(s); 52 | return $.isFunction(converter) ? converter(value) : value; 53 | } 54 | 55 | var config = $.cookie = function (key, value, options) { 56 | 57 | // Write 58 | 59 | if (value !== undefined && !$.isFunction(value)) { 60 | options = $.extend({}, config.defaults, options); 61 | 62 | if (typeof options.expires === 'number') { 63 | var days = options.expires, t = options.expires = new Date(); 64 | t.setTime(+t + days * 864e+5); 65 | } 66 | 67 | return (document.cookie = [ 68 | encode(key), '=', stringifyCookieValue(value), 69 | options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE 70 | options.path ? '; path=' + options.path : '', 71 | options.domain ? '; domain=' + options.domain : '', 72 | options.secure ? '; secure' : '' 73 | ].join('')); 74 | } 75 | 76 | // Read 77 | 78 | var result = key ? undefined : {}; 79 | 80 | // To prevent the for loop in the first place assign an empty array 81 | // in case there are no cookies at all. Also prevents odd result when 82 | // calling $.cookie(). 83 | var cookies = document.cookie ? document.cookie.split('; ') : []; 84 | 85 | for (var i = 0, l = cookies.length; i < l; i++) { 86 | var parts = cookies[i].split('='); 87 | var name = decode(parts.shift()); 88 | var cookie = parts.join('='); 89 | 90 | if (key && key === name) { 91 | // If second argument (value) is a function it's a converter... 92 | result = read(cookie, value); 93 | break; 94 | } 95 | 96 | // Prevent storing a cookie that we couldn't decode. 97 | if (!key && (cookie = read(cookie)) !== undefined) { 98 | result[name] = cookie; 99 | } 100 | } 101 | 102 | return result; 103 | }; 104 | 105 | config.defaults = {}; 106 | 107 | $.removeCookie = function (key, options) { 108 | if ($.cookie(key) === undefined) { 109 | return false; 110 | } 111 | 112 | // Must not alter options, thus extending a fresh object... 113 | $.cookie(key, '', $.extend({}, options, { expires: -1 })); 114 | return !$.cookie(key); 115 | }; 116 | 117 | })); 118 | -------------------------------------------------------------------------------- /source/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "__MSG_extName__", 3 | "short_name": "Plus for Trello", 4 | "version": "5.1.0", 5 | "manifest_version": 2, 6 | "default_locale": "en", 7 | "description": "__MSG_extDescription__", 8 | "icons": { 9 | "16": "images/icon16.png", 10 | "48": "images/icon48.png", 11 | "128": "images/icon128.png" 12 | }, 13 | "offline_enabled": true, 14 | "background": { 15 | "page": "background.html" 16 | }, 17 | 18 | "homepage_url": "http://www.plusfortrello.com", 19 | "oauth2": { 20 | "client_id": "147493868263-rau69q6puvkskc83li1neonnbo0aelp9.apps.googleusercontent.com", 21 | "scopes": [ 22 | "https://spreadsheets.google.com/feeds", 23 | "https://www.googleapis.com/auth/drive.file", 24 | "https://www.googleapis.com/auth/chromewebstore.readonly" 25 | ] 26 | }, 27 | 28 | "browser_action": { 29 | "default_icon": { 30 | "19": "images/icon19.png" 31 | }, 32 | "default_title": "Plus for Trello", 33 | "default_popup": "popup.html" 34 | }, 35 | 36 | "content_scripts": [ 37 | { 38 | "all_frames": true, 39 | "matches": [ "https://trello.com/*" ], 40 | "js": [ 41 | "libs/jquery.min.js", 42 | "libs/jquery-ui.custom.min.js", 43 | "libs/jquery.cookie.js", 44 | "libs/jquery.zoomooz.js", 45 | "libs/jsapi.js", 46 | "libs/formatchart.js", 47 | "libs/jquery.grumble.js", 48 | "libs/dialog-polyfill.js", 49 | "libs/jquery.tablesorter.js", 50 | "libs/select2.full.min.js", 51 | "shared.js", 52 | "sharedmobile.js", 53 | "sharedsync.js", 54 | "app.js", 55 | "card.js", 56 | "cardetransfer.js", 57 | "labels.js", 58 | "labels.js", 59 | "language.js", 60 | "help.js", 61 | "buttons.js", 62 | "plus.js", 63 | "plusconfig.js", 64 | "board.js", 65 | "tour.js", 66 | "translations.js" 67 | ], 68 | "css": [ "css/style.css", "css/colors.css", "css/tooltip.css", "css/grumble.css", "css/dialog-polyfill.css", "css/tablesorter.css", "css/jquery-ui-custom.min.css", "css/select2.min.css"], 69 | "run_at": "document_start" 70 | } 71 | ], 72 | "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", 73 | "web_accessible_resources": [ 74 | "images/*.png", 75 | "images/*.gif", 76 | "*.html", 77 | "manifest.json", 78 | "css/images/*.gif", 79 | "stripe-wrap.js" 80 | ], 81 | "optional_permissions": [ "https://*.stripe.com/", "https://*.cloudfunctions.net/", "clipboardWrite", "https://spreadsheets.google.com/", "https://ssl.google-analytics.com/", "https://www.googleapis.com/", "alarms", "gcm", "bookmarks" ], 82 | "permissions": ["identity", "storage", "unlimitedStorage", "notifications", "webRequest", "webRequestBlocking", "https://trello.com/", "https://trello.com/1/*"] 83 | } -------------------------------------------------------------------------------- /source/plusfortrello.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 14 4 | VisualStudioVersion = 14.0.25123.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{2C5D4E06-B3F8-406C-AFB9-7729DC9AB044}" 7 | ProjectSection(SolutionItems) = preProject 8 | app.js = app.js 9 | background.html = background.html 10 | background.js = background.js 11 | board.js = board.js 12 | burndown.html = burndown.html 13 | burndown.js = burndown.js 14 | buttons.js = buttons.js 15 | card.js = card.js 16 | css\colors.css = css\colors.css 17 | commitsync.js = commitsync.js 18 | dashboard.html = dashboard.html 19 | dashboard.js = dashboard.js 20 | help.js = help.js 21 | intellisense.js = intellisense.js 22 | labels.js = labels.js 23 | language.js = language.js 24 | manifest.json = manifest.json 25 | plus.js = plus.js 26 | plusconfig.js = plusconfig.js 27 | plusmessages.html = plusmessages.html 28 | plusmessages.js = plusmessages.js 29 | popup.html = popup.html 30 | popup.js = popup.js 31 | report.html = report.html 32 | report.js = report.js 33 | shared.js = shared.js 34 | sql.js = sql.js 35 | css\style.css = css\style.css 36 | timerwin.html = timerwin.html 37 | timerwin.js = timerwin.js 38 | tour.js = tour.js 39 | trellosync.js = trellosync.js 40 | EndProjectSection 41 | ProjectSection(FolderGlobals) = preProject 42 | __JSONSchema = http://json.schemastore.org/tslint 43 | EndProjectSection 44 | EndProject 45 | Global 46 | GlobalSection(SolutionProperties) = preSolution 47 | HideSolutionNode = FALSE 48 | EndGlobalSection 49 | EndGlobal 50 | -------------------------------------------------------------------------------- /source/plusmessages.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Error Log - Plus 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |   email support 16 |   FAQ 17 |
        18 |
        19 |
        20 |
        21 | 22 | -------------------------------------------------------------------------------- /source/plusmessages.js: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | var g_bLoaded = false; //needed because DOMContentLoaded gets called again when we modify the page 4 | 5 | 6 | document.addEventListener('DOMContentLoaded', function () { 7 | if (g_bLoaded) 8 | return; 9 | g_bLoaded = true; 10 | //chrome Content Security Policy (CSP) makes us do it like this 11 | loadReport(); 12 | }); 13 | 14 | 15 | function loadReport() { 16 | $("#buttonClear").click(function () { 17 | if (!confirm('Are you sure you want to delete the log? You cant undo it.')) 18 | return; 19 | sendExtensionMessage({ method: "clearAllLogMessages" }, 20 | function (response) { 21 | if (response.status != STATUS_OK) { 22 | showError(response.status); 23 | return; 24 | } 25 | configReport(); 26 | }); 27 | }); 28 | 29 | $("#buttonSendToDev").click(function () { 30 | sendExtensionMessage({ method: "writeLogToPlusSupport" }, 31 | function (response) { 32 | if (response.status != STATUS_OK) { 33 | showError(response.status); 34 | return; 35 | } 36 | $("#buttonSendToDev").prop('disabled', true); 37 | }); 38 | }); 39 | configReport(); 40 | } 41 | 42 | function showError(err) { 43 | try { 44 | setBusy(false); 45 | } catch (e) 46 | { 47 | 48 | } 49 | //dont use any libraries here 50 | document.getElementById("lastPageError").innerText = "Last page error: "+err; 51 | alert("Plus for Trello:" + err); 52 | } 53 | 54 | function buildSql(elems) { 55 | var sql = "select date, message FROM LOGMESSAGES ORDER BY date DESC"; 56 | return { sql: sql, values: [] }; 57 | } 58 | 59 | function configReport() { 60 | setBusy(true); 61 | openPlusDb( 62 | function (response) { 63 | if (response.status != STATUS_OK) { 64 | showError(response.status); 65 | return; 66 | } 67 | var sqlQuery = buildSql(); 68 | getSQLReport(sqlQuery.sql, sqlQuery.values, 69 | function (response) { 70 | var rows = response.rows; 71 | try { 72 | setReportData(rows); 73 | } 74 | catch (e) { 75 | var strError = "error: " + e.message; 76 | showError(strError); 77 | } 78 | }); 79 | }); 80 | } 81 | 82 | 83 | function setReportData(rows) { 84 | var html = getHtmlDrillDownTooltip(rows); 85 | var container = makeReportContainer(html, 1300, true); 86 | setBusy(false); 87 | } 88 | 89 | function getHtmlDrillDownTooltip(rows) { 90 | var header = [{ name: "Date" }, { name: "Message", bExtend: true }]; 91 | function callbackRowData(row) { 92 | var rgRet = []; 93 | var date = new Date(row.date * 1000); //db is in seconds 94 | var msg = row.message.replace(/\n/g, '
        '); 95 | rgRet.push({ name: date.toLocaleString(), bNoTruncate: true }); 96 | rgRet.push({ name: msg, bNoTruncate: true }); 97 | rgRet.title = row.message; 98 | return rgRet; 99 | } 100 | 101 | return getHtmlBurndownTooltipFromRows(false, rows, false, header, callbackRowData, true, "Error log", true); 102 | } 103 | 104 | function getSQLReport(sql, values, callback) { 105 | getSQLReportShared(sql, values, callback, function onError(status) { 106 | showError(status); 107 | }); 108 | } 109 | 110 | -------------------------------------------------------------------------------- /source/popup.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Plus for Trello 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
        15 | Help 16 | Plus for Trello 17 |
        18 | 22 | S 23 | R 24 | Counts 25 | Reports 26 | Trello 27 | 28 | New S/E 29 |
        30 |
        31 |
        32 |
        33 | 34 | 35 | -------------------------------------------------------------------------------- /source/prepare.bat: -------------------------------------------------------------------------------- 1 | del /s /aH desktop.ini -------------------------------------------------------------------------------- /source/timerwin.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 00:00m 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
        16 | 17 | -------------------------------------------------------------------------------- /source/timerwin.js: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | var g_bLoaded = false; 4 | var g_bSentLoadedMsg = false; 5 | 6 | function sendOnceLoadedMessage() { 7 | if (g_bSentLoadedMsg) 8 | return; 9 | g_bSentLoadedMsg = true; 10 | var params = getUrlParams(); 11 | var idCard = params.idCard; 12 | var bClearAndMinimize = (params.minimized != "0"); 13 | sendExtensionMessage({ method: "timerWindowLoaded", idCard: idCard, bClearAndMinimize: bClearAndMinimize }, function (response) { }); 14 | } 15 | 16 | window.addEventListener("load", function (event) { 17 | var params = getUrlParams(); 18 | var idCard = params.idCard; 19 | //try to wait until the window is fully painted, Windows needs it so its minimized preview shows the content. 20 | //this method isnt perfect. I also tried changing an img src and detect its onload but that also didnt always work, 21 | //so the current approach is to wait an extra 100ms 22 | window.requestAnimationFrame(function () { 23 | setTimeout(function () { 24 | sendOnceLoadedMessage(); 25 | setTimeout(function () { 26 | window.requestAnimationFrame(function () { 27 | handleRestoreWindow(idCard); //case after lock screen restore 28 | }); 29 | }, 2000); //2000 is a safe time to wait, in case the minimize takes time and another paint happens 30 | }, 100); 31 | }); 32 | }); 33 | 34 | 35 | var g_bHandledRestore = false; 36 | function handleRestoreWindow(idCard) { 37 | if (g_bHandledRestore) 38 | return; 39 | g_bHandledRestore = true; //first one wins 40 | sendOnceLoadedMessage(); 41 | sendExtensionMessage({ method: "timerWindowRestored", idCard: idCard }, function (response) { 42 | window.close(); 43 | }); 44 | } 45 | 46 | window.onfocus = function () { 47 | if (document.visibilityState != "visible") 48 | return; 49 | var params = getUrlParams(); 50 | var idCard = params.idCard; 51 | handleRestoreWindow(idCard); 52 | }; 53 | 54 | document.addEventListener('DOMContentLoaded', function () { 55 | if (g_bLoaded) 56 | return; 57 | g_bLoaded = true; 58 | 59 | var params = getUrlParams(); 60 | var idCard = params.idCard; 61 | var hash = getCardTimerSyncHash(idCard); 62 | 63 | $("#cardText").text(params.nameCard);//.prop("title", params.nameCard); 64 | $("#boardText").text(params.nameBoard); 65 | 66 | function update() { 67 | getCardTimerData(hash, function (objTimer) { 68 | var stored = objTimer.stored; 69 | 70 | if (stored === undefined || stored.msStart == null || stored.msEnd != null) { 71 | document.title = "00:00m"; 72 | sendOnceLoadedMessage(); 73 | window.close(); 74 | } 75 | else { 76 | document.title = getTimerElemText(stored.msStart, Date.now(), false, true); 77 | } 78 | }); 79 | } 80 | 81 | update(); 82 | setInterval(update, 1000); //review this could be re-done with timeouts with minute-step as now the windows is always minimized 83 | }); 84 | 85 | --------------------------------------------------------------------------------