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

« back to all changes in this revision

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

  • Committer: dcoles
  • Date: 2008-07-03 04:20:54 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:803
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should 
allow us to get in there and tidy up each module much easier. Also removed 
updatejails since this functionality seems to be duplicated with remakeuser.py 
and remakealluser.py scripts.

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
 
}