moveEntityCall = (url, direction) ->
$.ajax
type: "PATCH"
url: url
dataType: 'json'
contentType: 'application/json'
data: JSON.stringify({direction: direction})
success: (data, status) -> window.location.reload()
deleteEntityCall = (url) ->
$.ajax
type: "DELETE"
url: url
dataType: 'json'
contentType: 'application/json'
data: {}
success: (data, status) -> window.location.reload()
createEntityCall = (url, data) ->
$.ajax
type: "POST"
url: url
dataType: 'json'
contentType: 'application/json'
data: JSON.stringify(data)
success: (data, status) ->
window.location.reload()
buildFields = (editor) ->
fields = editor.data.fields
inputs = ''
defaultValues = {}
for field in fields
if field.default
defaultValues[field.name] = field.default
modelValues = if editor.data.action == 'edit' then editor.data.values else defaultValues
for field in fields
if field.label
label = ""
input = switch field.type
when "text" then ""
when "textarea" then ""
when "select"
select = ""
select
when "multiple_select"
select = ""
select
inputs += "
#{label}
#{input}
"
else
inputs += ""
inputs
handleDeleteEntity = (editor) ->
vex.dialog.confirm
message: 'Are you sure you want to delete this?'
callback: (value) ->
if value
deleteEntityCall(editor.data.url)
handleMoveEntity = (editor) ->
moveEntityCall(editor.data.url, editor.data.options.direction)
handleCreateEditEntity = (editor) ->
self = editor
vex.dialog.buttons.YES.text = if self.data.action == 'edit' then 'Save' else 'Create'
vex_message_type = if self.data.type == 'TypeStation::Page' then 'Page' else self.data.type
vex_message = "#{if self.data.action == 'edit' then 'Edit' else 'Create'} #{vex_message_type || 'Page'}"
vex.dialog.open
message: vex_message
input: buildFields(self)
afterOpen: ($vexContent) ->
$("select.multiple_select", $vexContent).chosen()
callback: (data) ->
if data
if self.data.action == 'edit'
model = self.ts.getModel self.data.url
vex.dialog.confirm
message: 'Are you sure you want to save changes?'
callback: (value) ->
if value
self.ts.save()
for k,v of data
model.set(k, { field: k, value: v, type: self.fields[k].type })
model.save ->
window.location.reload()
else
json = {}
contents = []
valid = true
for k,v of data
field = self.fields[k]
if valid
valid = if field.required then (v.length > 0) else true
else
break
contents.push({ field: k, value: v, type: field.type })
json['contents'] = contents
json['parent_id'] = self.data.parent_id if self.data.parent_id
json['_type'] = self.data.type if self.data.type
if valid
if self.ts.isChanged()
vex.dialog.buttons.YES.text = 'Save'
vex.dialog.confirm
message: 'You have unsaved changes, Do you want to save them before creating this?'
callback: (value) ->
if value
self.ts.save()
createEntityCall(self.data.create_url, json)
else
createEntityCall(self.data.create_url, json)
else
vex.dialog.buttons.YES.text = 'Ok'
vex.dialog.alert
message: 'Please fill in all required fields'
callback: ->
self.$el.click()
class @TypeStation.EntityEditor
constructor: (@ts, @$el, @data) ->
vex.defaultOptions.className = 'vex-theme-os'
@fields = {}
for field in @data.fields
@fields[field.name] = field
enable: ->
@disable()
self = @
@$el.on 'click', ->
switch self.data.action
when 'edit', 'create' then handleCreateEditEntity(self)
when 'move' then handleMoveEntity(self)
when 'delete' then handleDeleteEntity(self)
disable: ->
@$el.off 'click'