Просмотр исходного кода

Improved external user auth config. Fixed browser tests.

Martin Edenhofer 8 лет назад
Родитель
Сommit
19802f88a2

+ 1 - 1
app/assets/javascripts/app/controllers/_dashboard/first_steps.coffee

@@ -72,7 +72,7 @@ class App.DashboardFirstSteps extends App.Controller
           )
           $('.modal .modal-body').html(finish)
       )
-    @delay(create, 1800)
+    @delay(create, 2800)
     template
 
   testTicketFinish: (data) ->

+ 2 - 2
app/assets/javascripts/app/controllers/_manage/security.coffee

@@ -8,8 +8,8 @@ class Security extends App.ControllerTabs
     @tabs = [
       { name: 'Base',                     'target': 'base',             controller: App.SettingsArea, params: { area: 'Security::Base' } }
       { name: 'Password',                 'target': 'password',         controller: App.SettingsArea, params: { area: 'Security::Password' } }
-      #{ name: 'Authentication',           'target': 'auth',             controller: App.SettingsArea, params: { area: 'Security::Authentication' } }
-      { name: 'Third-Party Applications', 'target': 'third_party_auth', controller: App.SettingsThirdPartyAuthentication, params: { area: 'Security::ThirdPartyAuthentication' } }
+      #{ name: 'Authentication',           'target': 'auth',            controller: App.SettingsArea, params: { area: 'Security::Authentication' } }
+      { name: 'Third-Party Applications', 'target': 'third_party_auth', controller: App.SettingsArea, params: { area: 'Security::ThirdPartyAuthentication' } }
     ]
     @render()
 

+ 7 - 172
app/assets/javascripts/app/controllers/_settings/area.coffee

@@ -4,7 +4,11 @@ class App.SettingsArea extends App.Controller
 
     # check authentication
     @authenticateCheckRedirect()
-    @subscribeId = App.Setting.subscribe(@render, initFetch: true, clear: false)
+    if App.Setting.count() is 0
+      App.Setting.fetchFull(@render)
+      return
+    @render()
+    #@subscribeId = App.Setting.subscribe(@render, initFetch: true, clear: false)
 
   render: =>
 
@@ -31,179 +35,10 @@ class App.SettingsArea extends App.Controller
 
     elements = []
     for setting in settings
-      if setting.name is 'product_logo'
-        item = new App.SettingsAreaLogo(setting: setting)
+      if setting.preferences.controller && App[setting.preferences.controller]
+        item = new App[setting.preferences.controller](setting: setting)
       else
         item = new App.SettingsAreaItem(setting: setting)
       elements.push item.el
 
     @html elements
-
-class App.SettingsAreaItem extends App.Controller
-  events:
-    'submit form': 'update'
-
-  constructor: ->
-    super
-    @render()
-
-  render: =>
-
-    # defaults
-    directValue = 0
-    for item in @setting.options['form']
-      directValue += 1
-    if directValue > 1
-      for item in @setting.options['form']
-        item['default'] = @setting.state_current.value[item.name]
-    else
-      item['default'] = @setting.state_current.value
-
-    # form
-    @configure_attributes = @setting.options['form']
-
-    # item
-    @html App.view('settings/item')(
-      setting: @setting
-    )
-
-    new App.ControllerForm(
-      el: @el.find('.form-item'),
-      model: { configure_attributes: @configure_attributes, className: '' }
-      autofocus: false
-    )
-
-  update: (e) =>
-    e.preventDefault()
-    @formDisable(e)
-    params = @formParam(e.target)
-
-    directValue = 0
-    directData  = undefined
-    for item in @setting.options['form']
-      directValue += 1
-      directData  = params[item.name]
-
-    if directValue > 1
-      state_current = {
-        value: params
-      }
-      #App.Config.set((@setting.name, params)
-    else
-      state_current = {
-        value: directData
-      }
-      #App.Config.set(@setting.name, directData)
-
-    @setting['state_current'] = state_current
-    ui = @
-    @setting.save(
-      done: =>
-        ui.formEnable(e)
-        App.Event.trigger 'notify', {
-          type:    'success'
-          msg:     App.i18n.translateContent('Update successful!')
-          timeout: 2000
-        }
-
-        # rerender ui || get new collections and session data
-        App.Setting.preferencesPost(@setting)
-
-      fail: (settings, details) ->
-        ui.formEnable(e)
-        App.Event.trigger 'notify', {
-          type:    'error'
-          msg:     App.i18n.translateContent(details.error_human || details.error || 'Unable to update object!')
-          timeout: 2000
-        }
-    )
-
-class App.SettingsAreaLogo extends App.Controller
-  elements:
-    '.logo-preview': 'logoPreview'
-
-  events:
-    'submit form':       'submit'
-    'change .js-upload': 'onLogoPick'
-
-  constructor: ->
-    super
-    @render()
-
-  render: ->
-    localElement = $(App.view('settings/logo')(
-      setting: @setting
-    ))
-    localElement.find('.js-loginPreview').html( App.view('generic/login_preview')(
-      logoUrl: @logoUrl()
-      logoChange: true
-    ))
-    @html localElement
-
-  onLogoPick: (event) =>
-    reader = new FileReader()
-
-    reader.onload = (e) =>
-      @logoPreview.attr('src', e.target.result)
-
-    file = event.target.files[0]
-
-    # if no file is given, about in file upload was used
-    return if !file
-
-    maxSiteInMb = 8
-    if file.size && file.size > 1024 * 1024 * maxSiteInMb
-      App.Event.trigger 'notify', {
-        type:    'error'
-        msg:     App.i18n.translateContent('File too big, max. %s MB allowed.', maxSiteInMb)
-        timeout: 2000
-      }
-      @logoPreview.attr('src', '')
-      return
-
-    reader.readAsDataURL(file)
-
-  submit: (e) =>
-    e.preventDefault()
-    @formDisable(e)
-
-    # get params
-    @params = @formParam(e.target)
-
-    # add logo
-    @params.logo = @logoPreview.attr('src')
-
-    store = (logoResizeDataUrl) =>
-
-      # store image
-      @params.logo_resize = logoResizeDataUrl
-      @ajax(
-        id:          "setting_image_#{@setting.id}"
-        type:        'PUT'
-        url:         "#{@apiPath}/settings/image/#{@setting.id}"
-        data:        JSON.stringify(@params)
-        processData: true
-        success:     (data, status, xhr) =>
-          @formEnable(e)
-          if data.result is 'ok'
-            App.Event.trigger 'notify', {
-              type:    'success'
-              msg:     App.i18n.translateContent('Update successful!')
-              timeout: 2000
-            }
-            for setting in data.settings
-              value = App.Setting.get(setting.name)
-              App.Config.set(name, value)
-          else
-            App.Event.trigger 'notify', {
-              type:    'error'
-              msg:     App.i18n.translateContent(data.message)
-              timeout: 2000
-            }
-
-        fail: =>
-          @formEnable(e)
-      )
-
-    # add resized image
-    App.ImageService.resizeForApp(@params.logo, @logoPreview.width(), @logoPreview.height(), store)

+ 78 - 0
app/assets/javascripts/app/controllers/_settings/area_item.coffee

@@ -0,0 +1,78 @@
+class App.SettingsAreaItem extends App.Controller
+  events:
+    'submit form': 'update'
+
+  constructor: ->
+    super
+    @render()
+
+  render: =>
+
+    # defaults
+    directValue = 0
+    for item in @setting.options['form']
+      directValue += 1
+    if directValue > 1
+      for item in @setting.options['form']
+        item['default'] = @setting.state_current.value[item.name]
+    else
+      item['default'] = @setting.state_current.value
+
+    # form
+    @configure_attributes = @setting.options['form']
+
+    # item
+    @html App.view('settings/item')(
+      setting: @setting
+    )
+
+    new App.ControllerForm(
+      el: @el.find('.form-item'),
+      model: { configure_attributes: @configure_attributes, className: '' }
+      autofocus: false
+    )
+
+  update: (e) =>
+    e.preventDefault()
+    @formDisable(e)
+    params = @formParam(e.target)
+
+    directValue = 0
+    directData  = undefined
+    for item in @setting.options['form']
+      directValue += 1
+      directData  = params[item.name]
+
+    if directValue > 1
+      state_current = {
+        value: params
+      }
+      #App.Config.set((@setting.name, params)
+    else
+      state_current = {
+        value: directData
+      }
+      #App.Config.set(@setting.name, directData)
+
+    @setting['state_current'] = state_current
+    ui = @
+    @setting.save(
+      done: =>
+        ui.formEnable(e)
+        App.Event.trigger 'notify', {
+          type:    'success'
+          msg:     App.i18n.translateContent('Update successful!')
+          timeout: 2000
+        }
+
+        # rerender ui || get new collections and session data
+        App.Setting.preferencesPost(@setting)
+
+      fail: (settings, details) ->
+        ui.formEnable(e)
+        App.Event.trigger 'notify', {
+          type:    'error'
+          msg:     App.i18n.translateContent(details.error_human || details.error || 'Unable to update object!')
+          timeout: 2000
+        }
+    )

+ 89 - 0
app/assets/javascripts/app/controllers/_settings/area_logo.coffee

@@ -0,0 +1,89 @@
+class App.SettingsAreaLogo extends App.Controller
+  elements:
+    '.logo-preview': 'logoPreview'
+
+  events:
+    'submit form':       'submit'
+    'change .js-upload': 'onLogoPick'
+
+  constructor: ->
+    super
+    @render()
+
+  render: ->
+    localElement = $(App.view('settings/logo')(
+      setting: @setting
+    ))
+    localElement.find('.js-loginPreview').html( App.view('generic/login_preview')(
+      logoUrl: @logoUrl()
+      logoChange: true
+    ))
+    @html localElement
+
+  onLogoPick: (event) =>
+    reader = new FileReader()
+
+    reader.onload = (e) =>
+      @logoPreview.attr('src', e.target.result)
+
+    file = event.target.files[0]
+
+    # if no file is given, about in file upload was used
+    return if !file
+
+    maxSiteInMb = 8
+    if file.size && file.size > 1024 * 1024 * maxSiteInMb
+      App.Event.trigger 'notify', {
+        type:    'error'
+        msg:     App.i18n.translateContent('File too big, max. %s MB allowed.', maxSiteInMb)
+        timeout: 2000
+      }
+      @logoPreview.attr('src', '')
+      return
+
+    reader.readAsDataURL(file)
+
+  submit: (e) =>
+    e.preventDefault()
+    @formDisable(e)
+
+    # get params
+    @params = @formParam(e.target)
+
+    # add logo
+    @params.logo = @logoPreview.attr('src')
+
+    store = (logoResizeDataUrl) =>
+
+      # store image
+      @params.logo_resize = logoResizeDataUrl
+      @ajax(
+        id:          "setting_image_#{@setting.id}"
+        type:        'PUT'
+        url:         "#{@apiPath}/settings/image/#{@setting.id}"
+        data:        JSON.stringify(@params)
+        processData: true
+        success:     (data, status, xhr) =>
+          @formEnable(e)
+          if data.result is 'ok'
+            App.Event.trigger 'notify', {
+              type:    'success'
+              msg:     App.i18n.translateContent('Update successful!')
+              timeout: 2000
+            }
+            for setting in data.settings
+              value = App.Setting.get(setting.name)
+              App.Config.set(name, value)
+          else
+            App.Event.trigger 'notify', {
+              type:    'error'
+              msg:     App.i18n.translateContent(data.message)
+              timeout: 2000
+            }
+
+        fail: =>
+          @formEnable(e)
+      )
+
+    # add resized image
+    App.ImageService.resizeForApp(@params.logo, @logoPreview.width(), @logoPreview.height(), store)

+ 97 - 0
app/assets/javascripts/app/controllers/_settings/area_switch.coffee

@@ -0,0 +1,97 @@
+class App.SettingsAreaSwitch extends App.Controller
+  events:
+    'change .js-setting input': 'toggleSetting'
+    'submit form': 'update'
+
+  elements:
+    '.js-setting input': 'uiSetting'
+
+  constructor: ->
+    super
+    @render()
+
+  render: =>
+
+    # defaults
+    directValue = 0
+    for item in @setting.options['form']
+      directValue += 1
+    if directValue > 1
+      for item in @setting.options['form']
+        item['default'] = @setting.state_current.value[item.name]
+    else
+      item['default'] = @setting.state_current.value
+
+    # form
+    @configure_attributes = @setting.options['form']
+
+    @subSetting = []
+    for localSetting in @setting.preferences.sub
+      @subSetting.push App.Setting.findByAttribute('name', localSetting)
+
+    # item
+    @html App.view('settings/switch')(
+      checked: App.Setting.get(@setting.name)
+      setting: @setting
+      subSetting: @subSetting
+    )
+    for localSetting in @subSetting
+      console.log('localSetting', localSetting.state_current)
+      new App.ControllerForm(
+        el: @$('.form-item')
+        params: localSetting.state_current.value
+        model: { configure_attributes: localSetting.options['form'], className: '' }
+        autofocus: false
+      )
+
+  toggleSetting: =>
+    value = @uiSetting.prop('checked')
+    App.Setting.set(@setting.name, value)
+
+  update: (e) =>
+    e.preventDefault()
+    @formDisable(e)
+    params = @formParam(e.target)
+
+    localSetting = $(e.currentTarget).data('name')
+    setting = App.Setting.findByAttribute('name', localSetting)
+
+    directValue = 0
+    directData  = undefined
+    for item in setting.options['form']
+      directValue += 1
+      directData  = params[item.name]
+
+    if directValue > 1
+      state_current = {
+        value: params
+      }
+      #App.Config.set((setting.name, params)
+    else
+      state_current = {
+        value: directData
+      }
+      #App.Config.set(setting.name, directData)
+
+    setting['state_current'] = state_current
+    ui = @
+    setting.save(
+      done: ->
+        ui.formEnable(e)
+        App.Event.trigger 'notify', {
+          type:    'success'
+          msg:     App.i18n.translateContent('Update successful!')
+          timeout: 2000
+        }
+
+        # rerender ui || get new collections and session data
+        App.Setting.preferencesPost(setting)
+
+      fail: (settings, details) ->
+        ui.formEnable(e)
+        App.Event.trigger 'notify', {
+          type:    'error'
+          msg:     App.i18n.translateContent(details.error_human || details.error || 'Unable to update object!')
+          timeout: 2000
+        }
+    )

+ 31 - 20
app/assets/javascripts/app/controllers/login.coffee

@@ -23,9 +23,8 @@ class Index extends App.ControllerContent
 
     # observe config changes related to login page
     @bind('config_update_local', (data) =>
-      return if data.name != 'maintenance_mode' &&
-        data.name != 'maintenance_login' &&
-        data.name != 'maintenance_login_message' &&
+      return if !data.name.match(/^maintenance/) &&
+        !data.name.match(/^auth/) &&
         data.name != 'user_lost_password' &&
         data.name != 'user_create_account' &&
         data.name != 'product_name' &&
@@ -38,33 +37,45 @@ class Index extends App.ControllerContent
   render: (data = {}) ->
     auth_provider_all = {
       facebook: {
-        url:    '/auth/facebook',
-        name:   'Facebook',
-        config: 'auth_facebook',
-        class:  'facebook',
+        url:    '/auth/facebook'
+        name:   'Facebook'
+        config: 'auth_facebook'
+        class:  'facebook'
       },
       twitter: {
-        url:    '/auth/twitter',
-        name:   'Twitter',
-        config: 'auth_twitter',
-        class:  'twitter',
+        url:    '/auth/twitter'
+        name:   'Twitter'
+        config: 'auth_twitter'
+        class:  'twitter'
       },
       linkedin: {
-        url:    '/auth/linkedin',
-        name:   'LinkedIn',
-        config: 'auth_linkedin',
-        class:  'linkedin',
+        url:    '/auth/linkedin'
+        name:   'LinkedIn'
+        config: 'auth_linkedin'
+        class:  'linkedin'
+      },
+      github: {
+        url:    '/auth/github'
+        name:   'Github'
+        config: 'auth_github'
+        class:  'github'
+      },
+      gitlab: {
+        url:    '/auth/gitlab'
+        name:   'Gitlab'
+        config: 'auth_gitlab'
+        class:  'gitlab'
       },
       google_oauth2: {
-        url:    '/auth/google_oauth2',
-        name:   'Google',
-        config: 'auth_google_oauth2',
-        class:  'google',
+        url:    '/auth/google_oauth2'
+        name:   'Google'
+        config: 'auth_google_oauth2'
+        class:  'google'
       },
     }
     auth_providers = []
     for key, provider of auth_provider_all
-      if @Config.get( provider.config ) is true || @Config.get( provider.config ) is 'true'
+      if @Config.get(provider.config) is true || @Config.get(provider.config) is 'true'
         auth_providers.push provider
 
     @html App.view('login')(

+ 6 - 1
app/assets/javascripts/app/lib/app_post/i18n.coffee

@@ -218,7 +218,7 @@ class _i18nSingleton extends Spine.Module
     if quote
       translated = App.Utils.htmlEscape(translated)
 
-    # apply inline markup
+    # apply inline markup pre
     if markup
       translated = translated
         .replace(/\|\|(.+?)\|\|/gm, '<i>$1</i>')
@@ -241,6 +241,11 @@ class _i18nSingleton extends Spine.Module
             "<a href=\"#{arg}\">🔗</a>"
         )
 
+    # apply inline markup post
+    if markup
+      translated = translated
+        .replace(/\[(.+?)\]\((.+?)\)/gm, '<a href="$2" target="_blank">$1</a>')
+
     @log 'debug', 'translate', string, args, translated
 
     # return translated string

+ 4 - 2
app/assets/javascripts/app/views/dashboard/first_steps_test_ticket_finish.jst.eco

@@ -1,2 +1,4 @@
-<p><%- @T('A Test Ticket has been created, you can find it in your overview |"%s"|', @overviewName) %></p>
-<p><%- @T('To open and work on it, click on the Ticket |#%s| directly %l or in the overview |"%s"| %l and click on the Ticket.', @ticketNumber, @ticketUrl, @overviewName, @overviewUrl) %></p>
+<p><%- @T('A Test Ticket has been created, you can find it in your overview "%s" %l.', @overviewName, @overviewUrl) %></p>
+<div class="centered">
+  <a class="btn btn--success flex" href="<%- @ticketUrl %>"><%- @T('Open Ticket# %s', @ticketNumber) %></a>
+</div>

+ 19 - 0
app/assets/javascripts/app/views/settings/switch.jst.eco

@@ -0,0 +1,19 @@
+<div class="page-header">
+  <div class="page-header-title">
+    <div class="zammad-switch zammad-switch--small js-setting" data-name="<%= @setting.name %>">
+       <input name="<%= @setting.name %>" type="checkbox" id="setting-<%= @setting.name %>" <% if @checked: %>checked<% end %>>
+       <label for="setting-<%= @setting.name %>"></label>
+    </div>
+    <h1><%- @T.apply(@, [@setting.title].concat(@setting.preferences.title_i18n)) %></h1>
+  </div>
+</div>
+<div class="page-content">
+  <p class="help-text"><%- @T.apply(@, [@setting.description].concat(@setting.preferences.description_i18n)) %></p>
+  <% for localSetting in @subSetting: %>
+  <form class="settings-entry" data-name="<%= localSetting.name %>">
+    <div class="horizontal end">
+      <div class="form-item flex"></div>
+      <button type="submit" class="btn btn--primary"><%- @T('Submit') %></button>
+    </div>
+  </form>
+</div>

Некоторые файлы не были показаны из-за большого количества измененных файлов