Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve the ODK sync to make it customizable so that other ODK, with different structured, can be easily mapped to DengueChat DB structure #984

Merged
merged 18 commits into from
Apr 20, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file.
81 changes: 81 additions & 0 deletions app/controllers/dashboard/settings_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# -*- encoding : utf-8 -*-

class Dashboard::SettingsController < Dashboard::BaseController
after_action :verify_authorized, except: [:create, :organizations_select, :users_select]
#----------------------------------------------------------------------------
# GET /dashboard/settings

def index
authorize :dashboard, :index?
@city = current_user.city
end

def create
if params[:organizations_select].blank?
redirect_to dashboard_settings_path, :flash => { :alert => I18n.t("views.dashboard.failed_create_flash") } and return
end

if !params[:dataVisits].blank?
@parameters = Parameter.where(:organization_id => params[:organizations_select], :key => 'organization.data.visits.url')
if @parameters.blank?
dataVisits = Parameter.new(:organization_id => params[:organizations_select], :key => 'organization.data.visits.url' , :value => params[:dataVisits])
dataVisits.save
else
@parameters.first.update_column(:value, params[:dataVisits])
end
end

if !params[:dataLocations].blank?
@parameters = Parameter.where(:organization_id => params[:organizations_select], :key => 'organization.data.locations.url')
if @parameters.blank?
dataVisits = Parameter.new(:organization_id => params[:organizations_select], :key => 'organization.data.locations.url' , :value => params[:dataLocations])
dataVisits.save
else
@parameters.first.update_column(:value, params[:dataLocations])
end
end

if !params[:datainspections].blank?
@parameters = Parameter.where(:organization_id => params[:organizations_select], :key => 'organization.data.inspections.url')
if @parameters.blank?
dataVisits = Parameter.new(:organization_id => params[:organizations_select], :key => 'organization.data.inspections.url' , :value => params[:datainspections])
dataVisits.save
else
@parameters.first.update_column(:value, params[:datainspections])
end
end

if !params[:volunteers].blank?
@parameters = Parameter.where(:organization_id => params[:organizations_select], :key => 'organization.sync.default-user')
@user_params = User.find_by_id(params[:volunteers])
if @parameters.blank?
dataVisits = Parameter.new(:organization_id => params[:organizations_select], :key => 'organization.sync.default-user' , :value => @user_params.username)
dataVisits.save
else
@parameters.first.update_column(:value, @user_params.username)
end
end
redirect_to dashboard_settings_path, :flash => { :notice => I18n.t("views.dashboard.success_create_flash") } and return

end

def value_exist(parameter,value)
if parameter.key == value
return true
end
return false
end

def organizations_select
@select = Parameter.where(:organization_id => params[:id])
render json: @select.to_json, status:200
end

def users_select
@select = User.select("id", "first_name", "last_name", "name").where(:username => params[:username])
render json: @select.to_json, status:200
end

end
#----------------------------------------------------------------------------

129 changes: 129 additions & 0 deletions app/views/dashboard/settings/index.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
<div class="container" id="assignments-page">
<% if flash[:notice] %>
<div class="alert alert-success alert-dismissable">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<%= flash[:notice] %>
</div>
<% end %>
<% if flash[:alert] %>
<div class="alert alert-danger alert-dismissable">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<%= flash[:alert] %>
</div>
<% end %>
<div class="panel panel-default">
<div class="panel-body">
<div class="col-md-12">
<%=form_tag create_dashboard_settings_url, method: :post, style: "padding: 2rem" do %>
<h2 style="padding-top: 2rem; padding-bottom: 2rem">Seleccione una organización</h2>
<div id= "organization-select" class="form-group">
<%=select_tag "organizations_select", options_for_select(Organization.order("name ASC").all.map { |n| [n.name, n.id] }), :prompt => I18n.t("activerecord.models.organization.name"), :class => "form-control", :required => true%>
</div>
<h2 style="padding-top: 2rem; padding-bottom: 2rem">Agregue las URLs de Google Sheet</h2>

<div class="form-group">
<label>data.visits.url:</label>
<input type="text" class="form-control" ng-model='settings.visits' id="dataVisits" name="dataVisits" value="">
<label>data.locations.url:</label>
<input type="text" class="form-control" ng-model='settings.locations' id="dataLocations" name="dataLocations">
<label>data.inspections.url:</label>
<input type="text" class="form-control" ng-model='settings.inspections' id="datainspections" name="datainspections">
<label>Usuario Admin</label>
<input type="text" class="form-control" ng-model='settings.volunteers' id="volunteers" name="volunteers" data-role="tagsinput">
</div>
<div style="text-align: right">
<%= button_tag :type => "submit", :class => "btn btn-success submit-button" do %>
<i class="fa fa-refresh fa-spin" style="display:none;"></i>
<%= I18n.t("views.buttons.save") %>
<% end %>
</div>
<% end %>
<!--<hr style="border-color:#ff6600;border-bottom:none;">
<h2 style="padding-top: 2rem; padding-bottom: 2rem">¿Desea agregar nueva columna de datos?</h2>
<div class="form-group">
<label>Nombre de la columna:</label>
<input type="text" class="form-control" id="nameColumn" name="dataVisits">
</div>
<div class="form-group">
<label>Tipo:</label>
<select name="typeData" id="typeData" class="form-control">
<option value="volvo">Numérico</option>
<option value="saab">Boolean</option>
<option value="mercedes">Texto</option>
</select>
</div>
<div style="text-align: right">
<%#= button_tag :type => "submit", :class => "btn btn-success submit-button" do %>
<i class="fa fa-refresh fa-spin" style="display:none;"></i>
<%#= I18n.t("views.buttons.add_column") %>
<%# end %>
</div>-->
</div>
</div>
</div>
</div>

<script>
$(document).ready(function() {
var volunteers = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
prefetch: '<%= volunteers_json_organizations_url(city_id: @city.id, format: :json) %>'
});
volunteers.initialize();
var elt = $('#volunteers');
elt.tagsinput({
itemValue: 'id',
itemText: 'name',
typeaheadjs: {
name: 'volunteers',
displayKey: 'name',
minLength : 1,
source: volunteers.ttAdapter()
}
});
})
</script>
<script>
$(document).ready(function(){
$('#organizations_select').change(function() {
var obtener_valor = $(this).val();
document.getElementById("dataVisits").value = "";
document.getElementById("dataLocations").value = "";
document.getElementById("datainspections").value = "";
document.getElementById("volunteers").value = "";
$("#volunteers").tagsinput('removeAll')

$.get("/dashboard/settings/organizationsselect/"+obtener_valor, function(data) {
if(data != null){
var dataVisits = document.getElementById("dataVisits");
var dataLocations = document.getElementById("dataLocations");
var datainspections = document.getElementById("datainspections");
for (var item of data) {
console.log(item)
if(item.key == "organization.data.visits.url") {
dataVisits.value =item.value
}else if(item.key == "organization.data.locations.url") {
dataLocations.value = item.value
}else if(item.key == "organization.data.inspections.url") {
datainspections.value = item.value
}else if(item.key == "organization.sync.default-user") {
$.get("/dashboard/settings/usersselect/"+item.value, function(data) {

if(data[0].first_name != null && data[0].last_name){
$("#volunteers").tagsinput("add", {id:data[0].id, name:data[0].first_name + " "+data[0].last_name});
}else{
$("#volunteers").tagsinput("add", {id:data[0].id, name:data[0].name});
}
})

}

}
}
})

});
});
</script>

4 changes: 4 additions & 0 deletions app/views/layouts/_dashboard.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,10 @@
= link_to dashboard_locations_path do
%i.fa.fa-globe
= I18n.t("views.dashboard.navigation.locations")
%li.user-navigation{:class => "#{dashboard_settings_path == request.path ? 'active' : ''}"}
= link_to dashboard_settings_path do
%i.fa.fa-cog
= I18n.t("views.dashboard.navigation.settings")
-# %li.user-navigation{:class => "#{heatmap_dashboard_graphs_path == request.path ? 'active' : ''}"}
-# = link_to heatmap_dashboard_graphs_path do
-# %i.fa.fa-map-marker
Expand Down
4 changes: 4 additions & 0 deletions config/locales/es.yml
Original file line number Diff line number Diff line change
Expand Up @@ -423,6 +423,7 @@ es:
upload_csv: Cargue un nuevo CSV
odk_sync: Errores de sincronización ODK
confirm: Confirmar
add_column: Agregar nueva columna
coordinator:
home: Coordinador
register_user: Registrar nuevo usuario
Expand All @@ -441,9 +442,12 @@ es:
navigation:
visits: Visitas
locations: Casas
settings: Configuración
heatmap: Mapa de actividad
graphs: Gráficos
sync: Sincronizar
success_create_flash: "Se guardo exitosamente la configuración"
failed_create_flash: "No se guardo la configuración"
badges:
eye_of_the_mosquito: "Vigilante de mosquitos"
exterminator: "Exterminador de mosquitos"
Expand Down
8 changes: 8 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,14 @@
resources :reports, :only => [:index]
resources :visits, :only => [:index]
resources :sync, :only => [:index]
resources :settings, :only => [:index] do
collection do
post "create", as: :create
end
get "organizationsselect/:id", to: "settings#organizations_select", on: :collection
get "usersselect/:username", to: "settings#users_select", on: :collection
end

resources :graphs, :only => [:index] do
collection do
get "heatmap"
Expand Down