~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to www/media/browser/specialhome.js

  • Committer: me at id
  • Date: 2009-01-15 02:55:57 UTC
  • mto: This revision was merged to the branch mainline in revision 1090.
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:branches%2Fstorm:1149
ivle.fileservice_lib.action.get_login: Always give credentials as strs.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* IVLE
 
2
 * Copyright (C) 2007-2008 The University of Melbourne
 
3
 *
 
4
 * This program is free software; you can redistribute it and/or modify
 
5
 * it under the terms of the GNU General Public License as published by
 
6
 * the Free Software Foundation; either version 2 of the License, or
 
7
 * (at your option) any later version.
 
8
 *
 
9
 * This program is distributed in the hope that it will be useful,
 
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
12
 * GNU General Public License for more details.
 
13
 *
 
14
 * You should have received a copy of the GNU General Public License
 
15
 * along with this program; if not, write to the Free Software
 
16
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
17
 */
 
18
 
 
19
/* Module: SpecialHome (File Browser, client)
 
20
 * Author: David Coles
 
21
 * Date: 23/7/2008
 
22
 */
 
23
 
 
24
/* This module implements the functionality to lay out a special home directory 
 
25
 * view on top of the normal listing
 
26
 */
 
27
 
 
28
/* The name of the personal file directory */
 
29
PERSONALDIR="mywork"
 
30
 
 
31
/* LAYOUT FUNCTIONS */
 
32
 
 
33
/** Present home directory 
 
34
 */
 
35
function home_listing(listing, subjects, path)
 
36
{
 
37
    /* Nav through the top-level of the JSON to the actual listing object. */
 
38
    var listing = listing.listing;
 
39
    
 
40
    var filetablediv = document.getElementById("filetablediv");
 
41
    var specialhomediv;
 
42
    var h2;
 
43
    var h3;
 
44
    var ul;
 
45
    var li;
 
46
    var div;
 
47
 
 
48
    /* Only show special headings if we get subject listings */
 
49
    if (subjects != null)
 
50
    {
 
51
        /* Wrap all this "special" stuff in a div, for styling purposes */
 
52
        specialhomediv = document.createElement("div");
 
53
        specialhomediv.setAttribute("id", "specialhome");
 
54
        filetablediv.appendChild(specialhomediv);
 
55
 
 
56
        /* SUBJECTS Section
 
57
        /* Create the header row */
 
58
        if (subjects.length > 0)
 
59
        {
 
60
            h2 = dom_make_text_elem("h2", "Subjects");
 
61
            specialhomediv.appendChild(h2);
 
62
        }
 
63
 
 
64
        /* Create the contents */
 
65
        for (var i=0; i<subjects.length; i++)
 
66
        {
 
67
            var subject = subjects[i];
 
68
            var subjpath = subject.subj_short_name;
 
69
            // Header
 
70
            h3 = dom_make_text_elem("h3", subject.subj_name);
 
71
            specialhomediv.appendChild(h3);
 
72
        
 
73
            /* Print the file listing */
 
74
            ul = document.createElement("ul");
 
75
            // Stuff
 
76
            ul.appendChild(make_subject_item(subjpath,
 
77
                path_join("users", username, subjpath), PERSONALDIR,
 
78
                "Your own files in this subject"));
 
79
 
 
80
            // Groups
 
81
            var groups = subject.groups;
 
82
            for (var j=0; j<subject.groups.length; j++)
 
83
            {
 
84
                var group = subject.groups[j];
 
85
                ul.appendChild(make_subject_item(subjpath,
 
86
                    path_join("groups", subject.subj_short_name + "_" +
 
87
                              subject.year + "_" + subject.semester + "_" +
 
88
                              group.name),
 
89
                    group.name,
 
90
                    "This group's files in this subject"));
 
91
            }
 
92
            
 
93
            specialhomediv.appendChild(ul);
 
94
 
 
95
            /* Remove it from listing */
 
96
            if (subject.subj_short_name in listing)
 
97
                delete listing[subject.subj_short_name];
 
98
        }
 
99
 
 
100
        /* FIXME: Old Subjects? */
 
101
 
 
102
        /* STUFF Section -- For the stuff directory */
 
103
        /* Create the header */
 
104
        h2 = dom_make_text_elem("h2", "Stuff");
 
105
        specialhomediv.appendChild(h2);
 
106
        /* Create the contents */
 
107
        ul = document.createElement("ul");
 
108
        ul.appendChild(make_subject_item("",
 
109
              path_join("users", username, "stuff"), "stuff",
 
110
              "Your own files not related to a subject"));
 
111
        specialhomediv.appendChild(ul);
 
112
        /* Remove stuff from the listing */
 
113
        if ("stuff" in listing)
 
114
            delete listing["stuff"];
 
115
 
 
116
        /* JUNK Section -- All the rest */
 
117
        /* Create the header row */
 
118
        if (obj_length(listing) > 0)
 
119
        {
 
120
            h2 = dom_make_text_elem("h2", "Junk");
 
121
            specialhomediv.appendChild(h2);
 
122
            handle_dir_listing(path, listing);
 
123
        }
 
124
    }
 
125
    else
 
126
    {
 
127
        handle_dir_listing(path, listing);
 
128
    }
 
129
}
 
130
 
 
131
/* Does an series of AJAX requests to find out the properties of this folder 
 
132
 * and then updates the folder view
 
133
 */
 
134
function make_subject_item(path, repopath, name, description)
 
135
{
 
136
    // Create the temporary item
 
137
    var li = document.createElement("li");
 
138
    var span;
 
139
    li.setAttribute("class", "listing-loading");
 
140
    li.appendChild(dom_make_text_elem("span", name, description));
 
141
    span = dom_make_text_elem("loading...");
 
142
    span.setAttribute("class","status");
 
143
    li.appendChild(span);
 
144
 
 
145
    // Set the callback function to update when we get the real details
 
146
    var callback = function(response)
 
147
    {
 
148
        var sublisting = decode_response(response);
 
149
        dom_removechildren(li);
 
150
        li.setAttribute("class", "listing-dir");
 
151
 
 
152
        // If we could find the file status...
 
153
        if (sublisting != null)
 
154
        {
 
155
            var thisdir = sublisting.listing['.'];
 
156
            var versioned = ("svnstatus" in thisdir) && (thisdir.svnstatus != "unversioned");
 
157
            if (versioned)
 
158
            {
 
159
                // Default: Just offer a link to the directory
 
160
                li.appendChild(dom_make_link_elem("span", name, description,
 
161
                    app_path(this_app, username, path, name)));
 
162
            }
 
163
            else
 
164
            {
 
165
                // Blocked: Offer to rename the directory
 
166
                li.appendChild(dom_make_text_elem("span", name, description));
 
167
                span = dom_make_text_elem("span", " (blocked) ",
 
168
                      "Another file or directory is in the way of this directory.");
 
169
                span.setAttribute("class", "status");
 
170
                li.appendChild(span);
 
171
 
 
172
                var button = document.createElement("input");
 
173
                button.addEventListener("click", function(event)
 
174
                {
 
175
                    action_rename(path_join(path, name));
 
176
                },
 
177
                false);
 
178
                button.setAttribute("type", "button");
 
179
                button.setAttribute("value", "Rename");
 
180
                span.appendChild(button);
 
181
            }
 
182
        }
 
183
        else
 
184
        {
 
185
            // Missing: Try to check out or create the repository
 
186
            li.appendChild(dom_make_text_elem("span", name, description));
 
187
            span = dom_make_text_elem("span", " (missing) ",
 
188
                  "This directory does not yet exist.");
 
189
            span.setAttribute("class", "status");
 
190
            li.appendChild(span);
 
191
 
 
192
            var button = document.createElement("input");
 
193
            button.addEventListener("click", function(event)
 
194
            {
 
195
                li.setAttribute("class", "listing-loading");
 
196
 
 
197
                var localpath = path_join(path, name);
 
198
 
 
199
                if (create_if_needed(repopath))
 
200
                {
 
201
                    // Try a checkout
 
202
                    do_action("svncheckout", current_path, {"path":
 
203
                        [repopath, localpath]});
 
204
                }
 
205
                else
 
206
                {
 
207
                    li.setAttribute("class", "listing-dir");
 
208
                }
 
209
            },
 
210
            false);
 
211
            button.setAttribute("type", "button");
 
212
            button.setAttribute("value", "Checkout");
 
213
            span.appendChild(button);
 
214
        }
 
215
    }
 
216
 
 
217
    /* Are we working in a subdirectory or parent? */
 
218
    ajax_call(callback, service_app, path_join(username, path, name), {}, "GET");
 
219
    return li;
 
220
}
 
221
 
 
222
function create_if_needed(path)
 
223
{
 
224
    response = ajax_call(null, service_app, current_path,
 
225
            {
 
226
                "action": "svnrepostat",
 
227
                "path": path
 
228
            }, "POST");
 
229
 
 
230
 
 
231
    if (response.status == 200)
 
232
    {
 
233
        return true;
 
234
    }
 
235
    else if (response.status == 404)
 
236
    {
 
237
        // Try a mkdir
 
238
        r2 = ajax_call(null, service_app, current_path,
 
239
                {
 
240
                    "action": "svnrepomkdir",
 
241
                    "path": path,
 
242
                    "logmsg": "Automated creation of '" + path + "' work directory"
 
243
                }, "POST");
 
244
 
 
245
        if (r2.status == 200)
 
246
        {
 
247
            return true;
 
248
        }
 
249
    }
 
250
    alert("Error: Could not create Subversion directory");
 
251
    return false;
 
252
}
 
253
 
 
254
/** Finds the length (number of user defined properties) of an object
 
255
 */
 
256
function obj_length(obj)
 
257
{
 
258
    length = 0;
 
259
    for (prop in obj)
 
260
        length++;
 
261
    return length;
 
262
}