Changeset 3787392
- Timestamp:
- 11/06/2026 07:44:19 AM (13 hours ago)
- Location:
- sikshya
- Files:
-
- 8 edited
- 1 copied
-
tags/1.0.17 (copied) (copied from sikshya/trunk )
-
tags/1.0.17/changelog.txt (modified) (1 diff)
-
tags/1.0.17/readme.txt (modified) (3 diffs)
-
tags/1.0.17/sikshya.php (modified) (2 diffs)
-
tags/1.0.17/src/Admin/ReactAdminConfig.php (modified) (1 diff)
-
trunk/changelog.txt (modified) (1 diff)
-
trunk/readme.txt (modified) (3 diffs)
-
trunk/sikshya.php (modified) (2 diffs)
-
trunk/src/Admin/ReactAdminConfig.php (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
sikshya/tags/1.0.17/changelog.txt
r3777634 r3787392 2 2 (readme.txt carries only the two most recent releases; WordPress.org truncates 3 3 a changelog longer than 5,000 words.) 4 5 = 1.0.17 - 2026-11-06 = 6 * **A feature you had paid for could be invisible.** Course discussions is included in Growth, but its menu row was built to remove itself unless the add-on was already switched on — the one row of thirteen that hid instead of reporting "off". So a site with the right licence saw no Discussions entry anywhere and no route to enable it, while the screen behind it had been sitting there the whole time offering to turn it on. It is now listed like every other add-on route, marked "off" until you enable it at Sikshya → Addons. Reported by a customer on Growth who could not find it. 4 7 5 8 = 1.0.16 - 2026-11-01 = -
sikshya/tags/1.0.17/readme.txt
r3777634 r3787392 6 6 Tested up to: 7.1 7 7 Requires PHP: 7.4 8 Stable tag: 1.0.1 68 Stable tag: 1.0.17 9 9 License: GPLv2 or later 10 10 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 427 427 https://github.com/mantrabrain/sikshya/releases 428 428 429 = 1.0.17 - 2026-11-06 = 430 * **A feature you had paid for could be invisible.** Course discussions is included in Growth, but its menu row was built to remove itself unless the add-on was already switched on — the one row of thirteen that hid instead of reporting "off". So a site with the right licence saw no Discussions entry anywhere and no route to enable it, while the screen behind it had been sitting there the whole time offering to turn it on. It is now listed like every other add-on route, marked "off" until you enable it at Sikshya → Addons. Reported by a customer on Growth who could not find it. 431 429 432 = 1.0.16 - 2026-11-01 = 430 433 **Documentation only. No code changed; there is no reason to rush this update.** … … 432 435 * Adds the Sikshya Pro overview video to the Pro section of this page. 433 436 434 = 1.0.15 - 2026-11-01 =435 **An AI studio for authoring: draft an outline, write a lesson, write quiz questions — with your own provider key, and nothing created until you have read the draft.**436 * **New: Course → AI studio.** Describe what a course should teach and get an outline of chapters and lessons you can rename, reorder and delete before anything exists. Pick a lesson and have its body written. Pick a chapter and have quiz questions written, with explanations learners see after grading. Then press a button to create it — generating and creating are deliberately two steps, so a draft you dislike costs you nothing but a click.437 * **Your key, your data.** Bring an API key from Anthropic or OpenAI. Requests go from your own server straight to that provider: no course material passes through MantraBrain, and nothing leaves your site until you have saved a key. A monthly request limit is set to 200 out of the box so a mistake cannot run up a provider bill, and it is checked before each request, so a refused one is free.438 * Applying an outline creates one chapter at a time with visible progress. If something fails halfway, the chapters already created are real and the rest are still on screen to retry — it never duplicates what already worked.439 * AI authoring is off until you enable the add-on, and inert until a key is saved. Updating from 1.0.14 changes nothing about an existing site.440 * Requires Sikshya Pro 1.0.11 for the generation itself (Starter tier and above). The studio screen lives in the free plugin so the add-on has somewhere to appear.441 * **Deleting a person left the LMS holding their place.** Nothing in Sikshya noticed a WordPress user being deleted, so their enrolments stayed open, their group seat stayed taken, and their mandatory training stayed assigned to somebody who no longer existed. The seat was the expensive part: an organisation that bought a hundred seats lost one with every employee who left, and the only remedy was for a leader to hunt down the row by hand. Deleting a user now closes their open enrolments, and Sikshya Pro releases the seat and records what happened. Completed enrolments are deliberately left alone — that row is the evidence the person did the training before they left — and nothing is deleted. A site that wants the old behaviour can filter `sikshya_cancel_enrollments_on_user_delete`.442 * For integrators: a single new action, `sikshya_user_deprovisioned`, carries the departure with the identity attached (login, email, roles, how many enrolments were closed), because by the time it fires the WordPress user record is gone. It is the hook to use for anything of your own that tracks people, and it is what makes an identity provider deprovisioning through a SCIM plugin do the right thing in the LMS — see `docs/ENTERPRISE-IDENTITY.md`.443 * **New: a content bank for material more than one course uses.** Content library → Content bank keeps a library of lessons, quizzes and assignments: save anything already in a course, then drop a copy into any section of any course you can edit. A quiz comes with its questions, answer keys and settings. Inserting makes a **copy**, on purpose — a learner's progress and quiz attempts are recorded against one lesson, so a lesson shared between two courses would show somebody as having finished a course they never took. The cost of that is worth knowing before you rely on it: fixing a typo in the bank does not fix the courses already built from it. Items are private to whoever saved them until shared with the site's other authors, and a shared item stays theirs to rename or remove. Starter tier and above, off until you enable the add-on; `docs/CONTENT-BANK.md` covers what travels with a copy and what is refused — cmi5 lessons are, with a reason.444 * **Dialogs now trap the keyboard correctly in Safari.** Two focus bugs were hiding behind the fact that everything had only ever been tested in Chrome. On macOS, Safari's Tab order skips buttons and links unless you have turned on full keyboard access, so Sikshya's dialogs calculated where the last stop was and then never reached it — Tab walked straight out of the dialog and into the page behind it. And because clicking a button does not focus it on macOS, opening a dialog with the mouse and pressing Escape dropped you at the top of the page instead of back on the button you pressed. Both are fixed, and the whole browser suite now runs in Chromium, WebKit and Firefox so this class of bug cannot hide again.445 * **Checked on PHP 7.4 through 8.5.** The whole test suite now runs on each of 7.4, 8.1, 8.2, 8.3, 8.4 and 8.5, and the compatibility ruleset checks the code against "7.4 and every later version" instead of 7.4 alone. Sikshya still *requires* only PHP 7.4, so no host is left behind — this is about the other end of the range, where a host that has moved to a current PHP should see no deprecation notices from Sikshya.446 * **The course picker's search box now actually searches.** Every admin screen that asks you to choose a course — the AI studio, Enrolments, Discussions, the activity log, the gradebook, grading, Integrations, prerequisites, the course builder, orders and coupons — offered a search box that threw away what you typed and listed the first twenty courses by title instead. On a site with twenty courses or fewer nobody could tell, because that list was already all of them; past that, a course whose title did not sort into the first page simply could not be chosen. Typing now filters, and the box keeps what you typed.447 * **A warning when Sikshya Pro is older than Sikshya.** Free updates come from WordPress.org, often automatically, while Pro updates come from your account — so for a while after every release the ordinary state of a paid site is the free plugin running ahead of Pro. In that window, screens for features added by a newer Pro add-on appear and then fail to load, which looks like a bug and is not one. Sikshya now says so plainly, naming both versions and where to update, and the notice can be dismissed. A site with no Pro at all never sees it.448 * **New: images and audio in quiz questions.** Any question type can now carry one image or audio clip on its stem, shown between the question and the answers — so you can ask "listen to this and tell us what you hear" or "what is wrong with this diagram", which until now simply could not be asked. Pick a file from your media library, or paste a URL. A library file is served through the same signed, expiring, per-learner link as everything else, so a question image behind a paid course is not handed out by its URL. **A picture cannot be saved without a description**, and that is on purpose: the image *is* the question, so without one a learner using a screen reader has nothing to answer from. Audio is exempt — the player gets a sensible name on its own, and a transcript of a clip you are asking somebody to identify would give the answer away. `docs/QUESTION-MEDIA.md` covers what is not claimed: media on the individual answer options is deliberately not built, there is no video, and imports still bring questions across without their pictures.449 * **New: PDF lessons.** Set a lesson's type to **PDF document**, pick a file from your media library (or paste a URL), and learners read it in the lesson itself — ticking it complete, counting towards progress and certificates, like any other step. A file from your media library is **not** served by its uploads URL: it goes through a signed link that expires within the hour and only works for the signed-in learner it was issued to, so a URL shared in a chat does not hand your course material to somebody who did not pay for it. There is always a visible "Open in a new tab" link beside the viewer, because embedded PDF support is uneven on phones and a frame that fails to draw does so silently. "Hide the download link" is offered and labelled honestly: it removes the link, and it does not stop anyone saving the file — the browser's own PDF viewer has a save button, and no web page can take it away. `docs/PDF-LESSONS.md` covers the rest, including what is not claimed: no page count or reading progress, no annotations, and no copy protection.450 * **New: points and a leaderboard.** People → Points lets you decide what finishing a lesson, passing a quiz, completing an assignment or a course, or earning a certificate is worth. Learners see their total, their place and their last few awards on their account page, and `[sikshya_leaderboard]` puts the board on any page. **Every amount starts at zero**, so turning this on changes nothing until you choose the numbers. Each achievement pays once — un-ticking and re-ticking a lesson, or retaking a quiz, earns nothing more — and a quiz pays for passing, not for attempting. Because a leaderboard publishes real people's names, it is visible to site staff only until you widen it, learners can hide themselves while still earning, names are shortened to a first name and last initial by default, and deleting a person removes their points. Requires Sikshya Pro 1.0.11 (Growth tier and above); `docs/GAMIFICATION.md` covers the rest, including what is not claimed — no streaks, no spending the points, no per-course boards.451 * **New: membership levels.** Sikshya could already sell ongoing access, but only one course at a time — set a course's type to subscription and pick its plan. Now Subscriptions → Membership levels lets you say "Gold is these forty courses" (or these categories, or everything), give it a name, a tagline and selling points, and drop the pricing table on any page with `[sikshya_membership_levels]`. A course page tells visitors which memberships include it, and a member sees "you have this" instead of a Join button. **A membership only ever adds access** — a course in no level behaves exactly as it did before, and deleting every level puts things back exactly as they were. Requires Sikshya Pro 1.0.11 (Growth tier and above, part of the Subscriptions add-on); `docs/MEMBERSHIPS.md` covers how joining works and what is not claimed.452 * **New: sell your courses through WooCommerce, free.** Edit a product, pick the courses it gives access to, and buying it enrols the customer — in one course or in a whole bundle. A refund, cancellation or failed payment closes the access **that order** gave them, and nothing else: somebody enrolled by an administrator, or who bought the same course in another order, keeps it. Nothing is deleted either, so if they buy again later the same enrolment reopens and the progress they made is still theirs. Guests are handled: WooCommerce will take money from somebody with no account, so one is created from the billing address and WordPress emails them a link to set a password. And a course sold this way shows the WooCommerce price and add-to-cart button instead of Sikshya's own cart, because a page offering two ways to pay makes half of a shop's reporting wrong. Access is granted on **processing** as well as completed, since a shop selling only courses often never marks a digital order complete. Nothing to turn on, and nothing runs if WooCommerce is not installed. `docs/WOOCOMMERCE.md` covers the rest, including what is *not* wired: WooCommerce Subscriptions renewals, and keeping the two prices in step.453 * **New: bring a Tutor LMS or LearnDash library across, free.** Sikshya → Tools → Move from another LMS reads the other plugin's courses, structure, lessons, quizzes with their answer keys, enrollments and completions, and recreates them as its own. It never changes or deletes anything belonging to the other plugin, so you can keep it installed, compare the two and switch back — that is the point of doing it this way. Preview first: a preview counts everything a real run would create and creates none of it. And running it twice is safe; the second run updates what it already brought across instead of making a second catalogue. Large libraries are better moved over WP-CLI (`wp sikshya import --source=tutor`, or `--source=learndash`), where there is no request to time out.454 * **LearnDash's three levels become Sikshya's two, sensibly.** A course that uses topics becomes a chapter per lesson — with the lesson's own page kept as the first lesson inside it, so nothing the author wrote is lost — while a flat course stays flat, because twenty chapters of one lesson each is faithful and unreadable. Learners who were *given* access but never opened the course come across as enrolled too; they would otherwise be dropped.455 * **A question is only imported if it can be imported honestly.** Six types come across exactly as they graded before. Types with no equivalent are named in the report instead of being turned into the nearest thing, and so are matching and ordering questions — those two Sikshya does support, but the old plugin stores their options already in the correct order, so an imported one would be impossible to get wrong. `docs/MIGRATING-TO-SIKSHYA.md` lists every mapping, and what does not come across: no orders or payments, no certificates or reviews, no LearnDash groups, and nothing at all removed from the old plugin.456 * **New: cmi5 courses, imported and launched.** Upload a cmi5 package and Sikshya reads its course structure: every block becomes a chapter and every assignable unit becomes a lesson on the course you chose — which is what cmi5 packages are for, and what a SCORM zip cannot do. Learners press Start, the unit opens, and when it reports back what the package calls "done" the lesson is ticked off their curriculum. The unit talks to Sikshya rather than straight to your Learning Record Store, so your LRS credentials never go anywhere near a learner's browser, and whatever a unit claims about who it is reporting on, Sikshya replaces it with the session it was launched under. What is *not* claimed is in `docs/XAPI.md`: this is not an ADL-certified implementation, blocks are flattened into chapters because Sikshya's curriculum is two levels deep, and the importer refuses a package with a completion rule it does not recognise instead of guessing one.457 * **Accessibility: a round of fixes you will notice if you use a keyboard or a screen reader.** The account menu button had no name at all on every account page — a screen reader announced "button" and nothing else. Progress bars on the resume card and the course cards reported a percentage without saying what it measured. Dialogs let the Tab key walk out of them onto the page behind, and dropped your place in the page when they closed, so you had to tab all the way back to the button you had just pressed. Seven form fields had labels that were not attached to anything, which reads as "edit, blank". A report table too wide for its box could not be reached without a trackpad. Saying "click Search" to voice control did nothing, because the search button was named something other than the word on it. All fixed.458 * **Readable text.** Several status colours sat just under the contrast the standard asks for — the "Remove" link in the cart, passing quiz scores, payment badges, the secondary text throughout the account pages and the learn shell, and the white text on sale and featured badges, which was the worst of them. Each is now a darker shade of the same colour.459 * Lists now show "(no title)" for a draft saved without one, instead of a blank row with an invisible link in it.460 * The rich-text editor's toolbar buttons — bold, italic, lists, link, text style — had no names, so the editor could not be operated without sight. They do now.461 * **New: report learning to your own Learning Record Store (xAPI).** Enrollments, lesson and course completions, quiz results with their scores, assignment submissions and certificates are sent to any conformant LRS as xAPI 1.0.3 statements — the thing nearly every public-sector and corporate tender asks for alongside SCORM, and that no other WordPress LMS does natively. You choose how much about a learner leaves your site: their email address, a hash of it that still lets an LRS recognise the same person elsewhere, or an account id with no email at all. Sikshya → Integrations shows what has been accepted, what is waiting, and what failed with the LRS's own words. Scale tier, off until you enable it, and nothing is queued until an endpoint and credentials exist — so turning it on early cannot build a backlog that floods your LRS later. `docs/XAPI.md` has the full statement map and, just as plainly, what is not included: this is reporting to an LRS, not cmi5, and Sikshya is not itself an LRS.462 * For contributors: WCAG 2.1 AA is enforced by the test suite, over all 43 admin screens and 13 learner-facing pages, plus a source check that catches an unlabelled field even when it is hidden behind a tab. What has *not* been done is stated just as plainly: no screen reader has been used, so the conformance report in `docs/ACCESSIBILITY-CONFORMANCE-REPORT.md` is a draft rather than a VPAT. `docs/ACCESSIBILITY.md` has both lists.463 464 437 == Upgrade Notice == 465 438 -
sikshya/tags/1.0.17/sikshya.php
r3777634 r3787392 4 4 * Plugin URI: https://mantrabrain.com/plugins/sikshya-lms/ 5 5 * Description: A comprehensive WordPress Learning Management System plugin with modern SaaS design and enterprise-level architecture. 6 * Version: 1.0.1 66 * Version: 1.0.17 7 7 * Author: MantraBrain 8 8 * Author URI: https://mantrabrain.com … … 26 26 27 27 // Define plugin constants 28 define('SIKSHYA_VERSION', '1.0.1 6');28 define('SIKSHYA_VERSION', '1.0.17'); 29 29 define('SIKSHYA_PLUGIN_FILE', __FILE__); 30 30 define('SIKSHYA_PLUGIN_DIR', plugin_dir_path(__FILE__)); -
sikshya/tags/1.0.17/src/Admin/ReactAdminConfig.php
r3777551 r3787392 260 260 ]; 261 261 262 if (TierCapabilities::feature('community_discussions') && Addons::isEnabled('community_discussions')) { 263 $course_children[] = [ 264 'id' => 'discussions', 265 'label' => __('Discussions & Q&A', 'sikshya'), 266 'icon' => 'chatBubbles', 267 'href' => self::reactAppUrl('discussions'), 268 'cap' => 'sikshya_staff', 269 ]; 270 } 262 /* 263 * Badged like every other add-on entry rather than hidden outright. 264 * Hiding it meant a site that *had* paid for Discussions saw no trace 265 * of it anywhere in the menu and no route to switch it on — the one 266 * nav row of thirteen that removed itself instead of saying "off". 267 * `DiscussionsPage` already renders an enable prompt when the add-on 268 * is off, so the destination has always been ready for this. 269 */ 270 $course_children[] = self::withNavGate([ 271 'id' => 'discussions', 272 'label' => __('Discussions & Q&A', 'sikshya'), 273 'icon' => 'chatBubbles', 274 'href' => self::reactAppUrl('discussions'), 275 'cap' => 'sikshya_staff', 276 ], 'community_discussions'); 271 277 272 278 $course_children[] = self::withNavGate([ -
sikshya/trunk/changelog.txt
r3777634 r3787392 2 2 (readme.txt carries only the two most recent releases; WordPress.org truncates 3 3 a changelog longer than 5,000 words.) 4 5 = 1.0.17 - 2026-11-06 = 6 * **A feature you had paid for could be invisible.** Course discussions is included in Growth, but its menu row was built to remove itself unless the add-on was already switched on — the one row of thirteen that hid instead of reporting "off". So a site with the right licence saw no Discussions entry anywhere and no route to enable it, while the screen behind it had been sitting there the whole time offering to turn it on. It is now listed like every other add-on route, marked "off" until you enable it at Sikshya → Addons. Reported by a customer on Growth who could not find it. 4 7 5 8 = 1.0.16 - 2026-11-01 = -
sikshya/trunk/readme.txt
r3777634 r3787392 6 6 Tested up to: 7.1 7 7 Requires PHP: 7.4 8 Stable tag: 1.0.1 68 Stable tag: 1.0.17 9 9 License: GPLv2 or later 10 10 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 427 427 https://github.com/mantrabrain/sikshya/releases 428 428 429 = 1.0.17 - 2026-11-06 = 430 * **A feature you had paid for could be invisible.** Course discussions is included in Growth, but its menu row was built to remove itself unless the add-on was already switched on — the one row of thirteen that hid instead of reporting "off". So a site with the right licence saw no Discussions entry anywhere and no route to enable it, while the screen behind it had been sitting there the whole time offering to turn it on. It is now listed like every other add-on route, marked "off" until you enable it at Sikshya → Addons. Reported by a customer on Growth who could not find it. 431 429 432 = 1.0.16 - 2026-11-01 = 430 433 **Documentation only. No code changed; there is no reason to rush this update.** … … 432 435 * Adds the Sikshya Pro overview video to the Pro section of this page. 433 436 434 = 1.0.15 - 2026-11-01 =435 **An AI studio for authoring: draft an outline, write a lesson, write quiz questions — with your own provider key, and nothing created until you have read the draft.**436 * **New: Course → AI studio.** Describe what a course should teach and get an outline of chapters and lessons you can rename, reorder and delete before anything exists. Pick a lesson and have its body written. Pick a chapter and have quiz questions written, with explanations learners see after grading. Then press a button to create it — generating and creating are deliberately two steps, so a draft you dislike costs you nothing but a click.437 * **Your key, your data.** Bring an API key from Anthropic or OpenAI. Requests go from your own server straight to that provider: no course material passes through MantraBrain, and nothing leaves your site until you have saved a key. A monthly request limit is set to 200 out of the box so a mistake cannot run up a provider bill, and it is checked before each request, so a refused one is free.438 * Applying an outline creates one chapter at a time with visible progress. If something fails halfway, the chapters already created are real and the rest are still on screen to retry — it never duplicates what already worked.439 * AI authoring is off until you enable the add-on, and inert until a key is saved. Updating from 1.0.14 changes nothing about an existing site.440 * Requires Sikshya Pro 1.0.11 for the generation itself (Starter tier and above). The studio screen lives in the free plugin so the add-on has somewhere to appear.441 * **Deleting a person left the LMS holding their place.** Nothing in Sikshya noticed a WordPress user being deleted, so their enrolments stayed open, their group seat stayed taken, and their mandatory training stayed assigned to somebody who no longer existed. The seat was the expensive part: an organisation that bought a hundred seats lost one with every employee who left, and the only remedy was for a leader to hunt down the row by hand. Deleting a user now closes their open enrolments, and Sikshya Pro releases the seat and records what happened. Completed enrolments are deliberately left alone — that row is the evidence the person did the training before they left — and nothing is deleted. A site that wants the old behaviour can filter `sikshya_cancel_enrollments_on_user_delete`.442 * For integrators: a single new action, `sikshya_user_deprovisioned`, carries the departure with the identity attached (login, email, roles, how many enrolments were closed), because by the time it fires the WordPress user record is gone. It is the hook to use for anything of your own that tracks people, and it is what makes an identity provider deprovisioning through a SCIM plugin do the right thing in the LMS — see `docs/ENTERPRISE-IDENTITY.md`.443 * **New: a content bank for material more than one course uses.** Content library → Content bank keeps a library of lessons, quizzes and assignments: save anything already in a course, then drop a copy into any section of any course you can edit. A quiz comes with its questions, answer keys and settings. Inserting makes a **copy**, on purpose — a learner's progress and quiz attempts are recorded against one lesson, so a lesson shared between two courses would show somebody as having finished a course they never took. The cost of that is worth knowing before you rely on it: fixing a typo in the bank does not fix the courses already built from it. Items are private to whoever saved them until shared with the site's other authors, and a shared item stays theirs to rename or remove. Starter tier and above, off until you enable the add-on; `docs/CONTENT-BANK.md` covers what travels with a copy and what is refused — cmi5 lessons are, with a reason.444 * **Dialogs now trap the keyboard correctly in Safari.** Two focus bugs were hiding behind the fact that everything had only ever been tested in Chrome. On macOS, Safari's Tab order skips buttons and links unless you have turned on full keyboard access, so Sikshya's dialogs calculated where the last stop was and then never reached it — Tab walked straight out of the dialog and into the page behind it. And because clicking a button does not focus it on macOS, opening a dialog with the mouse and pressing Escape dropped you at the top of the page instead of back on the button you pressed. Both are fixed, and the whole browser suite now runs in Chromium, WebKit and Firefox so this class of bug cannot hide again.445 * **Checked on PHP 7.4 through 8.5.** The whole test suite now runs on each of 7.4, 8.1, 8.2, 8.3, 8.4 and 8.5, and the compatibility ruleset checks the code against "7.4 and every later version" instead of 7.4 alone. Sikshya still *requires* only PHP 7.4, so no host is left behind — this is about the other end of the range, where a host that has moved to a current PHP should see no deprecation notices from Sikshya.446 * **The course picker's search box now actually searches.** Every admin screen that asks you to choose a course — the AI studio, Enrolments, Discussions, the activity log, the gradebook, grading, Integrations, prerequisites, the course builder, orders and coupons — offered a search box that threw away what you typed and listed the first twenty courses by title instead. On a site with twenty courses or fewer nobody could tell, because that list was already all of them; past that, a course whose title did not sort into the first page simply could not be chosen. Typing now filters, and the box keeps what you typed.447 * **A warning when Sikshya Pro is older than Sikshya.** Free updates come from WordPress.org, often automatically, while Pro updates come from your account — so for a while after every release the ordinary state of a paid site is the free plugin running ahead of Pro. In that window, screens for features added by a newer Pro add-on appear and then fail to load, which looks like a bug and is not one. Sikshya now says so plainly, naming both versions and where to update, and the notice can be dismissed. A site with no Pro at all never sees it.448 * **New: images and audio in quiz questions.** Any question type can now carry one image or audio clip on its stem, shown between the question and the answers — so you can ask "listen to this and tell us what you hear" or "what is wrong with this diagram", which until now simply could not be asked. Pick a file from your media library, or paste a URL. A library file is served through the same signed, expiring, per-learner link as everything else, so a question image behind a paid course is not handed out by its URL. **A picture cannot be saved without a description**, and that is on purpose: the image *is* the question, so without one a learner using a screen reader has nothing to answer from. Audio is exempt — the player gets a sensible name on its own, and a transcript of a clip you are asking somebody to identify would give the answer away. `docs/QUESTION-MEDIA.md` covers what is not claimed: media on the individual answer options is deliberately not built, there is no video, and imports still bring questions across without their pictures.449 * **New: PDF lessons.** Set a lesson's type to **PDF document**, pick a file from your media library (or paste a URL), and learners read it in the lesson itself — ticking it complete, counting towards progress and certificates, like any other step. A file from your media library is **not** served by its uploads URL: it goes through a signed link that expires within the hour and only works for the signed-in learner it was issued to, so a URL shared in a chat does not hand your course material to somebody who did not pay for it. There is always a visible "Open in a new tab" link beside the viewer, because embedded PDF support is uneven on phones and a frame that fails to draw does so silently. "Hide the download link" is offered and labelled honestly: it removes the link, and it does not stop anyone saving the file — the browser's own PDF viewer has a save button, and no web page can take it away. `docs/PDF-LESSONS.md` covers the rest, including what is not claimed: no page count or reading progress, no annotations, and no copy protection.450 * **New: points and a leaderboard.** People → Points lets you decide what finishing a lesson, passing a quiz, completing an assignment or a course, or earning a certificate is worth. Learners see their total, their place and their last few awards on their account page, and `[sikshya_leaderboard]` puts the board on any page. **Every amount starts at zero**, so turning this on changes nothing until you choose the numbers. Each achievement pays once — un-ticking and re-ticking a lesson, or retaking a quiz, earns nothing more — and a quiz pays for passing, not for attempting. Because a leaderboard publishes real people's names, it is visible to site staff only until you widen it, learners can hide themselves while still earning, names are shortened to a first name and last initial by default, and deleting a person removes their points. Requires Sikshya Pro 1.0.11 (Growth tier and above); `docs/GAMIFICATION.md` covers the rest, including what is not claimed — no streaks, no spending the points, no per-course boards.451 * **New: membership levels.** Sikshya could already sell ongoing access, but only one course at a time — set a course's type to subscription and pick its plan. Now Subscriptions → Membership levels lets you say "Gold is these forty courses" (or these categories, or everything), give it a name, a tagline and selling points, and drop the pricing table on any page with `[sikshya_membership_levels]`. A course page tells visitors which memberships include it, and a member sees "you have this" instead of a Join button. **A membership only ever adds access** — a course in no level behaves exactly as it did before, and deleting every level puts things back exactly as they were. Requires Sikshya Pro 1.0.11 (Growth tier and above, part of the Subscriptions add-on); `docs/MEMBERSHIPS.md` covers how joining works and what is not claimed.452 * **New: sell your courses through WooCommerce, free.** Edit a product, pick the courses it gives access to, and buying it enrols the customer — in one course or in a whole bundle. A refund, cancellation or failed payment closes the access **that order** gave them, and nothing else: somebody enrolled by an administrator, or who bought the same course in another order, keeps it. Nothing is deleted either, so if they buy again later the same enrolment reopens and the progress they made is still theirs. Guests are handled: WooCommerce will take money from somebody with no account, so one is created from the billing address and WordPress emails them a link to set a password. And a course sold this way shows the WooCommerce price and add-to-cart button instead of Sikshya's own cart, because a page offering two ways to pay makes half of a shop's reporting wrong. Access is granted on **processing** as well as completed, since a shop selling only courses often never marks a digital order complete. Nothing to turn on, and nothing runs if WooCommerce is not installed. `docs/WOOCOMMERCE.md` covers the rest, including what is *not* wired: WooCommerce Subscriptions renewals, and keeping the two prices in step.453 * **New: bring a Tutor LMS or LearnDash library across, free.** Sikshya → Tools → Move from another LMS reads the other plugin's courses, structure, lessons, quizzes with their answer keys, enrollments and completions, and recreates them as its own. It never changes or deletes anything belonging to the other plugin, so you can keep it installed, compare the two and switch back — that is the point of doing it this way. Preview first: a preview counts everything a real run would create and creates none of it. And running it twice is safe; the second run updates what it already brought across instead of making a second catalogue. Large libraries are better moved over WP-CLI (`wp sikshya import --source=tutor`, or `--source=learndash`), where there is no request to time out.454 * **LearnDash's three levels become Sikshya's two, sensibly.** A course that uses topics becomes a chapter per lesson — with the lesson's own page kept as the first lesson inside it, so nothing the author wrote is lost — while a flat course stays flat, because twenty chapters of one lesson each is faithful and unreadable. Learners who were *given* access but never opened the course come across as enrolled too; they would otherwise be dropped.455 * **A question is only imported if it can be imported honestly.** Six types come across exactly as they graded before. Types with no equivalent are named in the report instead of being turned into the nearest thing, and so are matching and ordering questions — those two Sikshya does support, but the old plugin stores their options already in the correct order, so an imported one would be impossible to get wrong. `docs/MIGRATING-TO-SIKSHYA.md` lists every mapping, and what does not come across: no orders or payments, no certificates or reviews, no LearnDash groups, and nothing at all removed from the old plugin.456 * **New: cmi5 courses, imported and launched.** Upload a cmi5 package and Sikshya reads its course structure: every block becomes a chapter and every assignable unit becomes a lesson on the course you chose — which is what cmi5 packages are for, and what a SCORM zip cannot do. Learners press Start, the unit opens, and when it reports back what the package calls "done" the lesson is ticked off their curriculum. The unit talks to Sikshya rather than straight to your Learning Record Store, so your LRS credentials never go anywhere near a learner's browser, and whatever a unit claims about who it is reporting on, Sikshya replaces it with the session it was launched under. What is *not* claimed is in `docs/XAPI.md`: this is not an ADL-certified implementation, blocks are flattened into chapters because Sikshya's curriculum is two levels deep, and the importer refuses a package with a completion rule it does not recognise instead of guessing one.457 * **Accessibility: a round of fixes you will notice if you use a keyboard or a screen reader.** The account menu button had no name at all on every account page — a screen reader announced "button" and nothing else. Progress bars on the resume card and the course cards reported a percentage without saying what it measured. Dialogs let the Tab key walk out of them onto the page behind, and dropped your place in the page when they closed, so you had to tab all the way back to the button you had just pressed. Seven form fields had labels that were not attached to anything, which reads as "edit, blank". A report table too wide for its box could not be reached without a trackpad. Saying "click Search" to voice control did nothing, because the search button was named something other than the word on it. All fixed.458 * **Readable text.** Several status colours sat just under the contrast the standard asks for — the "Remove" link in the cart, passing quiz scores, payment badges, the secondary text throughout the account pages and the learn shell, and the white text on sale and featured badges, which was the worst of them. Each is now a darker shade of the same colour.459 * Lists now show "(no title)" for a draft saved without one, instead of a blank row with an invisible link in it.460 * The rich-text editor's toolbar buttons — bold, italic, lists, link, text style — had no names, so the editor could not be operated without sight. They do now.461 * **New: report learning to your own Learning Record Store (xAPI).** Enrollments, lesson and course completions, quiz results with their scores, assignment submissions and certificates are sent to any conformant LRS as xAPI 1.0.3 statements — the thing nearly every public-sector and corporate tender asks for alongside SCORM, and that no other WordPress LMS does natively. You choose how much about a learner leaves your site: their email address, a hash of it that still lets an LRS recognise the same person elsewhere, or an account id with no email at all. Sikshya → Integrations shows what has been accepted, what is waiting, and what failed with the LRS's own words. Scale tier, off until you enable it, and nothing is queued until an endpoint and credentials exist — so turning it on early cannot build a backlog that floods your LRS later. `docs/XAPI.md` has the full statement map and, just as plainly, what is not included: this is reporting to an LRS, not cmi5, and Sikshya is not itself an LRS.462 * For contributors: WCAG 2.1 AA is enforced by the test suite, over all 43 admin screens and 13 learner-facing pages, plus a source check that catches an unlabelled field even when it is hidden behind a tab. What has *not* been done is stated just as plainly: no screen reader has been used, so the conformance report in `docs/ACCESSIBILITY-CONFORMANCE-REPORT.md` is a draft rather than a VPAT. `docs/ACCESSIBILITY.md` has both lists.463 464 437 == Upgrade Notice == 465 438 -
sikshya/trunk/sikshya.php
r3777634 r3787392 4 4 * Plugin URI: https://mantrabrain.com/plugins/sikshya-lms/ 5 5 * Description: A comprehensive WordPress Learning Management System plugin with modern SaaS design and enterprise-level architecture. 6 * Version: 1.0.1 66 * Version: 1.0.17 7 7 * Author: MantraBrain 8 8 * Author URI: https://mantrabrain.com … … 26 26 27 27 // Define plugin constants 28 define('SIKSHYA_VERSION', '1.0.1 6');28 define('SIKSHYA_VERSION', '1.0.17'); 29 29 define('SIKSHYA_PLUGIN_FILE', __FILE__); 30 30 define('SIKSHYA_PLUGIN_DIR', plugin_dir_path(__FILE__)); -
sikshya/trunk/src/Admin/ReactAdminConfig.php
r3777551 r3787392 260 260 ]; 261 261 262 if (TierCapabilities::feature('community_discussions') && Addons::isEnabled('community_discussions')) { 263 $course_children[] = [ 264 'id' => 'discussions', 265 'label' => __('Discussions & Q&A', 'sikshya'), 266 'icon' => 'chatBubbles', 267 'href' => self::reactAppUrl('discussions'), 268 'cap' => 'sikshya_staff', 269 ]; 270 } 262 /* 263 * Badged like every other add-on entry rather than hidden outright. 264 * Hiding it meant a site that *had* paid for Discussions saw no trace 265 * of it anywhere in the menu and no route to switch it on — the one 266 * nav row of thirteen that removed itself instead of saying "off". 267 * `DiscussionsPage` already renders an enable prompt when the add-on 268 * is off, so the destination has always been ready for this. 269 */ 270 $course_children[] = self::withNavGate([ 271 'id' => 'discussions', 272 'label' => __('Discussions & Q&A', 'sikshya'), 273 'icon' => 'chatBubbles', 274 'href' => self::reactAppUrl('discussions'), 275 'cap' => 'sikshya_staff', 276 ], 'community_discussions'); 271 277 272 278 $course_children[] = self::withNavGate([
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)