Skip to content
This repository was archived by the owner on Feb 5, 2024. It is now read-only.

Commit 1c2217e

Browse files
committed
Merge branch 'master' into feature-delete-page
2 parents 932215a + 5297cd8 commit 1c2217e

File tree

6 files changed

+53
-7
lines changed

6 files changed

+53
-7
lines changed

lib/models/page.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,14 +325,14 @@ module.exports = function(crowi) {
325325
pageSchema.statics.isCreatableName = function(name) {
326326
var forbiddenPages = [
327327
/\^|\$|\*|\+|\#/,
328-
/^\/_api\/.*/,
328+
/^\/_.*/, // /_api/* and so on
329329
/^\/\-\/.*/,
330330
/^\/_r\/.*/,
331331
/^\/user\/[^\/]+\/(bookmarks|comments|activities|pages|recent-create|recent-edit)/, // reserved
332-
/^http:\/\/.+$/, // avoid miss in renaming
332+
/^https?:\/\/.+$/, // avoid miss in renaming
333333
/.+\/edit$/,
334334
/.+\.md$/,
335-
/^\/(installer|register|login|logout|admin|me|files|trash|paste|comments).+/,
335+
/^\/(installer|register|login|logout|admin|me|files|trash|paste|comments)(\/.*|$)/,
336336
];
337337

338338
var isCreatable = true;

lib/routes/page.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ module.exports = function(crowi, app) {
5959
var path = getPathFromRequest(req);
6060
var limit = 50;
6161
var offset = parseInt(req.query.offset) || 0;
62+
var SEENER_THRESHOLD = 10;
6263
path = path + (path == '/' ? '' : '/');
6364

6465
// index page
@@ -90,6 +91,9 @@ module.exports = function(crowi, app) {
9091

9192
pagerOptions.length = pageList.length;
9293

94+
renderVars.config = {
95+
seener_threshold: SEENER_THRESHOLD
96+
};
9397
renderVars.pager = generatePager(pagerOptions);
9498
renderVars.pages = pageList;
9599
res.render('page_list', renderVars);

lib/views/layout/layout.html

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
<div class="navbar-header">
5050
<a class="navbar-brand" href="/">
5151
<img alt="Crowi" src="/logo/32x32.png" width="16">
52-
{% block title %}{{ config.crowi['app:title'] }}{% endblock %}
52+
{% block title %}{{ config.crowi['app:title']|default('Crowi') }}{% endblock %}
5353
</a>
5454
{% if searchConfigured() %}
5555
<div class="navbar-form navbar-left search-top visible-lg visible-md" role="search" id="search-top">
@@ -147,4 +147,3 @@
147147
<script src="/js/app{% if env == 'production' %}.min{% endif %}.js"></script>
148148
<script src="/js/crowi{% if env == 'production' %}.min{% endif %}.js"></script>
149149
</html>
150-

lib/views/page_list.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ <h3>Next Actions</h3>
127127

128128
{# list view #}
129129
<div class="active tab-pane fade page-list-container in" id="view-list">
130-
{% include 'widget/page_list.html' with { pages: pages, pager: pager } %}
130+
{% include 'widget/page_list.html' with { pages: pages, pager: pager, config: config } %}
131131
</div>
132132

133133
{# timeline view #}

lib/views/widget/page_list.html

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@
3131
</span>
3232
{% endif %}
3333

34+
{% if page.seenUsers.length >= config.seener_threshold %}
35+
<span>
36+
<i class="fa fa-eye">{{ page.seenUsers.length }}</i>
37+
</span>
38+
{% endif %}
39+
3440
{% if !page.isPublic() %}
3541
<span>
3642
<i class="fa fa-lock"></i>

test/models/page.test.js

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ describe('Page', function () {
6262
},
6363
];
6464

65-
testDBUtil.generateFixture(conn, 'Page', fixture)
65+
return testDBUtil.generateFixture(conn, 'Page', fixture)
6666
.then(function(pages) {
6767
done();
6868
});
@@ -93,6 +93,43 @@ describe('Page', function () {
9393
});
9494
});
9595

96+
describe('.isCreatableName', function() {
97+
98+
expect(Page.isCreatableName('/hoge')).to.be.true;
99+
100+
// edge cases
101+
expect(Page.isCreatableName('/me')).to.be.false;
102+
expect(Page.isCreatableName('/me/')).to.be.false;
103+
expect(Page.isCreatableName('/me/x')).to.be.false;
104+
expect(Page.isCreatableName('/meeting')).to.be.true;
105+
expect(Page.isCreatableName('/meeting/x')).to.be.true;
106+
107+
// under score
108+
expect(Page.isCreatableName('/_')).to.be.false;
109+
expect(Page.isCreatableName('/_r/x')).to.be.false;
110+
expect(Page.isCreatableName('/_api')).to.be.false;
111+
expect(Page.isCreatableName('/_apix')).to.be.false;
112+
expect(Page.isCreatableName('/_api/x')).to.be.false;
113+
114+
expect(Page.isCreatableName('/hoge/xx.md')).to.be.false;
115+
116+
117+
var forbidden = ['installer', 'register', 'login', 'logout', 'admin', 'files', 'trash', 'paste', 'comments'];
118+
for (var i = 0; i < forbidden.length ; i++) {
119+
var pn = forbidden[i];
120+
expect(Page.isCreatableName('/' + pn + '')).to.be.false;
121+
expect(Page.isCreatableName('/' + pn + '/')).to.be.false;
122+
expect(Page.isCreatableName('/' + pn + '/abc')).to.be.false;
123+
}
124+
125+
var forbidden = ['bookmarks', 'comments', 'activities', 'pages', 'recent-create', 'recent-edit'];
126+
for (var i = 0; i < forbidden.length ; i++) {
127+
var pn = forbidden[i];
128+
expect(Page.isCreatableName('/user/aoi/' + pn)).to.be.false;
129+
expect(Page.isCreatableName('/user/aoi/x/' + pn)).to.be.true;
130+
}
131+
});
132+
96133
describe('.isCreator', function() {
97134
context('with creator', function() {
98135
it('should return true', function(done) {

0 commit comments

Comments
 (0)