Uploaded image for project: 'Moodle'
  1. Moodle
  2. MDL-78324

Move modal factory instantiation to modal::create

XMLWordPrintable

    • MOODLE_403_STABLE
    • MOODLE_403_STABLE
    • MDL-78324-master-7
    • Hide

      Scenario: ModalFactory is deprecated and continues to work

      1. Open any page in Moodle
      2. Pull up the Browser developer tools, and switch to the console.
      3. Run the following code:

        require(['core/modal_factory'], (MF) => {
            MF.create({title: 'Example'}).then((modal) => modal.show());
        });
        

        1. Confirm that a modal appeared with a title of "Example"
        2. Confirm that there was a deprecation notice

      Scenario: ModalFactory emits a deprecation notice when using the triggerElement

      1. Open any page in Moodle
      2. Pull up the Browser developer tools, and switch to the console.
      3. Run the following code:

        require(['core/modal_factory', 'jquery'], (MF, $) => {
            MF.create(
                {
                    title: 'Example',
                },
                $('body'),
            );
        });
        

        1. Confirm that a modal does not appear immediately
        2. Confirm that a deprecation notice was emitted to the browser warning that the triggerElement is deprecated
      4. Click on the background of the page
        1. Confirm that a modal appeared with a title of "Example"

      Scenario: New show option

      1. Open any page in Moodle
      2. Pull up the Browser developer tools, and switch to the console.
      3. Run the following code:

        require(['core/modal'], (Modal) => {
            Modal.create(
                {
                    title: 'Example',
                    show: true,
                },
            );
        });
        

        1. Confirm that the modal showed on the page immediately

      Quiz modals (tested by Behat so can be skipped)

      1. Create a least one question in the course question bank
      2. Create a quiz and navigate to the "Questions" tab
      3. From the "Add" dropdown, choose "from question bank"
        1. Confirm that a modal appeared
      4. Select the question you put into the question bank in the first step
      5. Choose "Add selected questions to the quiz"
        1. Confirm that the page refreshed and the question was added
      6. From the first "Add" dropdown, choose "a random question" (the one before any questions)
        1. Confirm that the dialog opened allowing you to configure and choose a random question
        2. *Confirm it had a title of "Add a random question to page 1"
      7. Press the "Add random question" button
        1. *Confirm that the page refreshed and a random question was added to the correct part of the quiz
      8. From the second "Add" dropdown, choose "a random question" (the one after the first question)
        1. Confirm that the dialog opened allowing you to configure and choose a random question
        2. *Confirm it had a title of "Add a random question to page 2"
      9. Press the "Add random question" button
        1. *Confirm that the page refreshed and a random question was added to the correct part of the quiz
      10. Press the "Repaginate" button
      11. Accept the defaults and press "Go"
        1. Confirm that the questions were each put onto their own page
      12. Navigate to the course question bank
      13. Click on the "0" in the comments column
        1. Confirm modal shown
      14. Add two comments
      15. Close the modal using the "Close" button
        1. Confirm the page refreshed
        2. Confirm that the column count now has two comments for that question
      16. Open the comments by clicking on the "2"
      17. Delete one of the comments
      18. Close the modal using the "X" button in the modal's titlebar
        1. Confirm the page refreshed
        2. Confirm that the column count now has one comment for that question
      19. Click on the "1" in the "Usage" column
        1. Confirm the modal opened listing the quiz you created at the beginning

      TinyMCE

      1. Navigate to a course as teacher
      2. Navigate to the announcements forum
      3. Create a new discussion
      4. In the TinyMCE editor:
        1. Open the accessibility checker
          1. Confirm it opened
        2. Inspect it in your developers tools and find the reference in the DOM
        3. Close the modal
          1. Confirm that it was removed from the DOM
        4. Open the equation editor
          1. Confirm it opened
        5. Inspect it in your developers tools and find the reference in the DOM
        6. Close the modal
          1. Confirm that it was removed from the DOM
        7. Open the link editor
          1. Confirm it opened
        8. Inspect it in your developers tools and find the reference in the DOM
        9. Close the modal
          1. Confirm that it was removed from the DOM
        10. Open the h5p editor
          1. Confirm it opened
        11. Inspect it in your developers tools and find the reference in the DOM
        12. Close the modal
          1. Confirm that it was removed from the DOM
        13. Open the Insert Image plugin
          1. Confirm it opened
        14. Inspect it in your developers tools and find the reference in the DOM
        15. Close the modal
          1. Confirm that it was removed from the DOM
        16. Open the Insert Video plugin
          1. Confirm it opened
        17. Inspect it in your developers tools and find the reference in the DOM
        18. Close the modal
          1. Confirm that it was removed from the DOM
        19. Open the RecordRTC Audio plugin (requires localhost or SSL)
          1. Confirm it opened
        20. Inspect it in your developers tools and find the reference in the DOM
        21. Close the modal
          1. Confirm that it was removed from the DOM
        22. Open the RecordRTC Video plugin (requires localhost or SSL)
          1. Confirm it opened
        23. Inspect it in your developers tools and find the reference in the DOM
        24. Close the modal
          1. Confirm that it was removed from the DOM

      Scenario: Calendar

      1. Navigate to your dashboard
      2. Click on a calendar day to create a new calendar event
        1. Confirm modal opened
      3. Create the event
      4. Open the event again
        1. Confirm modal opened
      5. Click the delete button
        1. Confirm modal opened
      6. Cancel deletion
      7. Click delete again
        1. Confirm modal opened
      8. Delete the event
        1. Confirm it was removed
      9. Navigate to "Import or export calendars" (underneath the main calendar)
      10. Import the following calendar URL:

        https://calendar.google.com/calendar/embed?src=moodle.com_p4c2oe7hsb77ltaro5qtihb5d4%40group.calendar.google.com&ctz=Australia%2FPerth
        

        1. Confirm it imported
      11. Delete the calendar subscription
        1. Confirm the delete modal was shown
      12. Delete it
        1. Confirm the subscription was removed

      Scenario: License manager

      1. Navigate to site admin -> Licence -> License manager
      2. Create a new license:
        1. Short name: 78324
        2. Full name: MDL-78324
        3. Source: https://moodle.org
      3. Click the "Delete" (bin) icon beside the newly created license
        1. Confirm delete dialogue shown
      4. Cancel deletion
        1. Confirm modal closed without deleting the license
      5. Click the "Delete" (bin) icon beside the newly created license
        1. Confirm delete dialogue shown
        2. Confirm modal closed deleting the license

      Scenario: Badges

      1. Navigate to site admin -> badges -> manage backpacks
      2. Create a new backpack:
        1. API version: Open Badges v2.0
        2. URL: https://example.com
        3. API URL: https://example.com
      3. Press the delete button
        1. Confirm delete dialogue shown
      4. Cancel deletion
        1. Confirm modal closed without deleting the backpack
      5. Click the "Delete" (bin) icon again
        1. Confirm delete dialogue shown
        2. Confirm modal closed deleting the backpack

      Scenario: Tags

      1. Tested by behat

      Scenario: Grade report singleview

      1. Navigate to a course with some form of gardable items in it (assigment, quiz, etc).
      2. Navigate to Grades
      3. Open the tertiary navigation dropdown and select "Single view"
      4. Switch to view by "Grade items"
      5. Select a grade item
      6. From the "Actions" dropdown, choose "Override all"
        1. Confirm overrides checkboxes all checked
      7. From the "Actions" dropdown, choose "Override none"
        1. Confirm you were prompted with a confirmation
      8. Cancel
      9. From the "Actions" dropdown, choose "Override none"
        1. Confirm you were prompted with a confirmation
      10. Remove overrides
        1. Confirm overrdies checkboxes all cleared
      11. From the "Actions" dropdown, choose "Exclude all"
        1. Confirm excludes checkboxes all checked
      12. From the "Actions" dropdown, choose "Exclude none"
        1. Confirm excludes checkboxes all cleared
      13. From the "Actions" dropdown, choose "Bulk insert grades"
        1. Confirm form elements greyed out and disabled
        2. Confirm save button greyed out and disabled
      14. Check the "I understand" button
        1. Confirm form elements enabled
      15. Choose "All grades"
        1. Confirm submit button enabled
      16. Save
        1. *Confirm page reloaded and recalculated grades

      Scenario: Enrolments

      1. Navigate to a course as teacher/admin
      2. Navigate to participants page
      3. Press the "Enrol users" button
        1. Confirm dialogue opened
      4. Enrol a user
        1. Confirm dialogue closed
      5. For any user, press the info ("i") icon in the "Status" column
        1. Confirm that a modal opened up
      6. Press the cog on the "Manual enrolments" row
        1. Confirm that the edit enrolment modal opened
      7. Suspend the user
      8. Save changes
        1. Confirm the user showed as suspended and the modal closed
      9. Click on the Cog icon for the same user
        1. Confirm the edit enrolment modal opened again
      10. Unsuspend the user
      11. Save changes
        1. Confirm the user showed as active and the modal closed
      12. Press the delete button
        1. Confirm delete dialogue shown
      13. Cancel deletion
        1. Confirm modal closed without deleting the user enrolment
      14. Click the "Delete" (bin) icon again
        1. Confirm delete dialogue shown
        2. Confirm modal closed deleting the user enrolment this time
      15. Using the checkboxes at the left, select a couple of users
      16. From the bottom of the page, open the "With selected users" dropdown and choose" Send a message"
      17. Enter a message
      18. Send message
      19. Rejoice

      Scenario: Forum

      1. Create a forum and enable "Whole forum grading" (any point/scale)
      2. Log in as a student and navigate to that forum
      3. Click on the "View grades" button
        1. Confirm the dialogue opened
      4. Create content in the forum
      5. Log back in as teacher/admin and navigate to that forum
      6. Press the "Grade users" button
      7. Find the user with content
      8. Press the "View discussion" link
        1. Confirm it opened in a modal

      Scenario: File types

      1. Open a course in editing mode
      2. Open activity chooser
      3. Select assignment
      4. Find the "Submission types" section
      5. In the "Accepted file types" option, press the "choose" button
        1. Confirm modal opened
      6. Select some values
      7. Save changes
        1. Confirm they saved

      Scenario: Privacy

      1. Navigate to Site admin -> Users -> Privacy and policies -> Privacy settings
      2. Ensure that the "Allow filtering of exports by course" is checked
      3. Navigate to Site admin -> Users -> Privacy and policies -> Data requests
      4. Make a request for a data export for a user enrolled in multiple courses
      5. Run cron
      6. Wait a few seconds for t he cron to run
      7. Refresh the requests page
      8. From the "Actions" dropdown, choose "Approve request (data from selected courses)"
        1. Confirm a modal was shown

      Course content download

      1. Navigate to Site admin -> Courses -> download course content
      2. Enable the feature
      3. Navigate to any course and edit its settings
      4. Set "Enable download course content" to yes
      5. Save
      6. From the "More" menu choose "Download course content"
        1. Confirm modal opened
      7. Download the content
        1. Confirm modal closed

      Course content

      1. Navigate to a course
      2. Turn editign on
      3. Drag and drop an image from your computer into the course
        1. Confirm modal opened
      4. Accept the modal
        1. Confirm modal closed
        2. Confirm file uploaded

      Copy course

      1. Navigate to Site admin -> Courses - Manage courses and categories
      2. Click on the "Copy course" button for any course
        1. Confirm modal opened
      3. Cancel
        1. Confirm modal closed
      4. Click on the "Copy course" button for any course
        1. Confirm modal opened
      5. Enter details and press "Copy and return"
        1. Confirm modal closed
      6. Run cron
      7. Refresh
        1. Confirm new course now shown
      8. Click on the "Copy course" button for any course
        1. Confirm modal opened
      9. Enter details and press "Copy and view"
        1. *Confirm you're taken to the "Course copy progress" page

      Scenario: Moodlenet

      1. Navigate to Site admin -> Advanced features
      2. Enable MoodleNet integration (inbound) 
      3. Navigate to Site admin -> Developerment -> Experimental settings
      4. Enable sharing to MoodleNet (outbound)
      5. Navigate to Site admin -> MoodleNet -> OUtbound
      6. Click the "Create it" link
      7. Create a "MoodleNet" OAuth2 Provider
      8. Navigate to Site admin -> MoodleNet -> OUtbound
      9. Select the newly created OAUth2 proivder
      10. Navigate to a course
      11. Create an activity
      12. From the activity's "More" menu, choose "Share to MoodleNet"
        1. Confirm modal opened

      Repeats

      The following tests all require you to open a modal, close it, open it again, and close it again without any error shown in the browser developer console

      Course

      1. Enable editing mode
      2. Toggle the Activity chooser open/close/open/close
      3. Toggle the Add block modal open/close/open/close
      Show
      Scenario: ModalFactory is deprecated and continues to work Open any page in Moodle Pull up the Browser developer tools, and switch to the console. Run the following code: require(['core/modal_factory'], (MF) => { MF.create({title: 'Example'}).then((modal) => modal.show()); }); Confirm that a modal appeared with a title of "Example" Confirm that there was a deprecation notice Scenario: ModalFactory emits a deprecation notice when using the triggerElement Open any page in Moodle Pull up the Browser developer tools, and switch to the console. Run the following code: require(['core/modal_factory', 'jquery'], (MF, $) => { MF.create( { title: 'Example', }, $('body'), ); }); Confirm that a modal does not appear immediately Confirm that a deprecation notice was emitted to the browser warning that the triggerElement is deprecated Click on the background of the page Confirm that a modal appeared with a title of "Example" Scenario: New show option Open any page in Moodle Pull up the Browser developer tools, and switch to the console. Run the following code: require(['core/modal'], (Modal) => { Modal.create( { title: 'Example', show: true, }, ); }); Confirm that the modal showed on the page immediately Quiz modals (tested by Behat so can be skipped) Create a least one question in the course question bank Create a quiz and navigate to the "Questions" tab From the "Add" dropdown, choose "from question bank" Confirm that a modal appeared Select the question you put into the question bank in the first step Choose "Add selected questions to the quiz" Confirm that the page refreshed and the question was added From the first "Add" dropdown, choose "a random question" (the one before any questions) Confirm that the dialog opened allowing you to configure and choose a random question *Confirm it had a title of "Add a random question to page 1" Press the "Add random question" button *Confirm that the page refreshed and a random question was added to the correct part of the quiz From the second "Add" dropdown, choose "a random question" (the one after the first question) Confirm that the dialog opened allowing you to configure and choose a random question *Confirm it had a title of "Add a random question to page 2" Press the "Add random question" button *Confirm that the page refreshed and a random question was added to the correct part of the quiz Press the "Repaginate" button Accept the defaults and press "Go" Confirm that the questions were each put onto their own page Navigate to the course question bank Click on the "0" in the comments column Confirm modal shown Add two comments Close the modal using the "Close" button Confirm the page refreshed Confirm that the column count now has two comments for that question Open the comments by clicking on the "2" Delete one of the comments Close the modal using the "X" button in the modal's titlebar Confirm the page refreshed Confirm that the column count now has one comment for that question Click on the "1" in the "Usage" column Confirm the modal opened listing the quiz you created at the beginning TinyMCE Navigate to a course as teacher Navigate to the announcements forum Create a new discussion In the TinyMCE editor: Open the accessibility checker Confirm it opened Inspect it in your developers tools and find the reference in the DOM Close the modal Confirm that it was removed from the DOM Open the equation editor Confirm it opened Inspect it in your developers tools and find the reference in the DOM Close the modal Confirm that it was removed from the DOM Open the link editor Confirm it opened Inspect it in your developers tools and find the reference in the DOM Close the modal Confirm that it was removed from the DOM Open the h5p editor Confirm it opened Inspect it in your developers tools and find the reference in the DOM Close the modal Confirm that it was removed from the DOM Open the Insert Image plugin Confirm it opened Inspect it in your developers tools and find the reference in the DOM Close the modal Confirm that it was removed from the DOM Open the Insert Video plugin Confirm it opened Inspect it in your developers tools and find the reference in the DOM Close the modal Confirm that it was removed from the DOM Open the RecordRTC Audio plugin (requires localhost or SSL) Confirm it opened Inspect it in your developers tools and find the reference in the DOM Close the modal Confirm that it was removed from the DOM Open the RecordRTC Video plugin (requires localhost or SSL) Confirm it opened Inspect it in your developers tools and find the reference in the DOM Close the modal Confirm that it was removed from the DOM Scenario: Calendar Navigate to your dashboard Click on a calendar day to create a new calendar event Confirm modal opened Create the event Open the event again Confirm modal opened Click the delete button Confirm modal opened Cancel deletion Click delete again Confirm modal opened Delete the event Confirm it was removed Navigate to "Import or export calendars" (underneath the main calendar) Import the following calendar URL: https://calendar.google.com/calendar/embed?src=moodle.com_p4c2oe7hsb77ltaro5qtihb5d4%40group.calendar.google.com&ctz=Australia%2FPerth Confirm it imported Delete the calendar subscription Confirm the delete modal was shown Delete it Confirm the subscription was removed Scenario: License manager Navigate to site admin -> Licence -> License manager Create a new license: Short name: 78324 Full name: MDL-78324 Source: https://moodle.org Click the "Delete" (bin) icon beside the newly created license Confirm delete dialogue shown Cancel deletion Confirm modal closed without deleting the license Click the "Delete" (bin) icon beside the newly created license Confirm delete dialogue shown Confirm modal closed deleting the license Scenario: Badges Navigate to site admin -> badges -> manage backpacks Create a new backpack: API version: Open Badges v2.0 URL: https://example.com API URL: https://example.com Press the delete button Confirm delete dialogue shown Cancel deletion Confirm modal closed without deleting the backpack Click the "Delete" (bin) icon again Confirm delete dialogue shown Confirm modal closed deleting the backpack Scenario: Tags Tested by behat Scenario: Grade report singleview Navigate to a course with some form of gardable items in it (assigment, quiz, etc). Navigate to Grades Open the tertiary navigation dropdown and select "Single view" Switch to view by "Grade items" Select a grade item From the "Actions" dropdown, choose "Override all" Confirm overrides checkboxes all checked From the "Actions" dropdown, choose "Override none" Confirm you were prompted with a confirmation Cancel From the "Actions" dropdown, choose "Override none" Confirm you were prompted with a confirmation Remove overrides Confirm overrdies checkboxes all cleared From the "Actions" dropdown, choose "Exclude all" Confirm excludes checkboxes all checked From the "Actions" dropdown, choose "Exclude none" Confirm excludes checkboxes all cleared From the "Actions" dropdown, choose "Bulk insert grades" Confirm form elements greyed out and disabled Confirm save button greyed out and disabled Check the "I understand" button Confirm form elements enabled Choose "All grades" Confirm submit button enabled Save *Confirm page reloaded and recalculated grades Scenario: Enrolments Navigate to a course as teacher/admin Navigate to participants page Press the "Enrol users" button Confirm dialogue opened Enrol a user Confirm dialogue closed For any user, press the info ("i") icon in the "Status" column Confirm that a modal opened up Press the cog on the "Manual enrolments" row Confirm that the edit enrolment modal opened Suspend the user Save changes Confirm the user showed as suspended and the modal closed Click on the Cog icon for the same user Confirm the edit enrolment modal opened again Unsuspend the user Save changes Confirm the user showed as active and the modal closed Press the delete button Confirm delete dialogue shown Cancel deletion Confirm modal closed without deleting the user enrolment Click the "Delete" (bin) icon again Confirm delete dialogue shown Confirm modal closed deleting the user enrolment this time Using the checkboxes at the left, select a couple of users From the bottom of the page, open the "With selected users" dropdown and choose" Send a message" Enter a message Send message Rejoice Scenario: Forum Create a forum and enable "Whole forum grading" (any point/scale) Log in as a student and navigate to that forum Click on the "View grades" button Confirm the dialogue opened Create content in the forum Log back in as teacher/admin and navigate to that forum Press the "Grade users" button Find the user with content Press the "View discussion" link Confirm it opened in a modal Scenario: File types Open a course in editing mode Open activity chooser Select assignment Find the "Submission types" section In the "Accepted file types" option, press the "choose" button Confirm modal opened Select some values Save changes Confirm they saved Scenario: Privacy Navigate to Site admin -> Users -> Privacy and policies -> Privacy settings Ensure that the "Allow filtering of exports by course" is checked Navigate to Site admin -> Users -> Privacy and policies -> Data requests Make a request for a data export for a user enrolled in multiple courses Run cron Wait a few seconds for t he cron to run Refresh the requests page From the "Actions" dropdown, choose "Approve request (data from selected courses)" Confirm a modal was shown Course content download Navigate to Site admin -> Courses -> download course content Enable the feature Navigate to any course and edit its settings Set "Enable download course content" to yes Save From the "More" menu choose "Download course content" Confirm modal opened Download the content Confirm modal closed Course content Navigate to a course Turn editign on Drag and drop an image from your computer into the course Confirm modal opened Accept the modal Confirm modal closed Confirm file uploaded Copy course Navigate to Site admin -> Courses - Manage courses and categories Click on the "Copy course" button for any course Confirm modal opened Cancel Confirm modal closed Click on the "Copy course" button for any course Confirm modal opened Enter details and press "Copy and return" Confirm modal closed Run cron Refresh Confirm new course now shown Click on the "Copy course" button for any course Confirm modal opened Enter details and press "Copy and view" *Confirm you're taken to the "Course copy progress" page Scenario: Moodlenet Navigate to Site admin -> Advanced features Enable MoodleNet integration (inbound)  Navigate to Site admin -> Developerment -> Experimental settings Enable sharing to MoodleNet (outbound) Navigate to Site admin -> MoodleNet -> OUtbound Click the "Create it" link Create a "MoodleNet" OAuth2 Provider Navigate to Site admin -> MoodleNet -> OUtbound Select the newly created OAUth2 proivder Navigate to a course Create an activity From the activity's "More" menu, choose "Share to MoodleNet" Confirm modal opened Repeats The following tests all require you to open a modal, close it, open it again, and close it again without any error shown in the browser developer console Course Enable editing mode Toggle the Activity chooser open/close/open/close Toggle the Add block modal open/close/open/close

      The way in which the core/modal module works and that we must separately register modals, before instantiating them from the factory is, to be frank, batshit crazy.

      Right now it looks like:

      // mymodal.js
      import Modal from 'core/modal';
      import * as ModalRegistry from 'core/modal_registry';
       
      export default class MyModal extends Modal {
          static TYPE = 'local_example/mymodal';
          // ...
      }
       
      ModalRegistry.register(
          MyModal.TYPE,
          MyModal,
          'local_example/mymodal', // Template name.
      );
      

      And then to instantiate it looks like:

      // mycode.js
      import MyModal from './mymodal';
      import * as ModalFactory from 'core/modal_factory';
       
      // ...
      const myModal = await ModalFactory.create(MyModal.TYPE, {
          // ...
          large: true,
          body: 'Hello world!',
      });
      myModal.show();
      

      To be quite frank, this is nuts. There is so much boilerplate here, and it's so easy to reduce and remove most of it.
      ,
      I'd like to get us to to the point where the definition is as simple as:

      // mymodal.js
      import Modal from 'core/modal';
       
      export default class MyModal extends Modal {
          static TYPE = 'local_example/mymodal';
          static TEMPLATE = 'local_example/mymodal';
          // ...
      }
      

      And then the instantiation is:

      // mycode.js
      import MyModal from './mymodal';
       
      const myModal = MyModal.create({
          // ...
          large: true,
          body: 'Hello world!',
          show: true,
      });
      

      I believe that we should be able to entirely get rid of:

      • the modal_registry (after deprecating)
      • the modal_factory (moving existing functionality to core/modal as new static methods and depreating)
      • the need to register modals at all

      We also do a ridiculous amount of configuration in the factory instead of the modal itself - again why!?

      This issue is about taking some ideas originally put into MDL-78306, and enacting them here.

        1. MDL-78324-Badges.png
          MDL-78324-Badges.png
          494 kB
        2. MDL-78324-Calendar.png
          MDL-78324-Calendar.png
          691 kB
        3. MDL-78324-copy course.png
          MDL-78324-copy course.png
          603 kB
        4. MDL-78324-course content.png
          MDL-78324-course content.png
          198 kB
        5. MDL-78324-Course content download.png
          MDL-78324-Course content download.png
          265 kB
        6. MDL-78324-deprecated and continues to work.png
          MDL-78324-deprecated and continues to work.png
          122 kB
        7. MDL-78324-Enrolments.png
          MDL-78324-Enrolments.png
          1.59 MB
        8. MDL-78324-file types.png
          MDL-78324-file types.png
          318 kB
        9. MDL-78324-forum.png
          MDL-78324-forum.png
          294 kB
        10. MDL-78324-Grade report singleview.png
          MDL-78324-Grade report singleview.png
          1.05 MB
        11. MDL-78324-license manager.png
          MDL-78324-license manager.png
          703 kB
        12. MDL-78324-moodlenet.png
          MDL-78324-moodlenet.png
          91 kB
        13. MDL-78324-Privacy.png
          MDL-78324-Privacy.png
          146 kB
        14. MDL-78324-repeat course.png
          MDL-78324-repeat course.png
          276 kB
        15. MDL-78324-show option.png
          MDL-78324-show option.png
          193 kB
        16. MDL-78324-tinymce.png
          MDL-78324-tinymce.png
          2.48 MB
        17. MDL-78324-triggerELEMENT.png
          MDL-78324-triggerELEMENT.png
          196 kB

            dobedobedoh Andrew Lyons
            dobedobedoh Andrew Lyons
            Meirza Meirza
            Jun Pataleta Jun Pataleta
            Ron Carl Alfon Yu Ron Carl Alfon Yu
            Votes:
            0 Vote for this issue
            Watchers:
            9 Start watching this issue

              Created:
              Updated:
              Resolved:

                Estimated:
                Original Estimate - Not Specified
                Not Specified
                Remaining:
                Remaining Estimate - 0 minutes
                0m
                Logged:
                Time Spent - 3 days, 1 hour, 15 minutes
                3d 1h 15m

                  Error rendering 'clockify-timesheets-time-tracking-reports:timer-sidebar'. Please contact your Jira administrators.