more snippet sharing
This commit is contained in:
parent
ee1c2c2722
commit
5bff5407a5
@ -169,6 +169,21 @@ if ( window ) window.out = out; window.breakpoint = breakpoint;
|
|||||||
owns(project, target_user){
|
owns(project, target_user){
|
||||||
return (project.user_id === target_user.uuid)
|
return (project.user_id === target_user.uuid)
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
snippet: {
|
||||||
|
edit(snippet, target_user){
|
||||||
|
if ( snippet.user_id === target_user.uuid ) return true
|
||||||
|
else if ( snippet.edit_user_ids.includes(target_user.uuid) ) return true
|
||||||
|
else return false
|
||||||
|
},
|
||||||
|
view(snippet, target_user){
|
||||||
|
if ( this.edit(snippet, target_user) ) return true
|
||||||
|
else if ( project.shared_user_ids.includes(target_user.uuid) ) return true
|
||||||
|
else return false
|
||||||
|
},
|
||||||
|
owns(snippet, target_user){
|
||||||
|
return snippet.user_id === target_user.uuid
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,10 @@ const Project = _flitter.model('v1:Project')
|
|||||||
const Out = _flitter.model('v1:Out')
|
const Out = _flitter.model('v1:Out')
|
||||||
const Invite = _flitter.model('v1:Invite')
|
const Invite = _flitter.model('v1:Invite')
|
||||||
const Snippet = _flitter.model('v1:Snippet')
|
const Snippet = _flitter.model('v1:Snippet')
|
||||||
|
const share_api = {
|
||||||
|
project: Project,
|
||||||
|
snippet: Snippet,
|
||||||
|
}
|
||||||
class v1 {
|
class v1 {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -199,11 +203,13 @@ class v1 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async project_share_show(req, res, next){
|
async project_share_show(req, res, next){
|
||||||
const project = await Project.findById(req.params.id)
|
const share_model = share_api[req.params.api]
|
||||||
|
if ( !share_model ) return _flitter.error(res, 400, {reason: 'Invalid Share API endpoint.'})
|
||||||
|
const project = await share_model.findById(req.params.id)
|
||||||
|
|
||||||
if ( !project ) return _flitter.error(res, 404, {reason: 'Project not found with the specified ID.'})
|
if ( !project ) return _flitter.error(res, 404, {reason: req.params.api+' not found with the specified ID.'})
|
||||||
|
|
||||||
if ( !devbug.permission.project.owns(project, req.session.auth.user) ) return _flitter.error(res, 401, {reason: 'You do not have permission to edit this project.'})
|
if ( !devbug.permission.project.owns(project, req.session.auth.user) ) return _flitter.error(res, 401, {reason: 'You do not have permission to edit this '+req.params.api+'.'})
|
||||||
|
|
||||||
// Find read-only users
|
// Find read-only users
|
||||||
const read_find = {
|
const read_find = {
|
||||||
@ -240,34 +246,38 @@ class v1 {
|
|||||||
current_owns: (project.user_id === req.session.auth.uuid)
|
current_owns: (project.user_id === req.session.auth.uuid)
|
||||||
}
|
}
|
||||||
|
|
||||||
return _flitter.view(res, 'dash_v1:share', { user: req.session.auth.user, sharing, project, title: 'Share Project: '+project.name, show_back: true })
|
return _flitter.view(res, 'dash_v1:share', { user: req.session.auth.user, sharing, item: project, api: req.params.api, title: 'Share '+req.params.api+': '+project.name, show_back: true })
|
||||||
}
|
}
|
||||||
|
|
||||||
async project_share_do(req, res, next){
|
async project_share_do(req, res, next){
|
||||||
const project = await Project.findById(req.params.id)
|
const share_model = share_api[req.params.api]
|
||||||
if ( !project ) return _flitter.error(res, 404, {reason: 'Project not found with the specified ID.'})
|
if ( !share_model ) return _flitter.error(res, 400, {reason: 'Invalid Share API endpoint.'})
|
||||||
|
const project = await share_model.findById(req.params.id)
|
||||||
|
if ( !project ) return _flitter.error(res, 404, {reason: req.params.api+' not found with the specified ID.'})
|
||||||
|
|
||||||
const target_user = await _flitter.model('User').findOne({uuid: req.params.user})
|
const target_user = await _flitter.model('User').findOne({uuid: req.params.user})
|
||||||
if ( !target_user ) return _flitter.error(res, 404, {reason: 'User not found with the specified ID.'})
|
if ( !target_user ) return _flitter.error(res, 404, {reason: 'User not found with the specified ID.'})
|
||||||
|
|
||||||
if ( !devbug.permission.project.owns(project, req.session.auth.user) ) return _flitter.error(res, 401, {reason: "You do not have permission to edit this project."})
|
if ( !devbug.permission.project.owns(project, req.session.auth.user) ) return _flitter.error(res, 401, {reason: "You do not have permission to edit this "+req.params.api+"."})
|
||||||
|
|
||||||
if ( !(project.user_id === target_user.uuid) && !(project.shared_user_ids.includes(target_user.uuid)) ){
|
if ( !(project.user_id === target_user.uuid) && !(project.shared_user_ids.includes(target_user.uuid)) ){
|
||||||
project.shared_user_ids.push(target_user.uuid)
|
project.shared_user_ids.push(target_user.uuid)
|
||||||
await project.save()
|
await project.save()
|
||||||
}
|
}
|
||||||
|
|
||||||
return res.redirect('/dash/v1/project/share/'+project.id)
|
return res.redirect('/dash/v1/'+req.params.api+'/share/'+project.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
async project_share_edit_do(req, res, next){
|
async project_share_edit_do(req, res, next){
|
||||||
const project = await Project.findById(req.params.id)
|
const share_model = share_api[req.params.api]
|
||||||
|
if ( !share_model ) return _flitter.error(res, 400, {reason: 'Invalid Share API endpoint.'})
|
||||||
|
const project = await share_model.findById(req.params.id)
|
||||||
if ( !project ) return _flitter.error(res, 404, {reason: 'Project not found with the specified ID.'})
|
if ( !project ) return _flitter.error(res, 404, {reason: 'Project not found with the specified ID.'})
|
||||||
|
|
||||||
const target_user = await _flitter.model('User').findOne({uuid: req.params.user})
|
const target_user = await _flitter.model('User').findOne({uuid: req.params.user})
|
||||||
if ( !target_user ) return _flitter.error(res, 404, {reason: 'User not found with the specified ID.'})
|
if ( !target_user ) return _flitter.error(res, 404, {reason: 'User not found with the specified ID.'})
|
||||||
|
|
||||||
if ( !devbug.permission.project.owns(project, req.session.auth.user) ) return _flitter.error(res, 401, {reason: "You do not have permission to edit this project."})
|
if ( !devbug.permission.project.owns(project, req.session.auth.user) ) return _flitter.error(res, 401, {reason: "You do not have permission to edit this "+req.params.api+"."})
|
||||||
|
|
||||||
if ( !(project.user_id === target_user.uuid) && !(project.edit_user_ids.includes(target_user.uuid)) ){
|
if ( !(project.user_id === target_user.uuid) && !(project.edit_user_ids.includes(target_user.uuid)) ){
|
||||||
// check if read access. If so, revoke.
|
// check if read access. If so, revoke.
|
||||||
@ -279,17 +289,19 @@ class v1 {
|
|||||||
await project.save()
|
await project.save()
|
||||||
}
|
}
|
||||||
|
|
||||||
return res.redirect('/dash/v1/project/share/'+project.id)
|
return res.redirect('/dash/v1/'+req.params.api+'/share/'+project.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
async project_share_revoke(req, res, next){
|
async project_share_revoke(req, res, next){
|
||||||
const project = await Project.findById(req.params.id)
|
const share_model = share_api[req.params.api]
|
||||||
if ( !project ) return _flitter.error(res, 404, {reason: 'Project not found with the specified ID.'})
|
if ( !share_model ) return _flitter.error(res, 400, {reason: 'Invalid Share API endpoint.'})
|
||||||
|
const project = await share_model.findById(req.params.id)
|
||||||
|
if ( !project ) return _flitter.error(res, 404, {reason: req.params.api+' not found with the specified ID.'})
|
||||||
|
|
||||||
const target_user = await _flitter.model('User').findOne({uuid: req.params.user})
|
const target_user = await _flitter.model('User').findOne({uuid: req.params.user})
|
||||||
if ( !target_user ) return _flitter.error(res, 404, {reason: 'User not found with the specified ID.'})
|
if ( !target_user ) return _flitter.error(res, 404, {reason: 'User not found with the specified ID.'})
|
||||||
|
|
||||||
if ( !devbug.permission.project.view(project, req.session.auth.user) ) return _flitter.error(res, 401, {reason: "You do not have permission to edit this project."})
|
if ( !devbug.permission.project.view(project, req.session.auth.user) ) return _flitter.error(res, 401, {reason: "You do not have permission to edit this "+req.params.api+"."})
|
||||||
|
|
||||||
const to_dash = project.shared_user_ids.includes(req.session.auth.uuid)
|
const to_dash = project.shared_user_ids.includes(req.session.auth.uuid)
|
||||||
|
|
||||||
@ -300,17 +312,19 @@ class v1 {
|
|||||||
|
|
||||||
if ( to_dash ) return res.redirect('/dash/v1')
|
if ( to_dash ) return res.redirect('/dash/v1')
|
||||||
|
|
||||||
return res.redirect('/dash/v1/project/share/'+project.id)
|
return res.redirect('/dash/v1/'+req.params.api+'/share/'+project.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
async project_share_revoke_edit(req, res, next){
|
async project_share_revoke_edit(req, res, next){
|
||||||
const project = await Project.findById(req.params.id)
|
const share_model = share_api[req.params.api]
|
||||||
if ( !project ) return _flitter.error(res, 404, {reason: 'Project not found with the specified ID.'})
|
if ( !share_model ) return _flitter.error(res, 400, {reason: 'Invalid Share API endpoint.'})
|
||||||
|
const project = await share_model.findById(req.params.id)
|
||||||
|
if ( !project ) return _flitter.error(res, 404, {reason: req.params.api+' not found with the specified ID.'})
|
||||||
|
|
||||||
const target_user = await _flitter.model('User').findOne({uuid: req.params.user})
|
const target_user = await _flitter.model('User').findOne({uuid: req.params.user})
|
||||||
if ( !target_user ) return _flitter.error(res, 404, {reason: 'User not found with the specified ID.'})
|
if ( !target_user ) return _flitter.error(res, 404, {reason: 'User not found with the specified ID.'})
|
||||||
|
|
||||||
if ( !devbug.permission.project.view(project, req.session.auth.user) ) return _flitter.error(res, 401, {reason: "You do not have permission to edit this project."})
|
if ( !devbug.permission.project.view(project, req.session.auth.user) ) return _flitter.error(res, 401, {reason: "You do not have permission to edit this "+req.params.api+"."})
|
||||||
|
|
||||||
const to_dash = project.edit_user_ids.includes(req.session.auth.uuid)
|
const to_dash = project.edit_user_ids.includes(req.session.auth.uuid)
|
||||||
|
|
||||||
@ -321,17 +335,19 @@ class v1 {
|
|||||||
|
|
||||||
if ( to_dash ) return res.redirect('/dash/v1')
|
if ( to_dash ) return res.redirect('/dash/v1')
|
||||||
|
|
||||||
return res.redirect('/dash/v1/project/share/'+project.id)
|
return res.redirect('/dash/v1/'+req.params.api+'/share/'+project.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
async project_share_transfer(req, res, next){
|
async project_share_transfer(req, res, next){
|
||||||
const project = await Project.findById(req.params.id)
|
const share_model = share_api[req.params.api]
|
||||||
if ( !project ) return _flitter.error(res, 404, {reason: 'Project not found with the specified ID.'})
|
if ( !share_model ) return _flitter.error(res, 400, {reason: 'Invalid Share API endpoint.'})
|
||||||
|
const project = await share_model.findById(req.params.id)
|
||||||
|
if ( !project ) return _flitter.error(res, 404, {reason: req.params.api+' not found with the specified ID.'})
|
||||||
|
|
||||||
const target_user = await _flitter.model('User').findOne({uuid: req.params.user})
|
const target_user = await _flitter.model('User').findOne({uuid: req.params.user})
|
||||||
if ( !target_user ) return _flitter.error(res, 404, {reason: 'User not found with the specified ID.'})
|
if ( !target_user ) return _flitter.error(res, 404, {reason: 'User not found with the specified ID.'})
|
||||||
|
|
||||||
if ( !devbug.permission.project.owns(project, req.session.auth.user) ) return _flitter.error(res, 401, {reason: 'You do not have permission to edit this project.'})
|
if ( !devbug.permission.project.owns(project, req.session.auth.user) ) return _flitter.error(res, 401, {reason: 'You do not have permission to edit this '+req.params.api+'.'})
|
||||||
|
|
||||||
project.user_id = target_user.uuid
|
project.user_id = target_user.uuid
|
||||||
project.shared_user_ids.push(req.session.auth.uuid)
|
project.shared_user_ids.push(req.session.auth.uuid)
|
||||||
@ -404,21 +420,37 @@ class v1 {
|
|||||||
if ( !project ) return _flitter.error(res, 404, {reason: 'The specified project does not exist.'})
|
if ( !project ) return _flitter.error(res, 404, {reason: 'The specified project does not exist.'})
|
||||||
|
|
||||||
if ( !req.body.title || !req.body.data ){
|
if ( !req.body.title || !req.body.data ){
|
||||||
return _flitter.view(res, 'dash_v1:snippet', {project, user: req.session.auth.user, title: 'Create Snippet', show_back: true});
|
return _flitter.view(res, 'dash_v1:snippet', {project, user: req.session.auth.user, title: 'Create Snippet', show_back: true})
|
||||||
|
}
|
||||||
|
|
||||||
|
// check required fields: title, data, mode
|
||||||
|
let fail = false
|
||||||
|
|
||||||
|
if ( !req.body.title ) fail = 'Snippet title is required.'
|
||||||
|
else if ( !req.body.data ) fail = 'Snippet data is required.'
|
||||||
|
else if ( !req.body.mode ) fail = 'Snippet mode is required.'
|
||||||
|
|
||||||
|
if ( fail ){
|
||||||
|
return _flitter.view(res, 'dash_v1:snippet', {project, user: req.session.auth.user, title: 'Create Snippet', show_back: true, errors:[fail]})
|
||||||
}
|
}
|
||||||
|
|
||||||
const snippet_data = {
|
const snippet_data = {
|
||||||
title: req.body.title,
|
name: req.body.title,
|
||||||
data: req.body.data,
|
data: req.body.data,
|
||||||
|
mode: req.body.mode,
|
||||||
user_id: req.session.auth.uuid,
|
user_id: req.session.auth.uuid,
|
||||||
};
|
project_id: project.id,
|
||||||
|
}
|
||||||
|
|
||||||
const snippet = new Snippet(snippet_data);
|
console.log({snippet_data})
|
||||||
await snippet.save();
|
|
||||||
|
const snippet = new Snippet(snippet_data)
|
||||||
|
await snippet.save()
|
||||||
|
|
||||||
return res.redirect('/dash/v1/project/snippet/'+req.params.id+'/view/'+snippet.uuid)
|
return res.redirect('/dash/v1/project/snippet/'+req.params.id+'/view/'+snippet.uuid)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO access checks
|
||||||
async project_snippet_view(req, res, next){
|
async project_snippet_view(req, res, next){
|
||||||
const project = await Project.findById(req.params.id)
|
const project = await Project.findById(req.params.id)
|
||||||
if ( !project ) return _flitter.error(res, 404, {reason: 'The specified project does not exist.'})
|
if ( !project ) return _flitter.error(res, 404, {reason: 'The specified project does not exist.'})
|
||||||
@ -426,7 +458,9 @@ class v1 {
|
|||||||
const snippet = await Snippet.findOne({uuid: req.params.snippet})
|
const snippet = await Snippet.findOne({uuid: req.params.snippet})
|
||||||
if ( !snippet ) return _flitter.error(res, 404, {reason: 'The specified snippet does not exist.'})
|
if ( !snippet ) return _flitter.error(res, 404, {reason: 'The specified snippet does not exist.'})
|
||||||
|
|
||||||
return _flitter.view(res, 'dash_v1:snippet', {snippet, project, user: req.session.auth.user, title: snippet.title, show_back: true, readonly: true})
|
console.log('snippet mode', snippet.mode)
|
||||||
|
|
||||||
|
return _flitter.view(res, 'dash_v1:snippet', {snippet, project, user: req.session.auth.user, title: 'Snippet: '+snippet.name, show_back: true, readonly: true})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
const uuid = require('uuid/v4')
|
const uuid = require('uuid/v4')
|
||||||
const Snippet = {
|
const Snippet = {
|
||||||
title: String,
|
name: String,
|
||||||
user_id: String,
|
user_id: String,
|
||||||
archived: { type: Boolean, default: false },
|
archived: { type: Boolean, default: false },
|
||||||
data: String,
|
data: String,
|
||||||
@ -13,6 +13,8 @@ const Snippet = {
|
|||||||
edit_user_ids: [String],
|
edit_user_ids: [String],
|
||||||
uuid: { type: String, default: uuid },
|
uuid: { type: String, default: uuid },
|
||||||
public_share: String,
|
public_share: String,
|
||||||
|
mode: String,
|
||||||
|
project_id: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = exports = Snippet
|
module.exports = exports = Snippet
|
@ -41,13 +41,13 @@ const v1 = {
|
|||||||
'/project/view/:id': [ _flitter.controller('dash:v1').project_view ],
|
'/project/view/:id': [ _flitter.controller('dash:v1').project_view ],
|
||||||
'/project/delete/:id': [ _flitter.controller('dash:v1').project_delete_show ],
|
'/project/delete/:id': [ _flitter.controller('dash:v1').project_delete_show ],
|
||||||
'/project/edit/:id': [ _flitter.controller('dash:v1').project_edit_show ],
|
'/project/edit/:id': [ _flitter.controller('dash:v1').project_edit_show ],
|
||||||
'/project/share/:id': [ _flitter.controller('dash:v1').project_share_show ],
|
'/:api/share/:id': [ _flitter.controller('dash:v1').project_share_show ],
|
||||||
'/project/share/:id/share/:user': [ _flitter.controller('dash:v1').project_share_do ],
|
'/:api/share/:id/share/:user': [ _flitter.controller('dash:v1').project_share_do ],
|
||||||
'/project/share/:id/share/:user/edit': [ _flitter.controller('dash:v1').project_share_edit_do ],
|
'/:api/share/:id/share/:user/edit': [ _flitter.controller('dash:v1').project_share_edit_do ],
|
||||||
'/project/share/:id/revoke/:user': [ _flitter.controller('dash:v1').project_share_revoke ],
|
'/:api/share/:id/revoke/:user': [ _flitter.controller('dash:v1').project_share_revoke ],
|
||||||
'/project/share/:id/revoke/:user/edit': [ _flitter.controller('dash:v1').project_share_revoke_edit ],
|
'/:api/share/:id/revoke/:user/edit': [ _flitter.controller('dash:v1').project_share_revoke_edit ],
|
||||||
'/project/share/:id/transfer/:user': [ _flitter.controller('dash:v1').project_share_transfer ],
|
'/:api/share/:id/transfer/:user': [ _flitter.controller('dash:v1').project_share_transfer ],
|
||||||
'/project/share/:id/invite': [ _flitter.controller('dash:v1').project_share_invite ],
|
'/:api/share/:id/invite': [ _flitter.controller('dash:v1').project_share_invite ],
|
||||||
'/project/snippet/:id/new': [ _flitter.controller('dash:v1').project_snippet_new ],
|
'/project/snippet/:id/new': [ _flitter.controller('dash:v1').project_snippet_new ],
|
||||||
'/project/snippet/:id/view/:snippet': [ _flitter.controller('dash:v1').project_snippet_view ],
|
'/project/snippet/:id/view/:snippet': [ _flitter.controller('dash:v1').project_snippet_view ],
|
||||||
|
|
||||||
|
@ -20,14 +20,14 @@ block content
|
|||||||
tbody
|
tbody
|
||||||
each user in sharing.read
|
each user in sharing.read
|
||||||
tr
|
tr
|
||||||
td #{(user.uuid === project.user_id ? user.username + " (Owner)" : user.username)}
|
td #{(user.uuid === item.user_id ? user.username + " (Owner)" : user.username)}
|
||||||
td
|
td
|
||||||
ul(style='list-style-type: none; margin: 0; padding: 0;')
|
ul(style='list-style-type: none; margin: 0; padding: 0;')
|
||||||
if !(user.uuid === project.user_id)
|
if !(user.uuid === item.user_id)
|
||||||
li.action-li
|
li.action-li
|
||||||
a.action(href='/dash/v1/project/share/'+project.id+'/revoke/'+user.uuid) Revoke
|
a.action(href='/dash/v1/'+api+'/share/'+item.id+'/revoke/'+user.uuid) Revoke
|
||||||
li
|
li
|
||||||
a.action(href='/dash/v1/project/share/'+project.id+'/transfer/'+user.uuid) Transfer Ownership
|
a.action(href='/dash/v1/'+api+'/share/'+item.id+'/transfer/'+user.uuid) Transfer Ownership
|
||||||
else
|
else
|
||||||
li.action-li
|
li.action-li
|
||||||
strike Revoke
|
strike Revoke
|
||||||
@ -45,14 +45,14 @@ block content
|
|||||||
tbody
|
tbody
|
||||||
each user in sharing.edit
|
each user in sharing.edit
|
||||||
tr
|
tr
|
||||||
td #{(user.uuid === project.user_id ? user.username + " (Owner)" : user.username)}
|
td #{(user.uuid === item.user_id ? user.username + " (Owner)" : user.username)}
|
||||||
td
|
td
|
||||||
ul(style='list-style-type: none; margin: 0; padding: 0;')
|
ul(style='list-style-type: none; margin: 0; padding: 0;')
|
||||||
if !(user.uuid === project.user_id)
|
if !(user.uuid === item.user_id)
|
||||||
li.action-li
|
li.action-li
|
||||||
a.action(href='/dash/v1/project/share/'+project.id+'/revoke/'+user.uuid+'/edit') Revoke
|
a.action(href='/dash/v1/'+api+'/share/'+item.id+'/revoke/'+user.uuid+'/edit') Revoke
|
||||||
li
|
li
|
||||||
a.action(href='/dash/v1/project/share/'+project.id+'/transfer/'+user.uuid) Transfer Ownership
|
a.action(href='/dash/v1/'+api+'/share/'+item.id+'/transfer/'+user.uuid) Transfer Ownership
|
||||||
else
|
else
|
||||||
li.action-li
|
li.action-li
|
||||||
strike Revoke
|
strike Revoke
|
||||||
@ -60,7 +60,7 @@ block content
|
|||||||
strike Transfer Ownership
|
strike Transfer Ownership
|
||||||
br
|
br
|
||||||
h2 Share With New User
|
h2 Share With New User
|
||||||
a.btn(href='/dash/v1/project/share/'+project.id+'/invite') Generate Sharing Link
|
a.btn(href='/dash/v1/'+api+'/share/'+item.id+'/invite') Generate Sharing Link
|
||||||
|
|
||||||
if sharing.other.length > 0
|
if sharing.other.length > 0
|
||||||
br
|
br
|
||||||
@ -73,16 +73,16 @@ block content
|
|||||||
tbody
|
tbody
|
||||||
each user in sharing.other
|
each user in sharing.other
|
||||||
tr
|
tr
|
||||||
td #{(user.uuid === project.user_id ? user.username + " (Owner)" : user.username)}
|
td #{(user.uuid === item.user_id ? user.username + " (Owner)" : user.username)}
|
||||||
td
|
td
|
||||||
ul(style='list-style-type: none; margin: 0; padding: 0;')
|
ul(style='list-style-type: none; margin: 0; padding: 0;')
|
||||||
if !(user.uuid === project.user_id)
|
if !(user.uuid === item.user_id)
|
||||||
li.action-li
|
li.action-li
|
||||||
a.action(href='/dash/v1/project/share/' + project.id + '/share/'+user.uuid) Share (View)
|
a.action(href='/dash/v1/'+api+'/share/' + item.id + '/share/'+user.uuid) Share (View)
|
||||||
li.action-li
|
li.action-li
|
||||||
a.action(href='/dash/v1/project/share/' + project.id + '/share/'+user.uuid+'/edit') Share (Edit)
|
a.action(href='/dash/v1/'+api+'/share/' + item.id + '/share/'+user.uuid+'/edit') Share (Edit)
|
||||||
else
|
else
|
||||||
li.action-li
|
li.action-li
|
||||||
strike Share
|
strike Share
|
||||||
li.action-li
|
li.action-li
|
||||||
a.action(href='/dash/v1/project/share/' + project.id + '/transfer/' + user.uuid) Transfer Ownership
|
a.action(href='/dash/v1/'+api+'/share/' + item.id + '/transfer/' + user.uuid) Transfer Ownership
|
||||||
|
@ -3,21 +3,103 @@ block content
|
|||||||
if errors
|
if errors
|
||||||
each error in errors
|
each error in errors
|
||||||
p(style='color: red; font-weight: bold;') #{error}
|
p(style='color: red; font-weight: bold;') #{error}
|
||||||
if (!readonly)
|
form#snippet_form(method='post' enctype='multipart/form-data')
|
||||||
form#snippet_form(method='post' enctype='multipart/form-data')
|
label(for='snippet_name') Snippet Title:
|
||||||
label(for='snippet_name') Snippet Title:
|
input#snippet_name(type='text' name='title' placeholder='required' value=snippet ? snippet.name : '' autofocus required readonly=!!readonly)
|
||||||
input#snippet_name(type='text' name='title' autofocus required)
|
label(for='snippet_mode' style='margin-left: 10px;') Language:
|
||||||
input#snippet_value(type='hidden' name='data' required)
|
select#snippet_mode(name='mode' onchange='selectonchange()' required disabled=!!readonly)
|
||||||
|
option(value='ace/mode/c_cpp') C/C++
|
||||||
|
option(value='ace/mode/css') CSS
|
||||||
|
option(value='ace/mode/gitignore') .gitignore
|
||||||
|
option(value='ace/mode/go') Go
|
||||||
|
option(value='ace/mode/html') HTML
|
||||||
|
option(value='ace/mode/java') Java
|
||||||
|
option(value='ace/mode/javascript') JavaScript
|
||||||
|
option(value='ace/mode/json') JSON
|
||||||
|
option(value='ace/mode/mysql') MySQL
|
||||||
|
option(value='ace/mode/perl') Perl
|
||||||
|
option(value='ace/mode/pgsql') Postgres
|
||||||
|
option(value='ace/mode/php') PHP
|
||||||
|
option(value='ace/mode/python') Python
|
||||||
|
option(value='ace/mode/ruby') Ruby
|
||||||
|
option(value='ace/mode/rust') Rust
|
||||||
|
option(value='ace/mode/sql') SQL
|
||||||
|
option(value='ace/mode/text') Text
|
||||||
|
option(value='ace/mode/typescript') TypeScript
|
||||||
|
option(value='ace/mode/apache_conf') Apache Configuration
|
||||||
|
option(value='ace/mode/asl') ASL
|
||||||
|
option(value='ace/mode/assembly_x86') Assembly (x86)
|
||||||
|
option(value='ace/mode/autohotkey') AutoHotKey
|
||||||
|
option(value='ace/mode/crystal') Crystal
|
||||||
|
option(value='ace/mode/clojure') Clojure
|
||||||
|
option(value='ace/mode/cobol') COBOL
|
||||||
|
option(value='ace/mode/coffee') CoffeeScript
|
||||||
|
option(value='ace/mode/csharp') C#
|
||||||
|
option(value='ace/mode/d') D
|
||||||
|
option(value='ace/mode/django') django
|
||||||
|
option(value='ace/mode/dockerfile') Dockerfile
|
||||||
|
option(value='ace/mode/ejs') EJS
|
||||||
|
option(value='ace/mode/elixir') Elixir
|
||||||
|
option(value='ace/mode/fortran') Fortran
|
||||||
|
option(value='ace/mode/haml') HAML
|
||||||
|
option(value='ace/mode/handlebars') Handlebars
|
||||||
|
option(value='ace/mode/html_elixir') HTML (Elixir)
|
||||||
|
option(value='ace/mode/html_ruby') HTML (Ruby)
|
||||||
|
option(value='ace/mode/ini') INI
|
||||||
|
option(value='ace/mode/jade') Jade
|
||||||
|
option(value='ace/mode/julia') Julia
|
||||||
|
option(value='ace/mode/kotlin') Kotlin
|
||||||
|
option(value='ace/mode/latex') LaTeX
|
||||||
|
option(value='ace/mode/less') Less
|
||||||
|
option(value='ace/mode/lisp') Lisp
|
||||||
|
option(value='ace/mode/lua') Lua
|
||||||
|
option(value='ace/mode/makefile') Makefile
|
||||||
|
option(value='ace/mode/markdown') Markdown
|
||||||
|
option(value='ace/mode/matlab') MATLAB
|
||||||
|
option(value='ace/mode/nginx') NGINX
|
||||||
|
option(value='ace/mode/objectivec') Objective-C
|
||||||
|
option(value='ace/mode/pascal') Pascal
|
||||||
|
option(value='ace/mode/perl6') Perl 6
|
||||||
|
option(value='ace/mode/php_laravel_blade') PHP (blade template)
|
||||||
|
option(value='ace/mode/puppet') Puppet
|
||||||
|
option(value='ace/mode/powershell') PowerShell
|
||||||
|
option(value='ace/mode/r') R
|
||||||
|
option(value='ace/mode/sass') SASS
|
||||||
|
option(value='ace/mode/scala') Scala
|
||||||
|
option(value='ace/mode/scss') SCSS
|
||||||
|
option(value='ace/mode/sh') /bin/sh
|
||||||
|
option(value='ace/mode/slim') Slim
|
||||||
|
option(value='ace/mode/snippets') Snippets
|
||||||
|
option(value='ace/mode/sqlserver') SQL Server
|
||||||
|
option(value='ace/mode/svg') SVG
|
||||||
|
option(value='ace/mode/swift') Swift
|
||||||
|
option(value='ace/mode/tcl') TCL
|
||||||
|
option(value='ace/mode/tex') Tex
|
||||||
|
option(value='ace/mode/vbscript') VBScript
|
||||||
|
option(value='ace/mode/xml') XML
|
||||||
|
option(value='ace/mode/yaml') YAML
|
||||||
|
input#snippet_value(type='hidden' name='data' required)
|
||||||
|
if snippet && user.uuid === snippet.user_id
|
||||||
|
a.btn(href='/dash/v1/snippet/share/'+snippet.id style='margin-left: 20px') Share Snippet
|
||||||
pre#editor #{ snippet ? snippet.data : '' }
|
pre#editor #{ snippet ? snippet.data : '' }
|
||||||
if (!readonly)
|
if (!readonly)
|
||||||
button(onclick='submitSnippet()') #{ snippet ? 'Update Snippet' : 'Create Snippet' }
|
button(onclick='submitSnippet()') #{ snippet ? 'Update Snippet' : 'Create Snippet' }
|
||||||
|
input#preset_mode(type='hidden' value=snippet ? snippet.mode : 'ace/mode/javascript')
|
||||||
|
|
||||||
block scripts
|
block scripts
|
||||||
script(src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.5/ace.js")
|
script(src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.5/ace.js")
|
||||||
script.
|
script.
|
||||||
|
const readonly = #{!!readonly}
|
||||||
|
const preset_mode = document.getElementById('preset_mode').value
|
||||||
const editor = ace.edit('editor');
|
const editor = ace.edit('editor');
|
||||||
editor.setTheme('ace/theme/cobalt');
|
editor.setTheme('ace/theme/cobalt');
|
||||||
//- editor.session.setMode('ace/mode/javascript');
|
console.log('preset mode: ', preset_mode);
|
||||||
|
editor.session.setMode(preset_mode);
|
||||||
|
document.getElementById('snippet_mode').value = preset_mode
|
||||||
|
|
||||||
|
if ( readonly ){
|
||||||
|
editor.setOption('readOnly', true)
|
||||||
|
}
|
||||||
|
|
||||||
function trim(s){
|
function trim(s){
|
||||||
return ( s || '' ).replace( /^\s+|\s+$/g, '' );
|
return ( s || '' ).replace( /^\s+|\s+$/g, '' );
|
||||||
@ -27,10 +109,14 @@ block scripts
|
|||||||
const form = document.getElementById('snippet_form');
|
const form = document.getElementById('snippet_form');
|
||||||
const value = document.getElementById('snippet_value');
|
const value = document.getElementById('snippet_value');
|
||||||
const name = document.getElementById('snippet_name');
|
const name = document.getElementById('snippet_name');
|
||||||
|
const mode = document.getElementById('snippet_mode');
|
||||||
value.value = editor.getValue();
|
value.value = editor.getValue();
|
||||||
|
|
||||||
if ( trim(value.value) && trim(name.value) ) form.submit();
|
if ( trim(value.value) && trim(name.value) && trim(mode.value) ) form.submit();
|
||||||
|
}
|
||||||
|
|
||||||
|
function selectonchange() {
|
||||||
|
const mode = document.getElementById('snippet_mode');
|
||||||
|
console.log('set mode: ', mode.value);
|
||||||
|
editor.session.setMode(mode.value);
|
||||||
}
|
}
|
||||||
if readonly
|
|
||||||
script.
|
|
||||||
editor.setOption('readOnly', true)
|
|
Loading…
Reference in New Issue
Block a user