├── .editorconfig ├── .eslintignore ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── LICENSE ├── README.md ├── assets └── css │ └── frontend.scss ├── changelog.txt ├── composer.json ├── composer.lock ├── includes ├── class-sensei-course-progress-dependency-checker.php ├── class-sensei-course-progress-widget.php └── class-sensei-course-progress.php ├── languages ├── sensei-course-progress-hu_HU.mo ├── sensei-course-progress-hu_HU.po ├── sensei-course-progress-ru_RU.mo ├── sensei-course-progress-ru_RU.po └── sensei-course-progress.pot ├── package-lock.json ├── package.json ├── phpcs.xml.dist ├── readme.txt ├── renovate.json ├── sensei-course-progress.php └── webpack.config.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # This file is for unifying the coding style for different editors and IDEs 2 | # editorconfig.org 3 | 4 | # WordPress Coding Standards 5 | # https://make.wordpress.org/core/handbook/coding-standards/ 6 | 7 | root = true 8 | 9 | [*] 10 | charset = utf-8 11 | end_of_line = lf 12 | indent_size = 4 13 | tab_width = 4 14 | indent_style = tab 15 | insert_final_newline = true 16 | trim_trailing_whitespace = true 17 | 18 | [*.txt] 19 | trim_trailing_whitespace = false 20 | 21 | [*.{md,json,yml}] 22 | trim_trailing_whitespace = false 23 | indent_style = space 24 | indent_size = 2 25 | 26 | [{*.txt}] 27 | end_of_line = crlf 28 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | /build 2 | /assets/dist 3 | /vendor 4 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: "[Type] Bug" 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | 12 | ### Steps to Reproduce 13 | 1. Go to '...' 14 | 2. Click on '....' 15 | 3. Scroll down to '....' 16 | 4. See error 17 | 18 | ### What I Expected 19 | 20 | 21 | ### What Happened Instead 22 | 23 | 24 | ### PHP / WordPress / Sensei Course Progress / Sensei LMS version 25 | 26 | 27 | ### Browser / OS version 28 | 29 | 30 | ### Screenshot / Video 31 | 32 | 33 | ### Context / Source 34 | 35 | 36 | 37 | 38 | 46 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: "[Type] Enhancement" 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | 12 | ### Is your feature request related to a problem? Please describe 13 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 14 | 15 | ### Describe the solution you'd like 16 | A clear and concise description of what you want to happen. 17 | 18 | ### Describe alternatives you've considered 19 | A clear and concise description of any alternative solutions or features you've considered. 20 | 21 | ### Additional context 22 | Add any other context or screenshots about the feature request here. 23 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Fixes # 2 | 3 | ### Changes proposed in this Pull Request 4 | 5 | * 6 | 7 | ### Testing instructions 8 | 9 | * 10 | 11 | 12 | ### New/Updated Hooks 13 | 14 | * 15 | 16 | 17 | ### Deprecated Code 18 | 19 | * 20 | 21 | 25 | ### Screenshot / Video 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | vendor 4 | build 5 | assets/dist 6 | /*.zip 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Sensei LMS Course Progress 2 | 3 | > **This extension has been [retired](https://senseilms.com/retiring-course-progress-and-media-attachments/) and is no longer being actively maintained. This functionality is now available by default in [Learning Mode](https://senseilms.com/documentation/learning-mode-overview/#overview).** 4 | 5 | Sensei LMS Course Progress provides a sidebar widget that displays all the lessons in the current course or module and lets your learners see, at a glance, which ones they have completed and which they have yet to take. 6 | 7 | ## Getting Started 8 | 9 | If you'd like to try Sensei LMS Course Progress on your site, you can download it for free from the [product page](https://woocommerce.com/products/sensei-course-progress/). 10 | 11 | If you'd like to do some development and run the plugin locally, you can do that too: 12 | 13 | 1. Make sure you have `git`, `node`, and `npm` installed. 14 | 2. Clone this repository locally. 15 | 3. Execute `npm install` and `gulp build` from the root directory of the repository. 16 | 4. Copy the `/build/sensei-course-progress` folder to `wp-content/plugins/sensei-course-progress`. 17 | 18 | ## Contributing 19 | All contributions are greatly appreciated and welcome! Please submit a pull request and we will do our best to incorporate it. 20 | -------------------------------------------------------------------------------- /assets/css/frontend.scss: -------------------------------------------------------------------------------- 1 | .widget_sensei_course_progress { 2 | padding: 0; 3 | background: rgba(0,0,0,0.02); 4 | border-radius: 5px; 5 | header, .course-progress-module { 6 | padding: 1.618em 1.618em 0; 7 | h2, h3 { 8 | margin-bottom: 0.618em; 9 | } 10 | h2 { 11 | font-size: 1.618em; 12 | a { 13 | text-decoration: none; 14 | } 15 | } 16 | } 17 | 18 | .course-progress-lessons { 19 | list-style: none; 20 | #sidebar & { 21 | margin: 0; 22 | } 23 | .course-progress-module { 24 | border: none; 25 | border-bottom: 1px solid rgba(0,0,0,0.05); 26 | margin: 0; 27 | background: rgba(255,255,255,0.6); 28 | } 29 | .course-progress-lesson { 30 | border: none; 31 | margin: 0; 32 | padding: 0; 33 | a, span { 34 | display: block; 35 | border-bottom: 1px solid rgba(0,0,0,0.05); 36 | padding: 0.618em 1.618em 0.618em 3.618em; 37 | font-weight: bold; 38 | background: rgba(255,255,255,0.8); 39 | position: relative; 40 | &:before { 41 | font-family: FontAwesomeSensei, FontAwesome; 42 | display: inline-block; 43 | font-size: 150%; 44 | margin-right: 0.618em; 45 | font-weight: 400; 46 | line-height: 1em; 47 | width: 1em; 48 | position: absolute; 49 | left: 1em; 50 | top: 0.5em; 51 | content: '\f10c'; 52 | color: rgba(0,0,0,0.1); 53 | } 54 | } 55 | a:hover { 56 | background: rgba(255,255,255,1); 57 | text-decoration: none; 58 | } 59 | &.current span { 60 | background: rgba(255,255,255,1); 61 | color: rgba(0,0,0,0.5); 62 | border-top: 1px solid rgba(0,0,0,0.04); 63 | &:before { 64 | content: '\f138'; 65 | color: rgba(0,0,0,0.2); 66 | } 67 | } 68 | &.completed { 69 | a, span { 70 | color: rgba(0,0,0,0.4); 71 | font-weight: normal; 72 | &:before { 73 | content: '\f058'; 74 | color: #63a95f; 75 | } 76 | } 77 | } 78 | } 79 | } 80 | 81 | ul.course-progress-navigation { 82 | background: #eee; 83 | border-top: 1px solid #ddd; 84 | display: flex; 85 | flex-direction: row; 86 | justify-content: flex-start; 87 | align-items: center; 88 | margin: 0; 89 | padding: 0; 90 | li { 91 | width: 50%; 92 | text-align: center; 93 | list-style: none; 94 | border-bottom: 1px solid #ddd; 95 | a { 96 | background: #fefefe; 97 | display: block; 98 | padding: 1em 0; 99 | color: #ccc; 100 | line-height: 1.5em; 101 | text-decoration: none; 102 | span { 103 | display: none; 104 | } 105 | &:hover { 106 | background: #fff; 107 | text-decoration: none; 108 | } 109 | &:before, &:after { 110 | font-family: FontAwesomeSensei, FontAwesome; 111 | font-weight: bold; 112 | font-size: 2em; 113 | position: relative; 114 | top: 3px; 115 | } 116 | } 117 | &.prev { 118 | margin-right: auto; 119 | a { 120 | border-right: 1px solid #ddd; 121 | &:before { 122 | content: "\f053"; 123 | } 124 | } 125 | } 126 | &.next { 127 | margin-left: auto; 128 | a { 129 | &:after { 130 | content: "\f054"; 131 | } 132 | } 133 | } 134 | } 135 | } 136 | } 137 | 138 | details.course-progress-details { 139 | summary { 140 | outline: none; 141 | &::marker, &::-webkit-details-marker { 142 | content: ""; 143 | display: none; 144 | } 145 | } 146 | } 147 | 148 | details.course-progress-details { 149 | .course-progress-summary { 150 | height: 32px; 151 | width: 100%; 152 | display: flex; 153 | justify-content: center; 154 | align-items: center; 155 | user-select: none; 156 | text-decoration: underline; 157 | &:hover { 158 | cursor: pointer; 159 | background: rgba(0,0,0,0.01); 160 | } 161 | } 162 | .course-progress-collapse { 163 | display: none; 164 | } 165 | } 166 | 167 | details.course-progress-details[open] { 168 | .course-progress-collapse { 169 | display: block; 170 | } 171 | .course-progress-expand { 172 | display: none; 173 | } 174 | 175 | } 176 | -------------------------------------------------------------------------------- /changelog.txt: -------------------------------------------------------------------------------- 1 | *** Sensei LMS Course Progress Changelog *** 2 | 3 | 2021.10.19 - version 2.0.4 4 | * New: Add ability to minimize the course progress widget by the user - #115 5 | 6 | 2020.04.08 - version 2.0.3 7 | * Tweak: Remove call to `user_started_course` - #98 8 | 9 | 2019.12.05 - version 2.0.2 10 | * New: Remove Woo header so that plugin updates are served from WordPress.org - #87 11 | * Tweak: Add readme.txt to build instead of README.md - #86 12 | 13 | 2019.11.21 - version 2.0.1 14 | * New: Rename plugin to Sensei LMS Course Progress - #79 15 | * New: Add Hungarian translation (@amroland) - #83 16 | * Fix: Translations not loading - #82 17 | 18 | 2019.04.24 - version 2.0.0 19 | * New: Add dependency check for minimum Sensei (1.11.0) and PHP (5.6) versions - #68 20 | * Tweak: Check dependencies and perform the majority of plugin loading tasks after other plugins have loaded - #72 21 | * Tweak: Use Woo header for plugin updates - #69 22 | * Fix: Broken CSS for themes that change the default widget class - #70 23 | 24 | 2018.10.31 - version 1.0.8 25 | * Fix: Widget does not work if lessons are not in a module 26 | * Fix: PHP notices generated by the Widget 27 | * Fix: Coding standard violations 28 | * Tweak: Update Russian translations 29 | * Tweak: Update plugin author information 30 | 31 | 2018.04.04 - version 1.0.7 32 | * Fix: Widget no longer shows navigation arrows 33 | * Fix: Fix for current lesson indicator when viewing module 34 | * Fix: Double encoding of ampersand on module titles 35 | * Tweak: Make UI consistent between show all/not all modules 36 | * Tweak: Escape data and use absolute paths to files 37 | * Tweak: The modules taxonomy query should only send term id 38 | * Tweak: Use correct version of frontend.css file 39 | * Tweak: Update links in plugin header 40 | * New: Add Russian translations 41 | * New: Link to module if it has a description/template overridden 42 | 43 | 2015.10.08 - version 1.0.6 44 | * Fix - Replaces missing font declaration to ensure arrows always display 45 | * Fix - Updates widget constructor method due to a change in WordPress 46 | 47 | 2015.07.24 - version 1.0.5 48 | * Fix - Ensures the widget works properly on quiz pages. 49 | * Tweak - Removes !important from CSS styles to make it easier to override the styles. 50 | 51 | 2015.05.28 - version 1.0.4 52 | * Tweak - Updating code to work with modules in Sensei 1.8 53 | * Fix - Fixed a few undefined variable notices 54 | 55 | 2015.02.02 - version 1.0.3 56 | * New - Adds an option to display lessons from all modules, not just the current one. 57 | * Tweak - Updating code for Sensei 1.7 compatibility 58 | * Tweak - Left aligns the module title 59 | 60 | 2014.08.18 - version 1.0.2 61 | * Fix - Fixes a styling issue on the next/previous lesson buttons in some themes. 62 | 63 | 2014.06.30 - version 1.0.1 64 | * Fix - Fixes HTML character conversion in course title. 65 | * New - Added next/previous lesson navigation above the lesson list. 66 | 67 | 2014.06.23 - version 1.0.0 68 | * First release 69 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "automattic/sensei-course-progress", 3 | "description": "Sensei LMS Course Progress", 4 | "require-dev": { 5 | "php": "^7", 6 | "dealerdirect/phpcodesniffer-composer-installer": "0.7.1", 7 | "phpcompatibility/phpcompatibility-wp": "2.1.2", 8 | "squizlabs/php_codesniffer": "3.6.1", 9 | "wp-coding-standards/wpcs": "2.3.0" 10 | }, 11 | "archive": { 12 | "exclude": [ 13 | "/*", 14 | "!/assets/dist", 15 | "/assets/dist/css/*.js", 16 | "!/includes", 17 | "!/languages", 18 | "!/changelog.txt", 19 | "!/LICENSE", 20 | "!/readme.txt", 21 | "!/sensei-course-progress.php", 22 | ".DS_Store", 23 | ".*", 24 | "*.test.js" 25 | ] 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "5788de648810390b6450cf3b95d4a791", 8 | "packages": [], 9 | "packages-dev": [ 10 | { 11 | "name": "andrewsville/php-token-reflection", 12 | "version": "1.4.0", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/Andrewsville/PHP-Token-Reflection.git", 16 | "reference": "e6d0ac2baf66cdf154be34c3d2a2aa1bd4b426ee" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/Andrewsville/PHP-Token-Reflection/zipball/e6d0ac2baf66cdf154be34c3d2a2aa1bd4b426ee", 21 | "reference": "e6d0ac2baf66cdf154be34c3d2a2aa1bd4b426ee", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "ext-tokenizer": "*", 26 | "php": ">=5.3.0" 27 | }, 28 | "type": "library", 29 | "autoload": { 30 | "psr-0": { 31 | "TokenReflection": "./" 32 | } 33 | }, 34 | "notification-url": "https://packagist.org/downloads/", 35 | "license": [ 36 | "BSD-3" 37 | ], 38 | "authors": [ 39 | { 40 | "name": "Ondřej Nešpor", 41 | "homepage": "https://github.com/andrewsville" 42 | }, 43 | { 44 | "name": "Jaroslav Hanslík", 45 | "homepage": "https://github.com/kukulich" 46 | } 47 | ], 48 | "description": "Library emulating the PHP internal reflection using just the tokenized source code.", 49 | "homepage": "http://andrewsville.github.com/PHP-Token-Reflection/", 50 | "keywords": [ 51 | "library", 52 | "reflection", 53 | "tokenizer" 54 | ], 55 | "time": "2014-08-06T16:37:08+00:00" 56 | }, 57 | { 58 | "name": "apigen/apigen", 59 | "version": "v4.1.2", 60 | "source": { 61 | "type": "git", 62 | "url": "https://github.com/ApiGen/ApiGen.git", 63 | "reference": "3365433ea3433b0e5c8f763608f8e63cbedb2a3a" 64 | }, 65 | "dist": { 66 | "type": "zip", 67 | "url": "https://api.github.com/repos/ApiGen/ApiGen/zipball/3365433ea3433b0e5c8f763608f8e63cbedb2a3a", 68 | "reference": "3365433ea3433b0e5c8f763608f8e63cbedb2a3a", 69 | "shasum": "" 70 | }, 71 | "require": { 72 | "andrewsville/php-token-reflection": "~1.4", 73 | "apigen/theme-bootstrap": "~1.1.2", 74 | "apigen/theme-default": "~1.0.1", 75 | "herrera-io/phar-update": "~2.0", 76 | "kdyby/events": "~2.0", 77 | "kukulich/fshl": "~2.1", 78 | "latte/latte": ">=2.2.0,<2.3.5", 79 | "michelf/php-markdown": "~1.4", 80 | "nette/application": "~2.2", 81 | "nette/bootstrap": "~2.2", 82 | "nette/di": "~2.2", 83 | "nette/mail": "~2.2", 84 | "nette/neon": "~2.2", 85 | "nette/robot-loader": "~2.2", 86 | "nette/safe-stream": "~2.2", 87 | "php": ">=5.4", 88 | "symfony/console": "~2.6", 89 | "symfony/options-resolver": "~2.6.1", 90 | "symfony/yaml": "~2.6", 91 | "tracy/tracy": "~2.2" 92 | }, 93 | "require-dev": { 94 | "herrera-io/box": "~1.6", 95 | "mockery/mockery": "~0.9" 96 | }, 97 | "bin": [ 98 | "bin/apigen" 99 | ], 100 | "type": "library", 101 | "extra": { 102 | "branch-alias": { 103 | "dev-master": "4.1.0-dev" 104 | } 105 | }, 106 | "autoload": { 107 | "psr-4": { 108 | "ApiGen\\": "src" 109 | } 110 | }, 111 | "notification-url": "https://packagist.org/downloads/", 112 | "license": [ 113 | "MIT" 114 | ], 115 | "authors": [ 116 | { 117 | "name": "David Grudl", 118 | "homepage": "http://davidgrudl.com" 119 | }, 120 | { 121 | "name": "Ondřej Nešpor", 122 | "homepage": "https://github.com/andrewsville" 123 | }, 124 | { 125 | "name": "Jaroslav Hanslík", 126 | "homepage": "https://github.com/kukulich" 127 | }, 128 | { 129 | "name": "Tomáš Votruba", 130 | "email": "tomas.vot@gmail.com" 131 | }, 132 | { 133 | "name": "Olivier Laviale", 134 | "homepage": "https://github.com/olvlvl" 135 | } 136 | ], 137 | "description": "PHP source code API generator", 138 | "homepage": "http://apigen.org/", 139 | "keywords": [ 140 | "api", 141 | "documentation", 142 | "generator", 143 | "phpdoc" 144 | ], 145 | "time": "2015-11-29T20:11:30+00:00" 146 | }, 147 | { 148 | "name": "apigen/theme-bootstrap", 149 | "version": "v1.1.3", 150 | "source": { 151 | "type": "git", 152 | "url": "https://github.com/ApiGen/ThemeBootstrap.git", 153 | "reference": "55a35b4a3a9a5fcaa6a8fc43fb304983cab98c6c" 154 | }, 155 | "dist": { 156 | "type": "zip", 157 | "url": "https://api.github.com/repos/ApiGen/ThemeBootstrap/zipball/55a35b4a3a9a5fcaa6a8fc43fb304983cab98c6c", 158 | "reference": "55a35b4a3a9a5fcaa6a8fc43fb304983cab98c6c", 159 | "shasum": "" 160 | }, 161 | "require": { 162 | "latte/latte": "~2.2" 163 | }, 164 | "type": "library", 165 | "notification-url": "https://packagist.org/downloads/", 166 | "license": [ 167 | "MIT" 168 | ], 169 | "authors": [ 170 | { 171 | "name": "Tomáš Votruba", 172 | "email": "tomas.vot@gmail.com" 173 | }, 174 | { 175 | "name": "Olivier Laviale", 176 | "homepage": "https://github.com/olvlvl" 177 | } 178 | ], 179 | "description": "Twitter Bootstrap theme for ApiGen", 180 | "homepage": "http://apigen.org/", 181 | "abandoned": "apigen/apigen", 182 | "time": "2015-10-11T14:52:50+00:00" 183 | }, 184 | { 185 | "name": "apigen/theme-default", 186 | "version": "v1.0.2", 187 | "source": { 188 | "type": "git", 189 | "url": "https://github.com/ApiGen/ThemeDefault.git", 190 | "reference": "51648cf83645d9ae6c655fe46bcd26a347d45336" 191 | }, 192 | "dist": { 193 | "type": "zip", 194 | "url": "https://api.github.com/repos/ApiGen/ThemeDefault/zipball/51648cf83645d9ae6c655fe46bcd26a347d45336", 195 | "reference": "51648cf83645d9ae6c655fe46bcd26a347d45336", 196 | "shasum": "" 197 | }, 198 | "require": { 199 | "latte/latte": "~2.2" 200 | }, 201 | "type": "library", 202 | "notification-url": "https://packagist.org/downloads/", 203 | "license": [ 204 | "MIT" 205 | ], 206 | "authors": [ 207 | { 208 | "name": "David Grudl", 209 | "homepage": "http://davidgrudl.com" 210 | }, 211 | { 212 | "name": "Ondřej Nešpor", 213 | "homepage": "https://github.com/andrewsville" 214 | }, 215 | { 216 | "name": "Jaroslav Hanslík", 217 | "homepage": "https://github.com/kukulich" 218 | }, 219 | { 220 | "name": "Tomáš Votruba", 221 | "email": "tomas.vot@gmail.com" 222 | }, 223 | { 224 | "name": "Olivier Laviale", 225 | "homepage": "https://github.com/olvlvl" 226 | } 227 | ], 228 | "description": "Default theme for ApiGen", 229 | "homepage": "http://apigen.org/", 230 | "abandoned": "apigen/apigen", 231 | "time": "2015-10-11T14:55:30+00:00" 232 | }, 233 | { 234 | "name": "dealerdirect/phpcodesniffer-composer-installer", 235 | "version": "v0.7.1", 236 | "source": { 237 | "type": "git", 238 | "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git", 239 | "reference": "fe390591e0241955f22eb9ba327d137e501c771c" 240 | }, 241 | "dist": { 242 | "type": "zip", 243 | "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/fe390591e0241955f22eb9ba327d137e501c771c", 244 | "reference": "fe390591e0241955f22eb9ba327d137e501c771c", 245 | "shasum": "" 246 | }, 247 | "require": { 248 | "composer-plugin-api": "^1.0 || ^2.0", 249 | "php": ">=5.3", 250 | "squizlabs/php_codesniffer": "^2.0 || ^3.0 || ^4.0" 251 | }, 252 | "require-dev": { 253 | "composer/composer": "*", 254 | "phpcompatibility/php-compatibility": "^9.0", 255 | "sensiolabs/security-checker": "^4.1.0" 256 | }, 257 | "type": "composer-plugin", 258 | "extra": { 259 | "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" 260 | }, 261 | "autoload": { 262 | "psr-4": { 263 | "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" 264 | } 265 | }, 266 | "notification-url": "https://packagist.org/downloads/", 267 | "license": [ 268 | "MIT" 269 | ], 270 | "authors": [ 271 | { 272 | "name": "Franck Nijhof", 273 | "email": "franck.nijhof@dealerdirect.com", 274 | "homepage": "http://www.frenck.nl", 275 | "role": "Developer / IT Manager" 276 | } 277 | ], 278 | "description": "PHP_CodeSniffer Standards Composer Installer Plugin", 279 | "homepage": "http://www.dealerdirect.com", 280 | "keywords": [ 281 | "PHPCodeSniffer", 282 | "PHP_CodeSniffer", 283 | "code quality", 284 | "codesniffer", 285 | "composer", 286 | "installer", 287 | "phpcs", 288 | "plugin", 289 | "qa", 290 | "quality", 291 | "standard", 292 | "standards", 293 | "style guide", 294 | "stylecheck", 295 | "tests" 296 | ], 297 | "time": "2020-12-07T18:04:37+00:00" 298 | }, 299 | { 300 | "name": "herrera-io/json", 301 | "version": "1.0.3", 302 | "source": { 303 | "type": "git", 304 | "url": "https://github.com/kherge-php/json.git", 305 | "reference": "60c696c9370a1e5136816ca557c17f82a6fa83f1" 306 | }, 307 | "dist": { 308 | "type": "zip", 309 | "url": "https://api.github.com/repos/kherge-php/json/zipball/60c696c9370a1e5136816ca557c17f82a6fa83f1", 310 | "reference": "60c696c9370a1e5136816ca557c17f82a6fa83f1", 311 | "shasum": "" 312 | }, 313 | "require": { 314 | "ext-json": "*", 315 | "justinrainbow/json-schema": ">=1.0,<2.0-dev", 316 | "php": ">=5.3.3", 317 | "seld/jsonlint": ">=1.0,<2.0-dev" 318 | }, 319 | "require-dev": { 320 | "herrera-io/phpunit-test-case": "1.*", 321 | "mikey179/vfsstream": "1.1.0", 322 | "phpunit/phpunit": "3.7.*" 323 | }, 324 | "type": "library", 325 | "extra": { 326 | "branch-alias": { 327 | "dev-master": "1.0-dev" 328 | } 329 | }, 330 | "autoload": { 331 | "files": [ 332 | "src/lib/json_version.php" 333 | ], 334 | "psr-0": { 335 | "Herrera\\Json": "src/lib" 336 | } 337 | }, 338 | "notification-url": "https://packagist.org/downloads/", 339 | "license": [ 340 | "MIT" 341 | ], 342 | "authors": [ 343 | { 344 | "name": "Kevin Herrera", 345 | "email": "kevin@herrera.io", 346 | "homepage": "http://kevin.herrera.io" 347 | } 348 | ], 349 | "description": "A library for simplifying JSON linting and validation.", 350 | "homepage": "http://herrera-io.github.com/php-json", 351 | "keywords": [ 352 | "json", 353 | "lint", 354 | "schema", 355 | "validate" 356 | ], 357 | "abandoned": "kherge/json", 358 | "time": "2013-10-30T16:51:34+00:00" 359 | }, 360 | { 361 | "name": "herrera-io/phar-update", 362 | "version": "2.0.0", 363 | "source": { 364 | "type": "git", 365 | "url": "https://github.com/kherge-abandoned/php-phar-update.git", 366 | "reference": "15643c90d3d43620a4f45c910e6afb7a0ad4b488" 367 | }, 368 | "dist": { 369 | "type": "zip", 370 | "url": "https://api.github.com/repos/kherge-abandoned/php-phar-update/zipball/15643c90d3d43620a4f45c910e6afb7a0ad4b488", 371 | "reference": "15643c90d3d43620a4f45c910e6afb7a0ad4b488", 372 | "shasum": "" 373 | }, 374 | "require": { 375 | "herrera-io/json": "1.*", 376 | "herrera-io/version": "1.*", 377 | "php": ">=5.3.3" 378 | }, 379 | "require-dev": { 380 | "herrera-io/phpunit-test-case": "1.*", 381 | "mikey179/vfsstream": "1.1.0", 382 | "phpunit/phpunit": "3.7.*" 383 | }, 384 | "type": "library", 385 | "extra": { 386 | "branch-alias": { 387 | "dev-master": "2.0-dev" 388 | } 389 | }, 390 | "autoload": { 391 | "files": [ 392 | "src/lib/constants.php" 393 | ], 394 | "psr-0": { 395 | "Herrera\\Phar\\Update": "src/lib" 396 | } 397 | }, 398 | "notification-url": "https://packagist.org/downloads/", 399 | "license": [ 400 | "MIT" 401 | ], 402 | "authors": [ 403 | { 404 | "name": "Kevin Herrera", 405 | "email": "kevin@herrera.io", 406 | "homepage": "http://kevin.herrera.io" 407 | } 408 | ], 409 | "description": "A library for self-updating Phars.", 410 | "homepage": "http://herrera-io.github.com/php-phar-update", 411 | "keywords": [ 412 | "phar", 413 | "update" 414 | ], 415 | "abandoned": true, 416 | "time": "2013-11-09T17:13:13+00:00" 417 | }, 418 | { 419 | "name": "herrera-io/version", 420 | "version": "1.1.1", 421 | "source": { 422 | "type": "git", 423 | "url": "https://github.com/kherge-abandoned/php-version.git", 424 | "reference": "d39d9642b92a04d8b8a28b871b797a35a2545e85" 425 | }, 426 | "dist": { 427 | "type": "zip", 428 | "url": "https://api.github.com/repos/kherge-abandoned/php-version/zipball/d39d9642b92a04d8b8a28b871b797a35a2545e85", 429 | "reference": "d39d9642b92a04d8b8a28b871b797a35a2545e85", 430 | "shasum": "" 431 | }, 432 | "require": { 433 | "php": ">=5.3.3" 434 | }, 435 | "require-dev": { 436 | "herrera-io/phpunit-test-case": "1.*", 437 | "phpunit/phpunit": "3.7.*" 438 | }, 439 | "type": "library", 440 | "extra": { 441 | "branch-alias": { 442 | "dev-master": "1.1.x-dev" 443 | } 444 | }, 445 | "autoload": { 446 | "psr-0": { 447 | "Herrera\\Version": "src/lib" 448 | } 449 | }, 450 | "notification-url": "https://packagist.org/downloads/", 451 | "license": [ 452 | "MIT" 453 | ], 454 | "authors": [ 455 | { 456 | "name": "Kevin Herrera", 457 | "email": "kevin@herrera.io", 458 | "homepage": "http://kevin.herrera.io" 459 | } 460 | ], 461 | "description": "A library for creating, editing, and comparing semantic versioning numbers.", 462 | "homepage": "http://github.com/herrera-io/php-version", 463 | "keywords": [ 464 | "semantic", 465 | "version" 466 | ], 467 | "abandoned": "kherge/semver", 468 | "time": "2014-05-27T05:29:25+00:00" 469 | }, 470 | { 471 | "name": "justinrainbow/json-schema", 472 | "version": "1.6.1", 473 | "source": { 474 | "type": "git", 475 | "url": "https://github.com/justinrainbow/json-schema.git", 476 | "reference": "cc84765fb7317f6b07bd8ac78364747f95b86341" 477 | }, 478 | "dist": { 479 | "type": "zip", 480 | "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/cc84765fb7317f6b07bd8ac78364747f95b86341", 481 | "reference": "cc84765fb7317f6b07bd8ac78364747f95b86341", 482 | "shasum": "" 483 | }, 484 | "require": { 485 | "php": ">=5.3.29" 486 | }, 487 | "require-dev": { 488 | "json-schema/json-schema-test-suite": "1.1.0", 489 | "phpdocumentor/phpdocumentor": "~2", 490 | "phpunit/phpunit": "~3.7" 491 | }, 492 | "bin": [ 493 | "bin/validate-json" 494 | ], 495 | "type": "library", 496 | "extra": { 497 | "branch-alias": { 498 | "dev-master": "1.6.x-dev" 499 | } 500 | }, 501 | "autoload": { 502 | "psr-4": { 503 | "JsonSchema\\": "src/JsonSchema/" 504 | } 505 | }, 506 | "notification-url": "https://packagist.org/downloads/", 507 | "license": [ 508 | "BSD-3-Clause" 509 | ], 510 | "authors": [ 511 | { 512 | "name": "Bruno Prieto Reis", 513 | "email": "bruno.p.reis@gmail.com" 514 | }, 515 | { 516 | "name": "Justin Rainbow", 517 | "email": "justin.rainbow@gmail.com" 518 | }, 519 | { 520 | "name": "Igor Wiedler", 521 | "email": "igor@wiedler.ch" 522 | }, 523 | { 524 | "name": "Robert Schönthal", 525 | "email": "seroscho@googlemail.com" 526 | } 527 | ], 528 | "description": "A library to validate a json schema.", 529 | "homepage": "https://github.com/justinrainbow/json-schema", 530 | "keywords": [ 531 | "json", 532 | "schema" 533 | ], 534 | "time": "2016-01-25T15:43:01+00:00" 535 | }, 536 | { 537 | "name": "kdyby/events", 538 | "version": "v2.4.1", 539 | "source": { 540 | "type": "git", 541 | "url": "https://github.com/Kdyby/Events.git", 542 | "reference": "d8a0e8a64a59f501996f8f9591aa3f950208f091" 543 | }, 544 | "dist": { 545 | "type": "zip", 546 | "url": "https://api.github.com/repos/Kdyby/Events/zipball/d8a0e8a64a59f501996f8f9591aa3f950208f091", 547 | "reference": "d8a0e8a64a59f501996f8f9591aa3f950208f091", 548 | "shasum": "" 549 | }, 550 | "require": { 551 | "nette/di": "~2.3@dev", 552 | "nette/utils": "~2.3@dev" 553 | }, 554 | "require-dev": { 555 | "latte/latte": "~2.3@dev", 556 | "nette/application": "~2.3@dev", 557 | "nette/bootstrap": "~2.3@dev", 558 | "nette/caching": "~2.3@dev", 559 | "nette/component-model": "~2.2@dev", 560 | "nette/database": "~2.3@dev", 561 | "nette/deprecated": "~2.3@dev", 562 | "nette/di": "~2.3@dev", 563 | "nette/finder": "~2.3@dev", 564 | "nette/forms": "~2.3@dev", 565 | "nette/http": "~2.3@dev", 566 | "nette/mail": "~2.3@dev", 567 | "nette/neon": "~2.3@dev", 568 | "nette/php-generator": "~2.3@dev", 569 | "nette/reflection": "~2.3@dev", 570 | "nette/robot-loader": "~2.3@dev", 571 | "nette/safe-stream": "~2.3@dev", 572 | "nette/security": "~2.3@dev", 573 | "nette/tester": "~1.4", 574 | "nette/tokenizer": "~2.2@dev", 575 | "nette/utils": "~2.3@dev", 576 | "symfony/event-dispatcher": "~2.3", 577 | "tracy/tracy": "~2.3@dev" 578 | }, 579 | "type": "library", 580 | "extra": { 581 | "branch-alias": { 582 | "dev-master": "2.4-dev" 583 | } 584 | }, 585 | "autoload": { 586 | "psr-0": { 587 | "Kdyby\\Events\\": "src/" 588 | }, 589 | "classmap": [ 590 | "src/Kdyby/Events/exceptions.php" 591 | ], 592 | "files": [ 593 | "src/Doctrine/compatibility.php" 594 | ] 595 | }, 596 | "notification-url": "https://packagist.org/downloads/", 597 | "license": [ 598 | "BSD-3-Clause", 599 | "GPL-2.0", 600 | "GPL-3.0" 601 | ], 602 | "authors": [ 603 | { 604 | "name": "Filip Procházka", 605 | "email": "filip@prochazka.su", 606 | "homepage": "http://filip-prochazka.com" 607 | } 608 | ], 609 | "description": "Events for Nette Framework", 610 | "homepage": "http://kdyby.org", 611 | "keywords": [ 612 | "kdyby", 613 | "nette" 614 | ], 615 | "time": "2016-04-19T11:19:31+00:00" 616 | }, 617 | { 618 | "name": "kukulich/fshl", 619 | "version": "2.1.0", 620 | "source": { 621 | "type": "git", 622 | "url": "https://github.com/kukulich/fshl.git", 623 | "reference": "974c294ade5d76c0c16b6fe3fd3a584ba999b24f" 624 | }, 625 | "dist": { 626 | "type": "zip", 627 | "url": "https://api.github.com/repos/kukulich/fshl/zipball/974c294ade5d76c0c16b6fe3fd3a584ba999b24f", 628 | "reference": "974c294ade5d76c0c16b6fe3fd3a584ba999b24f", 629 | "shasum": "" 630 | }, 631 | "require": { 632 | "php": ">=5.3" 633 | }, 634 | "type": "library", 635 | "autoload": { 636 | "psr-0": { 637 | "FSHL": "./" 638 | } 639 | }, 640 | "notification-url": "https://packagist.org/downloads/", 641 | "license": [ 642 | "GPL-2.0+" 643 | ], 644 | "authors": [ 645 | { 646 | "name": "Jaroslav Hanslík", 647 | "homepage": "https://github.com/kukulich" 648 | } 649 | ], 650 | "description": "FSHL is a free, open source, universal, fast syntax highlighter written in PHP.", 651 | "homepage": "http://fshl.kukulich.cz/", 652 | "keywords": [ 653 | "highlight", 654 | "library", 655 | "syntax" 656 | ], 657 | "time": "2012-09-08T19:00:07+00:00" 658 | }, 659 | { 660 | "name": "latte/latte", 661 | "version": "v2.3.4", 662 | "source": { 663 | "type": "git", 664 | "url": "https://github.com/nette/latte.git", 665 | "reference": "5e891af999776d2204a9d06ad66ad8fa0bcd4f8b" 666 | }, 667 | "dist": { 668 | "type": "zip", 669 | "url": "https://api.github.com/repos/nette/latte/zipball/5e891af999776d2204a9d06ad66ad8fa0bcd4f8b", 670 | "reference": "5e891af999776d2204a9d06ad66ad8fa0bcd4f8b", 671 | "shasum": "" 672 | }, 673 | "require": { 674 | "ext-tokenizer": "*", 675 | "php": ">=5.3.1" 676 | }, 677 | "require-dev": { 678 | "nette/tester": "~1.3" 679 | }, 680 | "suggest": { 681 | "ext-fileinfo": "to use filter |datastream", 682 | "ext-mbstring": "to use filters like lower, upper, capitalize, ..." 683 | }, 684 | "type": "library", 685 | "autoload": { 686 | "classmap": [ 687 | "src/" 688 | ] 689 | }, 690 | "notification-url": "https://packagist.org/downloads/", 691 | "license": [ 692 | "BSD-3-Clause", 693 | "GPL-2.0", 694 | "GPL-3.0" 695 | ], 696 | "authors": [ 697 | { 698 | "name": "David Grudl", 699 | "homepage": "http://davidgrudl.com" 700 | }, 701 | { 702 | "name": "Nette Community", 703 | "homepage": "http://nette.org/contributors" 704 | } 705 | ], 706 | "description": "Latte: the amazing template engine for PHP", 707 | "homepage": "http://latte.nette.org", 708 | "keywords": [ 709 | "templating", 710 | "twig" 711 | ], 712 | "time": "2015-08-23T12:36:55+00:00" 713 | }, 714 | { 715 | "name": "michelf/php-markdown", 716 | "version": "1.8.0", 717 | "source": { 718 | "type": "git", 719 | "url": "https://github.com/michelf/php-markdown.git", 720 | "reference": "01ab082b355bf188d907b9929cd99b2923053495" 721 | }, 722 | "dist": { 723 | "type": "zip", 724 | "url": "https://api.github.com/repos/michelf/php-markdown/zipball/01ab082b355bf188d907b9929cd99b2923053495", 725 | "reference": "01ab082b355bf188d907b9929cd99b2923053495", 726 | "shasum": "" 727 | }, 728 | "require": { 729 | "php": ">=5.3.0" 730 | }, 731 | "type": "library", 732 | "autoload": { 733 | "psr-4": { 734 | "Michelf\\": "Michelf/" 735 | } 736 | }, 737 | "notification-url": "https://packagist.org/downloads/", 738 | "license": [ 739 | "BSD-3-Clause" 740 | ], 741 | "authors": [ 742 | { 743 | "name": "Michel Fortin", 744 | "email": "michel.fortin@michelf.ca", 745 | "homepage": "https://michelf.ca/", 746 | "role": "Developer" 747 | }, 748 | { 749 | "name": "John Gruber", 750 | "homepage": "https://daringfireball.net/" 751 | } 752 | ], 753 | "description": "PHP Markdown", 754 | "homepage": "https://michelf.ca/projects/php-markdown/", 755 | "keywords": [ 756 | "markdown" 757 | ], 758 | "time": "2018-01-15T00:49:33+00:00" 759 | }, 760 | { 761 | "name": "nette/application", 762 | "version": "v2.4.16", 763 | "source": { 764 | "type": "git", 765 | "url": "https://github.com/nette/application.git", 766 | "reference": "e32c04de211873c792d13d9a00c50083b8e05a23" 767 | }, 768 | "dist": { 769 | "type": "zip", 770 | "url": "https://api.github.com/repos/nette/application/zipball/e32c04de211873c792d13d9a00c50083b8e05a23", 771 | "reference": "e32c04de211873c792d13d9a00c50083b8e05a23", 772 | "shasum": "" 773 | }, 774 | "require": { 775 | "nette/component-model": "^2.3", 776 | "nette/http": "^2.2", 777 | "nette/reflection": "^2.2", 778 | "nette/utils": "^2.4", 779 | "php": ">=5.6.0" 780 | }, 781 | "conflict": { 782 | "nette/di": "<2.4", 783 | "nette/forms": "<2.4", 784 | "nette/latte": "<2.4", 785 | "nette/nette": "<2.2" 786 | }, 787 | "require-dev": { 788 | "latte/latte": "^2.4.3", 789 | "mockery/mockery": "^1.0", 790 | "nette/di": "^2.4", 791 | "nette/forms": "^2.4", 792 | "nette/robot-loader": "^2.4.2 || ^3.0", 793 | "nette/security": "^2.4", 794 | "nette/tester": "^2.0", 795 | "tracy/tracy": "^2.4" 796 | }, 797 | "suggest": { 798 | "latte/latte": "Allows using Latte in templates", 799 | "nette/forms": "Allows to use Nette\\Application\\UI\\Form" 800 | }, 801 | "type": "library", 802 | "extra": { 803 | "branch-alias": { 804 | "dev-master": "2.4-dev" 805 | } 806 | }, 807 | "autoload": { 808 | "classmap": [ 809 | "src/" 810 | ] 811 | }, 812 | "notification-url": "https://packagist.org/downloads/", 813 | "license": [ 814 | "BSD-3-Clause", 815 | "GPL-2.0", 816 | "GPL-3.0" 817 | ], 818 | "authors": [ 819 | { 820 | "name": "David Grudl", 821 | "homepage": "https://davidgrudl.com" 822 | }, 823 | { 824 | "name": "Nette Community", 825 | "homepage": "https://nette.org/contributors" 826 | } 827 | ], 828 | "description": "🏆 Nette Application: a full-stack component-based MVC kernel for PHP that helps you write powerful and modern web applications. Write less, have cleaner code and your work will bring you joy.", 829 | "homepage": "https://nette.org", 830 | "keywords": [ 831 | "Forms", 832 | "component-based", 833 | "control", 834 | "framework", 835 | "mvc", 836 | "mvp", 837 | "nette", 838 | "presenter", 839 | "routing", 840 | "seo" 841 | ], 842 | "time": "2020-08-25T01:51:49+00:00" 843 | }, 844 | { 845 | "name": "nette/bootstrap", 846 | "version": "v2.4.6", 847 | "source": { 848 | "type": "git", 849 | "url": "https://github.com/nette/bootstrap.git", 850 | "reference": "268816e3f1bb7426c3a4ceec2bd38a036b532543" 851 | }, 852 | "dist": { 853 | "type": "zip", 854 | "url": "https://api.github.com/repos/nette/bootstrap/zipball/268816e3f1bb7426c3a4ceec2bd38a036b532543", 855 | "reference": "268816e3f1bb7426c3a4ceec2bd38a036b532543", 856 | "shasum": "" 857 | }, 858 | "require": { 859 | "nette/di": "~2.4.7", 860 | "nette/utils": "~2.4", 861 | "php": ">=5.6.0" 862 | }, 863 | "conflict": { 864 | "nette/nette": "<2.2" 865 | }, 866 | "require-dev": { 867 | "latte/latte": "~2.2", 868 | "nette/application": "~2.3", 869 | "nette/caching": "~2.3", 870 | "nette/database": "~2.3", 871 | "nette/forms": "~2.3", 872 | "nette/http": "~2.4.0", 873 | "nette/mail": "~2.3", 874 | "nette/robot-loader": "^2.4.2 || ^3.0", 875 | "nette/safe-stream": "~2.2", 876 | "nette/security": "~2.3", 877 | "nette/tester": "~2.0", 878 | "tracy/tracy": "^2.4.1" 879 | }, 880 | "suggest": { 881 | "nette/robot-loader": "to use Configurator::createRobotLoader()", 882 | "tracy/tracy": "to use Configurator::enableTracy()" 883 | }, 884 | "type": "library", 885 | "extra": { 886 | "branch-alias": { 887 | "dev-master": "2.4-dev" 888 | } 889 | }, 890 | "autoload": { 891 | "classmap": [ 892 | "src/" 893 | ] 894 | }, 895 | "notification-url": "https://packagist.org/downloads/", 896 | "license": [ 897 | "BSD-3-Clause", 898 | "GPL-2.0", 899 | "GPL-3.0" 900 | ], 901 | "authors": [ 902 | { 903 | "name": "David Grudl", 904 | "homepage": "https://davidgrudl.com" 905 | }, 906 | { 907 | "name": "Nette Community", 908 | "homepage": "https://nette.org/contributors" 909 | } 910 | ], 911 | "description": "? Nette Bootstrap: the simple way to configure and bootstrap your Nette application.", 912 | "homepage": "https://nette.org", 913 | "keywords": [ 914 | "bootstrapping", 915 | "configurator", 916 | "nette" 917 | ], 918 | "time": "2018-05-17T12:52:20+00:00" 919 | }, 920 | { 921 | "name": "nette/caching", 922 | "version": "v2.5.9", 923 | "source": { 924 | "type": "git", 925 | "url": "https://github.com/nette/caching.git", 926 | "reference": "d93ef446836a5a0ff7ef78d5ffebb7fe043f9953" 927 | }, 928 | "dist": { 929 | "type": "zip", 930 | "url": "https://api.github.com/repos/nette/caching/zipball/d93ef446836a5a0ff7ef78d5ffebb7fe043f9953", 931 | "reference": "d93ef446836a5a0ff7ef78d5ffebb7fe043f9953", 932 | "shasum": "" 933 | }, 934 | "require": { 935 | "nette/finder": "^2.2 || ~3.0.0", 936 | "nette/utils": "^2.4 || ~3.0.0", 937 | "php": ">=5.6.0" 938 | }, 939 | "conflict": { 940 | "nette/nette": "<2.2" 941 | }, 942 | "require-dev": { 943 | "latte/latte": "^2.4", 944 | "nette/di": "^2.4 || ~3.0.0", 945 | "nette/tester": "^2.0", 946 | "tracy/tracy": "^2.4" 947 | }, 948 | "suggest": { 949 | "ext-pdo_sqlite": "to use SQLiteStorage or SQLiteJournal" 950 | }, 951 | "type": "library", 952 | "extra": { 953 | "branch-alias": { 954 | "dev-master": "2.5-dev" 955 | } 956 | }, 957 | "autoload": { 958 | "classmap": [ 959 | "src/" 960 | ] 961 | }, 962 | "notification-url": "https://packagist.org/downloads/", 963 | "license": [ 964 | "BSD-3-Clause", 965 | "GPL-2.0", 966 | "GPL-3.0" 967 | ], 968 | "authors": [ 969 | { 970 | "name": "David Grudl", 971 | "homepage": "https://davidgrudl.com" 972 | }, 973 | { 974 | "name": "Nette Community", 975 | "homepage": "https://nette.org/contributors" 976 | } 977 | ], 978 | "description": "⏱ Nette Caching: library with easy-to-use API and many cache backends.", 979 | "homepage": "https://nette.org", 980 | "keywords": [ 981 | "cache", 982 | "journal", 983 | "memcached", 984 | "nette", 985 | "sqlite" 986 | ], 987 | "time": "2019-11-19T18:38:13+00:00" 988 | }, 989 | { 990 | "name": "nette/component-model", 991 | "version": "v2.4.0", 992 | "source": { 993 | "type": "git", 994 | "url": "https://github.com/nette/component-model.git", 995 | "reference": "6e7980f5ddec31f68a39e767799b1b0be9dd1014" 996 | }, 997 | "dist": { 998 | "type": "zip", 999 | "url": "https://api.github.com/repos/nette/component-model/zipball/6e7980f5ddec31f68a39e767799b1b0be9dd1014", 1000 | "reference": "6e7980f5ddec31f68a39e767799b1b0be9dd1014", 1001 | "shasum": "" 1002 | }, 1003 | "require": { 1004 | "nette/utils": "^2.5 || ~3.0.0", 1005 | "php": ">=5.6.0" 1006 | }, 1007 | "conflict": { 1008 | "nette/application": "<2.4", 1009 | "nette/nette": "<2.2" 1010 | }, 1011 | "require-dev": { 1012 | "nette/tester": "^2.0", 1013 | "tracy/tracy": "^2.3" 1014 | }, 1015 | "type": "library", 1016 | "extra": { 1017 | "branch-alias": { 1018 | "dev-master": "2.4-dev" 1019 | } 1020 | }, 1021 | "autoload": { 1022 | "classmap": [ 1023 | "src/" 1024 | ] 1025 | }, 1026 | "notification-url": "https://packagist.org/downloads/", 1027 | "license": [ 1028 | "BSD-3-Clause", 1029 | "GPL-2.0", 1030 | "GPL-3.0" 1031 | ], 1032 | "authors": [ 1033 | { 1034 | "name": "David Grudl", 1035 | "homepage": "https://davidgrudl.com" 1036 | }, 1037 | { 1038 | "name": "Nette Community", 1039 | "homepage": "https://nette.org/contributors" 1040 | } 1041 | ], 1042 | "description": "⚛ Nette Component Model", 1043 | "homepage": "https://nette.org", 1044 | "keywords": [ 1045 | "components", 1046 | "nette" 1047 | ], 1048 | "time": "2018-03-20T16:32:50+00:00" 1049 | }, 1050 | { 1051 | "name": "nette/di", 1052 | "version": "v2.4.15", 1053 | "source": { 1054 | "type": "git", 1055 | "url": "https://github.com/nette/di.git", 1056 | "reference": "d0561b8f77e8ef2ed6d83328860e16c81a5a8649" 1057 | }, 1058 | "dist": { 1059 | "type": "zip", 1060 | "url": "https://api.github.com/repos/nette/di/zipball/d0561b8f77e8ef2ed6d83328860e16c81a5a8649", 1061 | "reference": "d0561b8f77e8ef2ed6d83328860e16c81a5a8649", 1062 | "shasum": "" 1063 | }, 1064 | "require": { 1065 | "ext-tokenizer": "*", 1066 | "nette/neon": "^2.3.3 || ~3.0.0", 1067 | "nette/php-generator": "^2.6.1 || ^3.0.0", 1068 | "nette/utils": "^2.5.0 || ~3.0.0", 1069 | "php": ">=5.6.0" 1070 | }, 1071 | "conflict": { 1072 | "nette/bootstrap": "<2.4", 1073 | "nette/nette": "<2.2" 1074 | }, 1075 | "require-dev": { 1076 | "nette/tester": "^2.0", 1077 | "tracy/tracy": "^2.3" 1078 | }, 1079 | "type": "library", 1080 | "extra": { 1081 | "branch-alias": { 1082 | "dev-master": "2.4-dev" 1083 | } 1084 | }, 1085 | "autoload": { 1086 | "classmap": [ 1087 | "src/" 1088 | ] 1089 | }, 1090 | "notification-url": "https://packagist.org/downloads/", 1091 | "license": [ 1092 | "BSD-3-Clause", 1093 | "GPL-2.0", 1094 | "GPL-3.0" 1095 | ], 1096 | "authors": [ 1097 | { 1098 | "name": "David Grudl", 1099 | "homepage": "https://davidgrudl.com" 1100 | }, 1101 | { 1102 | "name": "Nette Community", 1103 | "homepage": "https://nette.org/contributors" 1104 | } 1105 | ], 1106 | "description": "? Nette Dependency Injection Container: Flexible, compiled and full-featured DIC with perfectly usable autowiring and support for all new PHP 7.1 features.", 1107 | "homepage": "https://nette.org", 1108 | "keywords": [ 1109 | "compiled", 1110 | "di", 1111 | "dic", 1112 | "factory", 1113 | "ioc", 1114 | "nette", 1115 | "static" 1116 | ], 1117 | "time": "2019-01-30T13:26:05+00:00" 1118 | }, 1119 | { 1120 | "name": "nette/finder", 1121 | "version": "v2.5.2", 1122 | "source": { 1123 | "type": "git", 1124 | "url": "https://github.com/nette/finder.git", 1125 | "reference": "4ad2c298eb8c687dd0e74ae84206a4186eeaed50" 1126 | }, 1127 | "dist": { 1128 | "type": "zip", 1129 | "url": "https://api.github.com/repos/nette/finder/zipball/4ad2c298eb8c687dd0e74ae84206a4186eeaed50", 1130 | "reference": "4ad2c298eb8c687dd0e74ae84206a4186eeaed50", 1131 | "shasum": "" 1132 | }, 1133 | "require": { 1134 | "nette/utils": "^2.4 || ^3.0", 1135 | "php": ">=7.1" 1136 | }, 1137 | "conflict": { 1138 | "nette/nette": "<2.2" 1139 | }, 1140 | "require-dev": { 1141 | "nette/tester": "^2.0", 1142 | "phpstan/phpstan": "^0.12", 1143 | "tracy/tracy": "^2.3" 1144 | }, 1145 | "type": "library", 1146 | "extra": { 1147 | "branch-alias": { 1148 | "dev-master": "2.5-dev" 1149 | } 1150 | }, 1151 | "autoload": { 1152 | "classmap": [ 1153 | "src/" 1154 | ] 1155 | }, 1156 | "notification-url": "https://packagist.org/downloads/", 1157 | "license": [ 1158 | "BSD-3-Clause", 1159 | "GPL-2.0", 1160 | "GPL-3.0" 1161 | ], 1162 | "authors": [ 1163 | { 1164 | "name": "David Grudl", 1165 | "homepage": "https://davidgrudl.com" 1166 | }, 1167 | { 1168 | "name": "Nette Community", 1169 | "homepage": "https://nette.org/contributors" 1170 | } 1171 | ], 1172 | "description": "🔍 Nette Finder: find files and directories with an intuitive API.", 1173 | "homepage": "https://nette.org", 1174 | "keywords": [ 1175 | "filesystem", 1176 | "glob", 1177 | "iterator", 1178 | "nette" 1179 | ], 1180 | "time": "2020-01-03T20:35:40+00:00" 1181 | }, 1182 | { 1183 | "name": "nette/http", 1184 | "version": "v2.4.11", 1185 | "source": { 1186 | "type": "git", 1187 | "url": "https://github.com/nette/http.git", 1188 | "reference": "3d75d11a880fe223bfa6bc7ca9822bdfe789e5a6" 1189 | }, 1190 | "dist": { 1191 | "type": "zip", 1192 | "url": "https://api.github.com/repos/nette/http/zipball/3d75d11a880fe223bfa6bc7ca9822bdfe789e5a6", 1193 | "reference": "3d75d11a880fe223bfa6bc7ca9822bdfe789e5a6", 1194 | "shasum": "" 1195 | }, 1196 | "require": { 1197 | "nette/utils": "^2.4 || ~3.0.0", 1198 | "php": ">=5.6.0" 1199 | }, 1200 | "conflict": { 1201 | "nette/nette": "<2.2" 1202 | }, 1203 | "require-dev": { 1204 | "nette/di": "^2.4.8 || ~3.0.0", 1205 | "nette/tester": "^2.0", 1206 | "tracy/tracy": "^2.4" 1207 | }, 1208 | "suggest": { 1209 | "ext-fileinfo": "to detect type of uploaded files", 1210 | "nette/security": "allows use Nette\\Http\\UserStorage" 1211 | }, 1212 | "type": "library", 1213 | "extra": { 1214 | "branch-alias": { 1215 | "dev-master": "2.4-dev" 1216 | } 1217 | }, 1218 | "autoload": { 1219 | "classmap": [ 1220 | "src/" 1221 | ] 1222 | }, 1223 | "notification-url": "https://packagist.org/downloads/", 1224 | "license": [ 1225 | "BSD-3-Clause", 1226 | "GPL-2.0", 1227 | "GPL-3.0" 1228 | ], 1229 | "authors": [ 1230 | { 1231 | "name": "David Grudl", 1232 | "homepage": "https://davidgrudl.com" 1233 | }, 1234 | { 1235 | "name": "Nette Community", 1236 | "homepage": "https://nette.org/contributors" 1237 | } 1238 | ], 1239 | "description": "? Nette Http: abstraction for HTTP request, response and session. Provides careful data sanitization and utility for URL and cookies manipulation.", 1240 | "homepage": "https://nette.org", 1241 | "keywords": [ 1242 | "cookies", 1243 | "http", 1244 | "nette", 1245 | "proxy", 1246 | "request", 1247 | "response", 1248 | "security", 1249 | "session", 1250 | "url" 1251 | ], 1252 | "time": "2019-03-13T19:04:45+00:00" 1253 | }, 1254 | { 1255 | "name": "nette/mail", 1256 | "version": "v2.4.6", 1257 | "source": { 1258 | "type": "git", 1259 | "url": "https://github.com/nette/mail.git", 1260 | "reference": "431f1774034cc14ee6a795b6514fe6343f75a68e" 1261 | }, 1262 | "dist": { 1263 | "type": "zip", 1264 | "url": "https://api.github.com/repos/nette/mail/zipball/431f1774034cc14ee6a795b6514fe6343f75a68e", 1265 | "reference": "431f1774034cc14ee6a795b6514fe6343f75a68e", 1266 | "shasum": "" 1267 | }, 1268 | "require": { 1269 | "ext-iconv": "*", 1270 | "nette/utils": "^2.4 || ~3.0.0", 1271 | "php": ">=5.6.0" 1272 | }, 1273 | "conflict": { 1274 | "nette/nette": "<2.2" 1275 | }, 1276 | "require-dev": { 1277 | "nette/di": "^2.4 || ~3.0.0", 1278 | "nette/tester": "^2.0", 1279 | "tracy/tracy": "^2.4" 1280 | }, 1281 | "suggest": { 1282 | "ext-fileinfo": "to detect type of attached files" 1283 | }, 1284 | "type": "library", 1285 | "extra": { 1286 | "branch-alias": { 1287 | "dev-master": "2.4-dev" 1288 | } 1289 | }, 1290 | "autoload": { 1291 | "classmap": [ 1292 | "src/" 1293 | ] 1294 | }, 1295 | "notification-url": "https://packagist.org/downloads/", 1296 | "license": [ 1297 | "BSD-3-Clause", 1298 | "GPL-2.0", 1299 | "GPL-3.0" 1300 | ], 1301 | "authors": [ 1302 | { 1303 | "name": "David Grudl", 1304 | "homepage": "https://davidgrudl.com" 1305 | }, 1306 | { 1307 | "name": "Nette Community", 1308 | "homepage": "https://nette.org/contributors" 1309 | } 1310 | ], 1311 | "description": "? Nette Mail: handy email creation and transfer library for PHP with both text and MIME-compliant support.", 1312 | "homepage": "https://nette.org", 1313 | "keywords": [ 1314 | "mail", 1315 | "mailer", 1316 | "mime", 1317 | "nette", 1318 | "smtp" 1319 | ], 1320 | "time": "2018-11-21T22:35:13+00:00" 1321 | }, 1322 | { 1323 | "name": "nette/neon", 1324 | "version": "v2.4.3", 1325 | "source": { 1326 | "type": "git", 1327 | "url": "https://github.com/nette/neon.git", 1328 | "reference": "5e72b1dd3e2d34f0863c5561139a19df6a1ef398" 1329 | }, 1330 | "dist": { 1331 | "type": "zip", 1332 | "url": "https://api.github.com/repos/nette/neon/zipball/5e72b1dd3e2d34f0863c5561139a19df6a1ef398", 1333 | "reference": "5e72b1dd3e2d34f0863c5561139a19df6a1ef398", 1334 | "shasum": "" 1335 | }, 1336 | "require": { 1337 | "ext-iconv": "*", 1338 | "ext-json": "*", 1339 | "php": ">=5.6.0" 1340 | }, 1341 | "require-dev": { 1342 | "nette/tester": "~2.0", 1343 | "tracy/tracy": "^2.3" 1344 | }, 1345 | "type": "library", 1346 | "extra": { 1347 | "branch-alias": { 1348 | "dev-master": "2.4-dev" 1349 | } 1350 | }, 1351 | "autoload": { 1352 | "classmap": [ 1353 | "src/" 1354 | ] 1355 | }, 1356 | "notification-url": "https://packagist.org/downloads/", 1357 | "license": [ 1358 | "BSD-3-Clause", 1359 | "GPL-2.0", 1360 | "GPL-3.0" 1361 | ], 1362 | "authors": [ 1363 | { 1364 | "name": "David Grudl", 1365 | "homepage": "https://davidgrudl.com" 1366 | }, 1367 | { 1368 | "name": "Nette Community", 1369 | "homepage": "https://nette.org/contributors" 1370 | } 1371 | ], 1372 | "description": "? Nette NEON: encodes and decodes NEON file format.", 1373 | "homepage": "http://ne-on.org", 1374 | "keywords": [ 1375 | "export", 1376 | "import", 1377 | "neon", 1378 | "nette", 1379 | "yaml" 1380 | ], 1381 | "time": "2018-03-21T12:12:21+00:00" 1382 | }, 1383 | { 1384 | "name": "nette/php-generator", 1385 | "version": "v3.2.3", 1386 | "source": { 1387 | "type": "git", 1388 | "url": "https://github.com/nette/php-generator.git", 1389 | "reference": "aea6e81437bb238e5f0e5b5ce06337433908e63b" 1390 | }, 1391 | "dist": { 1392 | "type": "zip", 1393 | "url": "https://api.github.com/repos/nette/php-generator/zipball/aea6e81437bb238e5f0e5b5ce06337433908e63b", 1394 | "reference": "aea6e81437bb238e5f0e5b5ce06337433908e63b", 1395 | "shasum": "" 1396 | }, 1397 | "require": { 1398 | "nette/utils": "^2.4.2 || ~3.0.0", 1399 | "php": ">=7.1" 1400 | }, 1401 | "require-dev": { 1402 | "nette/tester": "^2.0", 1403 | "tracy/tracy": "^2.3" 1404 | }, 1405 | "type": "library", 1406 | "extra": { 1407 | "branch-alias": { 1408 | "dev-master": "3.2-dev" 1409 | } 1410 | }, 1411 | "autoload": { 1412 | "classmap": [ 1413 | "src/" 1414 | ] 1415 | }, 1416 | "notification-url": "https://packagist.org/downloads/", 1417 | "license": [ 1418 | "BSD-3-Clause", 1419 | "GPL-2.0", 1420 | "GPL-3.0" 1421 | ], 1422 | "authors": [ 1423 | { 1424 | "name": "David Grudl", 1425 | "homepage": "https://davidgrudl.com" 1426 | }, 1427 | { 1428 | "name": "Nette Community", 1429 | "homepage": "https://nette.org/contributors" 1430 | } 1431 | ], 1432 | "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 7.3 features.", 1433 | "homepage": "https://nette.org", 1434 | "keywords": [ 1435 | "code", 1436 | "nette", 1437 | "php", 1438 | "scaffolding" 1439 | ], 1440 | "time": "2019-07-05T13:01:56+00:00" 1441 | }, 1442 | { 1443 | "name": "nette/reflection", 1444 | "version": "v2.4.2", 1445 | "source": { 1446 | "type": "git", 1447 | "url": "https://github.com/nette/reflection.git", 1448 | "reference": "b12327e98ead74e87a1315e0d48182a702adf901" 1449 | }, 1450 | "dist": { 1451 | "type": "zip", 1452 | "url": "https://api.github.com/repos/nette/reflection/zipball/b12327e98ead74e87a1315e0d48182a702adf901", 1453 | "reference": "b12327e98ead74e87a1315e0d48182a702adf901", 1454 | "shasum": "" 1455 | }, 1456 | "require": { 1457 | "ext-tokenizer": "*", 1458 | "nette/caching": "^2.2 || ^3.0", 1459 | "nette/utils": "^2.4 || ^3.0", 1460 | "php": ">=5.6.0" 1461 | }, 1462 | "conflict": { 1463 | "nette/nette": "<2.2" 1464 | }, 1465 | "require-dev": { 1466 | "nette/di": "^2.4 || ^3.0", 1467 | "nette/tester": "^2.0", 1468 | "tracy/tracy": "^2.4" 1469 | }, 1470 | "type": "library", 1471 | "extra": { 1472 | "branch-alias": { 1473 | "dev-master": "2.4-dev" 1474 | } 1475 | }, 1476 | "autoload": { 1477 | "classmap": [ 1478 | "src/" 1479 | ] 1480 | }, 1481 | "notification-url": "https://packagist.org/downloads/", 1482 | "license": [ 1483 | "BSD-3-Clause", 1484 | "GPL-2.0", 1485 | "GPL-3.0" 1486 | ], 1487 | "authors": [ 1488 | { 1489 | "name": "David Grudl", 1490 | "homepage": "https://davidgrudl.com" 1491 | }, 1492 | { 1493 | "name": "Nette Community", 1494 | "homepage": "https://nette.org/contributors" 1495 | } 1496 | ], 1497 | "description": "Nette Reflection: docblock annotations parser and common reflection classes", 1498 | "homepage": "https://nette.org", 1499 | "keywords": [ 1500 | "annotation", 1501 | "nette", 1502 | "reflection" 1503 | ], 1504 | "abandoned": true, 1505 | "time": "2017-07-11T19:28:57+00:00" 1506 | }, 1507 | { 1508 | "name": "nette/robot-loader", 1509 | "version": "v2.4.4", 1510 | "source": { 1511 | "type": "git", 1512 | "url": "https://github.com/nette/robot-loader.git", 1513 | "reference": "1f7f8792ce4d94162959e6b766822d6051623bca" 1514 | }, 1515 | "dist": { 1516 | "type": "zip", 1517 | "url": "https://api.github.com/repos/nette/robot-loader/zipball/1f7f8792ce4d94162959e6b766822d6051623bca", 1518 | "reference": "1f7f8792ce4d94162959e6b766822d6051623bca", 1519 | "shasum": "" 1520 | }, 1521 | "require": { 1522 | "ext-tokenizer": "*", 1523 | "nette/caching": "~2.2", 1524 | "nette/finder": "~2.3", 1525 | "nette/utils": "~2.4", 1526 | "php": ">=5.6.0" 1527 | }, 1528 | "conflict": { 1529 | "nette/nette": "<2.2" 1530 | }, 1531 | "require-dev": { 1532 | "nette/tester": "~2.0", 1533 | "tracy/tracy": "^2.3" 1534 | }, 1535 | "type": "library", 1536 | "extra": { 1537 | "branch-alias": { 1538 | "dev-master": "2.4-dev" 1539 | } 1540 | }, 1541 | "autoload": { 1542 | "classmap": [ 1543 | "src/" 1544 | ] 1545 | }, 1546 | "notification-url": "https://packagist.org/downloads/", 1547 | "license": [ 1548 | "BSD-3-Clause", 1549 | "GPL-2.0", 1550 | "GPL-3.0" 1551 | ], 1552 | "authors": [ 1553 | { 1554 | "name": "David Grudl", 1555 | "homepage": "https://davidgrudl.com" 1556 | }, 1557 | { 1558 | "name": "Nette Community", 1559 | "homepage": "https://nette.org/contributors" 1560 | } 1561 | ], 1562 | "description": "? Nette RobotLoader: high performance and comfortable autoloader that will search and autoload classes within your application.", 1563 | "homepage": "https://nette.org", 1564 | "keywords": [ 1565 | "autoload", 1566 | "class", 1567 | "interface", 1568 | "nette", 1569 | "trait" 1570 | ], 1571 | "time": "2017-08-14T20:23:02+00:00" 1572 | }, 1573 | { 1574 | "name": "nette/safe-stream", 1575 | "version": "v2.4.0", 1576 | "source": { 1577 | "type": "git", 1578 | "url": "https://github.com/nette/safe-stream.git", 1579 | "reference": "5e46d5fe397956d697501785d50b16fecea8e935" 1580 | }, 1581 | "dist": { 1582 | "type": "zip", 1583 | "url": "https://api.github.com/repos/nette/safe-stream/zipball/5e46d5fe397956d697501785d50b16fecea8e935", 1584 | "reference": "5e46d5fe397956d697501785d50b16fecea8e935", 1585 | "shasum": "" 1586 | }, 1587 | "require": { 1588 | "php": ">=7.1" 1589 | }, 1590 | "require-dev": { 1591 | "nette/tester": "^2.0", 1592 | "tracy/tracy": "^2.3" 1593 | }, 1594 | "type": "library", 1595 | "extra": { 1596 | "branch-alias": { 1597 | "dev-master": "2.4-dev" 1598 | } 1599 | }, 1600 | "autoload": { 1601 | "files": [ 1602 | "src/loader.php" 1603 | ] 1604 | }, 1605 | "notification-url": "https://packagist.org/downloads/", 1606 | "license": [ 1607 | "BSD-3-Clause", 1608 | "GPL-2.0", 1609 | "GPL-3.0" 1610 | ], 1611 | "authors": [ 1612 | { 1613 | "name": "David Grudl", 1614 | "homepage": "https://davidgrudl.com" 1615 | }, 1616 | { 1617 | "name": "Nette Community", 1618 | "homepage": "https://nette.org/contributors" 1619 | } 1620 | ], 1621 | "description": "Nette SafeStream: atomic and safe manipulation with files via native PHP functions.", 1622 | "homepage": "https://nette.org", 1623 | "keywords": [ 1624 | "atomic", 1625 | "filesystem", 1626 | "nette", 1627 | "safe" 1628 | ], 1629 | "time": "2019-02-06T00:22:25+00:00" 1630 | }, 1631 | { 1632 | "name": "nette/utils", 1633 | "version": "v2.5.4", 1634 | "source": { 1635 | "type": "git", 1636 | "url": "https://github.com/nette/utils.git", 1637 | "reference": "b343b5749f8c2daa0d15f30380ccdba0579c2ed1" 1638 | }, 1639 | "dist": { 1640 | "type": "zip", 1641 | "url": "https://api.github.com/repos/nette/utils/zipball/b343b5749f8c2daa0d15f30380ccdba0579c2ed1", 1642 | "reference": "b343b5749f8c2daa0d15f30380ccdba0579c2ed1", 1643 | "shasum": "" 1644 | }, 1645 | "require": { 1646 | "php": ">=5.6.0" 1647 | }, 1648 | "conflict": { 1649 | "nette/nette": "<2.2" 1650 | }, 1651 | "require-dev": { 1652 | "nette/tester": "~2.0", 1653 | "tracy/tracy": "^2.3" 1654 | }, 1655 | "suggest": { 1656 | "ext-gd": "to use Image", 1657 | "ext-iconv": "to use Strings::webalize() and toAscii()", 1658 | "ext-intl": "for script transliteration in Strings::webalize() and toAscii()", 1659 | "ext-json": "to use Nette\\Utils\\Json", 1660 | "ext-mbstring": "to use Strings::lower() etc...", 1661 | "ext-xml": "to use Strings::length() etc. when mbstring is not available" 1662 | }, 1663 | "type": "library", 1664 | "extra": { 1665 | "branch-alias": { 1666 | "dev-master": "2.5-dev" 1667 | } 1668 | }, 1669 | "autoload": { 1670 | "classmap": [ 1671 | "src/" 1672 | ], 1673 | "files": [ 1674 | "src/loader.php" 1675 | ] 1676 | }, 1677 | "notification-url": "https://packagist.org/downloads/", 1678 | "license": [ 1679 | "BSD-3-Clause", 1680 | "GPL-2.0", 1681 | "GPL-3.0" 1682 | ], 1683 | "authors": [ 1684 | { 1685 | "name": "David Grudl", 1686 | "homepage": "https://davidgrudl.com" 1687 | }, 1688 | { 1689 | "name": "Nette Community", 1690 | "homepage": "https://nette.org/contributors" 1691 | } 1692 | ], 1693 | "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", 1694 | "homepage": "https://nette.org", 1695 | "keywords": [ 1696 | "array", 1697 | "core", 1698 | "datetime", 1699 | "images", 1700 | "json", 1701 | "nette", 1702 | "paginator", 1703 | "password", 1704 | "slugify", 1705 | "string", 1706 | "unicode", 1707 | "utf-8", 1708 | "utility", 1709 | "validation" 1710 | ], 1711 | "time": "2019-11-19T00:32:02+00:00" 1712 | }, 1713 | { 1714 | "name": "phpcompatibility/php-compatibility", 1715 | "version": "9.3.5", 1716 | "source": { 1717 | "type": "git", 1718 | "url": "https://github.com/PHPCompatibility/PHPCompatibility.git", 1719 | "reference": "9fb324479acf6f39452e0655d2429cc0d3914243" 1720 | }, 1721 | "dist": { 1722 | "type": "zip", 1723 | "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/9fb324479acf6f39452e0655d2429cc0d3914243", 1724 | "reference": "9fb324479acf6f39452e0655d2429cc0d3914243", 1725 | "shasum": "" 1726 | }, 1727 | "require": { 1728 | "php": ">=5.3", 1729 | "squizlabs/php_codesniffer": "^2.3 || ^3.0.2" 1730 | }, 1731 | "conflict": { 1732 | "squizlabs/php_codesniffer": "2.6.2" 1733 | }, 1734 | "require-dev": { 1735 | "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0" 1736 | }, 1737 | "suggest": { 1738 | "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.", 1739 | "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." 1740 | }, 1741 | "type": "phpcodesniffer-standard", 1742 | "notification-url": "https://packagist.org/downloads/", 1743 | "license": [ 1744 | "LGPL-3.0-or-later" 1745 | ], 1746 | "authors": [ 1747 | { 1748 | "name": "Wim Godden", 1749 | "homepage": "https://github.com/wimg", 1750 | "role": "lead" 1751 | }, 1752 | { 1753 | "name": "Juliette Reinders Folmer", 1754 | "homepage": "https://github.com/jrfnl", 1755 | "role": "lead" 1756 | }, 1757 | { 1758 | "name": "Contributors", 1759 | "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors" 1760 | } 1761 | ], 1762 | "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.", 1763 | "homepage": "http://techblog.wimgodden.be/tag/codesniffer/", 1764 | "keywords": [ 1765 | "compatibility", 1766 | "phpcs", 1767 | "standards" 1768 | ], 1769 | "time": "2019-12-27T09:44:58+00:00" 1770 | }, 1771 | { 1772 | "name": "phpcompatibility/phpcompatibility-paragonie", 1773 | "version": "1.3.1", 1774 | "source": { 1775 | "type": "git", 1776 | "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git", 1777 | "reference": "ddabec839cc003651f2ce695c938686d1086cf43" 1778 | }, 1779 | "dist": { 1780 | "type": "zip", 1781 | "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/ddabec839cc003651f2ce695c938686d1086cf43", 1782 | "reference": "ddabec839cc003651f2ce695c938686d1086cf43", 1783 | "shasum": "" 1784 | }, 1785 | "require": { 1786 | "phpcompatibility/php-compatibility": "^9.0" 1787 | }, 1788 | "require-dev": { 1789 | "dealerdirect/phpcodesniffer-composer-installer": "^0.7", 1790 | "paragonie/random_compat": "dev-master", 1791 | "paragonie/sodium_compat": "dev-master" 1792 | }, 1793 | "suggest": { 1794 | "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", 1795 | "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." 1796 | }, 1797 | "type": "phpcodesniffer-standard", 1798 | "notification-url": "https://packagist.org/downloads/", 1799 | "license": [ 1800 | "LGPL-3.0-or-later" 1801 | ], 1802 | "authors": [ 1803 | { 1804 | "name": "Wim Godden", 1805 | "role": "lead" 1806 | }, 1807 | { 1808 | "name": "Juliette Reinders Folmer", 1809 | "role": "lead" 1810 | } 1811 | ], 1812 | "description": "A set of rulesets for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by the Paragonie polyfill libraries.", 1813 | "homepage": "http://phpcompatibility.com/", 1814 | "keywords": [ 1815 | "compatibility", 1816 | "paragonie", 1817 | "phpcs", 1818 | "polyfill", 1819 | "standards" 1820 | ], 1821 | "time": "2021-02-15T10:24:51+00:00" 1822 | }, 1823 | { 1824 | "name": "phpcompatibility/phpcompatibility-wp", 1825 | "version": "2.1.2", 1826 | "source": { 1827 | "type": "git", 1828 | "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git", 1829 | "reference": "a792ab623069f0ce971b2417edef8d9632e32f75" 1830 | }, 1831 | "dist": { 1832 | "type": "zip", 1833 | "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/a792ab623069f0ce971b2417edef8d9632e32f75", 1834 | "reference": "a792ab623069f0ce971b2417edef8d9632e32f75", 1835 | "shasum": "" 1836 | }, 1837 | "require": { 1838 | "phpcompatibility/php-compatibility": "^9.0", 1839 | "phpcompatibility/phpcompatibility-paragonie": "^1.0" 1840 | }, 1841 | "require-dev": { 1842 | "dealerdirect/phpcodesniffer-composer-installer": "^0.7" 1843 | }, 1844 | "suggest": { 1845 | "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", 1846 | "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." 1847 | }, 1848 | "type": "phpcodesniffer-standard", 1849 | "notification-url": "https://packagist.org/downloads/", 1850 | "license": [ 1851 | "LGPL-3.0-or-later" 1852 | ], 1853 | "authors": [ 1854 | { 1855 | "name": "Wim Godden", 1856 | "role": "lead" 1857 | }, 1858 | { 1859 | "name": "Juliette Reinders Folmer", 1860 | "role": "lead" 1861 | } 1862 | ], 1863 | "description": "A ruleset for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by WordPress.", 1864 | "homepage": "http://phpcompatibility.com/", 1865 | "keywords": [ 1866 | "compatibility", 1867 | "phpcs", 1868 | "standards", 1869 | "wordpress" 1870 | ], 1871 | "time": "2021-07-21T11:09:57+00:00" 1872 | }, 1873 | { 1874 | "name": "psr/log", 1875 | "version": "1.1.2", 1876 | "source": { 1877 | "type": "git", 1878 | "url": "https://github.com/php-fig/log.git", 1879 | "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801" 1880 | }, 1881 | "dist": { 1882 | "type": "zip", 1883 | "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801", 1884 | "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801", 1885 | "shasum": "" 1886 | }, 1887 | "require": { 1888 | "php": ">=5.3.0" 1889 | }, 1890 | "type": "library", 1891 | "extra": { 1892 | "branch-alias": { 1893 | "dev-master": "1.1.x-dev" 1894 | } 1895 | }, 1896 | "autoload": { 1897 | "psr-4": { 1898 | "Psr\\Log\\": "Psr/Log/" 1899 | } 1900 | }, 1901 | "notification-url": "https://packagist.org/downloads/", 1902 | "license": [ 1903 | "MIT" 1904 | ], 1905 | "authors": [ 1906 | { 1907 | "name": "PHP-FIG", 1908 | "homepage": "http://www.php-fig.org/" 1909 | } 1910 | ], 1911 | "description": "Common interface for logging libraries", 1912 | "homepage": "https://github.com/php-fig/log", 1913 | "keywords": [ 1914 | "log", 1915 | "psr", 1916 | "psr-3" 1917 | ], 1918 | "time": "2019-11-01T11:05:21+00:00" 1919 | }, 1920 | { 1921 | "name": "seld/jsonlint", 1922 | "version": "1.7.2", 1923 | "source": { 1924 | "type": "git", 1925 | "url": "https://github.com/Seldaek/jsonlint.git", 1926 | "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19" 1927 | }, 1928 | "dist": { 1929 | "type": "zip", 1930 | "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/e2e5d290e4d2a4f0eb449f510071392e00e10d19", 1931 | "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19", 1932 | "shasum": "" 1933 | }, 1934 | "require": { 1935 | "php": "^5.3 || ^7.0" 1936 | }, 1937 | "require-dev": { 1938 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 1939 | }, 1940 | "bin": [ 1941 | "bin/jsonlint" 1942 | ], 1943 | "type": "library", 1944 | "autoload": { 1945 | "psr-4": { 1946 | "Seld\\JsonLint\\": "src/Seld/JsonLint/" 1947 | } 1948 | }, 1949 | "notification-url": "https://packagist.org/downloads/", 1950 | "license": [ 1951 | "MIT" 1952 | ], 1953 | "authors": [ 1954 | { 1955 | "name": "Jordi Boggiano", 1956 | "email": "j.boggiano@seld.be", 1957 | "homepage": "http://seld.be" 1958 | } 1959 | ], 1960 | "description": "JSON Linter", 1961 | "keywords": [ 1962 | "json", 1963 | "linter", 1964 | "parser", 1965 | "validator" 1966 | ], 1967 | "time": "2019-10-24T14:27:39+00:00" 1968 | }, 1969 | { 1970 | "name": "squizlabs/php_codesniffer", 1971 | "version": "3.6.1", 1972 | "source": { 1973 | "type": "git", 1974 | "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", 1975 | "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e" 1976 | }, 1977 | "dist": { 1978 | "type": "zip", 1979 | "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/f268ca40d54617c6e06757f83f699775c9b3ff2e", 1980 | "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e", 1981 | "shasum": "" 1982 | }, 1983 | "require": { 1984 | "ext-simplexml": "*", 1985 | "ext-tokenizer": "*", 1986 | "ext-xmlwriter": "*", 1987 | "php": ">=5.4.0" 1988 | }, 1989 | "require-dev": { 1990 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" 1991 | }, 1992 | "bin": [ 1993 | "bin/phpcs", 1994 | "bin/phpcbf" 1995 | ], 1996 | "type": "library", 1997 | "extra": { 1998 | "branch-alias": { 1999 | "dev-master": "3.x-dev" 2000 | } 2001 | }, 2002 | "notification-url": "https://packagist.org/downloads/", 2003 | "license": [ 2004 | "BSD-3-Clause" 2005 | ], 2006 | "authors": [ 2007 | { 2008 | "name": "Greg Sherwood", 2009 | "role": "lead" 2010 | } 2011 | ], 2012 | "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", 2013 | "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", 2014 | "keywords": [ 2015 | "phpcs", 2016 | "standards" 2017 | ], 2018 | "time": "2021-10-11T04:00:11+00:00" 2019 | }, 2020 | { 2021 | "name": "symfony/console", 2022 | "version": "v2.8.52", 2023 | "source": { 2024 | "type": "git", 2025 | "url": "https://github.com/symfony/console.git", 2026 | "reference": "cbcf4b5e233af15cd2bbd50dee1ccc9b7927dc12" 2027 | }, 2028 | "dist": { 2029 | "type": "zip", 2030 | "url": "https://api.github.com/repos/symfony/console/zipball/cbcf4b5e233af15cd2bbd50dee1ccc9b7927dc12", 2031 | "reference": "cbcf4b5e233af15cd2bbd50dee1ccc9b7927dc12", 2032 | "shasum": "" 2033 | }, 2034 | "require": { 2035 | "php": ">=5.3.9", 2036 | "symfony/debug": "^2.7.2|~3.0.0", 2037 | "symfony/polyfill-mbstring": "~1.0" 2038 | }, 2039 | "require-dev": { 2040 | "psr/log": "~1.0", 2041 | "symfony/event-dispatcher": "~2.1|~3.0.0", 2042 | "symfony/process": "~2.1|~3.0.0" 2043 | }, 2044 | "suggest": { 2045 | "psr/log-implementation": "For using the console logger", 2046 | "symfony/event-dispatcher": "", 2047 | "symfony/process": "" 2048 | }, 2049 | "type": "library", 2050 | "extra": { 2051 | "branch-alias": { 2052 | "dev-master": "2.8-dev" 2053 | } 2054 | }, 2055 | "autoload": { 2056 | "psr-4": { 2057 | "Symfony\\Component\\Console\\": "" 2058 | }, 2059 | "exclude-from-classmap": [ 2060 | "/Tests/" 2061 | ] 2062 | }, 2063 | "notification-url": "https://packagist.org/downloads/", 2064 | "license": [ 2065 | "MIT" 2066 | ], 2067 | "authors": [ 2068 | { 2069 | "name": "Fabien Potencier", 2070 | "email": "fabien@symfony.com" 2071 | }, 2072 | { 2073 | "name": "Symfony Community", 2074 | "homepage": "https://symfony.com/contributors" 2075 | } 2076 | ], 2077 | "description": "Symfony Console Component", 2078 | "homepage": "https://symfony.com", 2079 | "time": "2018-11-20T15:55:20+00:00" 2080 | }, 2081 | { 2082 | "name": "symfony/debug", 2083 | "version": "v3.0.9", 2084 | "source": { 2085 | "type": "git", 2086 | "url": "https://github.com/symfony/debug.git", 2087 | "reference": "697c527acd9ea1b2d3efac34d9806bf255278b0a" 2088 | }, 2089 | "dist": { 2090 | "type": "zip", 2091 | "url": "https://api.github.com/repos/symfony/debug/zipball/697c527acd9ea1b2d3efac34d9806bf255278b0a", 2092 | "reference": "697c527acd9ea1b2d3efac34d9806bf255278b0a", 2093 | "shasum": "" 2094 | }, 2095 | "require": { 2096 | "php": ">=5.5.9", 2097 | "psr/log": "~1.0" 2098 | }, 2099 | "conflict": { 2100 | "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" 2101 | }, 2102 | "require-dev": { 2103 | "symfony/class-loader": "~2.8|~3.0", 2104 | "symfony/http-kernel": "~2.8|~3.0" 2105 | }, 2106 | "type": "library", 2107 | "extra": { 2108 | "branch-alias": { 2109 | "dev-master": "3.0-dev" 2110 | } 2111 | }, 2112 | "autoload": { 2113 | "psr-4": { 2114 | "Symfony\\Component\\Debug\\": "" 2115 | }, 2116 | "exclude-from-classmap": [ 2117 | "/Tests/" 2118 | ] 2119 | }, 2120 | "notification-url": "https://packagist.org/downloads/", 2121 | "license": [ 2122 | "MIT" 2123 | ], 2124 | "authors": [ 2125 | { 2126 | "name": "Fabien Potencier", 2127 | "email": "fabien@symfony.com" 2128 | }, 2129 | { 2130 | "name": "Symfony Community", 2131 | "homepage": "https://symfony.com/contributors" 2132 | } 2133 | ], 2134 | "description": "Symfony Debug Component", 2135 | "homepage": "https://symfony.com", 2136 | "time": "2016-07-30T07:22:48+00:00" 2137 | }, 2138 | { 2139 | "name": "symfony/options-resolver", 2140 | "version": "v2.6.13", 2141 | "target-dir": "Symfony/Component/OptionsResolver", 2142 | "source": { 2143 | "type": "git", 2144 | "url": "https://github.com/symfony/options-resolver.git", 2145 | "reference": "31e56594cee489e9a235b852228b0598b52101c1" 2146 | }, 2147 | "dist": { 2148 | "type": "zip", 2149 | "url": "https://api.github.com/repos/symfony/options-resolver/zipball/31e56594cee489e9a235b852228b0598b52101c1", 2150 | "reference": "31e56594cee489e9a235b852228b0598b52101c1", 2151 | "shasum": "" 2152 | }, 2153 | "require": { 2154 | "php": ">=5.3.3" 2155 | }, 2156 | "require-dev": { 2157 | "symfony/phpunit-bridge": "~2.7" 2158 | }, 2159 | "type": "library", 2160 | "extra": { 2161 | "branch-alias": { 2162 | "dev-master": "2.6-dev" 2163 | } 2164 | }, 2165 | "autoload": { 2166 | "psr-0": { 2167 | "Symfony\\Component\\OptionsResolver\\": "" 2168 | } 2169 | }, 2170 | "notification-url": "https://packagist.org/downloads/", 2171 | "license": [ 2172 | "MIT" 2173 | ], 2174 | "authors": [ 2175 | { 2176 | "name": "Fabien Potencier", 2177 | "email": "fabien@symfony.com" 2178 | }, 2179 | { 2180 | "name": "Symfony Community", 2181 | "homepage": "https://symfony.com/contributors" 2182 | } 2183 | ], 2184 | "description": "Symfony OptionsResolver Component", 2185 | "homepage": "https://symfony.com", 2186 | "keywords": [ 2187 | "config", 2188 | "configuration", 2189 | "options" 2190 | ], 2191 | "time": "2015-05-13T11:33:56+00:00" 2192 | }, 2193 | { 2194 | "name": "symfony/polyfill-ctype", 2195 | "version": "v1.12.0", 2196 | "source": { 2197 | "type": "git", 2198 | "url": "https://github.com/symfony/polyfill-ctype.git", 2199 | "reference": "550ebaac289296ce228a706d0867afc34687e3f4" 2200 | }, 2201 | "dist": { 2202 | "type": "zip", 2203 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/550ebaac289296ce228a706d0867afc34687e3f4", 2204 | "reference": "550ebaac289296ce228a706d0867afc34687e3f4", 2205 | "shasum": "" 2206 | }, 2207 | "require": { 2208 | "php": ">=5.3.3" 2209 | }, 2210 | "suggest": { 2211 | "ext-ctype": "For best performance" 2212 | }, 2213 | "type": "library", 2214 | "extra": { 2215 | "branch-alias": { 2216 | "dev-master": "1.12-dev" 2217 | } 2218 | }, 2219 | "autoload": { 2220 | "psr-4": { 2221 | "Symfony\\Polyfill\\Ctype\\": "" 2222 | }, 2223 | "files": [ 2224 | "bootstrap.php" 2225 | ] 2226 | }, 2227 | "notification-url": "https://packagist.org/downloads/", 2228 | "license": [ 2229 | "MIT" 2230 | ], 2231 | "authors": [ 2232 | { 2233 | "name": "Gert de Pagter", 2234 | "email": "BackEndTea@gmail.com" 2235 | }, 2236 | { 2237 | "name": "Symfony Community", 2238 | "homepage": "https://symfony.com/contributors" 2239 | } 2240 | ], 2241 | "description": "Symfony polyfill for ctype functions", 2242 | "homepage": "https://symfony.com", 2243 | "keywords": [ 2244 | "compatibility", 2245 | "ctype", 2246 | "polyfill", 2247 | "portable" 2248 | ], 2249 | "time": "2019-08-06T08:03:45+00:00" 2250 | }, 2251 | { 2252 | "name": "symfony/polyfill-mbstring", 2253 | "version": "v1.12.0", 2254 | "source": { 2255 | "type": "git", 2256 | "url": "https://github.com/symfony/polyfill-mbstring.git", 2257 | "reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17" 2258 | }, 2259 | "dist": { 2260 | "type": "zip", 2261 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/b42a2f66e8f1b15ccf25652c3424265923eb4f17", 2262 | "reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17", 2263 | "shasum": "" 2264 | }, 2265 | "require": { 2266 | "php": ">=5.3.3" 2267 | }, 2268 | "suggest": { 2269 | "ext-mbstring": "For best performance" 2270 | }, 2271 | "type": "library", 2272 | "extra": { 2273 | "branch-alias": { 2274 | "dev-master": "1.12-dev" 2275 | } 2276 | }, 2277 | "autoload": { 2278 | "psr-4": { 2279 | "Symfony\\Polyfill\\Mbstring\\": "" 2280 | }, 2281 | "files": [ 2282 | "bootstrap.php" 2283 | ] 2284 | }, 2285 | "notification-url": "https://packagist.org/downloads/", 2286 | "license": [ 2287 | "MIT" 2288 | ], 2289 | "authors": [ 2290 | { 2291 | "name": "Nicolas Grekas", 2292 | "email": "p@tchwork.com" 2293 | }, 2294 | { 2295 | "name": "Symfony Community", 2296 | "homepage": "https://symfony.com/contributors" 2297 | } 2298 | ], 2299 | "description": "Symfony polyfill for the Mbstring extension", 2300 | "homepage": "https://symfony.com", 2301 | "keywords": [ 2302 | "compatibility", 2303 | "mbstring", 2304 | "polyfill", 2305 | "portable", 2306 | "shim" 2307 | ], 2308 | "time": "2019-08-06T08:03:45+00:00" 2309 | }, 2310 | { 2311 | "name": "symfony/yaml", 2312 | "version": "v2.8.52", 2313 | "source": { 2314 | "type": "git", 2315 | "url": "https://github.com/symfony/yaml.git", 2316 | "reference": "02c1859112aa779d9ab394ae4f3381911d84052b" 2317 | }, 2318 | "dist": { 2319 | "type": "zip", 2320 | "url": "https://api.github.com/repos/symfony/yaml/zipball/02c1859112aa779d9ab394ae4f3381911d84052b", 2321 | "reference": "02c1859112aa779d9ab394ae4f3381911d84052b", 2322 | "shasum": "" 2323 | }, 2324 | "require": { 2325 | "php": ">=5.3.9", 2326 | "symfony/polyfill-ctype": "~1.8" 2327 | }, 2328 | "type": "library", 2329 | "extra": { 2330 | "branch-alias": { 2331 | "dev-master": "2.8-dev" 2332 | } 2333 | }, 2334 | "autoload": { 2335 | "psr-4": { 2336 | "Symfony\\Component\\Yaml\\": "" 2337 | }, 2338 | "exclude-from-classmap": [ 2339 | "/Tests/" 2340 | ] 2341 | }, 2342 | "notification-url": "https://packagist.org/downloads/", 2343 | "license": [ 2344 | "MIT" 2345 | ], 2346 | "authors": [ 2347 | { 2348 | "name": "Fabien Potencier", 2349 | "email": "fabien@symfony.com" 2350 | }, 2351 | { 2352 | "name": "Symfony Community", 2353 | "homepage": "https://symfony.com/contributors" 2354 | } 2355 | ], 2356 | "description": "Symfony Yaml Component", 2357 | "homepage": "https://symfony.com", 2358 | "time": "2018-11-11T11:18:13+00:00" 2359 | }, 2360 | { 2361 | "name": "tracy/tracy", 2362 | "version": "v2.6.5", 2363 | "source": { 2364 | "type": "git", 2365 | "url": "https://github.com/nette/tracy.git", 2366 | "reference": "18c3c0f3d60b6dba0a0d1c513c5dbaef82c947cb" 2367 | }, 2368 | "dist": { 2369 | "type": "zip", 2370 | "url": "https://api.github.com/repos/nette/tracy/zipball/18c3c0f3d60b6dba0a0d1c513c5dbaef82c947cb", 2371 | "reference": "18c3c0f3d60b6dba0a0d1c513c5dbaef82c947cb", 2372 | "shasum": "" 2373 | }, 2374 | "require": { 2375 | "ext-json": "*", 2376 | "ext-session": "*", 2377 | "php": ">=7.1" 2378 | }, 2379 | "require-dev": { 2380 | "nette/di": "^2.4 || ~3.0.0", 2381 | "nette/tester": "^2.2", 2382 | "nette/utils": "^2.4 || ^3.0", 2383 | "psr/log": "^1.0" 2384 | }, 2385 | "suggest": { 2386 | "https://nette.org/donate": "Please support Tracy via a donation" 2387 | }, 2388 | "type": "library", 2389 | "extra": { 2390 | "branch-alias": { 2391 | "dev-master": "2.6-dev" 2392 | } 2393 | }, 2394 | "autoload": { 2395 | "classmap": [ 2396 | "src" 2397 | ], 2398 | "files": [ 2399 | "src/Tracy/shortcuts.php" 2400 | ] 2401 | }, 2402 | "notification-url": "https://packagist.org/downloads/", 2403 | "license": [ 2404 | "BSD-3-Clause" 2405 | ], 2406 | "authors": [ 2407 | { 2408 | "name": "David Grudl", 2409 | "homepage": "https://davidgrudl.com" 2410 | }, 2411 | { 2412 | "name": "Nette Community", 2413 | "homepage": "https://nette.org/contributors" 2414 | } 2415 | ], 2416 | "description": "😎 Tracy: the addictive tool to ease debugging PHP code for cool developers. Friendly design, logging, profiler, advanced features like debugging AJAX calls or CLI support. You will love it.", 2417 | "homepage": "https://tracy.nette.org", 2418 | "keywords": [ 2419 | "Xdebug", 2420 | "debug", 2421 | "debugger", 2422 | "nette", 2423 | "profiler" 2424 | ], 2425 | "time": "2019-09-24T10:18:10+00:00" 2426 | }, 2427 | { 2428 | "name": "wp-coding-standards/wpcs", 2429 | "version": "2.3.0", 2430 | "source": { 2431 | "type": "git", 2432 | "url": "https://github.com/WordPress/WordPress-Coding-Standards.git", 2433 | "reference": "7da1894633f168fe244afc6de00d141f27517b62" 2434 | }, 2435 | "dist": { 2436 | "type": "zip", 2437 | "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/7da1894633f168fe244afc6de00d141f27517b62", 2438 | "reference": "7da1894633f168fe244afc6de00d141f27517b62", 2439 | "shasum": "" 2440 | }, 2441 | "require": { 2442 | "php": ">=5.4", 2443 | "squizlabs/php_codesniffer": "^3.3.1" 2444 | }, 2445 | "require-dev": { 2446 | "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || ^0.6", 2447 | "phpcompatibility/php-compatibility": "^9.0", 2448 | "phpcsstandards/phpcsdevtools": "^1.0", 2449 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" 2450 | }, 2451 | "suggest": { 2452 | "dealerdirect/phpcodesniffer-composer-installer": "^0.6 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically." 2453 | }, 2454 | "type": "phpcodesniffer-standard", 2455 | "notification-url": "https://packagist.org/downloads/", 2456 | "license": [ 2457 | "MIT" 2458 | ], 2459 | "authors": [ 2460 | { 2461 | "name": "Contributors", 2462 | "homepage": "https://github.com/WordPress/WordPress-Coding-Standards/graphs/contributors" 2463 | } 2464 | ], 2465 | "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions", 2466 | "keywords": [ 2467 | "phpcs", 2468 | "standards", 2469 | "wordpress" 2470 | ], 2471 | "time": "2020-05-13T23:57:56+00:00" 2472 | } 2473 | ], 2474 | "aliases": [], 2475 | "minimum-stability": "stable", 2476 | "stability-flags": [], 2477 | "prefer-stable": false, 2478 | "prefer-lowest": false, 2479 | "platform": [], 2480 | "platform-dev": { 2481 | "php": "^7" 2482 | }, 2483 | "plugin-api-version": "1.1.0" 2484 | } 2485 | -------------------------------------------------------------------------------- /includes/class-sensei-course-progress-dependency-checker.php: -------------------------------------------------------------------------------- 1 | =' ); 60 | } 61 | 62 | /** 63 | * Checks for our Sensei dependency. 64 | * 65 | * @return bool 66 | */ 67 | private static function check_sensei() { 68 | if ( ! class_exists( 'Sensei_Main' ) ) { 69 | return false; 70 | } 71 | 72 | // As long as we support 1.x, we need to also check this option. 73 | $legacy_version = get_option( 'woothemes-sensei-version' ); 74 | return version_compare( self::MINIMUM_SENSEI_VERSION, get_option( 'sensei-version', $legacy_version ), '<=' ); 75 | } 76 | 77 | /** 78 | * Adds notice in WP Admin that minimum version of PHP is not met. 79 | * 80 | * @access private 81 | */ 82 | public static function add_php_notice() { 83 | $screen = get_current_screen(); 84 | $valid_screens = array( 'dashboard', 'plugins' ); 85 | 86 | if ( ! current_user_can( 'activate_plugins' ) || ! in_array( $screen->id, $valid_screens, true ) ) { 87 | return; 88 | } 89 | 90 | // translators: %1$s is version of PHP that this plugin requires; %2$s is the version of PHP WordPress is running on. 91 | $message = sprintf( __( 'Sensei LMS Course Progress requires a minimum PHP version of %1$s, but you are running %2$s.', 'sensei-course-progress' ), self::MINIMUM_PHP_VERSION, phpversion() ); 92 | echo '

'; 93 | echo wp_kses( $message, array( 'strong' => array() ) ); 94 | $php_update_url = 'https://wordpress.org/support/update-php/'; 95 | if ( function_exists( 'wp_get_update_php_url' ) ) { 96 | $php_update_url = wp_get_update_php_url(); 97 | } 98 | printf( 99 | '

%2$s %3$s

', 100 | esc_url( $php_update_url ), 101 | esc_html__( 'Learn more about updating PHP', 'sensei-course-progress' ), 102 | /* translators: accessibility text */ 103 | esc_html__( '(opens in a new tab)', 'sensei-course-progress' ) 104 | ); 105 | echo '

'; 106 | } 107 | 108 | /** 109 | * Adds the notice in WP Admin that Sensei is required. 110 | * 111 | * @access private 112 | */ 113 | public static function add_sensei_notice() { 114 | $screen = get_current_screen(); 115 | $valid_screens = array( 'dashboard', 'plugins' ); 116 | 117 | if ( ! current_user_can( 'activate_plugins' ) || ! in_array( $screen->id, $valid_screens, true ) ) { 118 | return; 119 | } 120 | 121 | // translators: %1$s is the minimum version number of Sensei that is required. 122 | $message = sprintf( __( 'Sensei LMS Course Progress requires that the plugin Sensei (minimum version: %1$s) is installed and activated.', 'sensei-course-progress' ), self::MINIMUM_SENSEI_VERSION ); 123 | echo '

'; 124 | echo wp_kses( $message, array( 'strong' => array() ) ); 125 | echo '

'; 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /includes/class-sensei-course-progress-widget.php: -------------------------------------------------------------------------------- 1 | woo_widget_cssclass = 'widget_sensei_course_progress'; 28 | $this->woo_widget_description = esc_html__( 'Displays the current learners progress within the current course/module (only displays on single lesson page).', 'sensei-course-progress' ); 29 | $this->woo_widget_idbase = 'sensei_course_progress'; 30 | $this->woo_widget_title = esc_html__( 'Sensei LMS - Course Progress', 'sensei-course-progress' ); 31 | /* Widget settings. */ 32 | $widget_ops = array( 'classname' => $this->woo_widget_cssclass, 'description' => $this->woo_widget_description ); 33 | 34 | /* Widget control settings. */ 35 | $control_ops = array( 'width' => 250, 'height' => 350, 'id_base' => $this->woo_widget_idbase ); 36 | 37 | /* Create the widget. */ 38 | parent::__construct( $this->woo_widget_idbase, $this->woo_widget_title, $widget_ops, $control_ops ); 39 | } 40 | 41 | function widget( $args, $instance ) { 42 | 43 | global $woothemes_sensei, $post, $current_user, $view_lesson, $user_taking_course; 44 | 45 | $allmodules = 'off'; 46 | if ( isset( $instance['allmodules'] ) ) { 47 | $allmodules = $instance['allmodules']; 48 | } 49 | 50 | // If not viewing a lesson/quiz, don't display the widget 51 | if( ! ( is_singular( 'lesson' ) || is_singular( 'quiz' ) || is_tax( 'module' ) ) ) return; 52 | 53 | extract( $args ); 54 | 55 | if ( is_singular('quiz') ) { 56 | $current_lesson_id = absint( get_post_meta( $post->ID, '_quiz_lesson', true ) ); 57 | } else { 58 | $current_lesson_id = $post->ID; 59 | } 60 | 61 | // get the course for the current lesson/quiz 62 | $lesson_course_id = absint( get_post_meta( $current_lesson_id, '_lesson_course', true ) ); 63 | 64 | //Check for preview lesson 65 | $is_preview = false; 66 | if ( method_exists( 'WooThemes_Sensei_Utils', 'is_preview_lesson' ) ) { 67 | $is_preview = WooThemes_Sensei_Utils::is_preview_lesson( $post->ID ); 68 | } 69 | 70 | $course_title = get_the_title( $lesson_course_id ); 71 | $course_url = get_the_permalink( $lesson_course_id ); 72 | 73 | $in_module = false; 74 | $lesson_module = ''; 75 | $lesson_array = array(); 76 | 77 | if ( 0 < $current_lesson_id ) { 78 | // get an array of lessons in the module if there is one 79 | if( isset( Sensei()->modules ) ) { 80 | // Get all modules 81 | $course_modules = Sensei()->modules->get_course_modules( $lesson_course_id ); 82 | $lesson_module = Sensei()->modules->get_lesson_module( $current_lesson_id ); 83 | $in_module = true; 84 | 85 | // Get an array of module ids. 86 | $course_module_ids = array(); 87 | foreach ( $course_modules as $module ) { 88 | $course_module_ids[] = $module->term_id; 89 | } 90 | 91 | // Display all modules 92 | if ( 'on' === $allmodules ) { 93 | foreach ($course_modules as $module) { 94 | // get all lessons in the module 95 | $args = array( 96 | 'post_type' => 'lesson', 97 | 'post_status' => 'publish', 98 | 'posts_per_page' => -1, 99 | 'meta_query' => array( 100 | array( 101 | 'key' => '_lesson_course', 102 | 'value' => absint( $lesson_course_id ), 103 | 'compare' => '=' 104 | ) 105 | ), 106 | 'tax_query' => array( 107 | array( 108 | 'taxonomy' => Sensei()->modules->taxonomy, 109 | 'field' => 'id', 110 | 'terms' => absint( $module->term_id ) 111 | ) 112 | ), 113 | 'meta_key' => '_order_module_' . intval( $module->term_id ), 114 | 'orderby' => 'meta_value_num date', 115 | 'order' => 'ASC' 116 | ); 117 | $lesson_array = array_merge( $lesson_array, get_posts( $args) ); 118 | } 119 | 120 | // Get all lessons in the course that are not in any of the 121 | // course's modules. 122 | $args = array( 123 | 'post_type' => 'lesson', 124 | 'post_status' => 'publish', 125 | 'posts_per_page' => -1, 126 | 'meta_query' => array( 127 | array( 128 | 'key' => '_lesson_course', 129 | 'value' => absint( $lesson_course_id ), 130 | 'compare' => '=' 131 | ) 132 | ), 133 | 'tax_query' => array( 134 | array( 135 | 'taxonomy' => Sensei()->modules->taxonomy, 136 | 'field' => 'id', 137 | 'terms' => $course_module_ids, 138 | 'operator' => 'NOT IN', 139 | ) 140 | ), 141 | 'meta_key' => '_order_' . intval( $lesson_course_id ), 142 | 'orderby' => 'meta_value_num date', 143 | 'order' => 'ASC' 144 | ); 145 | $lesson_array = array_merge( $lesson_array, get_posts( $args) ); 146 | } else { 147 | // Only display current module 148 | // get all lessons in the current module 149 | $args = array( 150 | 'post_type' => 'lesson', 151 | 'post_status' => 'publish', 152 | 'posts_per_page' => -1, 153 | 'meta_query' => array( 154 | array( 155 | 'key' => '_lesson_course', 156 | 'value' => absint( $lesson_course_id ), 157 | 'compare' => '=' 158 | ) 159 | ), 160 | ); 161 | 162 | if ( ! empty( $lesson_module ) && in_array( $lesson_module->term_id, $course_module_ids ) ) { 163 | $args['tax_query'] = array( 164 | array( 165 | 'taxonomy' => Sensei()->modules->taxonomy, 166 | 'field' => 'id', 167 | 'terms' => intval( $lesson_module->term_id ), 168 | ), 169 | ); 170 | $args['meta_key'] = '_order_module_' . absint( $lesson_module->term_id ); 171 | $args['orderby'] = 'meta_value_num date'; 172 | $args['order'] = 'ASC'; 173 | } else { 174 | $args['tax_query'] = array( 175 | array( 176 | 'taxonomy' => Sensei()->modules->taxonomy, 177 | 'field' => 'id', 178 | 'terms' => $course_module_ids, 179 | 'operator' => 'NOT IN', 180 | ), 181 | ); 182 | $args['meta_key'] = '_order_' . absint( $lesson_course_id ); 183 | $args['orderby'] = 'meta_value_num date'; 184 | $args['order'] = 'ASC'; 185 | } 186 | 187 | $lesson_array = get_posts( $args ); 188 | } 189 | } else { 190 | // if modules are not loaded, get all lessons in the course. 191 | $lesson_array = Sensei()->course->course_lessons( $lesson_course_id ); 192 | } 193 | } 194 | 195 | echo wp_kses_post( $before_widget ); 196 | ?> 197 | 198 |
199 |

200 |
201 | 202 | 205 | 206 |
    207 | 208 | 209 |
210 | 211 | 212 | 213 |
214 | 215 |
216 | 217 |
218 |
219 | 220 |
221 |
222 |
    223 | 224 | ID ); 230 | $lesson_title = htmlspecialchars( $lesson->post_title ); 231 | $lesson_url = get_the_permalink( $lesson_id ); 232 | 233 | // add 'completed' class to completed lessons 234 | $classes = "not-completed"; 235 | if( WooThemes_Sensei_Utils::user_completed_lesson( $lesson->ID, $current_user->ID ) ) { 236 | $classes = "completed"; 237 | } 238 | 239 | // Lesson Quiz Meta 240 | $lesson_quiz_id = absint( Sensei()->lesson->lesson_quizzes( $lesson_id ) ); 241 | 242 | // add 'current' class on the current lesson/quiz 243 | if( ! is_tax( 'module' ) && ( $lesson_id === $post->ID || $lesson_quiz_id === $post->ID ) ) { 244 | $classes .= " current"; 245 | } 246 | 247 | if ( isset( Sensei()->modules ) ) { 248 | $new_module = Sensei()->modules->get_lesson_module( $lesson_id ); 249 | 250 | // Note that if there are no modules, all the modules for 251 | // the lessons will == false and so no module header will 252 | // be displayed here. 253 | if ( $old_module != $new_module ) { 254 | if ( $new_module ) { 255 | $module_title = $this->get_module_title_content( $new_module ); 256 | } else { 257 | $module_title = esc_html( __( 'Other Lessons', 'sensei-course-progress' ) ); 258 | } 259 | 260 | ?> 261 |
  • 262 |

    263 | 264 |

    265 |
  • 266 | 272 | 273 |
  • 274 | ID === $post->ID || $lesson_quiz_id === $post->ID ) ) { 275 | echo '' . esc_html( $lesson_title ) . ''; 276 | } else { 277 | echo '' . esc_html( $lesson_title ) . ''; 278 | } ?> 279 |
  • 280 | 281 | 282 | 283 |
284 |
285 | 286 | false 318 | ); 319 | 320 | $instance = wp_parse_args( (array) $instance, $defaults ); 321 | 322 | if ( isset( Sensei()->modules ) ) { 323 | ?> 324 |

325 | /> 326 |
327 |

328 | 329 |

330 | modules, 'do_link_to_module' ) ) { 343 | $link_to_module = Sensei()->modules->do_link_to_module( $module ); 344 | } 345 | 346 | if ( $link_to_module ) { 347 | return '' . esc_html( $module->name ) . ''; 348 | } 349 | 350 | return esc_html( $module->name ); 351 | } // End get_module_title_content() 352 | 353 | } 354 | -------------------------------------------------------------------------------- /includes/class-sensei-course-progress.php: -------------------------------------------------------------------------------- 1 | _version = SENSEI_COURSE_PROGRESS_VERSION; 55 | $this->_token = 'sensei_course_progress'; 56 | 57 | $this->assets_dir = trailingslashit( dirname( SENSEI_COURSE_PROGRESS_PLUGIN_FILE ) ) . 'assets'; 58 | $this->assets_url = esc_url( trailingslashit( plugins_url( '/assets/dist/', SENSEI_COURSE_PROGRESS_PLUGIN_FILE ) ) ); 59 | 60 | $this->load_plugin_textdomain(); 61 | 62 | register_activation_hook( SENSEI_COURSE_PROGRESS_PLUGIN_FILE, array( $this, 'install' ) ); 63 | } // End __construct() 64 | 65 | /** 66 | * Set up all hooks and filters if dependencies are met. 67 | */ 68 | public static function init() { 69 | $instance = self::instance(); 70 | add_action( 'init', array( $instance, 'load_localisation' ), 0 ); 71 | 72 | if ( ! Sensei_Course_Progress_Dependency_Checker::are_plugin_dependencies_met() ) { 73 | return; 74 | } 75 | 76 | /** 77 | * Returns the main instance of Sensei_Course_Progress to prevent the need to use globals. 78 | * 79 | * @since 1.0.0 80 | * @return Sensei_Course_Progress 81 | */ 82 | function Sensei_Course_Progress() { 83 | return Sensei_Course_Progress::instance(); 84 | } 85 | 86 | // Load frontend CSS. 87 | add_action( 'wp_enqueue_scripts', array( $instance, 'enqueue_styles' ), 10 ); 88 | 89 | // Include Widget. 90 | add_action( 'widgets_init', array( $instance, 'include_widgets' ) ); 91 | } 92 | 93 | /** 94 | * Include widgets 95 | */ 96 | public function include_widgets() { 97 | include_once dirname( __FILE__ ) . '/class-sensei-course-progress-widget.php'; 98 | register_widget( 'Sensei_Course_Progress_Widget' ); 99 | } 100 | 101 | /** 102 | * Load frontend CSS. 103 | * @access public 104 | * @since 1.0.0 105 | * @return void 106 | */ 107 | public function enqueue_styles () { 108 | wp_register_style( $this->_token . '-frontend', esc_url( $this->assets_url ) . 'css/frontend.css', array(), $this->_version ); 109 | wp_enqueue_style( $this->_token . '-frontend' ); 110 | } // End enqueue_styles() 111 | 112 | /** 113 | * Load plugin localisation. 114 | * @access public 115 | * @since 1.0.0 116 | * @return void 117 | */ 118 | public function load_localisation () { 119 | load_plugin_textdomain( 'sensei-course-progress' , false , dirname( SENSEI_COURSE_PROGRESS_PLUGIN_BASENAME ) . '/languages/' ); 120 | } // End load_localisation() 121 | 122 | /** 123 | * Load plugin textdomain. 124 | * @access public 125 | * @since 1.0.0 126 | * @return void 127 | */ 128 | public function load_plugin_textdomain () { 129 | $domain = 'sensei-course-progress'; 130 | 131 | $locale = apply_filters( 'plugin_locale' , get_locale() , $domain ); 132 | 133 | load_textdomain( $domain , WP_LANG_DIR . '/' . $domain . '/' . $domain . '-' . $locale . '.mo' ); 134 | load_plugin_textdomain( $domain , FALSE , dirname( SENSEI_COURSE_PROGRESS_PLUGIN_BASENAME ) . '/languages/' ); 135 | } // End load_plugin_textdomain 136 | 137 | /** 138 | * Main Sensei_Course_Progress Instance 139 | * 140 | * Ensures only one instance of Sensei_Course_Progress is loaded or can be loaded. 141 | * 142 | * @since 1.0.0 143 | * @static 144 | * @see Sensei_Course_Progress() 145 | * @return Sensei_Course_Progress instance 146 | */ 147 | public static function instance() { 148 | if ( is_null( self::$_instance ) ) { 149 | self::$_instance = new self(); 150 | } 151 | return self::$_instance; 152 | } // End instance() 153 | 154 | /** 155 | * Cloning is forbidden. 156 | * 157 | * @since 1.0.0 158 | */ 159 | public function __clone () { 160 | _doing_it_wrong( __FUNCTION__, esc_html__( 'Cheatin’ huh?', 'sensei-course-progress' ), esc_html( $this->_version ) ); 161 | } // End __clone() 162 | 163 | /** 164 | * Unserializing instances of this class is forbidden. 165 | * 166 | * @since 1.0.0 167 | */ 168 | public function __wakeup () { 169 | _doing_it_wrong( __FUNCTION__, esc_html__( 'Cheatin’ huh?', 'sensei-course-progress' ), esc_html( $this->_version ) ); 170 | } // End __wakeup() 171 | 172 | /** 173 | * Installation. Runs on activation. 174 | * @access public 175 | * @since 1.0.0 176 | * @return void 177 | */ 178 | public function install () { 179 | $this->_log_version_number(); 180 | } // End install() 181 | 182 | /** 183 | * Log the plugin version number. 184 | * @access public 185 | * @since 1.0.0 186 | * @return void 187 | */ 188 | private function _log_version_number () { 189 | update_option( $this->_token . '_version', $this->_version ); 190 | } 191 | 192 | } 193 | -------------------------------------------------------------------------------- /languages/sensei-course-progress-hu_HU.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woocommerce/sensei-course-progress/150c4472acf3555eb5f870fd17daa25fe311a8f3/languages/sensei-course-progress-hu_HU.mo -------------------------------------------------------------------------------- /languages/sensei-course-progress-hu_HU.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2015 Sensei Course Progress 2 | # This file is distributed under the same license as the Sensei Course Progress package. 3 | msgid "" 4 | msgstr "" 5 | "Project-Id-Version: Sensei Course Progress 2.0.0\n" 6 | "Report-Msgid-Bugs-To: https://github.com/woocommerce/sensei-course-progress/" 7 | "issues\n" 8 | "POT-Creation-Date: 2019-03-19 13:06:59+00:00\n" 9 | "PO-Revision-Date: 2019-03-23 12:42+0100\n" 10 | "Last-Translator: \n" 11 | "Language-Team: Sensei HUN \n" 12 | "Language: hu_HU\n" 13 | "MIME-Version: 1.0\n" 14 | "Content-Type: text/plain; charset=UTF-8\n" 15 | "Content-Transfer-Encoding: 8bit\n" 16 | "X-Generator: Poedit 2.2.1\n" 17 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 18 | 19 | #. translators: %1$s is version of PHP that this plugin requires; %2$s is the 20 | #. version of PHP WordPress is running on. 21 | #: includes/class-sensei-course-progress-dependency-checker.php:91 22 | msgid "" 23 | "Sensei Course Progress requires a minimum PHP version of " 24 | "%1$s, but you are running %2$s." 25 | msgstr "" 26 | "A Sensei Tanfolyam Haladás minimális PHP igénye %1$s, " 27 | "azonban a jelenlegi verzió: %2$s." 28 | 29 | #: includes/class-sensei-course-progress-dependency-checker.php:101 30 | msgid "Learn more about updating PHP" 31 | msgstr "További információk a PHP frissítéséről" 32 | 33 | #. translators: accessibility text 34 | #: includes/class-sensei-course-progress-dependency-checker.php:103 35 | msgid "(opens in a new tab)" 36 | msgstr "(új fülön nyílik meg)" 37 | 38 | #. translators: %1$s is the minimum version number of Sensei that is required. 39 | #: includes/class-sensei-course-progress-dependency-checker.php:122 40 | msgid "" 41 | "Sensei Course Progress requires that the plugin " 42 | "Sensei (minimum version: %1$s) is " 43 | "installed and activated." 44 | msgstr "" 45 | "A Sensei Tanfolyam Haladás működéséhez szükséges a " 46 | "Sensei bővítmény (minimum verzió: %1$s) " 47 | "telepítése és aktiválása." 48 | 49 | #: includes/class-sensei-course-progress-widget.php:28 50 | msgid "" 51 | "Displays the current learners progress within the current course/module " 52 | "(only displays on single lesson page)." 53 | msgstr "" 54 | "Megjeleníti az adott tanuló előrehaladását az aktuális tanfolyamban/modulban " 55 | "(csak az egyes lecke oldalakon jelenik meg)." 56 | 57 | #: includes/class-sensei-course-progress-widget.php:30 58 | msgid "Sensei - Course Progress" 59 | msgstr "Sensei - Tanfolyam Haladás" 60 | 61 | #: includes/class-sensei-course-progress-widget.php:210 62 | msgid "Previous" 63 | msgstr "Előző" 64 | 65 | #: includes/class-sensei-course-progress-widget.php:211 66 | msgid "Next" 67 | msgstr "Következő" 68 | 69 | #: includes/class-sensei-course-progress-widget.php:251 70 | msgid "Other Lessons" 71 | msgstr "További Leckék" 72 | 73 | #: includes/class-sensei-course-progress-widget.php:319 74 | msgid "Display all Modules" 75 | msgstr "Összes Modul megjelenítése" 76 | 77 | #: includes/class-sensei-course-progress-widget.php:322 78 | msgid "There are no options for this widget." 79 | msgstr "Ennek a widget-nek nincsenek beállítási lehetőségei." 80 | 81 | #: includes/class-sensei-course-progress.php:170 82 | #: includes/class-sensei-course-progress.php:179 83 | msgid "Cheatin’ huh?" 84 | msgstr "Csak nem csalunk?" 85 | 86 | #. Description of the plugin/theme 87 | msgid "" 88 | "Sensei extension that displays the learner's progress in the current course/" 89 | "module in a widget on lesson pages." 90 | msgstr "" 91 | "Sensei bővítmény, mely megjeleníti a lecke oldalakon egy widget-ben az adott " 92 | "tanuló előrehaladását az aktuális tanfolyamban/modulban." 93 | 94 | #~ msgid "Sensei Course Progress" 95 | #~ msgstr "Sensei Tanfolyam Haladás" 96 | 97 | #~ msgid "http://www.woothemes.com/" 98 | #~ msgstr "http://www.woothemes.com/" 99 | 100 | #~ msgid "WooThemes" 101 | #~ msgstr "WooThemes" 102 | -------------------------------------------------------------------------------- /languages/sensei-course-progress-ru_RU.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woocommerce/sensei-course-progress/150c4472acf3555eb5f870fd17daa25fe311a8f3/languages/sensei-course-progress-ru_RU.mo -------------------------------------------------------------------------------- /languages/sensei-course-progress-ru_RU.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2018 WooThemes 2 | # This file is distributed under the same license as the Sensei Course Progress package. 3 | msgid "" 4 | msgstr "" 5 | "Project-Id-Version: Sensei Course Progress 1.0.7\n" 6 | "Report-Msgid-Bugs-To: https://github.com/woocommerce/sensei-course-" 7 | "progress/issues\n" 8 | "POT-Creation-Date: 2018-04-04 13:12:23+00:00\n" 9 | "MIME-Version: 1.0\n" 10 | "Content-Type: text/plain; charset=UTF-8\n" 11 | "Content-Transfer-Encoding: 8bit\n" 12 | "PO-Revision-Date: 2018-08-26 20:04+0500\n" 13 | "Language-Team: Airat Halitov \n" 14 | "Language: ru_RU\n" 15 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 16 | "X-Poedit-SourceCharset: UTF-8\n" 17 | "X-Poedit-KeywordsList: __;_e;_x:1,2c;_ex:1,2c;_n:1,2;_nx:1,2,4c;" 18 | "_n_noop:1,2;_nx_noop:1,2,3c;esc_attr__;esc_html__;esc_attr_e;esc_html_e;" 19 | "esc_attr_x:1,2c;esc_html_x:1,2c\n" 20 | "X-Poedit-Basepath: ..\n" 21 | "X-Textdomain-Support: yes\n" 22 | "Last-Translator: Airat Halitov \n" 23 | "X-Generator: Poedit 1.8.7.1\n" 24 | "X-Poedit-SearchPath-0: .\n" 25 | 26 | #: includes/class-sensei-course-progress-widget.php:28 27 | msgid "" 28 | "Displays the current learners progress within the current course/module " 29 | "(only displays on single lesson page)." 30 | msgstr "" 31 | "Отображает текущий прогресс учеников в текущем курсе/модуле " 32 | "(отображается только на странице урока)" 33 | 34 | #: includes/class-sensei-course-progress-widget.php:30 35 | msgid "Sensei - Course Progress" 36 | msgstr "Sensei - Course Progress" 37 | 38 | #: includes/class-sensei-course-progress-widget.php:161 39 | msgid "Previous" 40 | msgstr "Предыдущий" 41 | 42 | #: includes/class-sensei-course-progress-widget.php:162 43 | msgid "Next" 44 | msgstr "Следующий" 45 | 46 | #: includes/class-sensei-course-progress-widget.php:256 47 | msgid "Display all Modules" 48 | msgstr "Отображать все модули" 49 | 50 | #: includes/class-sensei-course-progress-widget.php:259 51 | msgid "There are no options for this widget." 52 | msgstr "Этот виджет не имеет настроек." 53 | 54 | #: includes/class-sensei-course-progress.php:170 55 | #: includes/class-sensei-course-progress.php:179 56 | msgid "Cheatin’ huh?" 57 | msgstr "Барахлит, да?" 58 | 59 | #. Description of the plugin/theme 60 | msgid "" 61 | "Sensei extension that displays the learner's progress in the current " 62 | "course/module in a widget on lesson pages." 63 | msgstr "" 64 | "Расширение для Sensei, которое отображает в виджете на странице урока " 65 | "прогресс учеников в текущем курсе/модуле" 66 | -------------------------------------------------------------------------------- /languages/sensei-course-progress.pot: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2021 Automattic 2 | # This file is distributed under the same license as the Sensei LMS Course Progress plugin. 3 | msgid "" 4 | msgstr "" 5 | "Project-Id-Version: Sensei LMS Course Progress 2.0.4\n" 6 | "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/sensei-course-progress\n" 7 | "Last-Translator: \n" 8 | "Language-Team: \n" 9 | "MIME-Version: 1.0\n" 10 | "Content-Type: text/plain; charset=UTF-8\n" 11 | "Content-Transfer-Encoding: 8bit\n" 12 | "POT-Creation-Date: 2021-10-19T09:07:39+00:00\n" 13 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 14 | "X-Generator: WP-CLI 2.5.0\n" 15 | "X-Domain: sensei-course-progress\n" 16 | 17 | #. Plugin Name of the plugin 18 | msgid "Sensei LMS Course Progress" 19 | msgstr "" 20 | 21 | #. Plugin URI of the plugin 22 | msgid "https://woocommerce.com/products/sensei-course-progress/" 23 | msgstr "" 24 | 25 | #. Description of the plugin 26 | msgid "Sensei LMS extension that displays the student's progress in the current course/module in a widget on lesson pages." 27 | msgstr "" 28 | 29 | #. Author of the plugin 30 | msgid "Automattic" 31 | msgstr "" 32 | 33 | #. Author URI of the plugin 34 | msgid "https://automattic.com" 35 | msgstr "" 36 | 37 | #. translators: %1$s is version of PHP that this plugin requires; %2$s is the version of PHP WordPress is running on. 38 | #: includes/class-sensei-course-progress-dependency-checker.php:91 39 | msgid "Sensei LMS Course Progress requires a minimum PHP version of %1$s, but you are running %2$s." 40 | msgstr "" 41 | 42 | #: includes/class-sensei-course-progress-dependency-checker.php:101 43 | msgid "Learn more about updating PHP" 44 | msgstr "" 45 | 46 | #. translators: accessibility text 47 | #: includes/class-sensei-course-progress-dependency-checker.php:103 48 | msgid "(opens in a new tab)" 49 | msgstr "" 50 | 51 | #. translators: %1$s is the minimum version number of Sensei that is required. 52 | #: includes/class-sensei-course-progress-dependency-checker.php:122 53 | msgid "Sensei LMS Course Progress requires that the plugin Sensei (minimum version: %1$s) is installed and activated." 54 | msgstr "" 55 | 56 | #: includes/class-sensei-course-progress-widget-original.php:28 57 | #: includes/class-sensei-course-progress-widget.php:28 58 | msgid "Displays the current learners progress within the current course/module (only displays on single lesson page)." 59 | msgstr "" 60 | 61 | #: includes/class-sensei-course-progress-widget-original.php:30 62 | #: includes/class-sensei-course-progress-widget.php:30 63 | msgid "Sensei LMS - Course Progress" 64 | msgstr "" 65 | 66 | #: includes/class-sensei-course-progress-widget-original.php:207 67 | #: includes/class-sensei-course-progress-widget.php:207 68 | msgid "Previous" 69 | msgstr "" 70 | 71 | #: includes/class-sensei-course-progress-widget-original.php:208 72 | #: includes/class-sensei-course-progress-widget.php:208 73 | msgid "Next" 74 | msgstr "" 75 | 76 | #: includes/class-sensei-course-progress-widget-original.php:248 77 | #: includes/class-sensei-course-progress-widget.php:257 78 | msgid "Other Lessons" 79 | msgstr "" 80 | 81 | #: includes/class-sensei-course-progress-widget-original.php:316 82 | #: includes/class-sensei-course-progress-widget.php:326 83 | msgid "Display all Modules" 84 | msgstr "" 85 | 86 | #: includes/class-sensei-course-progress-widget-original.php:319 87 | #: includes/class-sensei-course-progress-widget.php:329 88 | msgid "There are no options for this widget." 89 | msgstr "" 90 | 91 | #: includes/class-sensei-course-progress-widget.php:216 92 | msgid "Collapse" 93 | msgstr "" 94 | 95 | #: includes/class-sensei-course-progress-widget.php:219 96 | msgid "Expand" 97 | msgstr "" 98 | 99 | #: includes/class-sensei-course-progress.php:160 100 | #: includes/class-sensei-course-progress.php:169 101 | msgid "Cheatin’ huh?" 102 | msgstr "" 103 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sensei-course-progress", 3 | "version": "2.0.4", 4 | "description": "Sensei LMS Course Progress", 5 | "author": "Automattic", 6 | "license": "GPL-2.0-or-later", 7 | "keywords": [ 8 | "wordpress-plugin" 9 | ], 10 | "homepage": "https://woocommerce.com/products/sensei-course-progress/", 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/woocommerce/sensei-course-progress.git" 14 | }, 15 | "bugs": { 16 | "url": "https://github.com/woocommerce/sensei-course-progress/issues" 17 | }, 18 | "devDependencies": { 19 | "@wordpress/scripts": "18.0.1" 20 | }, 21 | "scripts": { 22 | "build": "npm run build:assets && npm run archive", 23 | "build:assets": "wp-scripts build", 24 | "archive": "composer archive --file=$npm_package_name --format=zip", 25 | "postarchive": "rm -rf $npm_package_name && unzip $npm_package_name.zip -d $npm_package_name && rm $npm_package_name.zip && zip -r $npm_package_name.zip $npm_package_name && rm -rf $npm_package_name", 26 | "check-engines": "wp-scripts check-engines", 27 | "check-licenses": "wp-scripts check-licenses", 28 | "format:js": "wp-scripts format-js", 29 | "lint:css": "wp-scripts lint-style assets/css", 30 | "lint:js": "wp-scripts lint-js assets/js", 31 | "lint:pkg-json": "wp-scripts lint-pkg-json", 32 | "packages-update": "wp-scripts packages-update", 33 | "start": "wp-scripts start", 34 | "i18n:build": "npm run i18n:php", 35 | "i18n:php": "wp i18n make-pot --exclude=lib,vendor,node_modules --skip-js --headers='{\"Last-Translator\":null,\"Language-Team\":null,\"Report-Msgid-Bugs-To\":\"https://wordpress.org/support/plugin/sensei-course-progress\"}' . languages/sensei-course-progress.pot" 36 | }, 37 | "config": { 38 | "wp_org_slug": "sensei-course-progress" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /phpcs.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | A custom set of code standard rules to check for the Sensei LMS Course Progress plugin. 7 | 8 | 9 | 10 | 11 | 12 | . 13 | 15 | ./build/ 16 | ./node_modules/ 17 | ./vendor/ 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 27 | 28 | 30 | 31 | 32 | 34 | 35 | 36 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /readme.txt: -------------------------------------------------------------------------------- 1 | === Sensei LMS Course Progress === 2 | Contributors: automattic, alexsanford1, donnapep, jakeom 3 | Tags: course progress, sensei lms, widget 4 | Requires at least: 5.6 5 | Tested up to: 5.8 6 | Requires PHP: 7.0 7 | Stable tag: 2.0.4 8 | License: GPLv2 or later 9 | License URI: http://www.gnu.org/licenses/gpl-2.0.html 10 | 11 | Enable your students to easily view their progress and pick up where they left off in a course. 12 | 13 | == Description == 14 | 15 | It can be easy for students to lose track of their progress in a course that contains many lessons. It can be especially problematic if they’re taking the course over a period of several weeks or months. 16 | 17 | Sensei LMS Course Progress provides a widget that displays the lessons in the current course or module. It lets your students see, at a glance, which lessons they have completed and which lessons they still have to take. 18 | 19 | == Installation == 20 | 21 | = Automatic installation = 22 | 23 | 1. Log into your WordPress admin panel and go to *Plugins* > *Add New*. 24 | 2. Enter "Sensei LMS Course Progress" into the search field. 25 | 3. Once you've located the plugin, click *Install Now*. 26 | 4. Click *Activate*. 27 | 28 | = Manual installation = 29 | 30 | 1. Download the plugin file to your computer and unzip it. 31 | 2. Using an FTP program, or your hosting control panel, upload the unzipped plugin folder to your WordPress installation's `wp-content/plugins/` directory on the server. 32 | 3. Log into your WordPress admin panel and activate the plugin from the *Plugins* menu. 33 | 34 | == Screenshots == 35 | 1. Course progress widget configuration 36 | 2. Course progress widget 37 | 38 | == Changelog == 39 | [See changelog for all versions](https://raw.githubusercontent.com/woocommerce/sensei-course-progress/master/changelog.txt). 40 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "config:base" 4 | ], 5 | "labels": ["[Type] Maintenance"], 6 | "packageRules": [ 7 | { 8 | "depTypeList": ["devDependencies"], 9 | "extends": ["schedule:monthly"], 10 | "groupName": "devDependencies" 11 | }, 12 | { 13 | "depTypeList": ["dependencies"], 14 | "extends": ["schedule:monthly"] 15 | }, 16 | { 17 | "depTypeList": ["require-dev"], 18 | "extends": ["schedule:monthly"], 19 | "groupName": "require-dev" 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /sensei-course-progress.php: -------------------------------------------------------------------------------- 1 |