diff --git a/app/assets/javascripts/app/controllers/_ui_element/integer.coffee b/app/assets/javascripts/app/controllers/_ui_element/integer.coffee index 7587c4d28..a155c5512 100644 --- a/app/assets/javascripts/app/controllers/_ui_element/integer.coffee +++ b/app/assets/javascripts/app/controllers/_ui_element/integer.coffee @@ -4,5 +4,5 @@ class App.UiElement.integer attribute.type = 'number' attribute.step = '1' item = $( App.view('generic/input')(attribute: attribute) ) - item.find('select').data('field-type', 'integer') + item.data('field-type', 'integer') item \ No newline at end of file diff --git a/app/controllers/object_manager_attributes_controller.rb b/app/controllers/object_manager_attributes_controller.rb index 3a6aeecd6..a38fa5458 100644 --- a/app/controllers/object_manager_attributes_controller.rb +++ b/app/controllers/object_manager_attributes_controller.rb @@ -110,8 +110,22 @@ class ObjectManagerAttributesController < ApplicationController private def check_params + if params[:data_type] =~ /^(boolean)$/ + if params[:data_option][:options] + if params[:data_option][:options][:false] + params[:data_option][:options][false] = params[:data_option][:options][:false] + params[:data_option][:options].delete(:false) + end + if params[:data_option][:options][:true] + params[:data_option][:options][true] = params[:data_option][:options][:true] + params[:data_option][:options].delete(:true) + end + end + end if params[:data_option] && !params[:data_option].key?(:default) - params[:data_option][:default] = '' + params[:data_option][:default] = if params[:data_type] =~ /^(input|select)$/ + '' + end end return if !params[:data_option][:null].nil? params[:data_option][:null] = true diff --git a/app/models/object_manager/attribute.rb b/app/models/object_manager/attribute.rb index c94bc503f..f5b5014d2 100644 --- a/app/models/object_manager/attribute.rb +++ b/app/models/object_manager/attribute.rb @@ -23,7 +23,7 @@ list of all attributes =end def self.list_full - result = ObjectManager::Attribute.all + result = ObjectManager::Attribute.all.order('position ASC, name ASC') attributes = [] assets = {} result.each {|item| @@ -354,7 +354,7 @@ returns: active: true, to_create: false, to_delete: false, - ).order('position ASC') + ).order('position ASC, name ASC') attributes = [] result.each {|item| data = { @@ -534,7 +534,7 @@ to send no browser reload event, pass false attribute.name, data_type, default: attribute.data_option[:default], - null: false + null: true ) else raise "Unknown attribute.data_type '#{attribute.data_type}', can't update attribute" @@ -571,7 +571,7 @@ to send no browser reload event, pass false attribute.name, data_type, default: attribute.data_option[:default], - null: false + null: true ) elsif attribute.data_type =~ /^datetime|date$/ ActiveRecord::Migration.add_column( @@ -623,7 +623,7 @@ to send no browser reload event, pass false raise 'Only letters from a-z, numbers from 0-9, and _ are allowed' elsif name !~ /[a-z]/ raise 'At least one letters is needed' - elsif name =~ /^(destroy|true|false|integer|select|drop|create|alter|index|table)$/ + elsif name =~ /^(destroy|true|false|integer|select|drop|create|alter|index|table|varchar|blob|date|datetime|timestamp)$/ raise "#{name} is a reserved word, please choose a different one" end true @@ -665,7 +665,7 @@ to send no browser reload event, pass false end if data_type == 'select' || data_type == 'checkbox' - raise 'Need data_option[:default] param' if data_option[:default].nil? + raise 'Need data_option[:default] param' if !data_option.key?(:default) raise 'Invalid data_option[:options] or data_option[:relation] param' if data_option[:options].nil? && data_option[:relation].nil? if !data_option.key?(:nulloption) data_option[:nulloption] = true @@ -673,7 +673,7 @@ to send no browser reload event, pass false end if data_type == 'boolean' - raise 'Need data_option[:default] param true|false' if data_option[:default].nil? + raise 'Need data_option[:default] param true|false|undefined' if !data_option.key?(:default) raise 'Invalid data_option[:options] param' if data_option[:options].nil? end diff --git a/test/browser/admin_object_manager_test.rb b/test/browser/admin_object_manager_test.rb index d8347882e..99e21ef0c 100644 --- a/test/browser/admin_object_manager_test.rb +++ b/test/browser/admin_object_manager_test.rb @@ -176,15 +176,213 @@ class AdminObjectManagerTest < TestCase }, ) - sleep 10 - object_manager_attribute_discard_changes - #object_manager_attribute_delete( - # data: { - # name: 'browser_test2', - # }, - #) + sleep 4 + + object_manager_attribute_create( + data: { + name: 'browser_test2', + display: 'Browser Test 2', + data_type: 'Text', + #data_option: { + # default: 'xxx', + #}, + }, + ) + object_manager_attribute_create( + data: { + name: 'browser_test3', + display: 'Browser Test 3', + data_type: 'Select', + data_option: { + options: { + 'aa' => 'AA', + 'bb' => 'BB', + 'cc' => 'CC', + }, + }, + }, + ) + + object_manager_attribute_create( + data: { + name: 'browser_test4', + display: 'Browser Test 4', + data_type: 'Integer', + #data_option: { + # default: 'xxx', + # min: 15, + # max: 99, + #}, + }, + ) + + object_manager_attribute_create( + data: { + name: 'browser_test5', + display: 'Browser Test 5', + data_type: 'Datetime', + #data_option: { + # future: true, + # past: true, + # diff: 24 + #}, + }, + ) + + object_manager_attribute_create( + data: { + name: 'browser_test6', + display: 'Browser Test 6', + data_type: 'Date', + #data_option: { + # future: true, + # past: true, + # diff: 24 + #}, + }, + ) + + object_manager_attribute_create( + data: { + name: 'browser_test7', + display: 'Browser Test 7', + data_type: 'Boolean', + data_option: { + options: { + true: 'YES', + false: 'NO', + }, + # default: true, + }, + }, + ) + + watch_for( + css: '#content', + value: 'Database Update required', + ) + click(css: '#content .tab-pane.active div.js-execute') + watch_for( + css: '.modal', + value: 'restart', + ) + watch_for_disappear( + css: '.modal', + timeout: 120, + ) + sleep 5 + watch_for( + css: '#content', + ) + + # create new ticket + ticket = ticket_create( + data: { + customer: 'nico', + group: 'Users', + priority: '2 normal', + state: 'open', + title: 'ticket attribute test all #1', + body: 'ticket attribute test all #1', + }, + custom_data_select: { + browser_test3: 'CC', + browser_test7: 'NO', + }, + custom_data_input: { + browser_test2: 'some value öäüß', + browser_test4: '25', + }, + disable_group_check: true, + ) + + ticket_verify( + data: { + title: 'ticket attribute test all #1', + custom_data_select: { + browser_test3: 'CC', + browser_test7: 'NO', + }, + custom_data_input: { + browser_test2: 'some value öäüß', + browser_test4: '25', + }, + }, + ) + + object_manager_attribute_delete( + data: { + name: 'browser_test2', + }, + ) + object_manager_attribute_delete( + data: { + name: 'browser_test3', + }, + ) + object_manager_attribute_delete( + data: { + name: 'browser_test4', + }, + ) + object_manager_attribute_delete( + data: { + name: 'browser_test5', + }, + ) + object_manager_attribute_delete( + data: { + name: 'browser_test6', + }, + ) + object_manager_attribute_delete( + data: { + name: 'browser_test7', + }, + ) + click(css: '#content .tab-pane.active div.js-execute') + watch_for( + css: '.modal', + value: 'restart', + ) + watch_for_disappear( + css: '.modal', + timeout: 120, + ) + sleep 5 + watch_for( + css: '#content', + ) + match_not( + css: '#content', + value: 'Database Update required', + ) + match_not( + css: '#content table', + value: 'browser_test2', + ) + match_not( + css: '#content table', + value: 'browser_test3', + ) + match_not( + css: '#content table', + value: 'browser_test4', + ) + match_not( + css: '#content table', + value: 'browser_test5', + ) + match_not( + css: '#content table', + value: 'browser_test6', + ) + match_not( + css: '#content table', + value: 'browser_test7', + ) end end diff --git a/test/browser/setting_test.rb b/test/browser/setting_test.rb index 6338da35c..f30fa6f32 100644 --- a/test/browser/setting_test.rb +++ b/test/browser/setting_test.rb @@ -30,11 +30,11 @@ class SettingTest < TestCase # set yes select( - css: '#auth_facebook select[name="{boolean}auth_facebook"]', + css: '#auth_facebook select[name="auth_facebook"]', value: 'yes', ) match( - css: '#auth_facebook select[name="{boolean}auth_facebook"]', + css: '#auth_facebook select[name="auth_facebook"]', value: 'yes', ) click( css: '#auth_facebook button[type=submit]' ) @@ -44,17 +44,17 @@ class SettingTest < TestCase ) sleep 4 match( - css: '#auth_facebook select[name="{boolean}auth_facebook"]', + css: '#auth_facebook select[name="auth_facebook"]', value: 'yes', ) match_not( - css: '#auth_facebook select[name="{boolean}auth_facebook"]', + css: '#auth_facebook select[name="auth_facebook"]', value: 'no', ) # set no select( - css: '#auth_facebook select[name="{boolean}auth_facebook"]', + css: '#auth_facebook select[name="auth_facebook"]', value: 'no', ) click( css: '#auth_facebook button[type=submit]' ) @@ -64,11 +64,11 @@ class SettingTest < TestCase ) sleep 4 match( - css: '#auth_facebook select[name="{boolean}auth_facebook"]', + css: '#auth_facebook select[name="auth_facebook"]', value: 'no', ) match_not( - css: '#auth_facebook select[name="{boolean}auth_facebook"]', + css: '#auth_facebook select[name="auth_facebook"]', value: 'yes', ) diff --git a/test/browser_test_helper.rb b/test/browser_test_helper.rb index 09d8fca43..e642482a1 100644 --- a/test/browser_test_helper.rb +++ b/test/browser_test_helper.rb @@ -1779,7 +1779,7 @@ wait untill text in selector disabppears browser: instance, css: ".active .newTicket select[name=\"#{local_key}\"]", value: local_value, - mute_log: true, + #mute_log: true, ) } end @@ -1790,7 +1790,7 @@ wait untill text in selector disabppears css: ".active .newTicket input[name=\"#{local_key}\"]", value: local_value, clear: true, - mute_log: true, + #mute_log: true, ) } end @@ -2018,7 +2018,7 @@ wait untill text in selector disabppears browser: instance, css: ".active .sidebar select[name=\"#{local_key}\"]", value: local_value, - mute_log: true, + #mute_log: true, ) } end @@ -2029,7 +2029,7 @@ wait untill text in selector disabppears css: ".active .sidebar input[name=\"#{local_key}\"]", value: local_value, clear: true, - mute_log: true, + #mute_log: true, ) } end @@ -2095,6 +2095,12 @@ wait untill text in selector disabppears body: 'some body', ## group: 'some group', ## state: 'closed', + custom_data_select: { + key1: 'some value', + }, + custom_data_input: { + key1: 'some value', + }, }, ) @@ -2108,7 +2114,7 @@ wait untill text in selector disabppears data = params[:data] if data[:title] - title = instance.find_elements(css: '.content.active .ticketZoom-header .js-objectTitle')[0].text.strip + title = instance.find_elements(css: '.content.active .ticketZoom-header .js-objectTitle').first.text.strip if title =~ /#{data[:title]}/i assert(true, "matching '#{data[:title]}' in title '#{title}'") else @@ -2117,13 +2123,37 @@ wait untill text in selector disabppears end if data[:body] - body = instance.find_elements(css: '.content.active [data-name="body"]')[0].text.strip + body = instance.find_elements(css: '.content.active [data-name="body"]').first.text.strip if body =~ /#{data[:body]}/i assert(true, "matching '#{data[:body]}' in body '#{body}'") else raise "not matching '#{data[:body]}' in body '#{body}'" end end + + if params[:custom_data_select] + params[:custom_data_select].each {|local_key, local_value| + element = instance.find_elements(css: ".active .sidebar select[name=\"#{local_key}\"] option[selected]").first + value = element.text.strip + if value =~ /#{local_value}/i + assert(true, "matching '#{value}' in #{local_key} '#{local_value}'") + else + raise "not matching '#{value}' in #{local_key} '#{local_value}'" + end + } + end + if params[:custom_data_input] + params[:custom_data_input].each {|local_key, local_value| + element = instance.find_elements(css: ".active .sidebar input[name=\"#{local_key}\"]").first + value = element.text.strip + if value =~ /#{local_value}/i + assert(true, "matching '#{value}' in #{local_key} '#{local_value}'") + else + raise "not matching '#{value}' in #{local_key} '#{local_value}'" + end + } + end + true end @@ -2717,12 +2747,89 @@ wait untill text in selector disabppears data: { name: 'field_name' + random, display: 'Display Name of Field', - data_type: 'Text', # Text|Select|... + data_type: 'Select', data_option: { options: { 'aa' => 'AA', 'bb' => 'BB', }, + + default: 'abc', + }, + }, + error: 'already exists' + ) + + object_manager_attribute_create( + browser: browser2, + data: { + name: 'field_name' + random, + display: 'Display Name of Field', + data_type: 'Text', + data_option: { + default: 'abc', + }, + }, + error: 'already exists' + ) + + object_manager_attribute_create( + browser: browser2, + data: { + name: 'field_name' + random, + display: 'Display Name of Field', + data_type: 'Integer', + data_option: { + default: '15', + min: 1, + max: 999999, + }, + }, + error: 'already exists' + ) + + object_manager_attribute_create( + browser: browser2, + data: { + name: 'field_name' + random, + display: 'Display Name of Field', + data_type: 'Datetime', + data_option: { + future: true, + past: true, + diff: 24, + }, + }, + error: 'already exists' + ) + + object_manager_attribute_create( + browser: browser2, + data: { + name: 'field_name' + random, + display: 'Display Name of Field', + data_type: 'Date', + data_option: { + future: true, + past: true, + diff: 24, + }, + }, + error: 'already exists' + ) + + object_manager_attribute_create( + browser: browser2, + data: { + name: 'field_name' + random, + display: 'Display Name of Field', + data_type: 'Boolean', + data_option: { + options: { + true: 'YES', + false: 'NO', + } + default: undefined, }, }, error: 'already exists' @@ -2768,17 +2875,44 @@ wait untill text in selector disabppears ) if data[:data_option] if data[:data_option][:options] - data[:data_option][:options].each {|key, value| - element = instance.find_elements(css: '.modal .js-Table .js-key').last + if data[:data_type] == 'Boolean' + element = instance.find_elements(css: '.modal .js-valueTrue').first element.clear - element.send_keys(key) - element = instance.find_elements(css: '.modal .js-Table .js-value').last + element.send_keys(data[:data_option][:options][:true]) + element = instance.find_elements(css: '.modal .js-valueFalse').first element.clear - element.send_keys(value) - element = instance.find_elements(css: '.modal .js-Table .js-add')[0] - element.click - } + element.send_keys(data[:data_option][:options][:false]) + else + data[:data_option][:options].each {|key, value| + element = instance.find_elements(css: '.modal .js-Table .js-key').last + element.clear + element.send_keys(key) + element = instance.find_elements(css: '.modal .js-Table .js-value').last + element.clear + element.send_keys(value) + element = instance.find_elements(css: '.modal .js-Table .js-add')[0] + element.click + } + end end + + [:default, :min, :max, :diff].each {|key| + next if !data[:data_option].key?(key) + element = instance.find_elements(css: ".modal [name=\"data_option::#{key}\"]").first + element.clear + element.send_keys(data[:data_option][key]) + } + + [:future, :past].each {|key| + next if !data[:data_option].key?(key) + select( + browser: instance, + css: ".modal select[name=\"data_option::#{key}\"]", + value: data[:data_option][key], + mute_log: true, + ) + } + end instance.find_elements(css: '.modal button.js-submit')[0].click if params[:error] @@ -2824,6 +2958,9 @@ wait untill text in selector disabppears switch_window_focus(params) log('object_manager_attribute_delete', params) + instance = params[:browser] || @browser + data = params[:data] + click( browser: instance, css: 'a[href="#manage"]',