From b39dd5c40d84750e0cc26dad5d73644ea5322861 Mon Sep 17 00:00:00 2001 From: YNH Webdev Date: Tue, 31 Dec 2013 21:25:01 +0100 Subject: [PATCH] Change parameter type --- .../kernel/grid/wsf_pagination_control.e | 4 +- .../kernel/input/wsf_autocomplete_control.e | 2 +- .../kernel/input/wsf_checkbox_control.e | 2 +- .../kernel/input/wsf_file_control.e | 13 +++- .../kernel/input/wsf_input_control.e | 2 +- .../kernel/progressbar/wsf_progress_control.e | 2 +- .../kernel/slider/wsf_slider_control.e | 2 +- .../kernel/webcontrol/wsf_button_control.e | 2 +- .../kernel/webcontrol/wsf_control.e | 12 ++-- .../webcontrol/wsf_form_element_control.e | 2 +- .../kernel/webcontrol/wsf_html_control.e | 2 +- .../kernel/webcontrol/wsf_multi_control.e | 2 +- .../kernel/webcontrol/wsf_page_control.e | 9 ++- .../webcontrol/wsf_stateless_multi_control.e | 2 +- examples/widgetapp/assets/widget.coffee | 58 ++++++++++++++-- examples/widgetapp/assets/widget.js | 67 +++++++++++++++++-- examples/widgetapp/sample_page.e | 1 + 17 files changed, 153 insertions(+), 31 deletions(-) diff --git a/draft/library/wsf_js_widget/kernel/grid/wsf_pagination_control.e b/draft/library/wsf_js_widget/kernel/grid/wsf_pagination_control.e index 1e377627..df09e443 100644 --- a/draft/library/wsf_js_widget/kernel/grid/wsf_pagination_control.e +++ b/draft/library/wsf_js_widget/kernel/grid/wsf_pagination_control.e @@ -48,7 +48,7 @@ feature {WSF_PAGE_CONTROL, WSF_CONTROL} -- State management feature --Event handling - handle_callback (cname: LIST[STRING]; event: STRING; event_parameter: detachable STRING) + handle_callback (cname: LIST[STRING]; event: STRING; event_parameter: detachable ANY) -- Handle goto/next/prev events do if Current.control_name.same_string (cname[1]) then @@ -57,7 +57,7 @@ feature --Event handling elseif event.same_string ("prev") then datasource.set_page (datasource.page - 1) elseif event.same_string ("goto") then - if attached event_parameter as p and then attached p.to_integer as i then + if attached {STRING}event_parameter as p and then attached p.to_integer as i then datasource.set_page (i) end end diff --git a/draft/library/wsf_js_widget/kernel/input/wsf_autocomplete_control.e b/draft/library/wsf_js_widget/kernel/input/wsf_autocomplete_control.e index f484947c..ae9de051 100644 --- a/draft/library/wsf_js_widget/kernel/input/wsf_autocomplete_control.e +++ b/draft/library/wsf_js_widget/kernel/input/wsf_autocomplete_control.e @@ -49,7 +49,7 @@ feature -- State feature -- Callback - handle_callback (cname: LIST[STRING]; event: STRING; event_parameter: detachable STRING) + handle_callback (cname: LIST[STRING]; event: STRING; event_parameter: detachable ANY) do Precursor {WSF_INPUT_CONTROL} (cname, event, event_parameter) if cname[1].same_string (control_name) and event.same_string ("autocomplete") then diff --git a/draft/library/wsf_js_widget/kernel/input/wsf_checkbox_control.e b/draft/library/wsf_js_widget/kernel/input/wsf_checkbox_control.e index 6afa3e6f..dbb35c61 100644 --- a/draft/library/wsf_js_widget/kernel/input/wsf_checkbox_control.e +++ b/draft/library/wsf_js_widget/kernel/input/wsf_checkbox_control.e @@ -54,7 +54,7 @@ feature --Event handling change_event := e end - handle_callback (cname: LIST[STRING]; event: STRING; event_parameter: detachable STRING) + handle_callback (cname: LIST[STRING]; event: STRING; event_parameter: detachable ANY) do if Current.control_name.same_string (cname[1]) and attached change_event as cevent then if event.same_string ("change") then diff --git a/draft/library/wsf_js_widget/kernel/input/wsf_file_control.e b/draft/library/wsf_js_widget/kernel/input/wsf_file_control.e index 4d2449c4..c1bef063 100644 --- a/draft/library/wsf_js_widget/kernel/input/wsf_file_control.e +++ b/draft/library/wsf_js_widget/kernel/input/wsf_file_control.e @@ -49,7 +49,7 @@ feature --Event handling change_event := e end - handle_callback (cname: LIST [STRING]; event: STRING; event_parameter: detachable STRING) + handle_callback (cname: LIST [STRING]; event: STRING; event_parameter: detachable ANY) do if Current.control_name.same_string (cname [1]) and attached change_event as cevent then if event.same_string ("change") then @@ -58,6 +58,17 @@ feature --Event handling end end +feature -- Upload + + start_upload + local + upload: WSF_JSON_OBJECT + do + create upload.make + upload.put_string ("start_upload", "type") + actions.add (upload) + end + feature -- Implementation value: detachable WSF_PENDING_FILE diff --git a/draft/library/wsf_js_widget/kernel/input/wsf_input_control.e b/draft/library/wsf_js_widget/kernel/input/wsf_input_control.e index e0511bb0..d243bd7d 100644 --- a/draft/library/wsf_js_widget/kernel/input/wsf_input_control.e +++ b/draft/library/wsf_js_widget/kernel/input/wsf_input_control.e @@ -53,7 +53,7 @@ feature --Event handling change_event := e end - handle_callback (cname: LIST[STRING]; event: STRING; event_parameter: detachable STRING) + handle_callback (cname: LIST[STRING]; event: STRING; event_parameter: detachable ANY) do if Current.control_name.same_string (cname[1]) and attached change_event as cevent then if event.same_string ("change") then diff --git a/draft/library/wsf_js_widget/kernel/progressbar/wsf_progress_control.e b/draft/library/wsf_js_widget/kernel/progressbar/wsf_progress_control.e index 2f772db6..07113ecf 100644 --- a/draft/library/wsf_js_widget/kernel/progressbar/wsf_progress_control.e +++ b/draft/library/wsf_js_widget/kernel/progressbar/wsf_progress_control.e @@ -51,7 +51,7 @@ feature -- State handling feature -- Event handling - handle_callback (cname: LIST[STRING]; event: STRING; event_parameter: detachable STRING) + handle_callback (cname: LIST[STRING]; event: STRING; event_parameter: detachable ANY) do if cname[1].same_string (control_name) and event.same_string ("progress_fetch") then state_changes.put_integer (progress_value, "progress") diff --git a/draft/library/wsf_js_widget/kernel/slider/wsf_slider_control.e b/draft/library/wsf_js_widget/kernel/slider/wsf_slider_control.e index 0e5263e1..c952977c 100644 --- a/draft/library/wsf_js_widget/kernel/slider/wsf_slider_control.e +++ b/draft/library/wsf_js_widget/kernel/slider/wsf_slider_control.e @@ -43,7 +43,7 @@ feature -- State handling feature -- Callback - handle_callback (cname: LIST[STRING]; event: STRING; event_parameter: detachable STRING) + handle_callback (cname: LIST[STRING]; event: STRING; event_parameter: detachable ANY) do -- Do nothing here end diff --git a/draft/library/wsf_js_widget/kernel/webcontrol/wsf_button_control.e b/draft/library/wsf_js_widget/kernel/webcontrol/wsf_button_control.e index dd06596f..3b49767e 100644 --- a/draft/library/wsf_js_widget/kernel/webcontrol/wsf_button_control.e +++ b/draft/library/wsf_js_widget/kernel/webcontrol/wsf_button_control.e @@ -54,7 +54,7 @@ feature --Event handling click_event := e end - handle_callback (cname: LIST[STRING]; event: STRING; event_parameter: detachable STRING) + handle_callback (cname: LIST[STRING]; event: STRING; event_parameter: detachable ANY) do if Current.control_name.same_string (cname[1]) and attached click_event as cevent then cevent.call (Void) diff --git a/draft/library/wsf_js_widget/kernel/webcontrol/wsf_control.e b/draft/library/wsf_js_widget/kernel/webcontrol/wsf_control.e index c7fffb10..102d8b5e 100644 --- a/draft/library/wsf_js_widget/kernel/webcontrol/wsf_control.e +++ b/draft/library/wsf_js_widget/kernel/webcontrol/wsf_control.e @@ -52,12 +52,12 @@ feature -- Actions show_alert (message: STRING) --Start a modal window containg an other or the same page local - modal: WSF_JSON_OBJECT + alert: WSF_JSON_OBJECT do - create modal.make - modal.put_string ("show_alert", "type") - modal.put_string (message, "message") - actions.add (modal) + create alert.make + alert.put_string ("show_alert", "type") + alert.put_string (message, "message") + actions.add (alert) end redirect (url: STRING) @@ -154,7 +154,7 @@ feature -- Rendering feature -- Event handling - handle_callback (cname: LIST [STRING]; event: STRING; event_parameter: detachable STRING) + handle_callback (cname: LIST [STRING]; event: STRING; event_parameter: detachable ANY) -- Method called if any callback received. In this method you can route the callback to the event handler deferred end diff --git a/draft/library/wsf_js_widget/kernel/webcontrol/wsf_form_element_control.e b/draft/library/wsf_js_widget/kernel/webcontrol/wsf_form_element_control.e index acd49e18..1c759e94 100644 --- a/draft/library/wsf_js_widget/kernel/webcontrol/wsf_form_element_control.e +++ b/draft/library/wsf_js_widget/kernel/webcontrol/wsf_form_element_control.e @@ -121,7 +121,7 @@ feature {WSF_PAGE_CONTROL, WSF_CONTROL} -- State management feature -- Event handling - handle_callback (cname: LIST [STRING]; event: STRING; event_parameter: detachable STRING) + handle_callback (cname: LIST [STRING]; event: STRING; event_parameter: detachable ANY) -- Pass callback to subcontrols do if cname [1].same_string (control_name) then diff --git a/draft/library/wsf_js_widget/kernel/webcontrol/wsf_html_control.e b/draft/library/wsf_js_widget/kernel/webcontrol/wsf_html_control.e index 11335fd4..59998e00 100644 --- a/draft/library/wsf_js_widget/kernel/webcontrol/wsf_html_control.e +++ b/draft/library/wsf_js_widget/kernel/webcontrol/wsf_html_control.e @@ -43,7 +43,7 @@ feature {WSF_PAGE_CONTROL, WSF_CONTROL} -- State management feature --Event handling - handle_callback (cname: LIST[STRING]; event: STRING; event_parameter: detachable STRING) + handle_callback (cname: LIST[STRING]; event: STRING; event_parameter: detachable ANY) do end diff --git a/draft/library/wsf_js_widget/kernel/webcontrol/wsf_multi_control.e b/draft/library/wsf_js_widget/kernel/webcontrol/wsf_multi_control.e index bf5ad890..44da1df7 100644 --- a/draft/library/wsf_js_widget/kernel/webcontrol/wsf_multi_control.e +++ b/draft/library/wsf_js_widget/kernel/webcontrol/wsf_multi_control.e @@ -132,7 +132,7 @@ feature {WSF_PAGE_CONTROL, WSF_CONTROL} -- State management feature -- Event handling - handle_callback (cname: LIST [STRING]; event: STRING; event_parameter: detachable STRING) + handle_callback (cname: LIST [STRING]; event: STRING; event_parameter: detachable ANY) -- Pass callback to subcontrols do if equal (cname [1], control_name) then diff --git a/draft/library/wsf_js_widget/kernel/webcontrol/wsf_page_control.e b/draft/library/wsf_js_widget/kernel/webcontrol/wsf_page_control.e index e4848ca9..9ec447df 100644 --- a/draft/library/wsf_js_widget/kernel/webcontrol/wsf_page_control.e +++ b/draft/library/wsf_js_widget/kernel/webcontrol/wsf_page_control.e @@ -59,7 +59,7 @@ feature -- Implementation -- If request is not a callback. Run process and render the html page local event: detachable STRING - event_parameter: detachable STRING + event_parameter: detachable ANY event_control_name: detachable STRING states: STRING states_changes: WSF_JSON_OBJECT @@ -74,6 +74,11 @@ feature -- Implementation create json_parser.make_parser (states) if attached {JSON_OBJECT} json_parser.parse_json as sp then set_state (sp) + else + if attached request.form_parameter ("file") as o then + response.put_string (o.name) + end + end handle_callback (event_control_name.split ('-'), event, event_parameter) create states_changes.make @@ -147,7 +152,7 @@ feature -- Implementation feature -- Event handling - handle_callback (cname: LIST[STRING]; event: STRING; event_parameter: detachable STRING) + handle_callback (cname: LIST[STRING]; event: STRING; event_parameter: detachable ANY) -- Forward callback to control do control.handle_callback (cname, event, event_parameter) diff --git a/draft/library/wsf_js_widget/kernel/webcontrol/wsf_stateless_multi_control.e b/draft/library/wsf_js_widget/kernel/webcontrol/wsf_stateless_multi_control.e index 7dba1109..9e3579cd 100644 --- a/draft/library/wsf_js_widget/kernel/webcontrol/wsf_stateless_multi_control.e +++ b/draft/library/wsf_js_widget/kernel/webcontrol/wsf_stateless_multi_control.e @@ -76,7 +76,7 @@ feature end feature -- Event handling - handle_callback (cname: LIST [STRING]; event: STRING; event_parameter: detachable STRING) + handle_callback (cname: LIST [STRING]; event: STRING; event_parameter: detachable ANY) -- Pass callback to subcontrols do across diff --git a/examples/widgetapp/assets/widget.coffee b/examples/widgetapp/assets/widget.coffee index 2bbb9686..6ee695ff 100644 --- a/examples/widgetapp/assets/widget.coffee +++ b/examples/widgetapp/assets/widget.coffee @@ -180,13 +180,21 @@ class WSF_CONTROL process_actions: (actions)-> for action in actions try - fn = eval(action.type) - fn(action) + fn = null + #Check if action exists in class then check global + if @[action.type]? + fn = @[action.type] + fn.call(@, action) + else + fn = eval(action.type) + fn(action) catch e console.log "Failed preforming action #{action.type}" process_update: (new_states)-> try + if new_states.actions? + @process_actions(new_states.actions) if new_states[@control_name]? @update(new_states[@control_name]) for control in @controls @@ -289,8 +297,6 @@ class WSF_PAGE_CONTROL extends WSF_CONTROL @load_subcontrols() process_update: (new_states)-> - if new_states.actions? - @process_actions(new_states.actions) for control in @controls if control? control.process_update(new_states) @@ -361,6 +367,50 @@ class WSF_INPUT_CONTROL extends WSF_CONTROL @$el.val(state.text) class WSF_FILE_CONTROL extends WSF_CONTROL + constructor: ()-> + super + @uploading = false + start_upload: ()-> + if @uploading + return + @uploading = true + @$el.hide() + @progressbar = $ """
""" + @$el.parent().append(@progressbar) + + formData = new FormData(); + action = @callback_url + control_name: @control_name + event: "uploadfile" + event_parameter: "" + file = @$el[0].files[0]; + formData.append('our-file', file) + formData.append('state', JSON.stringify(@get_context_state())) + @sendXHRequest(formData, action) + + sendXHRequest: (formData, uri)-> + #Get an XMLHttpRequest instance + xhr = new XMLHttpRequest(); + self = @ + onprogressHandler = (evt)-> + percent = evt.loaded/evt.total*100 + self.progressbar.find('.progress-bar').css {'width':percent+"%"} + onloadHandler = (evt)-> + alert "DONE" + xhr.upload.addEventListener('progress', onprogressHandler, false); + xhr.upload.addEventListener('load', onloadHandler, false); + + ###Set up events + xhr.upload.addEventListener('loadstart', onloadstartHandler, false); + + + xhr.addEventListener('readystatechange', onreadystatechangeHandler, false); + ### + #Set up request + xhr.open('POST', uri, true); + #Fire! + xhr.send(formData); + attach_events: ()-> super self = @ diff --git a/examples/widgetapp/assets/widget.js b/examples/widgetapp/assets/widget.js index 03cbe912..8894892e 100644 --- a/examples/widgetapp/assets/widget.js +++ b/examples/widgetapp/assets/widget.js @@ -298,8 +298,14 @@ WSF_CONTROL = (function() { for (_i = 0, _len = actions.length; _i < _len; _i++) { action = actions[_i]; try { - fn = eval(action.type); - _results.push(fn(action)); + fn = null; + if (this[action.type] != null) { + fn = this[action.type]; + _results.push(fn.call(this, action)); + } else { + fn = eval(action.type); + _results.push(fn(action)); + } } catch (e) { _results.push(console.log("Failed preforming action " + action.type)); } @@ -310,6 +316,9 @@ WSF_CONTROL = (function() { WSF_CONTROL.prototype.process_update = function(new_states) { var control, _i, _len, _ref; try { + if (new_states.actions != null) { + this.process_actions(new_states.actions); + } if (new_states[this.control_name] != null) { this.update(new_states[this.control_name]); _ref = this.controls; @@ -453,9 +462,6 @@ WSF_PAGE_CONTROL = (function(_super) { WSF_PAGE_CONTROL.prototype.process_update = function(new_states) { var control, _i, _len, _ref; - if (new_states.actions != null) { - this.process_actions(new_states.actions); - } _ref = this.controls; for (_i = 0, _len = _ref.length; _i < _len; _i++) { control = _ref[_i]; @@ -601,9 +607,58 @@ WSF_FILE_CONTROL = (function(_super) { __extends(WSF_FILE_CONTROL, _super); function WSF_FILE_CONTROL() { - return WSF_FILE_CONTROL.__super__.constructor.apply(this, arguments); + WSF_FILE_CONTROL.__super__.constructor.apply(this, arguments); + this.uploading = false; } + WSF_FILE_CONTROL.prototype.start_upload = function() { + var action, file, formData; + if (this.uploading) { + return; + } + this.uploading = true; + this.$el.hide(); + this.progressbar = $("
"); + this.$el.parent().append(this.progressbar); + formData = new FormData(); + action = this.callback_url({ + control_name: this.control_name, + event: "uploadfile", + event_parameter: "" + }); + file = this.$el[0].files[0]; + formData.append('our-file', file); + formData.append('state', JSON.stringify(this.get_context_state())); + return this.sendXHRequest(formData, action); + }; + + WSF_FILE_CONTROL.prototype.sendXHRequest = function(formData, uri) { + var onloadHandler, onprogressHandler, self, xhr; + xhr = new XMLHttpRequest(); + self = this; + onprogressHandler = function(evt) { + var percent; + percent = evt.loaded / evt.total * 100; + return self.progressbar.find('.progress-bar').css({ + 'width': percent + "%" + }); + }; + onloadHandler = function(evt) { + return alert("DONE"); + }; + xhr.upload.addEventListener('progress', onprogressHandler, false); + xhr.upload.addEventListener('load', onloadHandler, false); + /*Set up events + xhr.upload.addEventListener('loadstart', onloadstartHandler, false); + + + xhr.addEventListener('readystatechange', onreadystatechangeHandler, false); + */ + + xhr.open('POST', uri, true); + return xhr.send(formData); + }; + WSF_FILE_CONTROL.prototype.attach_events = function() { var self; WSF_FILE_CONTROL.__super__.attach_events.apply(this, arguments); diff --git a/examples/widgetapp/sample_page.e b/examples/widgetapp/sample_page.e index 688995cb..18ac3f7d 100644 --- a/examples/widgetapp/sample_page.e +++ b/examples/widgetapp/sample_page.e @@ -100,6 +100,7 @@ feature do form.validate if form.is_valid then + filebox.start_upload --progress.set_progress ((textbox1.text.to_integer_64 / textbox2.text.to_integer_64 * 100).ceiling) text := textbox1.text + " + " + textbox2.text + " = " + (textbox1.text.to_integer_64 + textbox2.text.to_integer_64).out text.append ("