| rev | 
   line source | 
| 
bsw/jbe@19
 | 
     1 ui.script{ script = "lf_initiative_expanded = {};" }
 | 
| 
bsw@11
 | 
     2 
 | 
| 
bsw/jbe@0
 | 
     3 local issue = param.get("issue", "table")
 | 
| 
bsw/jbe@0
 | 
     4 
 | 
| 
bsw/jbe@19
 | 
     5 local initiatives_selector = param.get("initiatives_selector", "table")
 | 
| 
bsw@51
 | 
     6 
 | 
| 
bsw@11
 | 
     7 initiatives_selector
 | 
| 
bsw/jbe@19
 | 
     8   :join("issue", nil, "issue.id = initiative.issue_id")
 | 
| 
bsw@11
 | 
     9 
 | 
| 
bsw@51
 | 
    10 if app.session.member_id then
 | 
| 
bsw@51
 | 
    11   initiatives_selector
 | 
| 
bsw@57
 | 
    12     :left_join("initiator", "_initiator", { "_initiator.initiative_id = initiative.id AND _initiator.member_id = ? AND _initiator.accepted", app.session.member.id} )
 | 
| 
bsw@51
 | 
    13     :left_join("supporter", "_supporter", { "_supporter.initiative_id = initiative.id AND _supporter.member_id = ?", app.session.member.id} )
 | 
| 
bsw@51
 | 
    14   
 | 
| 
bsw@51
 | 
    15     :add_field("(_initiator.member_id NOTNULL)", "is_initiator")
 | 
| 
bsw@51
 | 
    16     :add_field({"(_supporter.member_id NOTNULL) AND NOT EXISTS(SELECT 1 FROM opinion WHERE opinion.initiative_id = initiative.id AND opinion.member_id = ? AND ((opinion.degree = 2 AND NOT fulfilled) OR (opinion.degree = -2 AND fulfilled)))", app.session.member.id }, "is_supporter")
 | 
| 
bsw@51
 | 
    17     :add_field({"EXISTS(SELECT 1 FROM opinion WHERE opinion.initiative_id = initiative.id AND opinion.member_id = ? AND ((opinion.degree = 2 AND NOT fulfilled) OR (opinion.degree = -2 AND fulfilled)))", app.session.member.id }, "is_potential_supporter")
 | 
| 
bsw@51
 | 
    18 end
 | 
| 
bsw@11
 | 
    19 
 | 
| 
bsw/jbe@19
 | 
    20 local initiatives_count = initiatives_selector:count()
 | 
| 
bsw@11
 | 
    21 
 | 
| 
bsw/jbe@19
 | 
    22 local limit = param.get("limit", atom.number)
 | 
| 
bsw/jbe@19
 | 
    23 local no_sort = param.get("no_sort", atom.boolean)
 | 
| 
bsw/jbe@19
 | 
    24 
 | 
| 
bsw/jbe@19
 | 
    25 local show_for_issue = param.get("show_for_issue", atom.boolean)
 | 
| 
bsw/jbe@19
 | 
    26 
 | 
| 
bsw/jbe@19
 | 
    27 local show_for_initiative
 | 
| 
bsw/jbe@19
 | 
    28 
 | 
| 
bsw/jbe@19
 | 
    29 local show_for_initiative_id = param.get("for_initiative_id", atom.number)
 | 
| 
bsw/jbe@19
 | 
    30 
 | 
| 
bsw/jbe@19
 | 
    31 if show_for_initiative_id then
 | 
| 
bsw/jbe@19
 | 
    32   show_for_initiative = Initiative:by_id(show_for_initiative_id)
 | 
| 
bsw/jbe@19
 | 
    33 
 | 
| 
bsw/jbe@19
 | 
    34 elseif not show_for_initiative_id and show_for_issue and issue and issue.ranks_available then
 | 
| 
bsw/jbe@19
 | 
    35   winning_initiative = Initiative:new_selector()
 | 
| 
bsw/jbe@19
 | 
    36     :add_where{ "issue_id = ?", issue.id }
 | 
| 
bsw/jbe@19
 | 
    37     :add_where("rank = 1")
 | 
| 
bsw@24
 | 
    38     :optional_object_mode()
 | 
| 
bsw/jbe@19
 | 
    39     :exec()
 | 
| 
bsw/jbe@19
 | 
    40   if winning_initiative then
 | 
| 
bsw/jbe@19
 | 
    41     show_for_initiative = winning_initiative
 | 
| 
bsw/jbe@19
 | 
    42     ui.container{
 | 
| 
bsw/jbe@19
 | 
    43       attr = { class = "admitted_info" },
 | 
| 
bsw/jbe@19
 | 
    44       content = _"This issue has been finished with the following winning initiative:"
 | 
| 
bsw/jbe@19
 | 
    45     }
 | 
| 
bsw/jbe@19
 | 
    46   else
 | 
| 
bsw/jbe@19
 | 
    47     ui.container{
 | 
| 
bsw/jbe@19
 | 
    48       attr = { class = "not_admitted_info" },
 | 
| 
bsw/jbe@19
 | 
    49       content = _"This issue has been finished without any winning initiative."
 | 
| 
bsw/jbe@19
 | 
    50     }
 | 
| 
bsw/jbe@19
 | 
    51   end
 | 
| 
bsw/jbe@19
 | 
    52 end
 | 
| 
bsw/jbe@19
 | 
    53 
 | 
| 
bsw/jbe@19
 | 
    54 
 | 
| 
bsw/jbe@19
 | 
    55 if show_for_initiative then
 | 
| 
bsw/jbe@19
 | 
    56   ui.script{ script = "lf_initiative_expanded['initiative_content_" .. tostring(show_for_initiative.id) .. "'] = true;" }
 | 
| 
bsw/jbe@19
 | 
    57   initiatives_selector:add_where{ "initiative.id != ?", show_for_initiative.id }
 | 
| 
bsw/jbe@19
 | 
    58 
 | 
| 
bsw/jbe@19
 | 
    59   execute.view{
 | 
| 
bsw/jbe@19
 | 
    60     module = "initiative",
 | 
| 
bsw/jbe@19
 | 
    61     view = "_list_element",
 | 
| 
bsw/jbe@19
 | 
    62     params = {
 | 
| 
bsw/jbe@19
 | 
    63       initiative = show_for_initiative,
 | 
| 
bsw/jbe@19
 | 
    64       expanded = true,
 | 
| 
bsw/jbe@19
 | 
    65       expandable = true
 | 
| 
bsw/jbe@19
 | 
    66     }
 | 
| 
bsw/jbe@19
 | 
    67   }
 | 
| 
bsw/jbe@19
 | 
    68   if show_for_issue then
 | 
| 
bsw/jbe@19
 | 
    69     slot.put("<br />")
 | 
| 
bsw/jbe@19
 | 
    70     ui.container{
 | 
| 
bsw/jbe@19
 | 
    71       attr = { style = "font-weight: bold;" },
 | 
| 
bsw/jbe@0
 | 
    72       content = function()
 | 
| 
bsw/jbe@19
 | 
    73         slot.put(_"Alternative initiatives")
 | 
| 
bsw/jbe@0
 | 
    74       end
 | 
| 
bsw/jbe@0
 | 
    75     }
 | 
| 
bsw/jbe@0
 | 
    76   end
 | 
| 
bsw/jbe@19
 | 
    77 elseif show_for_issue then
 | 
| 
bsw/jbe@19
 | 
    78   ui.container{
 | 
| 
bsw/jbe@19
 | 
    79     attr = { style = "font-weight: bold;" },
 | 
| 
bsw/jbe@19
 | 
    80     content = function()
 | 
| 
bsw/jbe@19
 | 
    81       slot.put(_"Alternative initiatives")
 | 
| 
bsw/jbe@19
 | 
    82     end
 | 
| 
bsw@11
 | 
    83   }
 | 
| 
bsw@11
 | 
    84 end
 | 
| 
bsw/jbe@19
 | 
    85 
 | 
| 
bsw/jbe@19
 | 
    86 if not show_for_initiative or initiatives_count > 1 then
 | 
| 
bsw/jbe@19
 | 
    87 
 | 
| 
bsw/jbe@19
 | 
    88 
 | 
| 
bsw/jbe@19
 | 
    89   local more_initiatives_count
 | 
| 
bsw/jbe@19
 | 
    90   if limit then
 | 
| 
bsw/jbe@19
 | 
    91     limit = limit - (show_for_initiative and 1 or 0)
 | 
| 
bsw/jbe@19
 | 
    92     if initiatives_count > limit then
 | 
| 
bsw/jbe@19
 | 
    93       more_initiatives_count = initiatives_count - limit
 | 
| 
bsw/jbe@19
 | 
    94     end
 | 
| 
bsw/jbe@19
 | 
    95     initiatives_selector:limit(limit)
 | 
| 
bsw/jbe@19
 | 
    96   end
 | 
| 
bsw/jbe@19
 | 
    97 
 | 
| 
bsw/jbe@19
 | 
    98   local expandable = param.get("expandable", atom.boolean)
 | 
| 
bsw/jbe@19
 | 
    99 
 | 
| 
bsw/jbe@19
 | 
   100   local issue = param.get("issue", "table")
 | 
| 
bsw/jbe@19
 | 
   101 
 | 
| 
bsw/jbe@19
 | 
   102   local name = "initiative_list"
 | 
| 
bsw/jbe@19
 | 
   103   if issue then
 | 
| 
bsw/jbe@19
 | 
   104     name = "issue_" .. tostring(issue.id) ..  "_initiative_list"
 | 
| 
bsw/jbe@19
 | 
   105   end
 | 
| 
bsw/jbe@19
 | 
   106 
 | 
| 
bsw/jbe@19
 | 
   107   ui.add_partial_param_names{ name }
 | 
| 
bsw/jbe@19
 | 
   108 
 | 
| 
bsw/jbe@19
 | 
   109   local order_filter = {
 | 
| 
bsw/jbe@19
 | 
   110     name = name,
 | 
| 
bsw/jbe@19
 | 
   111     label = _"Order by"
 | 
| 
bsw/jbe@19
 | 
   112   }
 | 
| 
bsw/jbe@19
 | 
   113 
 | 
| 
bsw/jbe@19
 | 
   114   if issue and issue.ranks_available then
 | 
| 
bsw/jbe@19
 | 
   115     order_filter[#order_filter+1] = {
 | 
| 
bsw/jbe@19
 | 
   116       name = "rank",
 | 
| 
bsw/jbe@19
 | 
   117       label = _"Rank",
 | 
| 
bsw/jbe@19
 | 
   118       selector_modifier = function(selector) selector:add_order_by("initiative.rank, initiative.admitted DESC, vote_ratio(initiative.positive_votes, initiative.negative_votes) DESC, initiative.id") end
 | 
| 
bsw/jbe@19
 | 
   119     }
 | 
| 
bsw/jbe@19
 | 
   120   end
 | 
| 
bsw/jbe@19
 | 
   121 
 | 
| 
bsw/jbe@19
 | 
   122   order_filter[#order_filter+1] = {
 | 
| 
bsw/jbe@19
 | 
   123     name = "potential_support",
 | 
| 
bsw/jbe@19
 | 
   124     label = _"Potential support",
 | 
| 
bsw/jbe@19
 | 
   125     selector_modifier = function(selector) selector:add_order_by("initiative.supporter_count::float / issue.population::float DESC, initiative.id") end
 | 
| 
bsw/jbe@19
 | 
   126   }
 | 
| 
bsw/jbe@19
 | 
   127 
 | 
| 
bsw/jbe@19
 | 
   128   order_filter[#order_filter+1] = {
 | 
| 
bsw/jbe@19
 | 
   129     name = "support",
 | 
| 
bsw/jbe@19
 | 
   130     label = _"Support",
 | 
| 
bsw/jbe@19
 | 
   131     selector_modifier = function(selector) selector:add_order_by("initiative.satisfied_supporter_count::float / issue.population::float DESC, initiative.id") end
 | 
| 
bsw/jbe@19
 | 
   132   }
 | 
| 
bsw/jbe@19
 | 
   133 
 | 
| 
bsw/jbe@19
 | 
   134   order_filter[#order_filter+1] = {
 | 
| 
bsw/jbe@19
 | 
   135     name = "newest",
 | 
| 
bsw/jbe@19
 | 
   136     label = _"Newest",
 | 
| 
bsw/jbe@19
 | 
   137     selector_modifier = function(selector) selector:add_order_by("initiative.created DESC, initiative.id") end
 | 
| 
bsw/jbe@19
 | 
   138   }
 | 
| 
bsw/jbe@19
 | 
   139 
 | 
| 
bsw/jbe@19
 | 
   140   order_filter[#order_filter+1] = {
 | 
| 
bsw/jbe@19
 | 
   141     name = "oldest",
 | 
| 
bsw/jbe@19
 | 
   142     label = _"Oldest",
 | 
| 
bsw/jbe@19
 | 
   143     selector_modifier = function(selector) selector:add_order_by("initiative.created, initiative.id") end
 | 
| 
bsw/jbe@19
 | 
   144   }
 | 
| 
bsw/jbe@19
 | 
   145 
 | 
| 
bsw/jbe@19
 | 
   146   ui_filters = ui.filters
 | 
| 
bsw/jbe@19
 | 
   147 
 | 
| 
bsw/jbe@19
 | 
   148   if no_sort then
 | 
| 
bsw/jbe@19
 | 
   149     ui_filters = function(args) args.content() end
 | 
| 
bsw/jbe@19
 | 
   150     if issue.ranks_available then
 | 
| 
bsw/jbe@19
 | 
   151       initiatives_selector:add_order_by("initiative.rank, initiative.admitted DESC, vote_ratio(initiative.positive_votes, initiative.negative_votes) DESC, initiative.id")
 | 
| 
bsw/jbe@19
 | 
   152     else
 | 
| 
bsw/jbe@19
 | 
   153       initiatives_selector:add_order_by("initiative.supporter_count::float / issue.population::float DESC, initiative.id")
 | 
| 
bsw/jbe@19
 | 
   154     end
 | 
| 
bsw/jbe@19
 | 
   155   end
 | 
| 
bsw/jbe@19
 | 
   156 
 | 
| 
bsw/jbe@19
 | 
   157   ui_filters{
 | 
| 
bsw/jbe@19
 | 
   158     label = _"Change order",
 | 
| 
bsw/jbe@19
 | 
   159     order_filter,
 | 
| 
bsw/jbe@19
 | 
   160     selector = initiatives_selector,
 | 
| 
bsw/jbe@19
 | 
   161     content = function()
 | 
| 
bsw/jbe@19
 | 
   162       ui.paginate{
 | 
| 
bsw/jbe@19
 | 
   163         name = issue and "issue_" .. tostring(issue.id) .. "_page" or nil,
 | 
| 
bsw/jbe@19
 | 
   164         selector = initiatives_selector,
 | 
| 
bsw/jbe@19
 | 
   165         per_page = param.get("per_page", atom.number),
 | 
| 
bsw/jbe@19
 | 
   166         content = function()
 | 
| 
bsw/jbe@19
 | 
   167           local initiatives = initiatives_selector:exec()
 | 
| 
bsw/jbe@19
 | 
   168           for i, initiative in ipairs(initiatives) do
 | 
| 
bsw/jbe@19
 | 
   169             local expanded = config.user_tab_mode == "accordeon_all_expanded" and expandable or
 | 
| 
bsw/jbe@19
 | 
   170               show_for_initiative and initiative.id == show_for_initiative.id
 | 
| 
bsw/jbe@19
 | 
   171             if expanded then
 | 
| 
bsw/jbe@19
 | 
   172               ui.script{ script = "lf_initiative_expanded['initiative_content_" .. tostring(initiative.id) .. "'] = true;" }
 | 
| 
bsw/jbe@19
 | 
   173             end
 | 
| 
bsw/jbe@19
 | 
   174             execute.view{
 | 
| 
bsw/jbe@19
 | 
   175               module = "initiative",
 | 
| 
bsw/jbe@19
 | 
   176               view = "_list_element",
 | 
| 
bsw/jbe@19
 | 
   177               params = {
 | 
| 
bsw/jbe@19
 | 
   178                 initiative = initiative,
 | 
| 
bsw/jbe@19
 | 
   179                 expanded = expanded,
 | 
| 
bsw/jbe@19
 | 
   180                 expandable = expandable
 | 
| 
bsw/jbe@19
 | 
   181               }
 | 
| 
bsw/jbe@19
 | 
   182             }
 | 
| 
bsw/jbe@19
 | 
   183           end
 | 
| 
bsw/jbe@19
 | 
   184         end
 | 
| 
bsw/jbe@19
 | 
   185       }
 | 
| 
bsw/jbe@19
 | 
   186     end
 | 
| 
bsw/jbe@19
 | 
   187   }
 | 
| 
bsw/jbe@19
 | 
   188 
 | 
| 
bsw/jbe@19
 | 
   189   if more_initiatives_count then
 | 
| 
bsw/jbe@19
 | 
   190     ui.link{
 | 
| 
bsw/jbe@19
 | 
   191       attr = { style = "font-size: 75%; font-style: italic;" },
 | 
| 
bsw/jbe@19
 | 
   192       content = _("and #{count} more initiatives", { count = more_initiatives_count }),
 | 
| 
bsw/jbe@19
 | 
   193       module = "issue",
 | 
| 
bsw/jbe@19
 | 
   194       view = "show",
 | 
| 
bsw/jbe@19
 | 
   195       id = issue.id,
 | 
| 
bsw/jbe@19
 | 
   196     }
 | 
| 
bsw/jbe@19
 | 
   197   end
 | 
| 
bsw/jbe@19
 | 
   198 
 | 
| 
bsw/jbe@19
 | 
   199 end
 | 
| 
bsw/jbe@19
 | 
   200 
 | 
| 
bsw/jbe@19
 | 
   201 if show_for_issue then
 | 
| 
bsw/jbe@19
 | 
   202   slot.put("<br />")
 | 
| 
bsw/jbe@19
 | 
   203   
 | 
| 
bsw/jbe@19
 | 
   204   if issue and initiatives_count == 1 then
 | 
| 
bsw/jbe@19
 | 
   205     ui.container{
 | 
| 
bsw/jbe@19
 | 
   206       content = function()
 | 
| 
bsw/jbe@19
 | 
   207         if issue.fully_frozen or issue.closed then
 | 
| 
bsw/jbe@19
 | 
   208           slot.put(_"There were no more alternative initiatives.")
 | 
| 
bsw/jbe@19
 | 
   209         else
 | 
| 
bsw/jbe@19
 | 
   210           slot.put(_"There are no more alternative initiatives currently.")
 | 
| 
bsw/jbe@19
 | 
   211         end
 | 
| 
bsw/jbe@19
 | 
   212       end
 | 
| 
bsw/jbe@19
 | 
   213     }
 | 
| 
bsw/jbe@19
 | 
   214   end
 | 
| 
bsw/jbe@19
 | 
   215 
 | 
| 
bsw@51
 | 
   216   if app.session.member_id and not (issue.fully_frozen or issue.closed) then
 | 
| 
bsw/jbe@19
 | 
   217     slot.put(" ")
 | 
| 
bsw/jbe@19
 | 
   218     ui.link{
 | 
| 
bsw/jbe@19
 | 
   219       content = function()
 | 
| 
bsw/jbe@19
 | 
   220         ui.image{ static = "icons/16/script_add.png" }
 | 
| 
bsw/jbe@19
 | 
   221         slot.put(" ")
 | 
| 
bsw/jbe@19
 | 
   222         slot.put(_"Create alternative initiative")
 | 
| 
bsw/jbe@19
 | 
   223       end,
 | 
| 
bsw/jbe@19
 | 
   224       module = "initiative",
 | 
| 
bsw/jbe@19
 | 
   225       view = "new",
 | 
| 
bsw/jbe@19
 | 
   226       params = { issue_id = issue.id }
 | 
| 
bsw/jbe@19
 | 
   227     }
 | 
| 
bsw/jbe@19
 | 
   228   end
 | 
| 
bsw/jbe@19
 | 
   229 end
 |