From 55b7254e0557b1ff357f02b40d2fa20d0cf57cd3 Mon Sep 17 00:00:00 2001 From: Tony Wu <twu@fliplet.com> Date: Tue, 22 Jan 2019 15:18:16 +0000 Subject: [PATCH 1/3] Code shuffling --- js/interface.js | 252 +++++++++++++++++++++++++----------------------- 1 file changed, 129 insertions(+), 123 deletions(-) diff --git a/js/interface.js b/js/interface.js index 5455343..328fcfe 100644 --- a/js/interface.js +++ b/js/interface.js @@ -56,6 +56,118 @@ var emailProviderData = $.extend(true, { to: [] }, widgetInstanceData.appData ? widgetInstanceData.appData.untouchedData : {}); +function showPageQuery() { + $('#add-query').addClass('hidden'); + $('#screen-form').addClass('show-query'); + Fliplet.Widget.autosize(); +} + +// Save data when submitting the form +function save(notifyComplete) { + // Clean data to store the new saved values + var data = {}; + + // Attach options from widgetInstanceData + data.options = widgetInstanceData.options; + + // Get and save values to data + fields.forEach(function(fieldId) { + data[fieldId] = $('#' + fieldId).val(); + }); + + var appAction = $appAction.val(); + if (data.action === 'app' && appAction) { + data.app = appAction; + data.appData = {}; + + if (data.app === "gmail.compose") { + data.appData.untouchedData = emailProviderData + data.appData.body = emailProviderData.html + data.appData.subject = emailProviderData.subject + + // All recipients are found in the "emailProviderData.to" array, but with "type" + // defining whether they are "to" or "cc" or "bcc" recipients. + data.appData.to = _.find(emailProviderData.to, function(o) { return o.type === 'to'; }) || ''; + data.appData.cc = _.find(emailProviderData.to, function(o) { return o.type === 'cc'; }) || ''; + data.appData.bcc = _.find(emailProviderData.to, function(o) { return o.type === 'bcc'; }) || ''; + } else if (data.app === 'googlechrome.website') { + data.appData.url = $('#' + externalAppValueMap[appAction]).val(); + } else { + var urlValue = $('#' + externalAppValueMap[appAction]).val(); + var result; + + data.appData.fullUrl = urlValue; + if (appAction === "gdocs.document" || appAction === "gdocs.spreadsheet" || appAction === "gdocs.presentation") { + result = urlValue.match(/\/d\/([A-z0-9-_]+)/); + data.appData.id = result.length && result[1]; + } + + if (appAction === "gdrive.folder") { + result = urlValue.match(/folders\/([A-z0-9-_]+)/); + data.appData.id = result.length && result[1]; + } + + if (appAction === "gdrive.file") { + result = urlValue.match(/open\?.?id=([A-z0-9-_]+)/); + data.appData.id = result.length && result[1]; + } + } + } + + if (data.url && !data.url.match(/^[A-z]+:/i)) { + data.url = 'http://' + data.url; + } + + if (['document', 'video'].indexOf(data.action) !== -1) { + if (files.toRemove) { + data.files = {}; + } else { + data.files = _.isEmpty(files.selectedFiles) ? files : files.selectedFiles; + } + } + + // cleanup + ['url', 'query', 'page'].forEach(function(key) { + if (data[key] === '') { + delete data[key]; + } + }); + + if (notifyComplete) { + // TODO: validate query + Fliplet.Widget.save(data).then(function() { + Fliplet.Widget.complete(); + }); + } else { + Fliplet.Widget.save(data).then(function() { + Fliplet.Studio.emit('reload-widget-instance', widgetInstanceId); + }); + } +} + +function initializeData() { + if (widgetInstanceData.action) { + fields.forEach(function(fieldId) { + $('#' + fieldId).val(widgetInstanceData[fieldId]).trigger('change'); + Fliplet.Widget.autosize(); + }); + + if (widgetInstanceData.action === 'app' && widgetInstanceData.app) { + $appAction.val(widgetInstanceData.app); + $appAction.trigger('change'); + var url = widgetInstanceData.appData.fullUrl || widgetInstanceData.appData.url; + if (widgetInstanceData.appData && url) { + $('#' + externalAppValueMap[widgetInstanceData.app]).val(url); + } + } + $('.spinner-holder').removeClass('animated'); + return; + } + + $('.spinner-holder').removeClass('animated'); + $('#transition').val(defaultTransitionVal).trigger('change') +} + // Only Fliplet, "Colgate" and "Hills Pet Nutirition" can see the "Open app" feature while it's on beta Fliplet.Organizations.get().then(function (organizations) { var valid = organizations.some(function (org) { @@ -170,14 +282,12 @@ $appAction.on('change', function onAppActionChange() { }); $('#add-query').on('click', function() { - $(this).addClass('hidden'); - $(this).parents('#screen-form').addClass('show-query'); - Fliplet.Widget.autosize(); + showPageQuery(); }); $('#query').on('change', function() { - if ($(this).val() !== '') { - $('#add-query').trigger('click'); + if ($(this).val() === '') { + showPageQuery(); } }); @@ -270,125 +380,21 @@ Fliplet.Widget.onCancelRequest(function() { } }); -// Save data when submitting the form -function save(notifyComplete) { - // Clean data to store the new saved values - var data = {}; - - // Attach options from widgetInstanceData - data.options = widgetInstanceData.options; - - // Get and save values to data - fields.forEach(function(fieldId) { - data[fieldId] = $('#' + fieldId).val(); - }); - - var appAction = $appAction.val(); - if (data.action === 'app' && appAction) { - data.app = appAction; - data.appData = {}; - - if (data.app === "gmail.compose") { - data.appData.untouchedData = emailProviderData - data.appData.body = emailProviderData.html - data.appData.subject = emailProviderData.subject - - // All recipients are found in the "emailProviderData.to" array, but with "type" - // defining whether they are "to" or "cc" or "bcc" recipients. - data.appData.to = _.find(emailProviderData.to, function(o) { return o.type === 'to'; }) || ''; - data.appData.cc = _.find(emailProviderData.to, function(o) { return o.type === 'cc'; }) || ''; - data.appData.bcc = _.find(emailProviderData.to, function(o) { return o.type === 'bcc'; }) || ''; - } else if (data.app === 'googlechrome.website') { - data.appData.url = $('#' + externalAppValueMap[appAction]).val(); - } else { - var urlValue = $('#' + externalAppValueMap[appAction]).val(); - var result; - - data.appData.fullUrl = urlValue; - if (appAction === "gdocs.document" || appAction === "gdocs.spreadsheet" || appAction === "gdocs.presentation") { - result = urlValue.match(/\/d\/([A-z0-9-_]+)/); - data.appData.id = result.length && result[1]; - } - - if (appAction === "gdrive.folder") { - result = urlValue.match(/folders\/([A-z0-9-_]+)/); - data.appData.id = result.length && result[1]; - } - - if (appAction === "gdrive.file") { - result = urlValue.match(/open\?.?id=([A-z0-9-_]+)/); - data.appData.id = result.length && result[1]; - } - } - } - - if (data.url && !data.url.match(/^[A-z]+:/i)) { - data.url = 'http://' + data.url; - } - - if (['document', 'video'].indexOf(data.action) !== -1) { - if (files.toRemove) { - data.files = {}; - } else { - data.files = _.isEmpty(files.selectedFiles) ? files : files.selectedFiles; - } - } - - // cleanup - ['url', 'query', 'page'].forEach(function(key) { - if (data[key] === '') { - delete data[key]; - } +Fliplet.Pages.get().then(function(pages) { + pages = pages || []; + var options = []; + pages.forEach(function(page) { + options.push([ + '<option value="' + page.id + '"', + (widgetInstanceData.page === page.id.toString() ? ' selected' : ''), + '>' + page.title + '</option>' + ].join('')); }); + $('#page').append(options.join('')); - if (notifyComplete) { - // TODO: validate query - Fliplet.Widget.save(data).then(function() { - Fliplet.Widget.complete(); - }); - } else { - Fliplet.Widget.save(data).then(function() { - Fliplet.Studio.emit('reload-widget-instance', widgetInstanceId); - }); - } -} - -function initialiseData() { - if (widgetInstanceData.action) { - fields.forEach(function(fieldId) { - $('#' + fieldId).val(widgetInstanceData[fieldId]).trigger('change'); - Fliplet.Widget.autosize(); - }); - - if (widgetInstanceData.action === 'app' && widgetInstanceData.app) { - $appAction.val(widgetInstanceData.app); - $appAction.trigger('change'); - var url = widgetInstanceData.appData.fullUrl || widgetInstanceData.appData.url; - if (widgetInstanceData.appData && url) { - $('#' + externalAppValueMap[widgetInstanceData.app]).val(url); - } - } - $('.spinner-holder').removeClass('animated'); - return; - } + initializeData(); - $('.spinner-holder').removeClass('animated'); - $('#transition').val(defaultTransitionVal).trigger('change') -} - -Fliplet.Pages.get() - .then(function(pages) { - var $select = $('#page'); - (pages || []).forEach(function(page) { - $select.append( - '<option value="' + page.id + '"' + - (widgetInstanceData.page === page.id.toString() ? ' selected' : '') + - '>' + page.title + '</option>' - ); - }); - - return Promise.resolve(); - }) - .then(initialiseData); + return Promise.resolve(); +}); -Fliplet.Widget.autosize(); +Fliplet.Widget.autosize(); \ No newline at end of file From afda41a3489a22e22528eec8a58723853641f0c2 Mon Sep 17 00:00:00 2001 From: Tony Wu <twu@fliplet.com> Date: Tue, 22 Jan 2019 15:47:42 +0000 Subject: [PATCH 2/3] Adds UI flow for adding screen actions --- css/interface.css | 8 +++-- interface.html | 29 ++++++++++++---- js/interface.js | 84 ++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 102 insertions(+), 19 deletions(-) diff --git a/css/interface.css b/css/interface.css index 4a45996..0766b99 100644 --- a/css/interface.css +++ b/css/interface.css @@ -36,7 +36,8 @@ body { pointer-events: none; } -#query-form { +#screen-action-form, +#custom-screen-query { height: 0; opacity: 0; overflow: hidden; @@ -51,10 +52,11 @@ body { transform: translate(0, -10px); } -#screen-form.show-query #query-form { +#screen-form.show-screen-action #screen-action-form, +#screen-form.show-custom-query #custom-screen-query { display: block; opacity: 1; - overflow: auto; + overflow: visible; height: auto; margin-bottom: 15px; -webkit-transform: translate(0, 0); diff --git a/interface.html b/interface.html index de09e05..f8be5da 100644 --- a/interface.html +++ b/interface.html @@ -53,16 +53,31 @@ </select> <span class="icon fa fa-chevron-down"></span> </label> - <a id="add-query" href="#">Add query parameters</a> + <a id="add-action" href="#">Add screen action</a> </div> </div> - <div class="form-group" id="query-form"> - <div class="col-sm-4 control-label"> - <label for="query">Add query parameters</label> + <div id="screen-action-form"> + <div class="form-group"> + <div class="col-sm-4 control-label"> + <label for="query-action">Screen action</label> + </div> + <div class="col-sm-8"> + <label for="query-action" class="select-proxy-display"> + <select name="query_action" id="query-action" data-label="select" class="hidden-select form-control"> + <option selected value="">Select a screen action</option> + </select> + <span class="icon fa fa-chevron-down"></span> + </label> + </div> </div> - <div class="col-sm-8"> - <input type="text" class="form-control" name="query" id="query" placeholder="Enter query (e.g. ?variable1=value1&variable2=value2)" /> - <p class="help-block">This needs to be URL encoded - <a target="_blank" href="http://meyerweb.com/eric/tools/dencoder/">URL encoding tool</a></p> + <div class="form-group" id="custom-screen-query"> + <div class="col-sm-4 control-label"> + <label for="query">Custom query parameters</label> + </div> + <div class="col-sm-8"> + <input type="text" class="form-control" name="query" id="query" placeholder="Enter query (e.g. ?variable1=value1&variable2=value2)" /> + <p class="help-block">This needs to be URL encoded - <a target="_blank" href="http://meyerweb.com/eric/tools/dencoder/">URL encoding tool</a></p> + </div> </div> </div> <div class="form-group"> diff --git a/js/interface.js b/js/interface.js index 328fcfe..f6e0853 100644 --- a/js/interface.js +++ b/js/interface.js @@ -56,9 +56,56 @@ var emailProviderData = $.extend(true, { to: [] }, widgetInstanceData.appData ? widgetInstanceData.appData.untouchedData : {}); -function showPageQuery() { - $('#add-query').addClass('hidden'); - $('#screen-form').addClass('show-query'); +var screenActions = [ + { + group: 'Accordion', + actions: [ + { + value: 'accordionOpenTitle', + label: 'Open accordion (by title)' + }, + { + value: 'accordionOpenIndex', + label: 'Open accordion (by index)' + } + ] + }, + { + group: 'Directory', + actions: [ + { + value: 'directoryLoadFilter', + label: 'Load directory with a filter' + }, + { + value: 'directoryLoadSearch', + label: 'Load directory with a search' + }, + { + value: 'directoryLoadFilterMode', + label: 'Load directory in filter mode' + } + ] + }, + { + group: 'Custom', + actions: [ + { + value: 'customQuery', + label: 'Custom query parameters' + } + ] + } +]; + +function showScreenActions() { + $('#add-action').addClass('hidden'); + $('#screen-form').addClass('show-screen-action'); + Fliplet.Widget.autosize(); +} + +function toggleCustomQuery(show) { + $('#screen-form')[show ? 'addClass' : 'removeClass']('show-custom-query'); Fliplet.Widget.autosize(); } @@ -281,13 +328,17 @@ $appAction.on('change', function onAppActionChange() { Fliplet.Widget.autosize(); }); -$('#add-query').on('click', function() { - showPageQuery(); +$('#add-action').on('click', function() { + showScreenActions(); +}); + +$('#query-action').on('change', function () { + toggleCustomQuery($(this).val() === 'customQuery'); }); $('#query').on('change', function() { if ($(this).val() === '') { - showPageQuery(); + showScreenActions(); } }); @@ -382,15 +433,30 @@ Fliplet.Widget.onCancelRequest(function() { Fliplet.Pages.get().then(function(pages) { pages = pages || []; - var options = []; + var pageOptions = []; + var screenActionOptions = []; pages.forEach(function(page) { - options.push([ + pageOptions.push([ '<option value="' + page.id + '"', (widgetInstanceData.page === page.id.toString() ? ' selected' : ''), '>' + page.title + '</option>' ].join('')); }); - $('#page').append(options.join('')); + $('#page').append(pageOptions.join('')); + + screenActions.forEach(function (screenActionGroup) { + var actions = screenActionGroup.actions || []; + screenActionOptions.push('<optgroup label="' + screenActionGroup.group + '">'); + actions.forEach(function (action) { + screenActionOptions.push([ + '<option value="' + action.value + '">', + action.label, + '</option>' + ].join('')); + }); + screenActionOptions.push('</optgroup>'); + }); + $('#query-action').append(screenActionOptions.join('')); initializeData(); From 67c6b4238899de1405e4d4f73dfe9971b623dc97 Mon Sep 17 00:00:00 2001 From: Tony Wu <twu@fliplet.com> Date: Tue, 22 Jan 2019 16:34:33 +0000 Subject: [PATCH 3/3] Adds an additional field to demonstrate flow --- css/interface.css | 6 ++++-- interface.html | 8 ++++++++ js/interface.js | 7 +++++-- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/css/interface.css b/css/interface.css index 0766b99..382e179 100644 --- a/css/interface.css +++ b/css/interface.css @@ -37,7 +37,8 @@ body { } #screen-action-form, -#custom-screen-query { +#custom-screen-query, +#screen-form.show-custom-query #another-field { height: 0; opacity: 0; overflow: hidden; @@ -53,7 +54,8 @@ body { } #screen-form.show-screen-action #screen-action-form, -#screen-form.show-custom-query #custom-screen-query { +#screen-form.show-custom-query #custom-screen-query, +#another-field { display: block; opacity: 1; overflow: visible; diff --git a/interface.html b/interface.html index f8be5da..822247e 100644 --- a/interface.html +++ b/interface.html @@ -70,6 +70,14 @@ </label> </div> </div> + <div class="form-group" id="another-field"> + <div class="col-sm-4 control-label"> + <label for="another">Accordion title</label> + </div> + <div class="col-sm-8"> + <input type="text" class="form-control" name="another" id="another" /> + </div> + </div> <div class="form-group" id="custom-screen-query"> <div class="col-sm-4 control-label"> <label for="query">Custom query parameters</label> diff --git a/js/interface.js b/js/interface.js index f6e0853..d696bbf 100644 --- a/js/interface.js +++ b/js/interface.js @@ -62,7 +62,8 @@ var screenActions = [ actions: [ { value: 'accordionOpenTitle', - label: 'Open accordion (by title)' + label: 'Open accordion (by title)', + selected: true }, { value: 'accordionOpenIndex', @@ -449,7 +450,9 @@ Fliplet.Pages.get().then(function(pages) { screenActionOptions.push('<optgroup label="' + screenActionGroup.group + '">'); actions.forEach(function (action) { screenActionOptions.push([ - '<option value="' + action.value + '">', + '<option value="' + action.value + '"', + (action.selected ? ' selected' : ''), + '>', action.label, '</option>' ].join(''));