2
* Copyright (C) 2007-2008 The University of Melbourne
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.
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.
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
19
/* Module: SpecialHome (File Browser, client)
24
/* This module implements the functionality to lay out a special home directory
25
* view on top of the normal listing
28
/* The name of the personal file directory */
31
/* LAYOUT FUNCTIONS */
33
/** Present home directory
35
function home_listing(listing, subjects, path)
37
/* Nav through the top-level of the JSON to the actual listing object. */
38
var listing = listing.listing;
40
var filetablediv = document.getElementById("filetablediv");
48
/* Only show special headings if we get subject listings */
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);
57
/* Create the header row */
58
if (subjects.length > 0)
60
h2 = dom_make_text_elem("h2", "Subjects");
61
specialhomediv.appendChild(h2);
64
/* Create the contents */
65
for (var i=0; i<subjects.length; i++)
67
var subject = subjects[i];
68
var subjpath = subject.subj_short_name;
70
h3 = dom_make_text_elem("h3", subject.subj_name);
71
specialhomediv.appendChild(h3);
73
/* Print the file listing */
74
ul = document.createElement("ul");
76
ul.appendChild(make_subject_item(subjpath,
77
path_join("users", username, subjpath), PERSONALDIR,
78
"Your own files in this subject"));
81
var groups = subject.groups;
82
for (var j=0; j<subject.groups.length; j++)
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 + "_" +
90
"This group's files in this subject"));
93
specialhomediv.appendChild(ul);
95
/* Remove it from listing */
96
if (subject.subj_short_name in listing)
97
delete listing[subject.subj_short_name];
100
/* FIXME: Old Subjects? */
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"];
116
/* JUNK Section -- All the rest */
117
/* Create the header row */
118
if (obj_length(listing) > 0)
120
h2 = dom_make_text_elem("h2", "Junk");
121
specialhomediv.appendChild(h2);
122
handle_dir_listing(path, listing);
127
handle_dir_listing(path, listing);
131
/* Does an series of AJAX requests to find out the properties of this folder
132
* and then updates the folder view
134
function make_subject_item(path, repopath, name, description)
136
// Create the temporary item
137
var li = document.createElement("li");
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);
145
// Set the callback function to update when we get the real details
146
var callback = function(response)
148
var sublisting = decode_response(response);
149
dom_removechildren(li);
150
li.setAttribute("class", "listing-dir");
152
// If we could find the file status...
153
if (sublisting != null)
155
var thisdir = sublisting.listing['.'];
156
var versioned = ("svnstatus" in thisdir) && (thisdir.svnstatus != "unversioned");
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)));
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);
172
var button = document.createElement("input");
173
button.addEventListener("click", function(event)
175
action_rename(path_join(path, name));
178
button.setAttribute("type", "button");
179
button.setAttribute("value", "Rename");
180
span.appendChild(button);
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);
192
var button = document.createElement("input");
193
button.addEventListener("click", function(event)
195
li.setAttribute("class", "listing-loading");
197
var localpath = path_join(path, name);
199
if (create_if_needed(repopath))
202
do_action("svncheckout", current_path, {"path":
203
[repopath, localpath]});
207
li.setAttribute("class", "listing-dir");
211
button.setAttribute("type", "button");
212
button.setAttribute("value", "Checkout");
213
span.appendChild(button);
217
/* Are we working in a subdirectory or parent? */
218
ajax_call(callback, service_app, path_join(username, path, name), {}, "GET");
222
function create_if_needed(path)
224
response = ajax_call(null, service_app, current_path,
226
"action": "svnrepostat",
231
if (response.status == 200)
235
else if (response.status == 404)
238
r2 = ajax_call(null, service_app, current_path,
240
"action": "svnrepomkdir",
242
"logmsg": "Automated creation of '" + path + "' work directory"
245
if (r2.status == 200)
250
alert("Error: Could not create Subversion directory");
254
/** Finds the length (number of user defined properties) of an object
256
function obj_length(obj)