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

« back to all changes in this revision

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

  • Committer: chadnickbok
  • Date: 2009-01-19 22:56:46 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:1170
This commit fixes issue #10 and part of issue #9

There are now two options for moving files with their
svn history intact; svn move and svn copy. These
use the svn commands to move the files, allowing students
to move and rename files without their histories being
lost.

This commit also shows the svn status of a dir, if it is
the 'head' of an svn repository.

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
}