944
by dcoles
Special Home Directory: Work to create a special home directory that shows the |
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 */
|
|
945
by wagrant
specialhome: Rebrand personal to mywork (by majority), refactor a bit, |
29 |
PERSONALDIR="mywork" |
944
by dcoles
Special Home Directory: Work to create a special home directory that shows the |
30 |
|
31 |
/* LAYOUT FUNCTIONS */
|
|
32 |
||
33 |
/** Present home directory
|
|
34 |
*/
|
|
980
by dcoles
Files: "Junk" is now only shown when other (non-subject/stuff) files are in the |
35 |
function home_listing(listing, subjects, path) |
944
by dcoles
Special Home Directory: Work to create a special home directory that shows the |
36 |
{
|
980
by dcoles
Files: "Junk" is now only shown when other (non-subject/stuff) files are in the |
37 |
/* Nav through the top-level of the JSON to the actual listing object. */
|
38 |
var listing = listing.listing; |
|
39 |
||
944
by dcoles
Special Home Directory: Work to create a special home directory that shows the |
40 |
var filetablediv = document.getElementById("filetablediv"); |
955
by mattgiuca
browser: Restyled "special home" page. Now much more in-line with the existing |
41 |
var specialhomediv; |
944
by dcoles
Special Home Directory: Work to create a special home directory that shows the |
42 |
var h2; |
955
by mattgiuca
browser: Restyled "special home" page. Now much more in-line with the existing |
43 |
var h3; |
944
by dcoles
Special Home Directory: Work to create a special home directory that shows the |
44 |
var ul; |
45 |
var li; |
|
980
by dcoles
Files: "Junk" is now only shown when other (non-subject/stuff) files are in the |
46 |
var div; |
47 |
||
48 |
/* Only show special headings if we get subject listings */
|
|
49 |
if (subjects != null) |
|
949
by wagrant
specialhome: Only show the subjects header if we are enrolled in some |
50 |
{
|
980
by dcoles
Files: "Junk" is now only shown when other (non-subject/stuff) files are in the |
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; |
|
1475
by William Grant
Give specialhome a link to each offering index. |
69 |
// Header, with link to offering home page.
|
70 |
h3 = $('<h3><span></span> <span style="font-weight: normal">– <a class="subjectaction">Subject home</a></span>'); |
|
71 |
h3.find('span:first-child').text(subject.subj_name); |
|
72 |
h3.find('a').attr('href', subject.url); |
|
73 |
$(specialhomediv).append(h3); |
|
980
by dcoles
Files: "Junk" is now only shown when other (non-subject/stuff) files are in the |
74 |
|
75 |
/* Print the file listing */
|
|
76 |
ul = document.createElement("ul"); |
|
77 |
// Stuff
|
|
997
by wagrant
specialhome: Support group workspaces! Yay! Involved a bit of poking to |
78 |
ul.appendChild(make_subject_item(subjpath, |
79 |
path_join("users", username, subjpath), PERSONALDIR, |
|
980
by dcoles
Files: "Junk" is now only shown when other (non-subject/stuff) files are in the |
80 |
"Your own files in this subject")); |
997
by wagrant
specialhome: Support group workspaces! Yay! Involved a bit of poking to |
81 |
|
980
by dcoles
Files: "Junk" is now only shown when other (non-subject/stuff) files are in the |
82 |
// Groups
|
997
by wagrant
specialhome: Support group workspaces! Yay! Involved a bit of poking to |
83 |
var groups = subject.groups; |
84 |
for (var j=0; j<subject.groups.length; j++) |
|
85 |
{
|
|
86 |
var group = subject.groups[j]; |
|
87 |
ul.appendChild(make_subject_item(subjpath, |
|
88 |
path_join("groups", subject.subj_short_name + "_" + |
|
89 |
subject.year + "_" + subject.semester + "_" + |
|
90 |
group.name), |
|
91 |
group.name, |
|
92 |
"This group's files in this subject")); |
|
93 |
}
|
|
980
by dcoles
Files: "Junk" is now only shown when other (non-subject/stuff) files are in the |
94 |
|
95 |
specialhomediv.appendChild(ul); |
|
96 |
||
97 |
/* Remove it from listing */
|
|
98 |
if (subject.subj_short_name in listing) |
|
99 |
delete listing[subject.subj_short_name]; |
|
100 |
}
|
|
101 |
||
102 |
/* FIXME: Old Subjects? */
|
|
103 |
||
104 |
/* STUFF Section -- For the stuff directory */
|
|
105 |
/* Create the header */
|
|
106 |
h2 = dom_make_text_elem("h2", "Stuff"); |
|
955
by mattgiuca
browser: Restyled "special home" page. Now much more in-line with the existing |
107 |
specialhomediv.appendChild(h2); |
980
by dcoles
Files: "Junk" is now only shown when other (non-subject/stuff) files are in the |
108 |
/* Create the contents */
|
944
by dcoles
Special Home Directory: Work to create a special home directory that shows the |
109 |
ul = document.createElement("ul"); |
997
by wagrant
specialhome: Support group workspaces! Yay! Involved a bit of poking to |
110 |
ul.appendChild(make_subject_item("", |
111 |
path_join("users", username, "stuff"), "stuff", |
|
980
by dcoles
Files: "Junk" is now only shown when other (non-subject/stuff) files are in the |
112 |
"Your own files not related to a subject")); |
955
by mattgiuca
browser: Restyled "special home" page. Now much more in-line with the existing |
113 |
specialhomediv.appendChild(ul); |
980
by dcoles
Files: "Junk" is now only shown when other (non-subject/stuff) files are in the |
114 |
/* Remove stuff from the listing */
|
115 |
if ("stuff" in listing) |
|
116 |
delete listing["stuff"]; |
|
117 |
||
118 |
/* JUNK Section -- All the rest */
|
|
119 |
/* Create the header row */
|
|
120 |
if (obj_length(listing) > 0) |
|
121 |
{
|
|
122 |
h2 = dom_make_text_elem("h2", "Junk"); |
|
123 |
specialhomediv.appendChild(h2); |
|
124 |
handle_dir_listing(path, listing); |
|
125 |
}
|
|
126 |
}
|
|
127 |
else
|
|
128 |
{
|
|
129 |
handle_dir_listing(path, listing); |
|
130 |
}
|
|
944
by dcoles
Special Home Directory: Work to create a special home directory that shows the |
131 |
}
|
132 |
||
133 |
/* Does an series of AJAX requests to find out the properties of this folder
|
|
134 |
* and then updates the folder view
|
|
135 |
*/
|
|
997
by wagrant
specialhome: Support group workspaces! Yay! Involved a bit of poking to |
136 |
function make_subject_item(path, repopath, name, description) |
944
by dcoles
Special Home Directory: Work to create a special home directory that shows the |
137 |
{
|
138 |
// Create the temporary item
|
|
139 |
var li = document.createElement("li"); |
|
140 |
var span; |
|
141 |
li.setAttribute("class", "listing-loading"); |
|
951
by wagrant
specialhome: Make nonexistent directories a little nicer, with titles |
142 |
li.appendChild(dom_make_text_elem("span", name, description)); |
944
by dcoles
Special Home Directory: Work to create a special home directory that shows the |
143 |
span = dom_make_text_elem("loading..."); |
144 |
span.setAttribute("class","status"); |
|
145 |
li.appendChild(span); |
|
146 |
||
147 |
// Set the callback function to update when we get the real details
|
|
148 |
var callback = function(response) |
|
149 |
{
|
|
150 |
var sublisting = decode_response(response); |
|
151 |
dom_removechildren(li); |
|
152 |
li.setAttribute("class", "listing-dir"); |
|
153 |
||
154 |
// If we could find the file status...
|
|
155 |
if (sublisting != null) |
|
156 |
{
|
|
157 |
var thisdir = sublisting.listing['.']; |
|
158 |
var versioned = ("svnstatus" in thisdir) && (thisdir.svnstatus != "unversioned"); |
|
159 |
if (versioned) |
|
160 |
{
|
|
161 |
// Default: Just offer a link to the directory
|
|
162 |
li.appendChild(dom_make_link_elem("span", name, description, |
|
163 |
app_path(this_app, username, path, name))); |
|
164 |
}
|
|
165 |
else
|
|
166 |
{
|
|
167 |
// Blocked: Offer to rename the directory
|
|
952
by wagrant
specialhome: Also be nice if a directory is blocked. |
168 |
li.appendChild(dom_make_text_elem("span", name, description)); |
169 |
span = dom_make_text_elem("span", " (blocked) ", |
|
170 |
"Another file or directory is in the way of this directory."); |
|
944
by dcoles
Special Home Directory: Work to create a special home directory that shows the |
171 |
span.setAttribute("class", "status"); |
172 |
li.appendChild(span); |
|
173 |
||
174 |
var button = document.createElement("input"); |
|
1166
by William Grant
Replace all non-external addEventListeners with equivalent jQuery calls. |
175 |
$(button).click(function(event) |
944
by dcoles
Special Home Directory: Work to create a special home directory that shows the |
176 |
{
|
177 |
action_rename(path_join(path, name)); |
|
1166
by William Grant
Replace all non-external addEventListeners with equivalent jQuery calls. |
178 |
});
|
944
by dcoles
Special Home Directory: Work to create a special home directory that shows the |
179 |
button.setAttribute("type", "button"); |
180 |
button.setAttribute("value", "Rename"); |
|
181 |
span.appendChild(button); |
|
182 |
}
|
|
183 |
}
|
|
184 |
else
|
|
185 |
{
|
|
186 |
// Missing: Try to check out or create the repository
|
|
951
by wagrant
specialhome: Make nonexistent directories a little nicer, with titles |
187 |
li.appendChild(dom_make_text_elem("span", name, description)); |
188 |
span = dom_make_text_elem("span", " (missing) ", |
|
189 |
"This directory does not yet exist."); |
|
944
by dcoles
Special Home Directory: Work to create a special home directory that shows the |
190 |
span.setAttribute("class", "status"); |
191 |
li.appendChild(span); |
|
192 |
||
193 |
var button = document.createElement("input"); |
|
1166
by William Grant
Replace all non-external addEventListeners with equivalent jQuery calls. |
194 |
$(button).click(function(event) |
946
by wagrant
specialhome: Work with per-subject 'mywork' directories, although it |
195 |
{
|
947
by wagrant
specialhome: Display the classic AJAX loading animation while |
196 |
li.setAttribute("class", "listing-loading"); |
197 |
||
946
by wagrant
specialhome: Work with per-subject 'mywork' directories, although it |
198 |
var localpath = path_join(path, name); |
947
by wagrant
specialhome: Display the classic AJAX loading animation while |
199 |
|
946
by wagrant
specialhome: Work with per-subject 'mywork' directories, although it |
200 |
if (create_if_needed(repopath)) |
944
by dcoles
Special Home Directory: Work to create a special home directory that shows the |
201 |
{
|
202 |
// Try a checkout
|
|
1326.1.2
by David Coles
Small refactor of browser's JavaScript to allow do_action to be called from |
203 |
do_act("svncheckout", {"path": [repopath, localpath]}); |
944
by dcoles
Special Home Directory: Work to create a special home directory that shows the |
204 |
}
|
947
by wagrant
specialhome: Display the classic AJAX loading animation while |
205 |
else
|
206 |
{
|
|
207 |
li.setAttribute("class", "listing-dir"); |
|
208 |
}
|
|
1166
by William Grant
Replace all non-external addEventListeners with equivalent jQuery calls. |
209 |
});
|
944
by dcoles
Special Home Directory: Work to create a special home directory that shows the |
210 |
button.setAttribute("type", "button"); |
211 |
button.setAttribute("value", "Checkout"); |
|
212 |
span.appendChild(button); |
|
213 |
}
|
|
214 |
}
|
|
215 |
||
216 |
/* Are we working in a subdirectory or parent? */
|
|
217 |
ajax_call(callback, service_app, path_join(username, path, name), {}, "GET"); |
|
218 |
return li; |
|
219 |
}
|
|
220 |
||
945
by wagrant
specialhome: Rebrand personal to mywork (by majority), refactor a bit, |
221 |
function create_if_needed(path) |
222 |
{
|
|
223 |
response = ajax_call(null, service_app, current_path, |
|
224 |
{
|
|
225 |
"action": "svnrepostat", |
|
226 |
"path": path |
|
227 |
}, "POST"); |
|
228 |
||
229 |
||
230 |
if (response.status == 200) |
|
231 |
{
|
|
946
by wagrant
specialhome: Work with per-subject 'mywork' directories, although it |
232 |
return true; |
945
by wagrant
specialhome: Rebrand personal to mywork (by majority), refactor a bit, |
233 |
}
|
234 |
else if (response.status == 404) |
|
235 |
{
|
|
236 |
// Try a mkdir
|
|
237 |
r2 = ajax_call(null, service_app, current_path, |
|
238 |
{
|
|
239 |
"action": "svnrepomkdir", |
|
240 |
"path": path, |
|
946
by wagrant
specialhome: Work with per-subject 'mywork' directories, although it |
241 |
"logmsg": "Automated creation of '" + path + "' work directory" |
945
by wagrant
specialhome: Rebrand personal to mywork (by majority), refactor a bit, |
242 |
}, "POST"); |
243 |
||
244 |
if (r2.status == 200) |
|
245 |
{
|
|
246 |
return true; |
|
247 |
}
|
|
248 |
}
|
|
249 |
alert("Error: Could not create Subversion directory"); |
|
250 |
return false; |
|
251 |
}
|
|
980
by dcoles
Files: "Junk" is now only shown when other (non-subject/stuff) files are in the |
252 |
|
253 |
/** Finds the length (number of user defined properties) of an object
|
|
254 |
*/
|
|
255 |
function obj_length(obj) |
|
256 |
{
|
|
1168
by William Grant
Rename length to len in specialhome.js to please IE8. |
257 |
len = 0; |
980
by dcoles
Files: "Junk" is now only shown when other (non-subject/stuff) files are in the |
258 |
for (prop in obj) |
1168
by William Grant
Rename length to len in specialhome.js to please IE8. |
259 |
len++; |
260 |
return len; |
|
980
by dcoles
Files: "Junk" is now only shown when other (non-subject/stuff) files are in the |
261 |
}
|