From ed22a4d3032f9995fc67baa458dd2ef04b084556 Mon Sep 17 00:00:00 2001 From: Harry Bomrah Date: Tue, 14 May 2013 17:18:05 +0800 Subject: [PATCH] apps update -- app upload and activation --- .../Archive/javascripts/orbitdesktop.js | 254 +++++------------- app/controllers/desktop_apps_controller.rb | 49 ++++ app/controllers/desktop_controller.rb | 71 +++-- app/models/desktop/desktop_app.rb | 20 ++ app/models/desktop/desktop_widget.rb | 2 +- app/models/desktop/group.rb | 8 +- app/models/desktop/tile.rb | 1 + app/views/desktop_apps/index.html.erb | 10 + app/views/desktop_apps/upload.html.erb | 12 + app/views/desktop_widgets/index.html.erb | 2 +- config/routes.rb | 8 + 11 files changed, 230 insertions(+), 207 deletions(-) create mode 100644 app/controllers/desktop_apps_controller.rb create mode 100644 app/models/desktop/desktop_app.rb create mode 100644 app/views/desktop_apps/index.html.erb create mode 100644 app/views/desktop_apps/upload.html.erb diff --git a/app/assets/Archive/javascripts/orbitdesktop.js b/app/assets/Archive/javascripts/orbitdesktop.js index 50f77661..6897144d 100755 --- a/app/assets/Archive/javascripts/orbitdesktop.js +++ b/app/assets/Archive/javascripts/orbitdesktop.js @@ -38,6 +38,15 @@ var sortAscending = function(a, b) { var sortDescending = function(a, b) { return $(a).find("h1").text() < $(b).find("h1").text() ? 1 : -1; }; + +Array.prototype.indexOfObject = function(object){ + for(i = 0;i < this.length; i++){ + if(this[i] === object) + break; + } + return i; +} + jQuery.ajax = (function(_ajax){ var protocol = location.protocol, @@ -315,9 +324,7 @@ var orbitDesktop = function(dom){ $(window).resize(function(){ // var ww = $(window).width(); // $("img#thmbackground").attr({"width":ww}); - // if( $('.tinycanvas').length > 0 ){ - $('.tinycanvas').tinyscrollbar_update('relative'); - // } + if( $('.tinycanvas').length > 0 ){ $('.tinycanvas').tinyscrollbar_update('relative'); } if($(o.contentHolder).find("div.app_frame").length > 0){ $(o.contentHolder).find("div.app_frame").each(function(){ var app_holder_height = $(this).height() - 72; @@ -371,7 +378,7 @@ var orbitDesktop = function(dom){ var temp_div = $("
"); var entries = []; switch (layout){ - case "simple": + case "simple": total_columns++; temp_div.append(column_container.html()); total_width = "auto"; @@ -464,7 +471,6 @@ var orbitDesktop = function(dom){ o.simple_drop_down(); o.autocomplete(); o.use_select2(); - o.check_simple_layout(); } this.paging = true; this.pagination = function(link,variable,page_no){ @@ -759,7 +765,7 @@ var orbitDesktop = function(dom){ var f = (tile.fullsize?"fullsize":null); if(tile.data_category == "app"){ - $li = $('
  • '+tile.title+'

  • '); + $li = $('
  • '+tile.title+'

  • '); } else { $li = $('
  • '+tile.title+'

  • '); } @@ -835,37 +841,26 @@ var orbitDesktop = function(dom){ var $elements = $("#app_manager .element"), $result = $("#app_manager .search_result"), $appinfo = $("#app_info"), - $applist = $("#app_list"), - $apptitle = $appinfo.find(".app_info_name"), - $appicon = $appinfo.find(".app_info_icon"), - $appinfolist = $appinfo.find(".app_info_list"), - $canvas = $result.parents('.overview'), - current_width = $canvas.css('width'); + $apptitle = $("#app_info .app_info_name"), + $appicon = $("#app_info .app_info_icon") + $appinfolist = $("#app_info .app_info_list"); $("#app_manager #searchbox") .focus(function(){ $(this).val(""); }) .keyup(function(e){ - var query = $(this).val(); - if(query){ - $appinfo.hide().attr('style',''); - $result.empty().show(); - $applist.hide(); + if($(this).val()){ + $result.empty(); + $elements.hide(); - // searchArray = $elements.filter(":containsi("+$(this).val()+")").clone(1,1); - // searchArray = $('#app_list').find('[data-title*="'+query+'"]').clone(1,1); - searchArray = $elements.filter(function(){ - var matcher = new RegExp(query, "i"); - return matcher.test( $(this).attr('data-title') ); - }).clone(1,1); - + searchArray = $elements.filter(":containsi("+$(this).val()+")"); if(searchArray.length > 0){ // searchArray.each(function(){ // $(this).hide("fold","fast"); // }) // $("#app_manager #seperator").show(); - var i = 0, c = 1; // c for numbers of columns + var i = 0; var $column; searchArray.each(function(){ i++; @@ -877,50 +872,23 @@ var orbitDesktop = function(dom){ if(i == 4){ $result.append($column); i = 0; - c++; } - }); + }) if(i != 0){ $result.append($column); - c*=132; - searchArray - .eq(0) - .parents('.overview') - .animate({ - 'width': c - },0, function(){ - $(this) - .parents('.tinycanvas') - .tinyscrollbar_update(); - }); } + elementSetting(); } else { - var $no_result = $('
    No result for
    '); - $no_result - .find('b') - .text('"'+$(this).val()+'"') - .end() - .show() - .appendTo($result); - $canvas.animate({ - 'width':252 - }, 0, function(){ - $(this) - .parents('.tinycanvas') - .tinyscrollbar_update(); - }); + $result.text("No Result Found."); } - } else if( query == "" ) { - info_close(); + + } else { $result.empty(); - $applist.show(); - $canvas.css('width',current_width); + $elements.show(); } }) .blur(function(){ - if($(this).val()==""){ - $(this).val("Search"); - } + if($(this).val()=="") $(this).val("Search"); }); //for Alphabet sorting @@ -952,22 +920,16 @@ var orbitDesktop = function(dom){ return false; }); - var elementSetting = function(){// for element setting load - $elements.click(function(){ - var $e = $(this); + $(".element").click(function(){ + $e = $(this); $apptitle.text($e.data("title")); $appicon.attr("src",$e.find("img").attr("src")); - $appinfolist.find("[info=app_version]").text($e.data("version")); + $appinfolist.find("li:eq(2) div").text($e.data("version")); var dt = new Date($e.data("update")); - $appinfolist.find("[info=app_last_update]").text(dt.toUTCString()); - $appinfolist.find("[info=app_author]").text($e.data("author")); - $appinfo - .find(".app_info_header") - .css({ - "background-color": $e.data("background"), - "color": $e.data("text-color") - }); + $appinfolist.find("li:eq(3) div").text(dt.toUTCString()); + $appinfolist.find("li:eq(4) div").text($e.data("author")); + var sections = elementSettingsData[$e.data("id")].sections; var sectionids = new Array(); @@ -975,23 +937,24 @@ var orbitDesktop = function(dom){ sectionids.push(sec.id); }) - $appinfolist.find("[info=app_section_activation]").empty(); + $appinfolist.find("[info=section_activation]").empty(); $.each(o.sectionList,function(i,sec){ var present = $.inArray(sec._id,sectionids); if(present == -1){ - $sectionswitch = $('
    Off
    '); + $sectionswitch = $('
    Off
    '); }else{ - $sectionswitch = $('
    On
    '); + $sectionswitch = $('
    On
    '); } - $appinfolist.find("[info=app_section_activation]").append($sectionswitch); - }); - info_open(); + $appinfolist.find("[info=section_activation]").append($sectionswitch); + }) + $appinfo.show(); o.simple_switch(function(dom){ var options = { "status" : dom.is(":checked"), - "widget_id" : dom.data("widget"), - "section_id" : dom.data("section") + "id" : dom.data("widget"), + "section_id" : dom.data("section"), + "type" : dom.data("type") } var sectionDetails = o.sectionList.filter(function(o){return(o._id == dom.data("section"))})[0]; $.ajax({ @@ -1001,101 +964,49 @@ var orbitDesktop = function(dom){ data : options, success : function(data){ if(data.success == "true"){ - elementSettingsData[$e.data("id")].sections.push({ - "id" : dom.data("section"), - "name":sectionDetails.name - }); - if(options.status) + if(dom.is(":checked")){ console.log("true"); + elementSettingsData[$e.data("id")].sections.push({"id" : dom.data("section"),"name":sectionDetails.name}); o.notify("Added to " + sectionDetails.name,"success"); - else + }else{ + var index = elementSettingsData[$e.data("id")].sections.indexOfObject(elementSettingsData[$e.data("id")].sections.filter(function(a){return a.id == dom.data("section")})[0]); + elementSettingsData[$e.data("id")].sections.splice(index,1); o.notify("Removed from " + sectionDetails.name,"success"); + } } } - }); + }) }); - return false; - }); + }) } $appinfo.find("a.panel_close").click(function(){ - info_close(); + $appinfo.hide(); return false; - }); - - var info_open = function(){ - if($appinfo.is(":hidden")){ - $('.overview').stop().animate({'width': '+=480'},0 , function(){ - $('.tinycanvas').tinyscrollbar_update(); - }); - $appinfo - .css({ - 'display': 'block', - 'margin-left': -480 - }) - .delay(300) - .animate({ - 'margin-left': 0 - }, 500, 'easeInOutQuint'); - } else { - $('.tinycanvas').tinyscrollbar_update(); - } - } - - var info_close = function(){ - if( $appinfo.is(":visible") ){ - $appinfo - .stop() - .animate({ - 'margin-left': -480 - },500 , 'easeInOutQuint', function(){ - $('.overview').animate({'width': '-=480'}, 0, function(){ - $('.tinycanvas').tinyscrollbar_update(); - }); - $(this).attr("style",""); - }); - } else { - $('.tinycanvas').tinyscrollbar_update(); - } - } - $(window).on('keydown', function(){ - if($('#searchbox').val() == 'Search'){ - $('#searchbox').focus(); - } - }); + }) elementSetting(); o.appname_substr('#group_wrapper .element'); - o.check_simple_layout(); + } var elementSettingsData = {}; var loadApps = function(){ //this load apps for sorting and searching - $('#app_info').attr('style',''); - $('.search_result').hide().text(""); - $('#app_list').empty().show(); + $('#app_list').empty(); $.getJSON("/desktop/getapplistforManager",{desktopid:o.desktopId},function(apps){ - var count = 0, - colindex = 0, - apps_sum = apps.length, - col_sum; - - col_sum = (apps_sum - (apps_sum % 4)) / 4 + 1; - - $('#app_list') - .css('width',col_sum * 132) - .append('
    '); - - $.each(apps,function(i,app){ - var $app; - count++; - elementSettingsData[app.id] = {"sections" : app.sections}; - $app = $('

    '+app.title+'

    '); - if( count > 4 ){ - count = 1, colindex+=1; - $('#app_list').append('
    '); - $('.g_col.col'+ colindex).append($app); - } else { - $('.g_col.col'+ colindex).append($app); - } - }); + var count = 0, colindex = 0; + $('#app_list').append('
    '); + $.each(apps,function(i,app){ + var $app; + count++; + elementSettingsData[app.id] = {"sections" : app.sections}; + o.t[app.id] = {"sections" : app.sections}; + $app = $('

    '+app.title+'

    '); + if( count > 4 ){ + count = 1, colindex+=1; + $('#app_list').append('
    '); + $('.g_col.col'+ colindex).append($app); + } else { + $('.g_col.col'+ colindex).append($app); + } + }); bindHandlers(); }); } @@ -1105,6 +1016,7 @@ var orbitDesktop = function(dom){ loadApps(); // } }; + this.t = {} this.initializeSectionsManager = function(target,url,cache){ // this is init function for section manager var elementParent,element,slabel; var bindHandlers = function(){ // this is bind handler for section manager page @@ -1715,25 +1627,6 @@ var orbitDesktop = function(dom){ o.tinyscrollbar = target.main.tinyscrollbar( settings ); }; - this.check_simple_layout = function(){ - // use for various width of columns inside canvas(.overview) - // only count width for visible element which has "s_column" class - // then set width to canvas - // ** not sure to update canvas here ( $.tinyscrollbar_update() ) - var sw = 0, - $simple_layout = $('#content .overview[content-layout=simple]'); - if($simple_layout.find(".s_column").length > 0){ - $simple_layout.each(function(){ - $(this).find(".s_column").filter(":visible").each(function(){ - sw += $(this).outerWidth(); - }); - $simple_layout.css('width',sw); - }); - } - // if($simple_layout.find(".s_column").length > 0){ - // $simple_layout.css('width',sw); - // } - }; this.simple_drop_down = function(){ // simple dropdown menu var $sdm = $('.sdm'); @@ -1781,7 +1674,7 @@ var orbitDesktop = function(dom){ ini = ($switcher.hasClass('admbg2')) ? null : $switcher.addClass('admbg2'); ini = ($switcher.find('.s_switch_toggle').length < 1) ? $checkbox.after(toggle) : null; set = ($checkbox.is(':checked')) ? $status.text(status_on) : $status.text(status_off); - $checkbox.change(function(){ + $checkbox.unbind().change(function(){ var v = $(this).attr('checked'); switch (v) { case 'checked': @@ -1793,9 +1686,8 @@ var orbitDesktop = function(dom){ $status.text(status_off); break; } - if(typeof func == "function"){ + if(typeof func == "function") func.call(this,$(this)); - } }); }); }; diff --git a/app/controllers/desktop_apps_controller.rb b/app/controllers/desktop_apps_controller.rb new file mode 100644 index 00000000..655ad024 --- /dev/null +++ b/app/controllers/desktop_apps_controller.rb @@ -0,0 +1,49 @@ +class DesktopAppsController < OrbitBackendController + require "net/http" + require "uri" + require 'zip/zip' + + def index + @desktopapps = DesktopApp.all + end + + def upload + if !params[:desktop_app].nil? + temp_file = Tempfile.new("temp_file"); + original_file = params[:desktop_app][:package_file] + temp_file.write(original_file.read.force_encoding("UTF-8")) + temp_file.rewind + filename = File.basename(original_file.original_filename,".zip") + unzip_app(temp_file,filename) + temp_file.close + end + end + + def unzip_app(file, zip_name) + Zip::ZipFile.open(file) { |zip_file| + da = DesktopApp.new.from_json(zip_file.read("#{zip_name}/settings.json")) + Dir.mktmpdir('f_path') { |dir| + images_entries = [] + zip_file.entries.each do |entry| + case (path = entry.to_s) + when /\A(#{zip_name})\/(images)\/.*((\.jpg)|(\.png)|(\.gif))\z/ #for img + images_entries << entry + end + end + + images_entries.each do |image| + da.images.build(:file => get_temp_file(zip_file,dir,image)) + end + } + da.save + } + end + + def get_temp_file(zip_file, dir, entry) + filename = File.basename(entry.to_s) + temp_file = File.new(dir + '/' + filename, 'w+') + temp_file.write (zip_file.read entry ).force_encoding('UTF-8') + temp_file + end + +end \ No newline at end of file diff --git a/app/controllers/desktop_controller.rb b/app/controllers/desktop_controller.rb index b5ab6f1e..ea930cd5 100644 --- a/app/controllers/desktop_controller.rb +++ b/app/controllers/desktop_controller.rb @@ -118,6 +118,7 @@ class DesktopController< ApplicationController cssfile = "" shape = "w1 h1" link = "" + icon= "" fullsize = false if tile.data_category == "widget" widge = DesktopWidget.find(tile.desktop_widget_id.to_s) @@ -127,19 +128,17 @@ class DesktopController< ApplicationController cssfile = widge.css_default.file.as_json[:file] shape = widge.shape title = widge.name + icon = widge.images.where(:name => widge.icon).first.file.url # binding.pry fullsize = widge.fullsize else - data_content = tile.data_content - title = tile.title - case data_content - when "envocab" - link = "http://www.english-vocabulary.eu/" - when "wikibooks" - link = "http://www.wikibooks.org" - end + app = DesktopApp.find(tile.desktop_app_id.to_s) + title = app.name + link = app.url + icon = app.images.where(:name => app.icon).first.file.url + end - gr << {"id"=>tile.id,"data_category"=>tile.data_category,"data_content"=>data_content,"js"=>jsfile,"css"=>cssfile,"shape"=>shape,"position"=>tile.position,"row"=>tile.row,"column"=>tile.column, "title"=>title,"fullsize"=>fullsize,"link"=>link} + gr << {"id"=>tile.id,"data_category"=>tile.data_category,"data_content"=>data_content,"js"=>jsfile,"css"=>cssfile,"shape"=>shape,"position"=>tile.position,"row"=>tile.row,"column"=>tile.column, "title"=>title,"fullsize"=>fullsize,"link"=>link,"icon"=>icon} end @@ -195,6 +194,7 @@ class DesktopController< ApplicationController def getapplistforManager @dwss = DesktopWidget.all + @dapps = DesktopApp.all @tiles = Array.new desktop = Desktop.find(params['desktopid']) sections = desktop.sections @@ -217,6 +217,18 @@ class DesktopController< ApplicationController end @allWidgets << {"id"=>dw.id, "data_category"=> "widget","title" => dw.name, "version" => dw.version, "author"=>dw.author, "last_update"=>dw.updated_at, "icon"=>dw.images.where(:name=>dw.icon).first.file.url, "text_color" => dw.text_color, "background" => dw.bg_color, "sections" => @sections} end + validtiles = Array.new + @dapps.each do |da| + @id = da.id + @validtiles = @tiles.select{|t| t.desktop_app_id == @id} + @sections = Array.new + @validtiles.each do |vt| + grp = Group.find(vt.group_id) + sec = Section.find(grp.section_id); + @sections << {"id"=>sec.id,"name"=>sec.name} + end + @allWidgets << {"id"=>da.id, "data_category"=> "app","title" => da.name, "version" => da.version, "author"=>da.author, "last_update"=>da.updated_at, "icon"=>da.images.where(:name=>da.icon).first.file.url, "sections" => @sections} + end render :json=>@allWidgets.to_json end @@ -264,18 +276,37 @@ class DesktopController< ApplicationController def appactivation @group = Section.find(params[:section_id]).groups.first - @widget = DesktopWidget.find(params[:widget_id]) - status = params[:status] + @type = params[:type] + if @type == "widget" + @widget = DesktopWidget.find(params[:id]) + status = params[:status] - case status - when "true" - tile = Tile.new(data_category: "widget", position: 8, desktop_widget_id: @widget.id) - @group.tiles+=[tile] - @group.save - when "false" - tile = @group.tiles.where("desktop_widget_id"=>@widget.id).first - if tile != nil - tile.destroy + case status + when "true" + tile = Tile.new(data_category: "widget", position: 8, desktop_widget_id: @widget.id) + @group.tiles+=[tile] + @group.save + when "false" + tile = @group.tiles.where("desktop_widget_id"=>@widget.id).first + if tile != nil + tile.destroy + end + end + end + + if @type == "app" + @app = DesktopApp.find(params[:id]) + status = params[:status] + case status + when "true" + tile = Tile.new(data_category: "app", position: 8, desktop_app_id: @app.id) + @group.tiles+=[tile] + @group.save + when "false" + tile = @group.tiles.where("desktop_app_id"=>@app.id).first + if tile != nil + tile.destroy + end end end diff --git a/app/models/desktop/desktop_app.rb b/app/models/desktop/desktop_app.rb new file mode 100644 index 00000000..85813dbb --- /dev/null +++ b/app/models/desktop/desktop_app.rb @@ -0,0 +1,20 @@ +class DesktopApp + include Mongoid::Document + include Mongoid::Timestamps + + field :name + field :author + field :shape + field :version, :type => String + field :text_color, :type => String, default: "#fff" + field :bg_color, :type => String, default: "#fff" + field :icon, default: "icon.png" + field :url + + has_many :images, as: :imgs, :autosave => true, :dependent => :destroy + has_and_belongs_to_many :desktops, :autosave => true + has_many :tiles, :autosave => true + + accepts_nested_attributes_for :images, :allow_destroy => true + +end \ No newline at end of file diff --git a/app/models/desktop/desktop_widget.rb b/app/models/desktop/desktop_widget.rb index b91ec518..677e27d7 100644 --- a/app/models/desktop/desktop_widget.rb +++ b/app/models/desktop/desktop_widget.rb @@ -5,7 +5,7 @@ class DesktopWidget field :name field :author - field :shape + field :shape, default: "w1 h1" field :fullsize, :type => Boolean, default: false field :version, :type => String field :text_color, :type => String, default: "" diff --git a/app/models/desktop/group.rb b/app/models/desktop/group.rb index 2c1992f0..c9f8e897 100644 --- a/app/models/desktop/group.rb +++ b/app/models/desktop/group.rb @@ -7,11 +7,11 @@ class Group before_create :initialize_tile def initialize_tile - self.tiles.build(data_category: "app", data_content: "quotes", position: 5, shape: "w1 h1", title: "Quotes") - self.tiles.build(data_category: "app", data_content: "dailyenglish", position: 6, shape: "w1 h1", title: "Daily English Word") + # self.tiles.build(data_category: "app", data_content: "quotes", position: 5, shape: "w1 h1", title: "Quotes") + # self.tiles.build(data_category: "app", data_content: "dailyenglish", position: 6, shape: "w1 h1", title: "Daily English Word") widgets = self.section.desktop.desktop_widgets.collect{|widget| widget.id} - for i in 0..3 - self.tiles.build(data_category: "widget", position: i+1,desktop_widget_id: widgets[i]) + widgets.each_with_index do |w,i| + self.tiles.build(data_category: "widget", position: i+1,desktop_widget_id: w) end end end diff --git a/app/models/desktop/tile.rb b/app/models/desktop/tile.rb index 13748a04..f7671d62 100644 --- a/app/models/desktop/tile.rb +++ b/app/models/desktop/tile.rb @@ -13,5 +13,6 @@ class Tile belongs_to :group belongs_to :desktop_widget + belongs_to :desktop_app end diff --git a/app/views/desktop_apps/index.html.erb b/app/views/desktop_apps/index.html.erb new file mode 100644 index 00000000..22bcf938 --- /dev/null +++ b/app/views/desktop_apps/index.html.erb @@ -0,0 +1,10 @@ +
    +
      + <% @desktopapps.each do |da| %> +
    • <%= da.name %> + <%= link_to "Delete", desktop_app_path(da), :method=>"delete", :confirm=>"Are you sure?" %> + <%#= link_to "Edit", edit_desktop_app_path(da) %> +
    • + <% end %> +
    +
    \ No newline at end of file diff --git a/app/views/desktop_apps/upload.html.erb b/app/views/desktop_apps/upload.html.erb new file mode 100644 index 00000000..4c5a015a --- /dev/null +++ b/app/views/desktop_apps/upload.html.erb @@ -0,0 +1,12 @@ +

    Upload App Package

    +
    + <%= form_tag '',:multipart => true,:action=>"post" do |f| %> + +

    + <%= file_field :desktop_app,:package_file %> +

    + <%= submit_tag %> + + <% end %> + +
    \ No newline at end of file diff --git a/app/views/desktop_widgets/index.html.erb b/app/views/desktop_widgets/index.html.erb index 72e92072..6bedca20 100644 --- a/app/views/desktop_widgets/index.html.erb +++ b/app/views/desktop_widgets/index.html.erb @@ -2,7 +2,7 @@
      <% @desktopWidgets.each do |dw| %>
    • <%= dw.name %> - <%= link_to "Delete", desktop_widget_path(dw), :method=>"delete" %> + <%= link_to "Delete", desktop_widget_path(dw), :method=>"delete", :confirm=>"Are you sure?" %> <%= link_to "Edit", edit_desktop_widget_path(dw) %>
    • <% end %> diff --git a/config/routes.rb b/config/routes.rb index 8f7f9b67..d511b89b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -230,6 +230,14 @@ Orbit::Application.routes.draw do end end + resources :desktop_apps do + collection do + get 'upload' + get 'delete' + post 'upload' + end + end + match "/desktop/compatibility" => "desktop#compatibility" match "desktop" => "desktop#index" match "/desktop/desktop" => "desktop#desktop"