diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..650bf59 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,150 @@ +name: Moodle Plugin CI + +on: [push, pull_request] + +jobs: + test: + runs-on: ubuntu-22.04 + + services: + postgres: + image: postgres:13 + env: + POSTGRES_USER: 'postgres' + POSTGRES_HOST_AUTH_METHOD: 'trust' + ports: + - 5432:5432 + options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 3 + + mariadb: + image: mariadb:10 + env: + MYSQL_USER: 'root' + MYSQL_ALLOW_EMPTY_PASSWORD: "true" + MYSQL_CHARACTER_SET_SERVER: "utf8mb4" + MYSQL_COLLATION_SERVER: "utf8mb4_unicode_ci" + ports: + - 3306:3306 + options: --health-cmd="mysqladmin ping" --health-interval 10s --health-timeout 5s --health-retries 3 + + strategy: + fail-fast: false + matrix: + include: + - php: '7.4' + moodle-branch: 'MOODLE_401_STABLE' + database: pgsql + - php: '8.1' + moodle-branch: 'MOODLE_401_STABLE' + database: mariadb + - php: '8.0' + moodle-branch: 'MOODLE_402_STABLE' + database: mariadb + - php: '8.1' + moodle-branch: 'MOODLE_402_STABLE' + database: pgsql + - php: '8.1' + moodle-branch: 'MOODLE_403_STABLE' + database: mariadb + - php: '8.2' + moodle-branch: 'MOODLE_403_STABLE' + database: pgsql + - php: '8.2' + moodle-branch: 'MOODLE_404_STABLE' + database: mariadb + - php: '8.3' + moodle-branch: 'MOODLE_404_STABLE' + database: pgsql + - php: '8.3' + moodle-branch: 'MOODLE_405_STABLE' + database: mariadb + - php: '8.3' + moodle-branch: 'MOODLE_405_STABLE' + database: pgsql + + steps: + - name: Check out repository code + uses: actions/checkout@v4 + with: + path: plugin + + - name: Setup PHP ${{ matrix.php }} + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: ${{ matrix.extensions }} + ini-values: max_input_vars=5000 + # If you are not using code coverage, keep "none". Otherwise, use "pcov" (Moodle 3.10 and up) or "xdebug". + # If you try to use code coverage with "none", it will fallback to phpdbg (which has known problems). + coverage: none + + - name: Initialise moodle-plugin-ci + run: | + composer create-project -n --no-dev --prefer-dist moodlehq/moodle-plugin-ci ci ^4 + echo $(cd ci/bin; pwd) >> $GITHUB_PATH + echo $(cd ci/vendor/bin; pwd) >> $GITHUB_PATH + sudo locale-gen en_AU.UTF-8 + echo "NVM_DIR=$HOME/.nvm" >> $GITHUB_ENV + + - name: Install moodle-plugin-ci + run: moodle-plugin-ci install --plugin ./plugin --db-host=127.0.0.1 + env: + DB: ${{ matrix.database }} + MOODLE_BRANCH: ${{ matrix.moodle-branch }} + # Uncomment this to run Behat tests using the Moodle App. + # MOODLE_APP: 'true' + + - name: PHP Lint + if: ${{ !cancelled() }} + run: moodle-plugin-ci phplint + + - name: PHP Mess Detector + continue-on-error: true # This step will show errors but will not fail + if: ${{ !cancelled() }} + run: moodle-plugin-ci phpmd + + - name: Moodle Code Checker + if: ${{ !cancelled() }} + run: moodle-plugin-ci phpcs --max-warnings 0 + + - name: Moodle PHPDoc Checker + if: ${{ !cancelled() }} + run: moodle-plugin-ci phpdoc --max-warnings 0 + + - name: Validating + if: ${{ !cancelled() }} + run: moodle-plugin-ci validate + + - name: Check upgrade savepoints + if: ${{ !cancelled() }} + run: moodle-plugin-ci savepoints + + - name: Mustache Lint + if: ${{ !cancelled() }} + run: moodle-plugin-ci mustache + + - name: Grunt + if: ${{ !cancelled() }} + run: moodle-plugin-ci grunt --max-lint-warnings 0 + + - name: PHPUnit tests + if: ${{ !cancelled() }} + run: moodle-plugin-ci phpunit --fail-on-warning + + - name: Behat features + id: behat + if: ${{ !cancelled() }} + run: moodle-plugin-ci behat --profile chrome + + - name: Upload Behat Faildump + if: ${{ failure() && steps.behat.outcome == 'failure' }} + uses: actions/upload-artifact@v4 + with: + name: Behat Faildump (${{ join(matrix.*, ', ') }}) + path: ${{ github.workspace }}/moodledata/behat_dump + retention-days: 7 + if-no-files-found: ignore + + - name: Mark cancelled jobs as failed. + if: ${{ cancelled() }} + run: exit 1 diff --git a/classes/condition.php b/classes/condition.php new file mode 100644 index 0000000..7e43892 --- /dev/null +++ b/classes/condition.php @@ -0,0 +1,147 @@ +. + +/** + * Condition to restrict access by dedication time + * + * @package availability_dedicationtime + * @copyright 2024 Santosh N. + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +namespace availability_dedicationtime; +use core_availability\info; +/** + * Dedication time condition. + * + * @package availability_dedicationtime + * @copyright 2024 Santosh N. + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class condition extends \core_availability\condition { + + /** @var string dedication time value */ + protected $dedicationtime; + + /** @var string dedication time unit */ + protected $unit; + + /** + * Constructor. + * + * @param \stdClass $structure Data structure from JSON decode + * @throws \coding_exception If invalid data structure. + */ + public function __construct($structure) { + $this->dedicationtime = $structure->dedicationtime; + $this->unit = $structure->unit; + } + + /** + * Determines whether this item is availabile. + * + * @param bool $not Set true if we are inverting the condition + * @param \core_availability\info $info Item we're checking + * @param bool $grabthelot if true, caches information required for all course-modules + * @param int $userid User ID to check availability for + * @return bool true if available + */ + public function is_available($not, info $info, $grabthelot, $userid) { + global $DB; + $modinfo = $info->get_modinfo(); + $course = $modinfo->get_course(); + $sql = "SELECT SUM(timespent) as timespent + FROM {block_dedication} + WHERE userid = ? + AND courseid = ?"; + $data = $DB->get_record_sql($sql, [$userid, $course->id]); + $dtime = $this->get_dedication_time(); + if ($not) { + if ($data->timespent == $dtime) { + return false; + } + return true; + } + if ($data->timespent >= $dtime) { + return true; + } + return false; + } + + /** + * Returns the dedication time in seconds + * @return int time in seconds + */ + protected function get_dedication_time() { + if ($this->unit == 'hours') { + return $this->dedicationtime * 3600; + } + return $this->dedicationtime * 60; + } + + /** + * Converts seconds into hours and minutes time format + * @param int $seconds Seconds + * @return array time value array + */ + protected function seconds_to_hours_minutes($seconds) { + $hours = floor($seconds / 3600); + $minutes = floor(($seconds % 3600) / 60); + return [ + 'hours' => $hours, + 'minutes' => $minutes, + ]; + } + + /** + * Obtains a string describing this restriction (whether or not it actually applies). + * + * @param bool $full Set true if this is the 'full information' view + * @param bool $not Set true if we are inverting the condition + * @param \core_availability\info $info Item we're checking + * @return string Information string (for admin) about all restrictions on this item + */ + public function get_description($full, $not, info $info) { + $dseconds = $this->get_dedication_time(); + $dtime = $this->seconds_to_hours_minutes($dseconds); + if ($not) { + return get_string('requires_notfinish', 'availability_dedicationtime', $dtime); + } + + return get_string('requires_finish', 'availability_dedicationtime', $dtime); + } + + /** + * Obtains a representation of the options of this condition as a string, for debugging. + * + * @return string dedication time value + */ + protected function get_debug_string() { + return $this->dedicationtime . ' ' . $this->unit; + } + + /** + * Saves tree data back to a structure object. + * + * @return \stdClass Structure object (ready to be made into JSON format) + */ + public function save() { + return (object)[ + 'type' => 'dedicationtime', + 'dedicationtime' => $this->dedicationtime, + 'unit' => $this->unit, + ]; + } +} diff --git a/classes/frontend.php b/classes/frontend.php new file mode 100644 index 0000000..615c0cb --- /dev/null +++ b/classes/frontend.php @@ -0,0 +1,54 @@ +. + +/** + * Restrict access by dedication time + * + * @package availability_dedicationtime + * @copyright 2024 Santosh N. + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +namespace availability_dedicationtime; +/** + * Restrict access by dedication time + * + * @package availability_dedicationtime + * @copyright 2024 Santosh N. + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class frontend extends \core_availability\frontend { + /** + * Gets a list of string identifiers (in the plugin's language file) that are required in JavaScript for this plugin. + * + * @return Array of required string identifiers + */ + protected function get_javascript_strings() { + return ['title', 'description']; + } + /** + * Delivers parameters to the javascript part of the plugin + * + * @param \stdClass $course Course object + * @param \cm_info $cm Course-module currently being edited (null if none) + * @param \section_info $section Section currently being edited (null if none) + * @return array Array of parameters for the JavaScript function + */ + protected function get_javascript_init_params($course, \cm_info $cm = null, \section_info $section = null) { + global $OUTPUT; + $html = $OUTPUT->render_from_template('availability_dedicationtime/dedication', []); + return [$html]; + } +} diff --git a/classes/privacy/provider.php b/classes/privacy/provider.php new file mode 100644 index 0000000..4b3bad1 --- /dev/null +++ b/classes/privacy/provider.php @@ -0,0 +1,46 @@ +. + +/** + * Privacy Subsystem implementation for availability_dedicationtime. + * + * @package availability_dedicationtime + * @copyright 2024 Santosh N. + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace availability_dedicationtime\privacy; + +defined('MOODLE_INTERNAL') || die(); + +/** + * Privacy Subsystem for availability_dedicationtime implementing null_provider. + * + * @copyright 2024 Santosh N. + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class provider implements \core_privacy\local\metadata\null_provider { + + /** + * Get the language string identifier with the component's language + * file to explain why this plugin stores no data. + * + * @return string + */ + public static function get_reason(): string { + return 'privacy:metadata'; + } +} diff --git a/lang/en/availability_dedicationtime.php b/lang/en/availability_dedicationtime.php new file mode 100644 index 0000000..c3305e4 --- /dev/null +++ b/lang/en/availability_dedicationtime.php @@ -0,0 +1,34 @@ +. + +/** + * English language strings. + * + * @package availability_dedicationtime + * @copyright 2024 Santosh N. + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +$string['description'] = 'Restrict access to a specific course dedication time.'; +$string['hours'] = 'hours'; +$string['minutes'] = 'minutes'; +$string['pluginname'] = 'Restriction by dedication time'; +$string['privacy:metadata'] = 'The Restriction by dedication time plugin does not store any personal data.'; +$string['requires_finish'] = 'you must spent at least {$a->hours} hours and {$a->minutes} minutes time in the course'; +$string['requires_notfinish'] = 'you must not spent {$a->hours} hours and {$a->minutes} minutes time in the course'; +$string['title'] = 'Dedication time'; +$string['unit'] = 'Dedication time unit'; +$string['error_invalidnumber'] = 'Please enter a valid value.'; diff --git a/lang/hi/availability_dedicationtime.php b/lang/hi/availability_dedicationtime.php new file mode 100644 index 0000000..6bbe1c3 --- /dev/null +++ b/lang/hi/availability_dedicationtime.php @@ -0,0 +1,34 @@ +. + +/** + * Hindi language strings. + * + * @package availability_dedicationtime + * @copyright 2024 Santosh N. + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +$string['description'] = 'विशिष्ट पाठ्यक्रम समर्पण समय तक पहुंच को प्रतिबंधित करें।'; +$string['hours'] = 'घंटे'; +$string['minutes'] = 'मिनट'; +$string['pluginname'] = 'समर्पण समय के अनुसार प्रतिबंध'; +$string['privacy:metadata'] = 'समर्पण समय के अनुसार प्रतिबंध प्लगइन कोई व्यक्तिगत डेटा संग्रहीत नहीं करता है।'; +$string['requires_finish'] = 'आपको पाठ्यक्रम में कम से कम {$a->hours} घंटे और {$a->minutes} मिनट बिताने होंगे।'; +$string['requires_notfinish'] = 'आपको पाठ्यक्रम में {$a->hours} घंटे और {$a->minutes} मिनट नहीं बिताने चाहिए।'; +$string['title'] = 'समर्पण समय'; +$string['unit'] = 'समर्पण समय इकाई'; +$string['error_invalidnumber'] = 'कृपया एक मान्य मान दर्ज करें।'; diff --git a/lang/mr/availability_dedicationtime.php b/lang/mr/availability_dedicationtime.php new file mode 100644 index 0000000..adf87cd --- /dev/null +++ b/lang/mr/availability_dedicationtime.php @@ -0,0 +1,34 @@ +. + +/** + * Marathi language strings. + * + * @package availability_dedicationtime + * @copyright 2024 Santosh N. + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +$string['description'] = 'विशिष्ट कोर्स समर्पित वेळेसाठी प्रवेश मर्यादित करा.'; +$string['hours'] = 'तास'; +$string['minutes'] = 'मिनिटे'; +$string['pluginname'] = 'समर्पित वेळेने मर्यादा'; +$string['privacy:metadata'] = 'समर्पित वेळेने मर्यादा प्लगइन कोणतीही वैयक्तिक माहिती संग्रहित करत नाही.'; +$string['requires_finish'] = 'तुम्हाला कोर्समध्ये किमान {$a->hours} तास आणि {$a->minutes} मिनिटे वेळ समर्पित करणे आवश्यक आहे.'; +$string['requires_notfinish'] = 'तुम्हाला कोर्समध्ये {$a->hours} तास आणि {$a->minutes} मिनिटे वेळ समर्पित करणे आवश्यक नाही.'; +$string['title'] = 'समर्पित वेळ'; +$string['unit'] = 'समर्पण वेळ एकक'; +$string['error_invalidnumber'] = 'कृपया एक वैध मूल्य प्रविष्ट करा.'; diff --git a/templates/dedication.mustache b/templates/dedication.mustache new file mode 100644 index 0000000..5150a9c --- /dev/null +++ b/templates/dedication.mustache @@ -0,0 +1,40 @@ +{{! + This file is part of Moodle - http://moodle.org/ + + Moodle is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Moodle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Moodle. If not, see . +}} +{{! + @template availability_time/dedication + + Displays a dedication time selector + + Example context (json): + { + + } +}} + + + + + diff --git a/tests/behat/availability_dedicationtime.feature b/tests/behat/availability_dedicationtime.feature new file mode 100644 index 0000000..05634d0 --- /dev/null +++ b/tests/behat/availability_dedicationtime.feature @@ -0,0 +1,59 @@ +@availability @availability_dedicationtime +Feature: availability_dedicationtime + In order to control student access to activities + As a teacher + I need to set dedicationtime conditions which prevent student access + + Background: + Given the following "courses" exist: + | fullname | shortname | format | enablecompletion | numsections | + | Course 1 | C1 | topics | 1 | 3 | + And the following "users" exist: + | username | + | teacher1 | + | student1 | + And the following "course enrolments" exist: + | user | course | role | + | teacher1 | C1 | editingteacher | + | student1 | C1 | student | + And the following "activities" exist: + | activity | course | name | + | page | C1 | P1 | + | page | C1 | P2 | + | page | C1 | P3 | + + @javascript + Scenario: Test condition + # Basic setup. + Given I am on the "P1" "page activity editing" page logged in as "teacher1" + And I expand all fieldsets + And I click on "Add restriction..." "button" + Then "Dedication time" "button" should exist in the "Add restriction..." "dialogue" + + # Add a Page P2 with a dedicationtime condition for 5 minutes. + And I am on the "P2" "page activity editing" page + And I expand all fieldsets + And I click on "Add restriction..." "button" + And I click on "Dedication time" "button" in the "Add restriction..." "dialogue" + And I click on ".availability-item .availability-eye img" "css_element" + And I set the field "Dedication time" to "5" + And I set the field "Dedication time unit" to "minutes" + And I press "Save and return to course" + + # Add a Page P3 with a dedicationtime condition for 2 hours. + And I am on the "P3" "page activity editing" page + And I expand all fieldsets + And I click on "Add restriction..." "button" + And I click on "Dedication time" "button" in the "Add restriction..." "dialogue" + And I click on ".availability-item .availability-eye img" "css_element" + And I set the field "Dedication time" to "2" + And I set the field "Dedication time unit" to "hours" + And I press "Save and return to course" + + # Log back in as student. + When I am on the "Course 1" "course" page logged in as "student1" + + # No pages should appear yet. + Then I should not see "P2" in the "region-main" "region" + And I should not see "P3" in the "region-main" "region" + \ No newline at end of file diff --git a/tests/condition_test.php b/tests/condition_test.php new file mode 100644 index 0000000..c776fdd --- /dev/null +++ b/tests/condition_test.php @@ -0,0 +1,121 @@ +. + +/** + * Unit test class to test condition class + * + * @package availability_dedicationtime + * @copyright 2024 Santosh N. + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +namespace availability_dedicationtime; + +use advanced_testcase; +use availability_dedicationtime\condition; +use core_availability\{tree, mock_info, info_module, info_section}; +use stdClass; + +/** + * Unit test class to test condition class + * + * @package availability_dedicationtime + * @copyright 2024 Santosh N. + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @coversDefaultClass \availability_dedicationtime\condition + */ +final class condition_test extends advanced_testcase { + /** @var stdClass course. */ + private $course; + + /** @var stdClass user. */ + private $user; + + /** + * Create course and page. + */ + public function setUp(): void { + global $CFG; + parent::setUp(); + require_once($CFG->dirroot . '/availability/tests/fixtures/mock_info.php'); + require_once($CFG->dirroot . '/availability/tests/fixtures/mock_info_module.php'); + require_once($CFG->dirroot . '/availability/tests/fixtures/mock_info_section.php'); + require_once($CFG->libdir . '/completionlib.php'); + $this->resetAfterTest(); + $this->setAdminUser(); + $CFG->enablecompletion = true; + $CFG->enableavailability = true; + set_config('enableavailability', true); + $dg = $this->getDataGenerator(); + $now = time(); + $this->course = $dg->create_course(['startdate' => $now, 'enddate' => $now + 7 * WEEKSECS, 'enablecompletion' => 1]); + $this->user = $dg->create_user(['timezone' => 'UTC']); + $dg->enrol_user($this->user->id, $this->course->id, 5, time()); + } + /** + * Tests whether description is correct + * @covers \availability_dedicationtime\condition + */ + public function test_get_description() { + $info = new \core_availability\mock_info(); + $structure = (object)['type' => 'dedicationtime', 'dedicationtime' => '5', 'unit' => 'minutes']; + $cond = new condition($structure); + $description = $cond->get_description(true, false, $info); + $this->assertMatchesRegularExpression('~0 hours and 5 minutes~', $description); + + $description = $cond->get_description(true, true, $info); + $this->assertMatchesRegularExpression('~0 hours and 5 minutes~', $description); + } + /** + * Tests whether activity is available or not + * @covers \availability_dedicationtime\condition + */ + public function test_is_available() { + global $DB, $USER; + + $data = new stdClass(); + $data->userid = $this->user->id; + $data->courseid = $this->course->id; + $data->timespent = 120; + $data->timestart = time(); + $DB->insert_record('block_dedication', $data); + + $pg = $this->getDataGenerator()->get_plugin_generator('mod_page'); + $pg->create_instance(['course' => $this->course, 'completion' => COMPLETION_TRACKING_MANUAL]); + + $this->setUser($this->user); + $info = new mock_info($this->course, $this->user->id); + + // Check whether activity is available. + $structure = (object)['type' => 'dedicationtime', 'dedicationtime' => '2', 'unit' => 'minutes']; + $cond = new condition($structure); + $this->assertTrue($cond->is_available(false, $info, false, $USER->id)); + + // Check whether activity is not available. + $structure = (object)['type' => 'dedicationtime', 'dedicationtime' => '3', 'unit' => 'minutes']; + $cond = new condition($structure); + $this->assertFalse($cond->is_available(false, $info, false, $USER->id)); + } + /** + * Tests whether save() returns correct response + * @covers \availability_dedicationtime\condition + */ + public function test_save() { + $structure = (object)['dedicationtime' => '5', 'unit' => 'minutes']; + $cond = new condition($structure); + $structure->type = 'dedicationtime'; + $this->assertEquals($structure, $cond->save()); + } +} diff --git a/tests/privacy/privacy_test.php b/tests/privacy/privacy_test.php new file mode 100644 index 0000000..e7a217e --- /dev/null +++ b/tests/privacy/privacy_test.php @@ -0,0 +1,49 @@ +. + +/** + * Privacy tests for dedicationtime availability. + * + * @package availability_dedicationtime + * @copyright 2024 Santosh N. + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace availability_dedicationtime\privacy; + +use core_privacy\tests\provider_testcase; +use core_privacy\local\metadata\collection; + +/** + * Privacy tests for dedicationtime availability. + * + * @package availability_dedicationtime + * @copyright 2024 Santosh N. + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @coversDefaultClass \availability_dedicationtime\privacy\provider + */ +final class privacy_test extends provider_testcase { + /** + * Test returning metadata. + * @covers \availability_dedicationtime\privacy\provider + */ + public function test_get_metadata(): void { + $collection = new collection('availability_dedicationtime'); + $reason = provider::get_reason($collection); + $this->assertEquals($reason, 'privacy:metadata'); + $this->assertStringContainsString('does not store any personal data.', get_string($reason, 'availability_dedicationtime')); + } +} diff --git a/version.php b/version.php new file mode 100644 index 0000000..e12a77f --- /dev/null +++ b/version.php @@ -0,0 +1,33 @@ +. + +/** + * Version info. + * + * @package availability_dedicationtime + * @copyright 2024 Santosh N. + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +$plugin->version = 2024083000; +$plugin->requires = 2022112800; +$plugin->component = 'availability_dedicationtime'; +$plugin->dependencies = [ + // Depend upon version 2023112001 of block_dedication. + 'block_dedication' => 2023112001, +]; diff --git a/yui/build/moodle-availability_dedicationtime-form/moodle-availability_dedicationtime-form-debug.js b/yui/build/moodle-availability_dedicationtime-form/moodle-availability_dedicationtime-form-debug.js new file mode 100644 index 0000000..4e78e36 --- /dev/null +++ b/yui/build/moodle-availability_dedicationtime-form/moodle-availability_dedicationtime-form-debug.js @@ -0,0 +1,52 @@ +YUI.add('moodle-availability_dedicationtime-form', function (Y, NAME) { + +// eslint-disable-next-line camelcase +M.availability_dedicationtime = M.availability_dedicationtime || {}; + +M.availability_dedicationtime.form = Y.Object(M.core_availability.plugin); + +M.availability_dedicationtime.form.initInner = function(param) { + this.params = param; +}; + +M.availability_dedicationtime.form.getNode = function(json) { + var node = Y.Node.create('' + this.params + ''); + if (json.dedicationtime === undefined) { + json.dedicationtime = ''; + } + if (json.unit === undefined) { + json.unit = 'hours'; + } + var dtime = json.dedicationtime; + var dunit = json.unit; + var dinput = node.one('input[name=availability_dedicationtime_value]'); + dinput.set('value', dtime); + var dselect = node.one('select[name=availability_dedicationtime_unit]'); + dselect.set('value', dunit); + if (!M.availability_dedicationtime.form.addedEvents) { + M.availability_dedicationtime.form.addedEvents = true; + var root = Y.one('#fitem_id_availabilityconditionsjson'); + root.delegate('click', function() { + M.core_availability.form.update(); + }, '.availability_dedicationtime select'); + root.delegate('change', function() { + M.core_availability.form.update(); + }, '.availability_dedicationtime input[name=availability_dedicationtime_value]'); + } + + return node; +}; + +M.availability_dedicationtime.form.fillValue = function(value, node) { + value.dedicationtime = node.one('input[name=availability_dedicationtime_value]').get('value'); + value.unit = node.one('select[name=availability_dedicationtime_unit]').get('value'); +}; + +M.availability_dedicationtime.form.fillErrors = function(errors, node) { + var dedicationtime = Number(node.one('input[name=availability_dedicationtime_value]').get('value')); + if (isNaN(dedicationtime) || dedicationtime == 0) { + errors.push('availability_dedicationtime:error_invalidnumber'); + } +}; + +}, '@VERSION@', {"requires": ["base", "node", "event", "moodle-core_availability-form"]}); diff --git a/yui/build/moodle-availability_dedicationtime-form/moodle-availability_dedicationtime-form-min.js b/yui/build/moodle-availability_dedicationtime-form/moodle-availability_dedicationtime-form-min.js new file mode 100644 index 0000000..6f55add --- /dev/null +++ b/yui/build/moodle-availability_dedicationtime-form/moodle-availability_dedicationtime-form-min.js @@ -0,0 +1 @@ +YUI.add("moodle-availability_dedicationtime-form",function(t,i){M.availability_dedicationtime=M.availability_dedicationtime||{},M.availability_dedicationtime.form=t.Object(M.core_availability.plugin),M.availability_dedicationtime.form.initInner=function(i){this.params=i},M.availability_dedicationtime.form.getNode=function(i){var a,e=t.Node.create(""+this.params+"");return i.dedicationtime===undefined&&(i.dedicationtime=""),i.unit===undefined&&(i.unit="hours"),a=i.dedicationtime,i=i.unit,e.one("input[name=availability_dedicationtime_value]").set("value",a),e.one("select[name=availability_dedicationtime_unit]").set("value",i),M.availability_dedicationtime.form.addedEvents||(M.availability_dedicationtime.form.addedEvents=!0,(a=t.one("#fitem_id_availabilityconditionsjson")).delegate("click",function(){M.core_availability.form.update()},".availability_dedicationtime select"),a.delegate("change",function(){M.core_availability.form.update()},".availability_dedicationtime input[name=availability_dedicationtime_value]")),e},M.availability_dedicationtime.form.fillValue=function(i,a){i.dedicationtime=a.one("input[name=availability_dedicationtime_value]").get("value"),i.unit=a.one("select[name=availability_dedicationtime_unit]").get("value")},M.availability_dedicationtime.form.fillErrors=function(i,a){a=Number(a.one("input[name=availability_dedicationtime_value]").get("value"));!isNaN(a)&&0!=a||i.push("availability_dedicationtime:error_invalidnumber")}},"@VERSION@",{requires:["base","node","event","moodle-core_availability-form"]}); \ No newline at end of file diff --git a/yui/build/moodle-availability_dedicationtime-form/moodle-availability_dedicationtime-form.js b/yui/build/moodle-availability_dedicationtime-form/moodle-availability_dedicationtime-form.js new file mode 100644 index 0000000..4e78e36 --- /dev/null +++ b/yui/build/moodle-availability_dedicationtime-form/moodle-availability_dedicationtime-form.js @@ -0,0 +1,52 @@ +YUI.add('moodle-availability_dedicationtime-form', function (Y, NAME) { + +// eslint-disable-next-line camelcase +M.availability_dedicationtime = M.availability_dedicationtime || {}; + +M.availability_dedicationtime.form = Y.Object(M.core_availability.plugin); + +M.availability_dedicationtime.form.initInner = function(param) { + this.params = param; +}; + +M.availability_dedicationtime.form.getNode = function(json) { + var node = Y.Node.create('' + this.params + ''); + if (json.dedicationtime === undefined) { + json.dedicationtime = ''; + } + if (json.unit === undefined) { + json.unit = 'hours'; + } + var dtime = json.dedicationtime; + var dunit = json.unit; + var dinput = node.one('input[name=availability_dedicationtime_value]'); + dinput.set('value', dtime); + var dselect = node.one('select[name=availability_dedicationtime_unit]'); + dselect.set('value', dunit); + if (!M.availability_dedicationtime.form.addedEvents) { + M.availability_dedicationtime.form.addedEvents = true; + var root = Y.one('#fitem_id_availabilityconditionsjson'); + root.delegate('click', function() { + M.core_availability.form.update(); + }, '.availability_dedicationtime select'); + root.delegate('change', function() { + M.core_availability.form.update(); + }, '.availability_dedicationtime input[name=availability_dedicationtime_value]'); + } + + return node; +}; + +M.availability_dedicationtime.form.fillValue = function(value, node) { + value.dedicationtime = node.one('input[name=availability_dedicationtime_value]').get('value'); + value.unit = node.one('select[name=availability_dedicationtime_unit]').get('value'); +}; + +M.availability_dedicationtime.form.fillErrors = function(errors, node) { + var dedicationtime = Number(node.one('input[name=availability_dedicationtime_value]').get('value')); + if (isNaN(dedicationtime) || dedicationtime == 0) { + errors.push('availability_dedicationtime:error_invalidnumber'); + } +}; + +}, '@VERSION@', {"requires": ["base", "node", "event", "moodle-core_availability-form"]}); diff --git a/yui/src/form/build.json b/yui/src/form/build.json new file mode 100644 index 0000000..91eacc9 --- /dev/null +++ b/yui/src/form/build.json @@ -0,0 +1,10 @@ +{ + "name": "moodle-availability_dedicationtime-form", + "builds": { + "moodle-availability_dedicationtime-form": { + "jsfiles": [ + "form.js" + ] + } + } +} \ No newline at end of file diff --git a/yui/src/form/js/form.js b/yui/src/form/js/form.js new file mode 100644 index 0000000..bda5691 --- /dev/null +++ b/yui/src/form/js/form.js @@ -0,0 +1,48 @@ +// eslint-disable-next-line camelcase +M.availability_dedicationtime = M.availability_dedicationtime || {}; + +M.availability_dedicationtime.form = Y.Object(M.core_availability.plugin); + +M.availability_dedicationtime.form.initInner = function(param) { + this.params = param; +}; + +M.availability_dedicationtime.form.getNode = function(json) { + var node = Y.Node.create('' + this.params + ''); + if (json.dedicationtime === undefined) { + json.dedicationtime = ''; + } + if (json.unit === undefined) { + json.unit = 'hours'; + } + var dtime = json.dedicationtime; + var dunit = json.unit; + var dinput = node.one('input[name=availability_dedicationtime_value]'); + dinput.set('value', dtime); + var dselect = node.one('select[name=availability_dedicationtime_unit]'); + dselect.set('value', dunit); + if (!M.availability_dedicationtime.form.addedEvents) { + M.availability_dedicationtime.form.addedEvents = true; + var root = Y.one('#fitem_id_availabilityconditionsjson'); + root.delegate('click', function() { + M.core_availability.form.update(); + }, '.availability_dedicationtime select'); + root.delegate('change', function() { + M.core_availability.form.update(); + }, '.availability_dedicationtime input[name=availability_dedicationtime_value]'); + } + + return node; +}; + +M.availability_dedicationtime.form.fillValue = function(value, node) { + value.dedicationtime = node.one('input[name=availability_dedicationtime_value]').get('value'); + value.unit = node.one('select[name=availability_dedicationtime_unit]').get('value'); +}; + +M.availability_dedicationtime.form.fillErrors = function(errors, node) { + var dedicationtime = Number(node.one('input[name=availability_dedicationtime_value]').get('value')); + if (isNaN(dedicationtime) || dedicationtime == 0) { + errors.push('availability_dedicationtime:error_invalidnumber'); + } +}; \ No newline at end of file diff --git a/yui/src/form/meta/form.json b/yui/src/form/meta/form.json new file mode 100644 index 0000000..0ce1f53 --- /dev/null +++ b/yui/src/form/meta/form.json @@ -0,0 +1,10 @@ +{ + "moodle-availability_dedicationtime-form": { + "requires": [ + "base", + "node", + "event", + "moodle-core_availability-form" + ] + } + } \ No newline at end of file