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

« back to all changes in this revision

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

  • Committer: mattgiuca
  • Date: 2008-01-11 00:49:06 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:172
util: Added buildurl function.

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
 
}