diff --git a/UI/ActionManager.js b/UI/ActionManager.js index ec57cc6..dfcc343 100644 --- a/UI/ActionManager.js +++ b/UI/ActionManager.js @@ -7,6 +7,23 @@ import { Logger } from '../Log/Logger.js'; * @license OMS License 1.0 * @version 1.0.0 * @since 1.0.0 + * + * @todo Orange-Management/jsOMS#26 + * Sync/Async events + * Events so fare can be created sync and async depending on the implementation. + * It would be better to make it sync/async depending on a option flag. + * + * @todo Orange-Management/jsOMS#35 + * Template actions cannot be overwritten + * Templates by nature get added and removed from a page (often in order to reuse existing html to minimize the html load). + * The problem with templates is that they need to register in the ActionManager.js. + * A listener currently is only registered once per id. + * Since templates often keep the same id for some elements this results in a problem because the new template will not register a new listener. + * Possible solutions: + * 1. Force unique ids for templates during setup (pro: fast and easy initial solution, con: action event pollution not solved) + * 2. Whenever a dom element with action elements is removed, also unregister the listeners (pro: clean solution, con: difficult to implement) + * Solution 2 will be implemented. + * Maybe this can be performed in the dom removing action events or a dom listener would be required to listen for these dom elements. */ export class ActionManager { diff --git a/UI/Component/AdvancedInput.js b/UI/Component/AdvancedInput.js index cff1fdb..61312b6 100644 --- a/UI/Component/AdvancedInput.js +++ b/UI/Component/AdvancedInput.js @@ -7,9 +7,6 @@ import { Request } from '../../Message/Request/Request.js'; * @license OMS License 1.0 * @version 1.0.0 * @since 1.0.0 - * - * @todo: this class is probably the most stupid thing I've done in a long time. Seriously fix this! - * @todo: Passing self to every MEMBER function is just dumb. */ export class AdvancedInput { @@ -35,10 +32,12 @@ export class AdvancedInput const self = this; this.inputField.addEventListener('focusout', function(e) { - // todo: this also means that clicking on any other part of the result list that it disappears befor - // the click is registered in the result list since focusout has highest priority (e.g. sort button in table). - // so far i don't know a way to check if *any* element in the result div is clicked, if I could check this - // first then I could simply say, don't make the result div inactive! + /** + * @todo Orange-Management/Modules#63 + * If you click anything outside of the input element the dropdown list closes. + * This is also true if you click something inside of the dropdown list e.g. sort/filter etc. + * This might be fixable by changing the focus from the input element to the dropdown element and keep the dropdown element visible if it has focus. + */ if (e.relatedTarget === null || e.relatedTarget.parentElement === null || e.relatedTarget.parentElement.parentElement === null || @@ -70,9 +69,14 @@ export class AdvancedInput this.dropdownElement.addEventListener('keydown', function(e) { jsOMS.preventAll(e); - // todo: consider if it makes sense to have a none element always for phone users only to jump out? - // todo: if not remote then the suggestion dropdown should filter itself based on best match - + /** + * @todo Orange-Management/jsOMS#61 + * Jumping out of the dropdown list is a little bit annoying for handheld users. + * A solution could be to add a exit/none element which closes the dropdown when clicked. + * + * @todo Orange-Management/jsOMS#62 + * If the data for the input element is only locally defined the filter or sort should be done by the best match. + */ if (e.keyCode === 27 || e.keyCode === 46 || e.keyCode === 8) { // handle esc, del to go back to input field self.inputField.focus(); diff --git a/UI/Component/AdvancedSelect.js b/UI/Component/AdvancedSelect.js index 72b04da..6a357da 100644 --- a/UI/Component/AdvancedSelect.js +++ b/UI/Component/AdvancedSelect.js @@ -14,9 +14,6 @@ import { Request } from '../../Message/Request/Request.js'; * @license OMS License 1.0 * @version 1.0.0 * @since 1.0.0 - * - * @todo: this class is probably the most stupid thing I've done in a long time. Seriously fix this! - * @todo: Passing self to every MEMBER function is just dumb. */ export class AdvancedSelect { diff --git a/UI/Component/Form.js b/UI/Component/Form.js index 44923e3..8a508f5 100644 --- a/UI/Component/Form.js +++ b/UI/Component/Form.js @@ -15,6 +15,20 @@ import { FormView } from '../../Views/FormView.js'; * @license OMS License 1.0 * @version 1.0.0 * @since 1.0.0 + * + * @tood Orange-Management/jsOMS#60 + * On change listener + * Allow to add a on change listener in a form. This should result in automatic submits after changing a form. + * Consider the following cases to submit the form: + * * on Enter (all except textarea) + * * on Change (by using a timer) + * * on Leave (all elements) + * The listener should be defined in the form definition once and in js be applied to all form elements. + * + * @todo Orange-Management/Modules#177 + * Hotkey for saving forms for creation/edit + * Instead of using the mouse to click save the user should be able to use a hotkey to save/create/update the current form. + * The hotkey on PC should be alt+enter or alt+shift+enter or alt+s */ export class Form { @@ -996,7 +1010,6 @@ export class Form break; case 'textarea': // textarea only has value data in it's content and nothing else! - // @todo: check other html tags as well or maybe just don't use the -text attribute and be fine? break; default: src.value = value; diff --git a/UI/Component/Table.js b/UI/Component/Table.js index d46320f..27e50ac 100644 --- a/UI/Component/Table.js +++ b/UI/Component/Table.js @@ -1,6 +1,7 @@ import { TableView } from '../../Views/TableView.js'; import { Request } from '../../Message/Request/Request.js'; import { ResponseType } from '../../Message/Response/ResponseType.js'; + /** * Table manager class. * @@ -8,6 +9,24 @@ import { ResponseType } from '../../Message/Response/ResponseType.js'; * @license OMS License 1.0 * @version 1.0.0 * @since 1.0.0 + * + * @todo Orange-Management/jsOMS#50 + * Add basic table handling (no db and pagination) + * + * @todo Orange-Management/jsOMS#55 + * Implement filtering and sorting based on backend + * + * @todo Orange-Management/jsOMS#57 + * Advanced filtering + * The current filtering implementation is only column by column connected with &&. + * Consider to implement a much more advanced filtering where different combinations are possible such as || &&, different ordering with parenthesis etc. + * This can be extremely powerful but will be complex for standard users. + * This advanced filtering should probably be a little bit hidden? + * + * @todo Orange-Management/jsOMS#59 + * Data download + * There is a small icon in the top right corner of tables which allows (not yet to be honest) to download the data in the table. + * Whether the backend should be queried for this or only the frontend data should be collected (current situation) should depend on if the table has an api endpoint defined. */ export class Table { diff --git a/UI/Input/Voice/ReadManager.js b/UI/Input/Voice/ReadManager.js index b7ad464..1bef47b 100644 --- a/UI/Input/Voice/ReadManager.js +++ b/UI/Input/Voice/ReadManager.js @@ -105,7 +105,10 @@ export class ReadManager }; }; -// todo: remove once obsolete +/** + * @todo Orange-Management/jsOMS#66 + * Remove the speech recognition wrapper once it is obsolete and supported by the major browsers. + */ /** global: webkitSpeechRecognition */ /** global: SpeechRecognition */ var SpeechRecognition = typeof SpeechRecognition !== 'undefined' ? SpeechRecognition : typeof webkitSpeechRecognition !== 'undefined' ? webkitSpeechRecognition : null; diff --git a/UI/Input/Voice/VoiceManager.js b/UI/Input/Voice/VoiceManager.js index d8fe399..b971647 100644 --- a/UI/Input/Voice/VoiceManager.js +++ b/UI/Input/Voice/VoiceManager.js @@ -158,7 +158,10 @@ export class VoiceManager }; }; -// todo: remove once obsolete +/** + * @todo Orange-Management/jsOMS#66 + * Remove the speech recognition wrapper once it is obsolete and supported by the major browsers. + */ /** global: webkitSpeechRecognition */ /** global: SpeechRecognition */ var SpeechRecognition = typeof SpeechRecognition !== 'undefined' ? SpeechRecognition : typeof webkitSpeechRecognition !== 'undefined' ? webkitSpeechRecognition : null; diff --git a/Utils/UiUtils.js b/Utils/UiUtils.js index 228039c..c18e03e 100644 --- a/Utils/UiUtils.js +++ b/Utils/UiUtils.js @@ -249,7 +249,9 @@ }; /** - * @todo: implement + * @todo Orange-Management/jsOMS#64 + * Implement a function which returns the nearest dom element based on a selector. + * Nearest is defined as vertical and horizontal distance. */ jsOMS.nearest = function (e, selector) { diff --git a/Views/FormView.js b/Views/FormView.js index d7bf49e..4f56265 100644 --- a/Views/FormView.js +++ b/Views/FormView.js @@ -11,6 +11,15 @@ import { Input } from '../UI/Component/Input.js'; * @license OMS License 1.0 * @version 1.0.0 * @since 1.0.0 + * + * @tood Orange-Management/jsOMS#60 + * On change listener + * Allow to add a on change listener in a form. This should result in automatic submits after changing a form. + * Consider the following cases to submit the form: + * * on Enter (all except textarea) + * * on Change (by using a timer) + * * on Leave (all elements) + * The listener should be defined in the form definition once and in js be applied to all form elements. */ export class FormView { @@ -100,7 +109,7 @@ export class FormView /** * Get submit elements * - * @return {Object} + * @return {NodeListOf} * * @since 1.0.0 */ @@ -119,7 +128,7 @@ export class FormView /** * Get submit elements * - * @return {Object} + * @return {NodeListOf} * * @since 1.0.0 */ @@ -133,7 +142,7 @@ export class FormView /** * Get edit elements * - * @return {Object} + * @return {NodeListOf} * * @since 1.0.0 */ @@ -149,7 +158,7 @@ export class FormView /** * Get save elements * - * @return {Object} + * @return {NodeListOf} * * @since 1.0.0 */ @@ -165,7 +174,7 @@ export class FormView /** * Get save elements * - * @return {Object} + * @return {NodeListOf} * * @since 1.0.0 */ @@ -195,12 +204,13 @@ export class FormView }; /** - * Get remove buttons + * Get add buttons + * + * The add button is different from the submit button since sometimes you want to show data to the user before you submit it. * * @return {NodeListOf} * * @since 1.0.0 - * @todo isn't this the same as submit in some cases? form below table? */ getAdd () { @@ -493,7 +503,6 @@ export class FormView * @return {void} * * @since 1.0.0 - * @todo: check bind functionality maybe remove!!! */ bind () { @@ -549,7 +558,6 @@ export class FormView * @return {void} * * @since 1.0.0 - * @todo: check unbind functionality maybe remove = everything!!! */ unbind () { diff --git a/Views/TableView.js b/Views/TableView.js index 2251893..6bf3584 100644 --- a/Views/TableView.js +++ b/Views/TableView.js @@ -5,6 +5,24 @@ * @license OMS License 1.0 * @version 1.0.0 * @since 1.0.0 + * + * @todo Orange-Management/jsOMS#50 + * Add basic table handling (no db and pagination) + * + * @todo Orange-Management/jsOMS#55 + * Implement filtering and sorting based on backend + * + * @todo Orange-Management/jsOMS#57 + * Advanced filtering + * The current filtering implementation is only column by column connected with &&. + * Consider to implement a much more advanced filtering where different combinations are possible such as || &&, different ordering with parenthesis etc. + * This can be extremely powerful but will be complex for standard users. + * This advanced filtering should probably be a little bit hidden? + * + * @todo Orange-Management/jsOMS#59 + * Data download + * There is a small icon in the top right corner of tables which allows (not yet to be honest) to download the data in the table. + * Whether the backend should be queried for this or only the frontend data should be collected (current situation) should depend on if the table has an api endpoint defined. */ export class TableView {