Skip to content

Commit 447bd0d

Browse files
committed
model folders. closes #142
1 parent d19790a commit 447bd0d

15 files changed

+193
-46
lines changed

adminifier/wiki.go

+32-12
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ var wikiFrameHandlers = map[string]func(*wikiRequest){
2626
"images": handleImagesFrame,
2727
"images/": handleImagesFrame,
2828
"models": handleModelsFrame,
29+
"models/": handleModelsFrame,
2930
"settings": handleSettingsFrame,
3031
"edit-page": handleEditPageFrame,
3132
"edit-category": handleEditCategoryFrame,
@@ -36,16 +37,18 @@ var wikiFrameHandlers = map[string]func(*wikiRequest){
3637
}
3738

3839
var wikiFuncHandlers = map[string]func(*wikiRequest){
39-
"switch-branch/": handleSwitchBranch,
40-
"create-branch": handleCreateBranch,
41-
"write-page": handleWritePage,
42-
"write-model": handleWriteModel,
43-
"write-config": handleWriteWikiConfig,
44-
"image/": handleImage,
45-
"page-revisions": handlePageRevisions,
46-
"create-page": handleCreatePage,
47-
"create-model": handleCreateModel,
48-
"create-page-folder": handleCreatePageFolder,
40+
"switch-branch/": handleSwitchBranch,
41+
"create-branch": handleCreateBranch,
42+
"write-page": handleWritePage,
43+
"write-model": handleWriteModel,
44+
"write-config": handleWriteWikiConfig,
45+
"image/": handleImage,
46+
"page-revisions": handlePageRevisions,
47+
"create-page": handleCreatePage,
48+
"create-model": handleCreateModel,
49+
"create-page-folder": handleCreatePageFolder,
50+
"create-model-folder": handleCreateModelFolder,
51+
"create-image-folder": handleCreateImageFolder,
4952
}
5053

5154
// wikiTemplate members are available to all wiki templates
@@ -325,8 +328,13 @@ func handleImagesFrame(wr *wikiRequest) {
325328

326329
func handleModelsFrame(wr *wikiRequest) {
327330
descending, sortFunc := getSortFunc(wr, wiki.SortModified, true)
328-
models := wr.wi.ModelsSorted(descending, sortFunc, wiki.SortTitle)
329-
handleFileFrames(wr, "models", models)
331+
dir := strings.TrimPrefix(strings.TrimPrefix(wr.r.URL.Path, wr.wikiRoot+"frame/models"), "/")
332+
models, dirs := wr.wi.ModelsAndDirsSorted(dir, descending, sortFunc, wiki.SortTitle)
333+
handleFileFrames(wr, "models", struct {
334+
Models []wikifier.ModelInfo `json:"models"`
335+
Dirs []string `json:"dirs"`
336+
Cd string `json:"cd"`
337+
}{models, dirs, dir})
330338
}
331339

332340
func handleCategoriesFrame(wr *wikiRequest) {
@@ -718,6 +726,18 @@ func handleCreatePageFolder(wr *wikiRequest) {
718726
})
719727
}
720728

729+
func handleCreateImageFolder(wr *wikiRequest) {
730+
handleCreateFolder("image", wr, func(dir, name string) (string, error) {
731+
return wr.wi.CreateImageFolder(dir, name)
732+
})
733+
}
734+
735+
func handleCreateModelFolder(wr *wikiRequest) {
736+
handleCreateFolder("model", wr, func(dir, name string) (string, error) {
737+
return wr.wi.CreateModelFolder(dir, name)
738+
})
739+
}
740+
721741
func handleCreateFolder(typ string, wr *wikiRequest, createFunc func(dir, name string) (string, error)) {
722742
if !parsePost(wr.w, wr.r, "name") {
723743
return

resources/adminifier/static/script/adminifier.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@ function handlePageData (page, data) {
536536
return;
537537
crumbs.reverse().each(function (crumb, i) {
538538
var a = new Element('a', {
539-
href: '../'.repeat(i) + crumb,
539+
href: '../'.repeat(i) + crumb + window.location.search,
540540
text: crumb
541541
});
542542
addFrameClickHandler(a);
@@ -549,7 +549,7 @@ function handlePageData (page, data) {
549549

550550
var pageTitle = $$('#page-title span')[0];
551551
var titleA = new Element('a', {
552-
href: '../'.repeat(crumbs.length) + page.replace(/^\/?([^\/]+).*/, '$1') + location.search,
552+
href: '../'.repeat(crumbs.length) + page.replace(/^\/?([^\/]+).*/, '$1') + window.location.search,
553553
html: pageTitle.innerHTML
554554
});
555555
addFrameClickHandler(titleA);

resources/adminifier/static/script/file-list/images.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ var imageList = new FileList({
1212
}
1313
});
1414

15-
var currentDir = a.json.results.cd;
15+
var currentDir;
1616

1717
function nextDir(dir) {
1818
if (!currentDir)
@@ -22,6 +22,8 @@ function nextDir(dir) {
2222

2323
if (a.json.results) {
2424

25+
currentDir = a.json.results.cd;
26+
2527
a.json.results.dirs.each(function (dir) {
2628
var entry = new FileListEntry({ Filename: dir });
2729
entry.isDir = true;
@@ -49,4 +51,6 @@ a.json.results.images.each(function (imageData) {
4951

5052
imageList.draw($('content'));
5153

54+
// common functions are in ../images.js
55+
5256
})(adminifier, window);

resources/adminifier/static/script/file-list/models.js

+36-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,26 @@ var modelList = new FileList({
1111
}
1212
});
1313

14-
if (a.json.results)
15-
a.json.results.each(function (modelData) {
14+
var currentDir;
15+
16+
function nextDir(dir) {
17+
if (!currentDir)
18+
return dir;
19+
return currentDir + '/' + dir;
20+
}
21+
22+
if (a.json.results) {
23+
24+
currentDir = a.json.results.cd;
25+
26+
a.json.results.dirs.each(function (dir) {
27+
var entry = new FileListEntry({ Title: dir });
28+
entry.isDir = true;
29+
entry.link = adminifier.wikiRoot + '/models/' + nextDir(dir) + location.search;
30+
modelList.addEntry(entry);
31+
});
32+
33+
a.json.results.models.each(function (modelData) {
1634
var entry = new FileListEntry({
1735
Title: modelData.title || modelData.file_ne || modelData.file,
1836
Author: modelData.author,
@@ -23,6 +41,8 @@ a.json.results.each(function (modelData) {
2341
modelList.addEntry(entry);
2442
});
2543

44+
}
45+
2646
modelList.draw($('content'));
2747

2848
exports.createModel = function () {
@@ -39,4 +59,18 @@ exports.createModel = function () {
3959
modal.show();
4060
}
4161

62+
exports.createFolder = function () {
63+
var modal = new ModalWindow({
64+
icon: 'folder',
65+
title: 'New Folder',
66+
html: tmpl('tmpl-create-folder', { mode: 'model' }),
67+
padded: true,
68+
id: 'create-folder-window',
69+
autoDestroy: true,
70+
onDone: null,
71+
doneText: 'Cancel',
72+
});
73+
modal.show();
74+
}
75+
4276
})(adminifier, window);

resources/adminifier/static/script/file-list/pages.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ var pageList = new FileList({
1111
}
1212
});
1313

14-
var currentDir = a.json.results.cd;
14+
var currentDir;
1515

1616
function nextDir(dir) {
1717
if (!currentDir)
@@ -21,6 +21,8 @@ function nextDir(dir) {
2121

2222
if (a.json.results) {
2323

24+
currentDir = a.json.results.cd;
25+
2426
a.json.results.dirs.each(function (dir) {
2527
var entry = new FileListEntry({ Title: dir });
2628
entry.isDir = true;
@@ -68,7 +70,7 @@ exports.createFolder = function () {
6870
var modal = new ModalWindow({
6971
icon: 'folder',
7072
title: 'New Folder',
71-
html: tmpl('tmpl-create-folder', {}),
73+
html: tmpl('tmpl-create-folder', { mode: 'page' }),
7274
padded: true,
7375
id: 'create-folder-window',
7476
autoDestroy: true,

resources/adminifier/static/script/image-grid.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ var dirContainer = new Element('div', { class: 'image-grid' });
44
var imageContainer = new Element('div', { class: 'image-grid' });
55
$('content').appendChild(imageContainer);
66

7-
var currentDir = a.json.results.cd;
7+
var currentDir;
88

99
function nextDir(dir) {
1010
if (!currentDir)
@@ -14,6 +14,8 @@ function nextDir(dir) {
1414

1515
if (a.json.results && (a.json.results.dirs.length || a.json.results.images.length)) {
1616

17+
currentDir = a.json.results.cd;
18+
1719
a.json.results.dirs.each(function (dir) {
1820
var div = new Element('div', {
1921
class: 'image-grid-item',
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
(function (a, exports) {
2+
3+
// this file is common to both the image grid and the image list.
4+
// see also ./image-grid.js and ./file-list/images.js
5+
6+
exports.createFolder = function () {
7+
var modal = new ModalWindow({
8+
icon: 'folder',
9+
title: 'New Folder',
10+
html: tmpl('tmpl-create-folder', { mode: 'image' }),
11+
padded: true,
12+
id: 'create-folder-window',
13+
autoDestroy: true,
14+
onDone: null,
15+
doneText: 'Cancel',
16+
});
17+
modal.show();
18+
}
19+
20+
})(adminifier, window);

resources/adminifier/template/common-file-list.tpl

+9
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,12 @@
3939
<i class="fa fa-minus-circle fa-lg" style="color: #FF7070;"></i>
4040
{%= o.mode %} &quot;{%= o.item %}&quot;
4141
</template>
42+
43+
<template id="tmpl-create-folder">
44+
<form action="{{.Root}}/func/create-{%= o.mode %}-folder" method="post">
45+
<label for="name">Folder Name:</label>
46+
<input type="text" name="name" />
47+
<input type="hidden" name="dir" value="{{.Cd}}" />
48+
<input type="submit" value="Create" />
49+
</form>
50+
</template>

resources/adminifier/template/frame-images.tpl

+6-3
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88
data-sort="{{.Order}}"
99
data-cd="{{.Cd}}"
1010

11-
data-buttons="upload image-mode filter"
11+
1212
data-button-upload="{'title': 'Upload', 'icon': 'upload', 'href': '{{.Root}}/upload-images'}"
13+
data-button-create-folder="{'title': 'New Folder', 'icon': 'folder', 'func': 'createFolder'}"
1314
data-button-filter="{'title': 'Filter', 'icon': 'filter', 'func': 'displayFilter'}"
1415

1516
data-selection-buttons="move rename delete"
@@ -18,12 +19,14 @@
1819
data-button-delete="{'title': 'Delete', 'icon': 'trash', 'func': 'deleteSelected', 'hide': true}"
1920

2021
{{if .List}}
22+
data-buttons="upload create-folder image-mode filter"
2123
data-button-image-mode="{'title': 'Grid', 'icon': 'th', 'frameHref': '{{.Root}}/images/{{.Cd}}'}"
22-
data-scripts="file-list file-list/images pikaday"
24+
data-scripts="file-list file-list/images images pikaday"
2325
data-styles="file-list pikaday"
2426
{{else}}
27+
data-buttons="upload create-folder image-mode"
2528
data-button-image-mode="{'title': 'List', 'icon': 'list', 'frameHref': '{{.Root}}/images/{{.Cd}}?mode=list'}"
26-
data-scripts="image-grid pikaday"
29+
data-scripts="image-grid images pikaday"
2730
data-styles="image-grid pikaday"
2831
{{end}}
2932
/>

resources/adminifier/template/frame-models.tpl

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@
55
data-title="Models"
66
data-icon="cube"
77
data-scripts="file-list file-list/models pikaday"
8-
98
data-styles="file-list pikaday"
109
data-flags="no-margin search buttons"
1110
data-search="fileSearch"
1211
data-sort="{{.Order}}"
12+
data-cd="{{.Cd}}"
1313

14-
data-buttons="create filter"
14+
data-buttons="create create-folder filter"
1515
data-button-create="{'title': 'New Model', 'icon': 'plus-circle', 'func': 'createModel'}"
16+
data-button-create-folder="{'title': 'New Folder', 'icon': 'folder', 'func': 'createFolder'}"
1617
data-button-filter="{'title': 'Filter', 'icon': 'filter', 'func': 'displayFilter'}"
1718

1819
data-selection-buttons="move rename delete"

resources/adminifier/template/frame-pages.tpl

-9
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,3 @@
3232
<input type="submit" value="Create" />
3333
</form>
3434
</template>
35-
36-
<template id="tmpl-create-folder">
37-
<form action="{{.Root}}/func/create-page-folder" method="post">
38-
<label for="name">Folder Name:</label>
39-
<input type="text" name="name" />
40-
<input type="hidden" name="dir" value="{{.Cd}}" />
41-
<input type="submit" value="Create" />
42-
</form>
43-
</template>

wiki/file.go

+5
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,11 @@ func (w *Wiki) allModelFiles() []string {
173173
return files
174174
}
175175

176+
func (w *Wiki) modelFilesInDir(where string) []string {
177+
files, _ := wikifier.UniqueFilesInDir(filepath.Join(w.Opt.Dir.Model, where), []string{"model"}, true)
178+
return files
179+
}
180+
176181
func (w *Wiki) allImageFiles() []string {
177182
files, _ := wikifier.UniqueFilesInDir(w.Opt.Dir.Image, imageExtensions, false)
178183
return files

wiki/folder.go

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package wiki
2+
3+
import (
4+
"os"
5+
"path/filepath"
6+
"strings"
7+
8+
"github.com/cooper/quiki/wikifier"
9+
)
10+
11+
// CreatePageFolder creates a new page folder.
12+
func (w *Wiki) CreatePageFolder(where, name string) (string, error) {
13+
return w.createFolder(w.Opt.Dir.Page, where, name)
14+
}
15+
16+
// CreateModelFolder creates a new model folder.
17+
func (w *Wiki) CreateModelFolder(where, name string) (string, error) {
18+
return w.createFolder(w.Opt.Dir.Model, where, name)
19+
}
20+
21+
// CreateImageFolder creates a new image folder.
22+
func (w *Wiki) CreateImageFolder(where, name string) (string, error) {
23+
return w.createFolder(w.Opt.Dir.Image, where, name)
24+
}
25+
26+
func (w *Wiki) createFolder(base, where, name string) (string, error) {
27+
name = wikifier.PageNameLink(strings.Replace(name, "/", "_", -1))
28+
return name, os.MkdirAll(filepath.Join(base, where, name), 0755)
29+
}

0 commit comments

Comments
 (0)